Ignore:
Timestamp:
Apr 26, 2001, 3:22:49 PM (24 years ago)
Author:
sandervl
Message:

added mailslot implemenation, named pipe fixes + FreeLibraryAndExitThread

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/kernel32/oslibdos.cpp

    r5393 r5587  
    1 /* $Id: oslibdos.cpp,v 1.60 2001-03-28 16:21:41 sandervl Exp $ */
     1/* $Id: oslibdos.cpp,v 1.61 2001-04-26 13:22:48 sandervl Exp $ */
    22/*
    33 * Wrappers for OS/2 Dos* API
     
    14791479   LPSTR lpOS2Name;
    14801480   DWORD hPipe;
    1481    DWORD rc;
    1482 
     1481   DWORD rc, ulAction;
     1482   
    14831483  if (dwOpenMode & PIPE_ACCESS_DUPLEX_W)
    14841484    dwOS2Mode |= NP_ACCESS_DUPLEX;
     
    15281528
    15291529  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
    15301543  rc=DosCreateNPipe(lpOS2Name,
    15311544                    &hPipe,
     
    15431556  }
    15441557  return hPipe;
     1558}
     1559//******************************************************************************
     1560//******************************************************************************
     1561BOOL 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//******************************************************************************
     1584DWORD 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
    15451675}
    15461676
Note: See TracChangeset for help on using the changeset viewer.