This example handles host end of a named pipe for several other named pipe examples. Some return code checking has been omitted for brevity.
#define INCL_BASE
#define INCL_DOSSEMAPHORES
#define INCL_DOSNMPIPES
#include <os2.h>
#include <stdio.h>
#include <string.h>
int main(VOID) {
CHAR PipeName[256] = "\\PIPE\\EXAMPLE" ; /* Pipe name */
HPIPE PipeHandle = NULLHANDLE; /* Pipe handle */
HEV hev = NULLHANDLE; /* Semaphore handle */
ULONG ulBytes = 0; /* Bytes read or written */
CHAR message[256] = ""; /* Input/Output buffer */
APIRET rc = NO_ERROR; /* Return code */
rc = DosCreateNPipe(PipeName, /* Name of pipe to create */
&PipeHandle, /* Handle returned for pipe */
NP_ACCESS_DUPLEX, /* Duplex pipe */
NP_WAIT |
NP_TYPE_MESSAGE |
NP_READMODE_MESSAGE |
NP_WMESG | /* Write messages */
NP_RMESG | /* Read messages */
0x01, /* Unique instance of pipe */
sizeof(message), /* Output buffer size */
sizeof(message), /* Input buffer size */
0L); /* Use default time-out */
if (rc != NO_ERROR) {
printf("DosCreateNPipe error: return code = %u\n",rc);
return 1;
}
rc = DosCreateEventSem("\\SEM32\\PIPE\\EXAMPLE", &hev, 0L, 0L);
/* Should check if (rc != NO_ERROR) here... This semaphore is not
always used. */
rc = DosSetNPipeSem(PipeHandle, /* Handle for pipe */
(HSEM) hev, /* Handle of semaphore */
1L); /* Used to distinguish among events */
if (rc != NO_ERROR) {
printf("DosSetNPipeSem error: return code = %u\n",rc);
return 1;
}
printf("Waiting for connection to pipe %s...\n",PipeName);
rc = DosConnectNPipe(PipeHandle);
if (rc != NO_ERROR) {
printf("DosConnectNPipe error: return code = %u\n",rc);
return 1;
}
printf("\nCONNECTED\nWaiting for a message...\n");
rc = DosRead(PipeHandle, /* Handle of pipe */
message, /* Buffer for message read */
sizeof(message), /* Buffer size */
&ulBytes); /* Number of bytes actually read */
if (rc != NO_ERROR) {
printf("DosRead error: return code = %u\n",rc);
return 1;
}
printf("\n\nMessage received was: %s\n\n", message);
strcpy(message, "Thank you for your message!");
rc = DosWrite(PipeHandle, /* Handle of pipe */
message, /* Buffer containing message to write */
strlen(message), /* Length of message */
&ulBytes); /* Number of bytes actually written */
if (rc != NO_ERROR) {
printf("DosWrite error: return code = %u\n",rc);
return 1;
}
rc = DosCloseEventSem(hev);
/* Should check if (rc != NO_ERROR) here... */
rc = DosDisConnectNPipe(PipeHandle);
/* Should check if (rc != NO_ERROR) here... */
return NO_ERROR;
}