From: kcc056@tijc02.uucp (Karen Bench)
Subject: Re: Talking to a DOS box from OS/2 2.0
Organization: Siemens Industrial Automation, Johnson City TN
Distribution: net
Date: Mon, 28 Sep 92 05:27:36 GMT



>>>> From: dmm@vnet.ibm.com (Dave Mooney)
>>>> Subject: Re: Talking to a DOS box from OS/2 2.0
>>>> Lines: 18
>>>> 
>>>> In <589@ddbeezer.Dundee.NCR.COM> Tim Craig writes:
>>>> > Can someone who has digested the wads of OS/2 2.0 doc please inform me
>>>> > if there is any method of communicating between an OS/2 process and
>>>> > something in a DOS box. I know this can be done via the clipboard but I
>>>> > was hoping for something a little more flexible (along the lines of pipes
>>>> > or even DDE as is possible between Windows and OS/2). Any ideas, pointers
>>>> > or references?
>>>> 
>>>> Create a named pipe on the OS/2 side, open up this pipe as a normal file
>>>> on the DOS side, and use the usual DOS I/O functions to read and write
>>>> this pipe.
>>>> 
>>>> dave
>>>> 
>>>> -------------------------------------------------------------------------
>>>> Dave Mooney                                              dmm@vnet.ibm.com
>>>>  C Set/2 Development, IBM Canada Lab, 844 Don Mills Rd, Toronto, Ontario

  I have been trying to do this too and have not been
  completly successful. I can read chars in the dos box that have 
  been put in the named pipe as long as there are chars to read but 
  HOW DO I TELL WHEN there are characters available. When the 
  dos program goes to read the pipe and there are no chars available
  to read, the dos program waits (blocks?) for them to become available,
  but in my application they won't become for some period of time, and
  I can't just sit there and wait. I have tried feof, bits in the file 
  handle, ioctl function call and they don't indicate if there are
  bytes to read. I am using the NO_WAIT option and byte pipe mode 
  on the  os/2 pipe open which I thought should make the fgetc in the
  dos task return when no chars are there.
 
  If anyone knows how to do this please mail me.
  Thanks

  Here is the code I am using.

/* os/2 part compile with ibm c 1.0 as follows: icc pipeos2.c */
#define INCL_DOS
#define INCL_DOSNMPIPES
/* includes and variables */
#include <os2.h>
#include <stdlib.h>
#include <string.h>

  HPIPE  Handle;
  ULONG  outbuffer, inbuffer, timeout, BytesToWrite, BytesWriten;
  USHORT rc;

  ULONG BytesWriten;

  char  temp_buf[25];


main(argc, argv, envp)
int argc;
char *argv[];
char *envp[];
{

    outbuffer = 5000;
    inbuffer = 5000;
    timeout = 0;
    rc = DosCreateNPipe("\\PIPE\\TWO",    /* create pipe */
             &Handle,
             NP_WRITEBEHIND | /* was set to nowritebehind */
               NP_INHERIT | 
               NP_ACCESS_DUPLEX,
               NP_NOWAIT | 
               NP_TYPE_BYTE |
               NP_READMODE_BYTE |
             1, /* only 1 of this pipe */
             outbuffer,
             inbuffer,
             timeout);

    printf("Return from DosCreateNPipe=%d\n", rc);

    do 
    {
        rc = DosConnectNPipe(Handle);
    }while (rc != 0);

    printf("Msdos task connected to Pipe two\n");

    
    temp_buf[0] = 't';
    temp_buf[1] = 'e';
    temp_buf[2] = 's';
    temp_buf[3] = 't';
    BytesToWrite = 4;
    rc = DosWrite(Handle,
          (PVOID)temp_buf,
          BytesToWrite,
          &BytesWriten);

    printf("Return from DosWrite=%d  BytesWriten=%ld\n", rc, BytesWriten);
    /* sit here and spin, msdos task will try to read pipe contents */
    while(1)
        ;

}
   
   
  
/* The dos part ===================================================== */
/* msdos part compile with BorlandC 3.x as follows: bcc dos1.c */

#include <stdio.h>    /* for fopen, printf */
#include <process.h>  /* for exit */
#include <dos.h>      /* for delay */

int ch1, ch2, ch3, ch4, ch5;
FILE *pipe_handle;
void main()
{
    pipe_handle = fopen("\\PIPE\\TWO", "rb");
    if(pipe_handle)
        printf("Msdos open of pipe TWO ok\n");
    else
    {
        printf("Couldn't open pipe \n");
        exit(0);
    }

    delay(2000); /* 2 second delay to allow time for os/2 task to */
                 /* write pipe */

    ch1 = fgetc(pipe_handle);
    printf("ch1=%c\n", ch1);
    ch2 = fgetc(pipe_handle);
    printf("ch2=%c\n", ch2);
    ch3 = fgetc(pipe_handle);
    printf("ch3=%c\n", ch3);
    ch4 = fgetc(pipe_handle);
    printf("ch4=%c\n", ch4);

    printf("before ch5 = fgetc(pipe_handle\n");
    /* !!!!!!!!!!!!   hangs here !!!!!!!!!!!!!!!!!!!!!! */
    /* stop the os2 task that handles the pipe and the  */
    /* next line will complete with an error */
    ch5 = fgetc(pipe_handle);
    printf("after ch5 = fgetc(pipe_handle\n");
    printf("ch5=%d\n", ch5);


}