home *** CD-ROM | disk | FTP | other *** search
/ gdead.berkeley.edu / gdead.berkeley.edu.tar / gdead.berkeley.edu / pub / cad-tools / ciftomann.tar / driver_dir / call.c next >
C/C++ Source or Header  |  1988-01-28  |  2KB  |  113 lines

  1. /*
  2.  * call a program
  3.  *
  4.  * Four entries:
  5.  *
  6.  *    call, callv    - call a program and wait for it, returning status
  7.  *    back, backv    - call a program and don't wait, returning process id
  8.  *
  9.  * The command's standard input, output and error are passed as FILE *'s.
  10.  */
  11.  
  12. #include <stdio.h>
  13. #include "string.h"
  14.  
  15. #define nil(type) ((type) 0)
  16.  
  17. #define local    static
  18.  
  19. #define MAXNARGS 100    /* unchecked upper limit on max num of arguments */
  20. #define BADEXEC 127    /* exec fails */
  21.  
  22. #define ischild(pid)    ((pid) == 0)
  23.  
  24. /*VARARGS3*/
  25. int call(name, in, out, err, args)
  26. string name;
  27. FILE *in;
  28. FILE *out;
  29. FILE *err;
  30. string args;
  31. {
  32.     register string *ap, *argp;
  33.     string argv[MAXNARGS];
  34.  
  35.     argp = &argv[0];
  36.     *argp++ = name;
  37.     ap = &args;
  38.     while (*ap != nil(string)) {
  39.         *argp++ = *ap++;
  40.     }
  41.     *argp = nil(string);
  42.     return(callv(name, in, out, err, argv));
  43. }
  44.  
  45. /*VARARGS3*/
  46. int back(name, in, out, err, args)
  47. string name;
  48. FILE *in;
  49. FILE *out;
  50. FILE *err;
  51. string args;
  52. {
  53.     register string *ap, *argp;
  54.     string argv[MAXNARGS];
  55.  
  56.     argp = &argv[0];
  57.     *argp++ = name;
  58.     ap = &args;
  59.     while (*ap != nil(string)) {
  60.         *argp++ = *ap++;
  61.     }
  62.     *argp = nil(string);
  63.     return(backv(name, in, out, err, argv));
  64. }
  65.  
  66. int callv(name, in, out, err, argv)
  67. string name;
  68. FILE *in;
  69. FILE *out;
  70. FILE *err;
  71. string *argv;
  72. {
  73.     int pid, status;
  74.  
  75.     pid = backv(name, in, out, err, argv);
  76.     pwait(pid, &status);
  77.     return(status);
  78. }
  79.  
  80. int backv(name, in, out, err, argv)
  81. string name;
  82. FILE *in;
  83. FILE *out;
  84. FILE *err;
  85. string *argv;
  86. {
  87.     int pid;
  88.  
  89.     if (ischild(pid = fork())) {
  90.         fswap(0, fileno(in));
  91.         fswap(1, fileno(out));
  92.         fswap(2, fileno(err));
  93.         execvp(name, argv);
  94.         exit(BADEXEC);
  95.     }
  96.     return(pid);
  97. }
  98.  
  99. /*
  100.  * Swap file numbers so as to redirect standard input, output and error.
  101.  */
  102.  
  103. local fswap(oldfd, newfd)
  104. int oldfd;
  105. int newfd;
  106. {
  107.     if (oldfd != newfd) {
  108.         close(oldfd);
  109.         dup(newfd);
  110.         close(newfd);
  111.     }
  112. }
  113.