home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / unix / volume11 / musbus / part02 / getwork.c < prev   
Encoding:
C/C++ Source or Header  |  1987-09-16  |  3.8 KB  |  190 lines

  1. #include "makework.h"
  2. #ifndef lint
  3. static char RCSid[] = "$Header: getwork.c,v 1.3 87/06/23 17:01:47 kjmcdonell Beta $";
  4. #endif
  5.  
  6. /*
  7.  * Build data structures (work[0] ... work[want-1]) for the next set
  8.  * of job streams.
  9.  */
  10.  
  11. stream work[MAXSTREAM];
  12.  
  13. typedef struct st_cmd {
  14.     char    *name;        /* pathname of the command */
  15.     char    **argv;        /* command argv[] vector */
  16.     struct st_cmd    *next;
  17. } cmd;
  18.  
  19. typedef struct st_scr {
  20.     char    *name;        /* name of the script file */
  21.     char    *buf;        /* the text of the script */
  22.     int        blen;        /* size of buf[] */
  23.     struct st_scr    *next;
  24. } scr;
  25.  
  26. static cmd    *cmd_head = (cmd *)0, *cmdp;
  27. static scr    *scr_head = (scr *)0, *scrp;
  28.  
  29. getwork(want)
  30. int    want;
  31. {
  32.     int        i;
  33.     int        f;
  34.     int        ac;
  35.     char    *lp;
  36.     char    *q;
  37.     stream    *w;
  38.     char    line[512];
  39.     char    c;
  40.     int        nwork = 0;
  41.     int        new;
  42.     char    *malloc(), *realloc();
  43.  
  44.     while (nwork < want) {
  45.     if (gets(line) == NULL) {
  46.         fprintf(stderr, "Insufficient job streams in the workload file\n");
  47.         fflush(stderr);
  48.         exit(4);
  49.     }
  50.     if (nwork >= MAXSTREAM) {
  51.         fprintf(stderr, "makework: internal snark -- code is broken!\n");
  52.         fflush(stderr);
  53.         exit(4);
  54.     }
  55.     w = &work[nwork];
  56.     q = lp = line;
  57.     i = 1;
  58.     while (*q && *q != ' ') {
  59.         i++;
  60.         q++;
  61.     }
  62.     *q = '\0';
  63.     if (w->home != (char *)0)
  64.         free(w->home);
  65.     w->home = (char *)malloc(strlen(lp)+1);
  66.     strcpy(w->home, lp);
  67.  
  68.     lp = ++q;
  69.     i = 1;
  70.     while (*q && *q != ' ') {
  71.         i++;
  72.         q++;
  73.     }
  74.     *q++ = '\0';
  75.     new = 0;
  76.     for (cmdp = cmd_head; cmdp != (cmd *)0; cmdp = cmdp->next) {
  77.         if (strcmp(cmdp->name, lp) == 0)
  78.         break;
  79.     }
  80.     if (cmdp == (cmd *)0) {
  81.         cmdp = (cmd *)malloc(sizeof(*cmdp));
  82.         cmdp->next = cmd_head;
  83.         cmd_head = cmdp;
  84.         cmdp->name = (char *)malloc(strlen(lp)+1);
  85.         strcpy(cmdp->name, lp);
  86.         new = 1;
  87.         lp = q;
  88.         /* start to build arg list */
  89.         ac = 2;
  90.         cmdp->argv = (char **)malloc(2*sizeof(char *));
  91.         q = cmdp->name;
  92.         while (*q) q++;
  93.         q--;
  94.         while (q >= cmdp->name) {
  95.         if (*q == '/') {
  96.             q++;
  97.             break;
  98.         }
  99.         q--;
  100.         }
  101.         cmdp->argv[0] = q;
  102.     }
  103.     else
  104.         lp = q;
  105.     w->cmd = cmdp->name;
  106.     w->av = cmdp->argv;
  107.     w->blen = 0;
  108.     w->buf = "";
  109.     w->tty = "";
  110.  
  111.     while (*lp) {
  112.         if (*lp == ' ') {
  113.         /* space */
  114.         lp++;
  115.         continue;
  116.         }
  117.         else if (*lp == '>') {
  118.         /* standard output for this job */
  119.         q = ++lp;
  120.         while (*q && *q != ' ')
  121.             q++;
  122.         c = *q;
  123.         *q = '\0';
  124.         if (w->tty != (char *)0)
  125.             free(w->tty);
  126.         w->tty = (char *)malloc(strlen(lp)+1);
  127.         strcpy(w->tty, lp);
  128.         *q = c;
  129.         lp = q;
  130.         }
  131.         else if (*lp == '<') {
  132.         /* standard input for this job */
  133.         q = ++lp;
  134.         while (*q && *q != ' ') q++;
  135.         c = *q;
  136.         *q = '\0';
  137.         for (scrp = scr_head; scrp != (scr *)0; scrp = scrp->next) {
  138.             if (strcmp(scrp->name, lp) == 0)
  139.             break;
  140.         }
  141.         if (scrp == (scr *)0) {
  142.             scrp = (scr *)malloc(sizeof(*scrp));
  143.             scrp->next = scr_head;
  144.             scr_head = scrp;
  145.             scrp->name = (char *)malloc(strlen(lp)+1);
  146.             strcpy(scrp->name, lp);
  147.             if ((f = open(lp, 0)) == -1) {
  148.             fprintf(stderr, "cannot open input file \"%s\"\n", lp);
  149.             fflush(stderr);
  150.             exit(4);
  151.             }
  152.             /* gobble input */
  153.             scrp->buf = (char *)malloc(512);
  154.             while ((i = read(f, &scrp->buf[scrp->blen], 512)) > 0) {
  155.             scrp->blen += i;
  156.             scrp->buf = (char *)realloc(scrp->buf, scrp->blen+512);
  157.             }
  158.             scrp->buf = (char *)realloc(scrp->buf, scrp->blen);
  159.             close(f);
  160.         }
  161.         w->buf = scrp->buf;
  162.         w->blen = scrp->blen;
  163.         *q = c;
  164.         lp = q;
  165.         }
  166.         else {
  167.         /* a command option */
  168.         q = lp;
  169.         i = 1;
  170.         while (*q && *q != ' ') {
  171.             q++;
  172.             i++;
  173.         }
  174.         if (new) {
  175.             ac++;
  176.             cmdp->argv = (char **)realloc(cmdp->argv, ac*sizeof(char *));
  177.             cmdp->argv[ac-2] = (char *)malloc(i);
  178.             strncpy(cmdp->argv[ac-2], lp, i-1);
  179.             cmdp->argv[ac-2][i-1] = '\0';
  180.         }
  181.         lp = q;
  182.         }
  183.     }
  184.     if (new)
  185.         cmdp->argv[ac-1] = (char *)0;
  186.         w->av = cmdp->argv;
  187.     nwork++;
  188.     }
  189. }
  190.