home *** CD-ROM | disk | FTP | other *** search
/ GEMini Atari / GEMini_Atari_CD-ROM_Walnut_Creek_December_1993.iso / zip / mint / mntutl95.lzh / MNTUTL95 / PIPE.C < prev    next >
C/C++ Source or Header  |  1993-08-03  |  1KB  |  83 lines

  1. #include "mintbind.h"
  2. #include <process.h>
  3. #include <ctype.h>
  4.  
  5. extern int errno;
  6.  
  7. void
  8. usage()
  9. {
  10.     Cconws("Usage: pipe cmd1 cmd2\r\n");
  11.     Pterm(2);
  12. }
  13.  
  14. main(argc, argv)
  15.     int argc;
  16.     char **argv;
  17. {
  18.     char *cmd1, *cmd2;
  19.     short pipe[2];
  20.     int oldin, oldout;
  21.     long r;
  22.  
  23. #define pipein ((int)pipe[0])
  24. #define pipeout ((int)pipe[1])
  25.  
  26.     if (!(cmd1 = argv[1]) || !(cmd2 = argv[2]))
  27.         usage();
  28.  
  29.     oldin = Fdup(0);
  30.     oldout = Fdup(1);
  31.  
  32.     r = Fpipe(pipe);
  33.     if (r < 0) {
  34.         errno = -r;
  35.         perror("pipe");
  36.         Pterm(2);
  37.     }
  38.  
  39. /* run first part of pipeline */
  40.     Fforce(1, pipeout);
  41.     Fclose(pipeout);
  42.     run(P_NOWAIT, cmd1);
  43.     Fforce(1, oldout);
  44.  
  45. /* run last part of pipeline */
  46.     Fforce(0, pipein);
  47.     Fclose(pipein);
  48.     _exit(run(P_OVERLAY, cmd2));
  49. }
  50.  
  51. #define MAX_ARGS 64
  52.  
  53. int
  54. run(mode, cmd)
  55.     int mode;
  56.     char *cmd;
  57. {
  58.     char *argv[MAX_ARGS];
  59.     int argc = 0;
  60.     char *s;
  61.     long r;
  62.  
  63.     for (s = cmd; *s;) {
  64.         while(*s && isspace(*s)) s++;
  65.         if (!*s) break;
  66.         argv[argc++] = s;
  67.         while(*s && !isspace(*s)) s++;
  68.         if (*s) *s++ = 0;
  69.     }
  70.  
  71.     if (argc == 0) {
  72.         usage();
  73.     }
  74.  
  75.     argv[argc] = 0;
  76.  
  77.     r = spawnvp(mode, argv[0], argv);
  78.     if (r < 0) {
  79.         perror(argv[0]);
  80.         exit(1);
  81.     }
  82. }
  83.