|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.