Changeset 5587 for trunk/src/kernel32/oslibdos.cpp
- Timestamp:
- Apr 26, 2001, 3:22:49 PM (24 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/kernel32/oslibdos.cpp
r5393 r5587 1 /* $Id: oslibdos.cpp,v 1.6 0 2001-03-28 16:21:41sandervl Exp $ */1 /* $Id: oslibdos.cpp,v 1.61 2001-04-26 13:22:48 sandervl Exp $ */ 2 2 /* 3 3 * Wrappers for OS/2 Dos* API … … 1479 1479 LPSTR lpOS2Name; 1480 1480 DWORD hPipe; 1481 DWORD rc ;1482 1481 DWORD rc, ulAction; 1482 1483 1483 if (dwOpenMode & PIPE_ACCESS_DUPLEX_W) 1484 1484 dwOS2Mode |= NP_ACCESS_DUPLEX; … … 1528 1528 1529 1529 dprintf(("DosCreateNPipe(%s,%x,%x,%x,%x,%x)",lpOS2Name,dwOS2Mode,dwOS2PipeMode,nInBufferSize,nOutBufferSize,nDefaultTimeOut)); 1530 1531 //if the windows app tries to open another instance of an existing pipe, then 1532 //we must use DosOpen here. So first try DosOpen, if that fails then we can 1533 //create the named pipe 1534 rc = DosOpen(lpOS2Name, &hPipe, &ulAction, 0, FILE_NORMAL, FILE_OPEN, 1535 ((dwOpenMode & PIPE_ACCESS_INBOUND_W) ? OPEN_ACCESS_READWRITE : OPEN_ACCESS_READONLY) | 1536 OPEN_SHARE_DENYNONE, NULL); 1537 1538 if(rc == NO_ERROR) { 1539 dprintf(("Opening of existing named pipe succeeded")); 1540 return hPipe; 1541 } 1542 1530 1543 rc=DosCreateNPipe(lpOS2Name, 1531 1544 &hPipe, … … 1543 1556 } 1544 1557 return hPipe; 1558 } 1559 //****************************************************************************** 1560 //****************************************************************************** 1561 BOOL OSLibSetNamedPipeState(DWORD hNamedPipe, DWORD dwPipeMode) 1562 { 1563 ULONG dwOS2PipeMode = 0; 1564 APIRET rc; 1565 1566 if (dwPipeMode & PIPE_WAIT_W) 1567 dwOS2PipeMode |= NP_WAIT; 1568 if (dwPipeMode & PIPE_NOWAIT_W) 1569 dwOS2PipeMode |= NP_NOWAIT; 1570 if (dwPipeMode & PIPE_READMODE_BYTE_W) 1571 dwOS2PipeMode |= NP_READMODE_BYTE; 1572 if (dwPipeMode & PIPE_READMODE_MESSAGE_W) 1573 dwOS2PipeMode |= NP_READMODE_MESSAGE; 1574 1575 rc = DosSetNPHState(hNamedPipe, dwOS2PipeMode); 1576 if(rc) { 1577 SetLastError(error2WinError(rc, ERROR_INVALID_PARAMETER_W)); 1578 return FALSE; 1579 } 1580 return TRUE; 1581 } 1582 //****************************************************************************** 1583 //****************************************************************************** 1584 DWORD OSLibDosOpenPipe(LPCTSTR lpName, 1585 DWORD fuAccess, 1586 DWORD fuShare, 1587 LPSECURITY_ATTRIBUTES lpSecurityAttributes, 1588 DWORD fuCreate, 1589 DWORD fuAttrFlags) 1590 { 1591 LPSTR lpOS2Name; 1592 ULONG hPipe; 1593 ULONG rc, ulAction; 1594 ULONG openFlag = 0; 1595 ULONG openMode = 0; 1596 1597 1598 switch(fuCreate) 1599 { 1600 case CREATE_NEW_W: 1601 openFlag |= OPEN_ACTION_CREATE_IF_NEW | OPEN_ACTION_FAIL_IF_EXISTS; 1602 break; 1603 case CREATE_ALWAYS_W: 1604 /* kso 2000-11-26: Not sure if OPEN_ACTION_REPLACE_IF_EXISTS is correct here! It is correct according to 1605 * MSDN, but not according to "The Win32 API SuperBible". Anyway I haven't got time to check it out in 1606 * NT now. 1607 * The problem is that OPEN_ACTION_REPLACE_IF_EXISTS requires write access. It failes with 1608 * rc = ERROR_ACCESS_DENIED (5). Quick fix, use OPEN_IF_EXIST if readonly access. 1609 */ 1610 if (fuAccess & GENERIC_WRITE_W) 1611 openFlag |= OPEN_ACTION_CREATE_IF_NEW | OPEN_ACTION_REPLACE_IF_EXISTS; 1612 else 1613 openFlag |= OPEN_ACTION_CREATE_IF_NEW | OPEN_ACTION_OPEN_IF_EXISTS; 1614 break; 1615 case OPEN_EXISTING_W: 1616 openFlag |= OPEN_ACTION_FAIL_IF_NEW | OPEN_ACTION_OPEN_IF_EXISTS; 1617 break; 1618 case OPEN_ALWAYS_W: 1619 openFlag |= OPEN_ACTION_CREATE_IF_NEW | OPEN_ACTION_OPEN_IF_EXISTS; 1620 break; 1621 case TRUNCATE_EXISTING_W: 1622 openFlag |= OPEN_ACTION_FAIL_IF_NEW | OPEN_ACTION_REPLACE_IF_EXISTS; 1623 break; 1624 } 1625 1626 if(fuAttrFlags & FILE_FLAG_WRITE_THROUGH_W) openMode |= OPEN_FLAGS_WRITE_THROUGH; 1627 if(fuAttrFlags & FILE_FLAG_NO_BUFFERING_W) openMode |= OPEN_FLAGS_NO_CACHE; 1628 if(fuAttrFlags & FILE_FLAG_RANDOM_ACCESS_W) openMode |= OPEN_FLAGS_RANDOM; 1629 if(fuAttrFlags & FILE_FLAG_SEQUENTIAL_SCAN_W) openMode |= OPEN_FLAGS_SEQUENTIAL; 1630 // TODO: FILE_FLAG_BACKUP_SEMANTICS_W 1631 // FILE_FLAG_POSIX_SEMANTICS_W are not supported 1632 1633 //TODO: FILE_SHARE_DELETE 1634 if((fuShare & (FILE_SHARE_READ_W | FILE_SHARE_WRITE_W)) == 0 ) 1635 openMode |= OPEN_SHARE_DENYREADWRITE; 1636 else 1637 if((fuShare & (FILE_SHARE_READ_W | FILE_SHARE_WRITE_W)) == (FILE_SHARE_READ_W | FILE_SHARE_WRITE_W)) 1638 openMode |= OPEN_SHARE_DENYNONE; 1639 else 1640 if(fuShare & FILE_SHARE_READ_W) 1641 openMode |= OPEN_SHARE_DENYWRITE; 1642 else 1643 if(fuShare & FILE_SHARE_WRITE_W) 1644 openMode |= OPEN_SHARE_DENYREAD; 1645 1646 if(fuAccess == (GENERIC_READ_W | GENERIC_WRITE_W)) 1647 openMode |= OPEN_ACCESS_READWRITE; 1648 else 1649 if(fuAccess & GENERIC_READ_W) 1650 openMode |= OPEN_ACCESS_READONLY; 1651 else 1652 if(fuAccess & GENERIC_WRITE_W) 1653 openMode |= OPEN_ACCESS_WRITEONLY; 1654 1655 if (strstr(lpName,"\\\\.")) 1656 { 1657 // If pipe is created on the local machine 1658 // we must delete string \\. because 1659 // in Windows named pipes scheme is a \\.\PIPE\pipename 1660 // but in OS/2 only \PIPE\pipename 1661 lpOS2Name = (LPSTR)lpName + 3; 1662 } 1663 else lpOS2Name = (LPSTR)lpName; 1664 1665 rc = DosOpen(lpOS2Name, &hPipe, &ulAction, 0, 0, 1666 openFlag, openMode, NULL); 1667 1668 if(rc == NO_ERROR) { 1669 dprintf(("Opening of existing named pipe succeeded")); 1670 return hPipe; 1671 } 1672 1673 SetLastError(error2WinError(rc,ERROR_INVALID_PARAMETER_W)); 1674 return -1; // INVALID_HANDLE_VALUE 1545 1675 } 1546 1676
Note:
See TracChangeset
for help on using the changeset viewer.