Ignore:
Timestamp:
Jan 2, 2000, 11:51:12 PM (26 years ago)
Author:
sandervl
Message:

PB: Started with named pipe api implementation

File:
1 edited

Legend:

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

    r1924 r2300  
    1 /* $Id: oslibdos.cpp,v 1.12 1999-12-01 18:40:48 sandervl Exp $ */
    2 
    31/*
    42 * Wrappers for OS/2 Dos* API
    53 *
    6  * Copyright 1998 Sander van Leeuwen (sandervl@xs4all.nl)
    7  *
     4 * Copyright 1998-2000 Sander van Leeuwen (sandervl@xs4all.nl)
     5 * Copyright 1999-2000 Edgar Buerkle <Edgar.Buerkle@gmx.net>
     6 * Copyright 2000 Przemyslaw Dobrowolski <dobrawka@asua.org.pl>
    87 *
    98 * Project Odin Software License can be found in LICENSE.TXT
     
    1514#define INCL_DOSPROCESS
    1615#define INCL_DOSERRORS
     16#define INCL_NPIPES
    1717#include <os2wrap.h>                     //Odin32 OS/2 api wrappers
    1818#include <stdlib.h>
     
    2020#include <string.h>
    2121#include <win32type.h>
     22#include <winconst.h>
    2223#include <misc.h>
    2324#include "initterm.h"
    2425#include "oslibdos.h"
    2526#include "dosqss.h"
     27
     28/***********************************
     29 * PH: fixups for missing os2win.h *
     30 ***********************************/
     31
     32void _System SetLastError(ULONG ulError);
    2633
    2734APIRET APIENTRY DosAliasMem(PVOID pb, ULONG cb, PPVOID ppbAlias, ULONG fl);
     
    403410   DWORD  os2Open=0;
    404411
    405 #define GENERIC_READ               0x80000000
    406 #define GENERIC_WRITE              0x40000000
    407     if(dwAccess == (GENERIC_READ | GENERIC_WRITE))
     412    if(dwAccess == (GENERIC_READ_W | GENERIC_WRITE_W))
    408413      os2Flags |= OPEN_ACCESS_READWRITE;
    409     else if(dwAccess & GENERIC_WRITE)
     414    else if(dwAccess & GENERIC_WRITE_W)
    410415      os2Flags |= OPEN_ACCESS_WRITEONLY;
    411     else if(dwAccess & GENERIC_READ)
     416    else if(dwAccess & GENERIC_READ_W)
    412417      os2Flags |= OPEN_ACCESS_READONLY;
    413418
    414 #define FILE_SHARE_READ         0x00000001L
    415 #define FILE_SHARE_WRITE        0x00000002L
    416419    if(dwShare == 0)
    417420      os2Flags |= OPEN_SHARE_DENYREADWRITE;
    418     else if(dwShare == (FILE_SHARE_READ | FILE_SHARE_WRITE))
     421    else if(dwShare == (FILE_SHARE_READ_W | FILE_SHARE_WRITE_W))
    419422      os2Flags |= OPEN_SHARE_DENYNONE;
    420     else if(dwShare & FILE_SHARE_READ)
     423    else if(dwShare & FILE_SHARE_READ_W)
    421424      os2Flags |= OPEN_SHARE_DENYWRITE;
    422     else if(dwShare & FILE_SHARE_WRITE)
     425    else if(dwShare & FILE_SHARE_WRITE_W)
    423426      os2Flags |= OPEN_SHARE_DENYREAD;
    424427
    425 #define CREATE_NEW              1
    426 #define CREATE_ALWAYS           2
    427 #define OPEN_EXISTING           3
    428 #define OPEN_ALWAYS             4
    429 #define TRUNCATE_EXISTING       5
    430     if(dwCreation == CREATE_NEW)
     428    if(dwCreation == CREATE_NEW_W)
    431429      os2Open = OPEN_ACTION_FAIL_IF_EXISTS | OPEN_ACTION_CREATE_IF_NEW;
    432     else if(dwCreation == CREATE_ALWAYS)
     430    else if(dwCreation == CREATE_ALWAYS_W)
    433431      os2Open = OPEN_ACTION_REPLACE_IF_EXISTS | OPEN_ACTION_CREATE_IF_NEW;
    434     else if(dwCreation == OPEN_EXISTING)
     432    else if(dwCreation == OPEN_EXISTING_W)
    435433      os2Open = OPEN_ACTION_OPEN_IF_EXISTS | OPEN_ACTION_FAIL_IF_NEW;
    436     else if(dwCreation == OPEN_ALWAYS)
     434    else if(dwCreation == OPEN_ALWAYS_W)
    437435      os2Open = OPEN_ACTION_OPEN_IF_EXISTS | OPEN_ACTION_CREATE_IF_NEW;
    438     else if(dwCreation == TRUNCATE_EXISTING)
     436    else if(dwCreation == TRUNCATE_EXISTING_W)
    439437      os2Open = OPEN_ACTION_REPLACE_IF_EXISTS;// |OPEN_ACTION_FAIL_IF_NEW;
    440438
    441 #define FILE_ATTRIBUTE_READONLY         0x00000001L
    442 #define FILE_ATTRIBUTE_HIDDEN           0x00000002L
    443 #define FILE_ATTRIBUTE_SYSTEM           0x00000004L
    444 #define FILE_ATTRIBUTE_DIRECTORY        0x00000010L
    445 #define FILE_ATTRIBUTE_ARCHIVE          0x00000020L
    446 #define FILE_ATTRIBUTE_NORMAL           0x00000080L
    447 #define FILE_ATTRIBUTE_TEMPORARY        0x00000100L
    448     if(dwFlags & FILE_ATTRIBUTE_READONLY)
     439    if(dwFlags & FILE_ATTRIBUTE_READONLY_W)
    449440      os2Attrib |= FILE_READONLY;
    450     if(dwFlags & FILE_ATTRIBUTE_HIDDEN)
     441    if(dwFlags & FILE_ATTRIBUTE_HIDDEN_W)
    451442      os2Attrib |= FILE_HIDDEN;
    452     if(dwFlags & FILE_ATTRIBUTE_SYSTEM)
     443    if(dwFlags & FILE_ATTRIBUTE_SYSTEM_W)
    453444      os2Attrib |= FILE_SYSTEM;
    454     if(dwFlags & FILE_ATTRIBUTE_DIRECTORY)
     445    if(dwFlags & FILE_ATTRIBUTE_DIRECTORY_W)
    455446      os2Attrib |= FILE_DIRECTORY;
    456     if(dwFlags & FILE_ATTRIBUTE_ARCHIVE)
     447    if(dwFlags & FILE_ATTRIBUTE_ARCHIVE_W)
    457448      os2Attrib |= FILE_ARCHIVED;
    458     if(dwFlags & FILE_ATTRIBUTE_NORMAL)
     449    if(dwFlags & FILE_ATTRIBUTE_NORMAL_W)
    459450      os2Attrib |= FILE_NORMAL;
    460451
    461 #define FILE_FLAG_WRITE_THROUGH    0x80000000UL
    462 #define FILE_FLAG_OVERLAPPED       0x40000000L
    463 #define FILE_FLAG_NO_BUFFERING     0x20000000L
    464 #define FILE_FLAG_RANDOM_ACCESS    0x10000000L
    465 #define FILE_FLAG_SEQUENTIAL_SCAN  0x08000000L
    466 #define FILE_FLAG_DELETE_ON_CLOSE  0x04000000L
    467 #define FILE_FLAG_BACKUP_SEMANTICS 0x02000000L
    468 #define FILE_FLAG_POSIX_SEMANTICS  0x01000000L
    469     if(dwFlags & FILE_FLAG_WRITE_THROUGH)
     452    if(dwFlags & FILE_FLAG_WRITE_THROUGH_W)
    470453      os2Flags |= OPEN_FLAGS_WRITE_THROUGH;
    471     if(dwFlags & FILE_FLAG_NO_BUFFERING)
     454    if(dwFlags & FILE_FLAG_NO_BUFFERING_W)
    472455      os2Flags |= OPEN_FLAGS_NO_CACHE;
    473     if(dwFlags & FILE_FLAG_RANDOM_ACCESS)
     456    if(dwFlags & FILE_FLAG_RANDOM_ACCESS_W)
    474457      os2Flags |= OPEN_FLAGS_RANDOM;
    475     if(dwFlags & FILE_FLAG_SEQUENTIAL_SCAN)
     458    if(dwFlags & FILE_FLAG_SEQUENTIAL_SCAN_W)
    476459      os2Flags |= OPEN_FLAGS_SEQUENTIAL;
    477460
    478461    // TODO:
    479     // if(dwFlags & FILE_FLAG_OVERLAPPED)
    480     // if(dwFlags & FILE_FLAG_DELETE_ON_CLOSE
     462    // if(dwFlags & FILE_FLAG_OVERLAPPED_W)
     463    // if(dwFlags & FILE_FLAG_DELETE_ON_CLOSE_W
    481464
    482465    rc = DosOpen(lpFileName, &hFile, &ulAction, 0,
     
    486469    {
    487470      // TODO: TEST TEST
    488       dprintf(("DosOpen Error rc:%d, try without GENERIC_WRITE", rc));
    489       if(dwAccess & GENERIC_WRITE)
     471      dprintf(("DosOpen Error rc:%d, try without GENERIC_WRITE_W", rc));
     472      if(dwAccess & GENERIC_WRITE_W)
    490473        os2Flags &= ~(OPEN_ACCESS_READWRITE | OPEN_ACCESS_WRITEONLY);
    491474      rc = DosOpen(lpFileName, &hFile, &ulAction, 0,
     
    584567//******************************************************************************
    585568//******************************************************************************
     569// TODO: implement SecurityAttributes parameter
     570DWORD OSLibDosCreateNamedPipe(LPCTSTR lpName,
     571                               DWORD   dwOpenMode,
     572                               DWORD   dwPipeMode,
     573                               DWORD   nMaxInstances,
     574                               DWORD   nOutBufferSize,
     575                               DWORD   nInBufferSize,
     576                               DWORD   nDefaultTimeOut,
     577                               void*   lpSecurityAttributes)
     578{  DWORD dwOS2Mode     = 0;
     579   DWORD dwOS2PipeMode = 0;
     580   LPSTR lpOS2Name; 
     581   DWORD hPipe;
     582   DWORD rc;
     583   
     584  if (dwOpenMode & PIPE_ACCESS_DUPLEX_W)
     585    dwOS2Mode |= NP_ACCESS_DUPLEX;
     586  else
     587  if (dwOpenMode & PIPE_ACCESS_INBOUND_W)
     588    dwOS2Mode |= NP_ACCESS_INBOUND;
     589  else
     590  if (dwOpenMode & PIPE_ACCESS_OUTBOUND_W)
     591    dwOS2Mode |= NP_ACCESS_OUTBOUND;
     592  // TODO:
     593  // if(dwOpenMode & FILE_FLAG_OVERLAPPED)
     594  // if(dwOpenMode & WRITE_DAC)
     595  // if(dwOpenMode & WRITE_OWNER)
     596  // if(dwOpenMode & ACCESS_SYSTEM_SECURITY)
     597  if(dwOpenMode & FILE_FLAG_WRITE_THROUGH_W)
     598    dwOS2Mode |= NP_WRITEBEHIND; // FIXME: I'm not sure!
     599
     600  if (dwPipeMode & PIPE_WAIT_W)
     601    dwOS2PipeMode |= NP_WAIT;
     602  if (dwPipeMode & PIPE_NOWAIT_W)
     603    dwOS2PipeMode |= NP_NOWAIT;
     604  if (dwPipeMode & PIPE_READMODE_BYTE_W)
     605    dwOS2PipeMode |= NP_READMODE_BYTE;
     606  if (dwPipeMode & PIPE_READMODE_MESSAGE_W)
     607    dwOS2PipeMode |= NP_READMODE_MESSAGE;
     608  if (dwPipeMode & PIPE_TYPE_BYTE_W)
     609    dwOS2PipeMode |= NP_TYPE_BYTE;
     610  if (dwPipeMode & PIPE_TYPE_MESSAGE_W)
     611    dwOS2PipeMode |= NP_TYPE_MESSAGE;
     612
     613  if (nMaxInstances>0xff)
     614  {
     615    SetLastError(87); // ERROR_INVALID_PARAMETER
     616    return -1; // INVALID_HANDLE_VALUE
     617  }
     618  dwOS2PipeMode |= nMaxInstances;
     619
     620  // we must delete string \.\ because
     621  // in Windows named pipes scheme is a \.\PIPE\pipename
     622  // but in OS/2 only \PIPE\pipename
     623  lpOS2Name = (LPSTR)lpName + 3;
     624
     625
     626  dprintf(("DosCreateNPipe(%s,%x,%x,%x,%x,%x)",lpOS2Name,dwOS2Mode,dwOS2PipeMode,nInBufferSize,nOutBufferSize,nDefaultTimeOut));
     627  rc=DosCreateNPipe(lpOS2Name,
     628                    &hPipe,
     629                    dwOS2Mode,
     630                    dwOS2PipeMode,
     631                    nInBufferSize,
     632                    nInBufferSize, 
     633                    nDefaultTimeOut); // Timeouts must be tested!
     634
     635  dprintf(("DosCreateNPipe rc=%d",rc));
     636  if (rc)
     637  {
     638     if ( rc == ERROR_PIPE_BUSY         ) SetLastError(ERROR_PIPE_BUSY_W);
     639       else
     640     if ( rc == ERROR_PATH_NOT_FOUND    ) SetLastError(ERROR_PATH_NOT_FOUND_W);
     641       else
     642     if ( rc == ERROR_NOT_ENOUGH_MEMORY ) SetLastError(ERROR_NOT_ENOUGH_MEMORY_W);
     643       else
     644     if ( rc == ERROR_INVALID_PARAMETER ) SetLastError(ERROR_INVALID_PARAMETER_W);
     645       else
     646     if ( rc == ERROR_OUT_OF_STRUCTURES ) SetLastError(ERROR_OUT_OF_STRUCTURES_W);
     647       else
     648         // Unknown error
     649         SetLastError(ERROR_INVALID_PARAMETER_W); // fixme!
     650     return -1; // INVALID_HANDLE_VALUE
     651  }
     652  return hPipe;
     653}
     654
     655//******************************************************************************
     656//******************************************************************************
     657// TODO: implement lpOverlapped parameter!
     658BOOL OSLibDosConnectNamedPipe(DWORD hNamedPipe, LPOVERLAPPED lpOverlapped)
     659{
     660 DWORD rc;
     661
     662  rc=DosConnectNPipe(hNamedPipe);
     663  dprintf(("DosConnectNPipe rc=%d",rc));
     664
     665  if (!rc) return (TRUE);
     666    else
     667  if (rc==ERROR_BROKEN_PIPE) SetLastError(ERROR_BROKEN_PIPE_W);   
     668    else
     669  if (rc==ERROR_BAD_PIPE) SetLastError(ERROR_BAD_PIPE_W);
     670    else
     671  if (rc==ERROR_PIPE_NOT_CONNECTED) SetLastError(ERROR_PIPE_NOT_CONNECTED_W);
     672    else
     673  // TODO: Implemnt this using Windows Errors
     674  // if (rc==ERROR_INTERRUPT)
     675  SetLastError(ERROR_PIPE_NOT_CONNECTED_W);
     676 
     677  return (FALSE);
     678}
     679
     680//******************************************************************************
     681//******************************************************************************
     682BOOL OSLibDosCallNamedPipe( LPCTSTR lpNamedPipeName,
     683                            LPVOID  lpInBuffer,
     684                            DWORD   nInBufferSize,
     685                            LPVOID  lpOutBuffer,
     686                            DWORD   nOutBufferSize,
     687                            LPDWORD lpBytesRead,
     688                            DWORD   nTimeOut )
     689{
     690  LPSTR lpOS2Name;
     691  DWORD rc;
     692  // we must delete string \.\ because
     693  // in Windows named pipes scheme is a \.\PIPE\pipename
     694  // but in OS/2 only \PIPE\pipename
     695  lpOS2Name = (LPSTR)lpNamedPipeName + 3;
     696
     697  rc=DosCallNPipe(lpOS2Name,
     698                  lpInBuffer,
     699                  nInBufferSize,
     700                  lpOutBuffer,
     701                  nOutBufferSize,
     702                  lpBytesRead,
     703                  nTimeOut );
     704
     705
     706  if (!rc) return (TRUE);
     707   else
     708  if ( rc==ERROR_FILE_NOT_FOUND     ) SetLastError(ERROR_FILE_NOT_FOUND_W);   
     709    else
     710  if ( rc==ERROR_PATH_NOT_FOUND     ) SetLastError(ERROR_PATH_NOT_FOUND_W);   
     711    else
     712  if ( rc==ERROR_ACCESS_DENIED      ) SetLastError(ERROR_ACCESS_DENIED_W);   
     713    else
     714  if ( rc==ERROR_MORE_DATA          ) SetLastError(ERROR_MORE_DATA_W);   
     715    else
     716  if ( rc==ERROR_PIPE_BUSY          ) SetLastError(ERROR_PIPE_BUSY_W);   
     717    else
     718  if ( rc==ERROR_BAD_FORMAT         ) SetLastError(ERROR_BAD_FORMAT_W);   
     719    else
     720  if ( rc==ERROR_BROKEN_PIPE        ) SetLastError(ERROR_BROKEN_PIPE_W);   
     721    else
     722  if ( rc==ERROR_BAD_PIPE           ) SetLastError(ERROR_BAD_PIPE_W);
     723    else
     724  if ( rc==ERROR_PIPE_NOT_CONNECTED ) SetLastError(ERROR_PIPE_NOT_CONNECTED_W);
     725    else
     726  // TODO: Implemnt this using Windows Errors
     727  // if (rc==ERROR_INTERRUPT)
     728  SetLastError(233);
     729
     730  return (FALSE);
     731}
     732
     733//******************************************************************************
     734//******************************************************************************
     735BOOL OSLibDosTransactNamedPipe( DWORD  hNamedPipe,
     736                                LPVOID lpInBuffer,
     737                                DWORD nInBufferSize,
     738                                LPVOID lpOutBuffer,
     739                                DWORD nOutBufferSize,
     740                                LPDWORD lpBytesRead,
     741                                LPOVERLAPPED lpOverlapped)
     742{
     743  DWORD rc;
     744
     745  rc=DosTransactNPipe(hNamedPipe,
     746                      lpOutBuffer,
     747                      nOutBufferSize,
     748                      lpInBuffer,
     749                      nInBufferSize,
     750                      lpBytesRead);
     751
     752  if (!rc) return (TRUE);
     753   else
     754  if ( rc==ERROR_ACCESS_DENIED      ) SetLastError(ERROR_ACCESS_DENIED_W);   
     755    else
     756  if ( rc==ERROR_MORE_DATA          ) SetLastError(ERROR_MORE_DATA_W);   
     757    else
     758  if ( rc==ERROR_PIPE_BUSY          ) SetLastError(ERROR_PIPE_BUSY_W);   
     759    else
     760  if ( rc==ERROR_BAD_FORMAT         ) SetLastError(ERROR_BAD_FORMAT_W);   
     761    else
     762  if ( rc==ERROR_BROKEN_PIPE        ) SetLastError(ERROR_BROKEN_PIPE_W);   
     763    else
     764  if ( rc==ERROR_BAD_PIPE           ) SetLastError(ERROR_BAD_PIPE_W);
     765    else
     766  if ( rc==ERROR_PIPE_NOT_CONNECTED ) SetLastError(ERROR_PIPE_NOT_CONNECTED_W);
     767    else
     768  // Unknown error
     769  SetLastError(ERROR_PIPE_NOT_CONNECTED_W);
     770
     771  return FALSE;
     772}
Note: See TracChangeset for help on using the changeset viewer.