home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 11 Util / 11-Util.zip / doscall.zip / dospawn.c < prev   
C/C++ Source or Header  |  2000-10-15  |  1KB  |  51 lines

  1. #include <stdlib.h>
  2. #include <string.h>
  3. #include <stdio.h>
  4. #include <io.h>
  5. #include <fcntl.h>
  6. #include <process.h>
  7.  
  8. static    char      Buf[ 500 ];
  9.  
  10. int  main( int argc, char *argv[] )
  11. {
  12.      int  n,   pipe;
  13.      char *p = argv[ 1 ];
  14.  
  15.      if ( argc != 2 | strlen( p ) != 18 )
  16.      {
  17.           fprintf( stderr, "\nstart %s in OS/2", argv[0] );
  18.           return 1;
  19.      }
  20.  
  21.      for ( n = 0; n < 3; ++n )
  22.      {
  23.           *( p + 17 ) = n + '0';
  24.           if ( n )
  25.                pipe = open( p, O_BINARY | O_WRONLY );
  26.           else pipe = open( p, O_BINARY | O_RDONLY );
  27.  
  28.           if ( dup2( pipe, n ) == -1 ) abort();
  29.      }
  30.  
  31.      for ( n = 3; n <= pipe; ++n ) close( n );
  32.  
  33.      if ( read( 0, &n,  2 ) != 2 || n <= 0 || sizeof Buf <= n
  34.      ||   read( 0, Buf, n ) != n
  35.      ||   NULL == ( p = strtok( Buf, " \t" )))
  36.      {
  37.           sprintf( Buf, "\nunexpected arg.s (%d)", n );
  38.           write( 2, Buf, strlen( Buf ));     n = -2;
  39.      }
  40.      else n = spawnlp( P_WAIT, p, p, strtok( NULL, "" ), NULL );
  41.  
  42.      if ( n == -1 )
  43.      {
  44.           strcat( strcat( p, ": " ), strerror( errno ));
  45.           write( 2, p, strlen( p ));    n = errno;
  46.      }
  47.  
  48.      Buf[ 0 ] = 0;            Buf[ 1 ] = n;
  49.      write( 2, Buf, 2 );      return n;
  50. }
  51.