Annotation of 3BSD/cmd/uucp/anlwrk.c, revision 1.1.1.1

1.1       root        1:        /*  anlwrk 2.1  5/22/79  09:59:09  */
                      2: #include "uucp.h"
                      3: #include <sys/types.h>
                      4: #include <sys/stat.h>
                      5: 
                      6: static char SiD[] = "@(#)anlwrk        2.1";
                      7: 
                      8: 
                      9: #define LLEN 20
                     10: #define SAME 0
                     11: 
                     12: /*******
                     13:  *     anlwrk(file, wvec)      create a vector of command arguments
                     14:  *     char *file, **wvec;
                     15:  *
                     16:  *     return codes:
                     17:  *             0  -  no more work in this file
                     18:  *             positive number  -  number of arguments
                     19:  */
                     20: 
                     21: anlwrk(file, wvec)
                     22: char *file, **wvec;
                     23: {
                     24:        static char str[BUFSIZ];
                     25:        static FILE *fp = NULL;
                     26: 
                     27:        if (file[0] == '\0')
                     28:                return(0);
                     29:        if (fp == NULL) {
                     30:                fp = fopen(file, "r");
                     31:                if (fp == NULL)
                     32:                        return(0);
                     33:        }
                     34: 
                     35:        if (fgets(str, BUFSIZ, fp) == NULL) {
                     36:                fclose(fp);
                     37:                unlink(file);
                     38:                file[0] = '\0';
                     39:                fp = NULL;
                     40:                return(0);
                     41:        }
                     42: 
                     43:        return(getargs(str, wvec));
                     44: }
                     45: 
                     46: 
                     47: /***
                     48:  *     iswrk(file, reqst, dir, pre)
                     49:  *     char *file, *reqst, *dir, *pre;
                     50:  *
                     51:  *     iswrk  -  this routine will check the work list (list).
                     52:  *     If it is empty or the present work is exhausted, it
                     53:  *     will call gtwrk to generate a new list.
                     54:  *     The "reqst" field will be the string "chk" or "get" to
                     55:  *     check for work, or get the next work file respectively.
                     56:  *
                     57:  *     return codes:
                     58:  *             0  -  no more work (or some error)
                     59:  *             1  -  there is work
                     60:  */
                     61: 
                     62: iswrk(file, reqst, dir, pre)
                     63: char *file, *reqst, *dir, *pre;
                     64: {
                     65:        static char **listp, *list[LLEN];
                     66: 
                     67:        if (listp == NULL || *listp == NULL || listp > (list + LLEN)
                     68:          || !prefix(pre, *listp)) {
                     69:                int i;
                     70:                for (i = 0, listp = list; i < LLEN; i++) {
                     71:                        if (*listp != NULL)
                     72:                                free(*listp);
                     73:                        *listp++ = NULL;
                     74:                }
                     75:                if (gtwrk(dir, pre, listp = list, LLEN) != 0)
                     76:                        /* alloc error */
                     77:                        return(0);
                     78:        }
                     79: 
                     80:        if (*listp == NULL)
                     81:                return(0);
                     82: 
                     83:        if (strcmp(reqst, "get") == SAME)
                     84:                sprintf(file, "%s/%s", dir, *listp++);
                     85:        return(1);
                     86: }
                     87: 
                     88: 
                     89: /***
                     90:  *     gtwvec(file, dir, wkpre, wrkvec)        get work vector 
                     91:  *     char *file, *dir, *wkpre, **wrkvec;
                     92:  *
                     93:  *     return codes:
                     94:  *             positive number  -  number of arguments
                     95:  *             0 -  no arguments - fail
                     96:  */
                     97: 
                     98: gtwvec(file, dir, wkpre, wrkvec)
                     99: char *file, *dir, *wkpre, **wrkvec;
                    100: {
                    101:        int nargs;
                    102: 
                    103:        while ((nargs = anlwrk(file, wrkvec)) == 0) {
                    104:                if (!iswrk(file, "get", dir, wkpre))
                    105:                        return(0);
                    106:        }
                    107:        return(nargs);
                    108: }
                    109: 
                    110: 
                    111: /***
                    112:  *     gtwrk(dir, pre, list, llen)
                    113:  *     char *dir, *pre, **list;
                    114:  *     int llen;
                    115:  *
                    116:  *     gtwrk  -  this routine will build a sorted list
                    117:  *     of files in a directory.
                    118:  *     "dir" is the directory name to search for file names
                    119:  *     beginning with the prefix (pre).
                    120:  *     "list" is the pointer to the list and "llen" is the
                    121:  *     length of the list.
                    122:  *
                    123:  *     return codes:  0  |  FAIL
                    124:  */
                    125: 
                    126: gtwrk(dir, pre, list, llen)
                    127: char *dir, *pre, **list;
                    128: int llen;
                    129: {
                    130:        struct stat s;
                    131:        char filename[NAMESIZE], *p;
                    132:        char **first, **last;
                    133:        FILE *pdir;
                    134:        extern int compar();
                    135:        extern char *calloc();
                    136: 
                    137:        first = last = list;
                    138:        if ((pdir = fopen(dir, "r")) == NULL)
                    139:                return(FAIL);
                    140:        while (gnamef(pdir, filename) && (last - first) < llen) {
                    141:                if (!prefix(pre, filename))
                    142:                        continue;
                    143:                if (stat(filename, &s) == -1)
                    144:                        continue;
                    145:                if ((s.st_mode & ANYREAD) == 0)
                    146:                        continue;
                    147:                if ((p = calloc(strlen(filename) + 1, sizeof (char))) == NULL)
                    148:                        return(FAIL);
                    149: 
                    150:                strcpy(p, filename);
                    151:                *last++ = p;
                    152:        }
                    153: 
                    154:        fclose(pdir);
                    155:        qsort(first, last - first, sizeof *last, compar);
                    156:        return(0);
                    157: }
                    158: 
                    159: 
                    160: /***
                    161:  *     compar(p1, p2)
                    162:  *     char **p1, **p2;
                    163:  *
                    164:  *     compar  -  this routine is used by qsort.
                    165:  *
                    166:  */
                    167: 
                    168: compar(p1, p2)
                    169: char **p1, **p2;
                    170: {
                    171:        return(strcmp(*p1, *p2));
                    172: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.