|
|
1.1 ! root 1: #ifndef lint ! 2: static char sccsid[] = "@(#)anlwrk.c 5.5 (Berkeley) 6/19/85"; ! 3: #endif ! 4: ! 5: #include "uucp.h" ! 6: #include <sys/stat.h> ! 7: #include "uust.h" ! 8: #ifdef NDIR ! 9: #include "ndir.h" ! 10: #else ! 11: #include <sys/dir.h> ! 12: #endif ! 13: #include <ctype.h> ! 14: ! 15: #define TLIMIT (5*60L) ! 16: #define NITEMS(X) (sizeof (X) / sizeof ((X)[0])) ! 17: ! 18: int Nfiles = 0; ! 19: char Filent[LLEN][NAMESIZE]; ! 20: long fseek(), ftell(); ! 21: extern int TransferSucceeded; ! 22: ! 23: /*LINTLIBRARY*/ ! 24: ! 25: /* ! 26: * create a vector of command arguments ! 27: * ! 28: * return codes: ! 29: * 0 - no more work in this file ! 30: * positive number - number of arguments ! 31: */ ! 32: ! 33: /* LOCAL only */ ! 34: int ! 35: anlwrk(file, wvec) ! 36: register char *file, **wvec; ! 37: { ! 38: static char str[MAXRQST], nstr[MAXRQST], lastfile[MAXFULLNAME] = ""; ! 39: static FILE *fp = NULL; ! 40: static long nextread, nextwrite; ! 41: ! 42: /* ! 43: * If called with a null string, force a shutdown ! 44: * of the current work file. ! 45: */ ! 46: if (file[0] == '\0') { ! 47: if (fp != NULL) ! 48: fclose (fp); ! 49: fp = NULL; ! 50: return 0; ! 51: } ! 52: if (fp == NULL) { ! 53: if (strncmp(file, lastfile, MAXFULLNAME) == 0) { ! 54: DEBUG(5,"Workfilename repeated: %s\n", file); ! 55: return 0; ! 56: } ! 57: strncpy(lastfile, file, MAXFULLNAME); ! 58: fp = fopen(subfile(file), "r+w"); ! 59: if (fp == NULL) { ! 60: char *bnp, rqstr[MAXFULLNAME]; ! 61: bnp = rindex(file, '/'); ! 62: sprintf(rqstr, "%s/%s", CORRUPT, bnp ? bnp + 1 : file); ! 63: xmv(file, rqstr); ! 64: logent(subfile(file), "CMD FILE UNREADABLE"); ! 65: unlink(subfile(file)); ! 66: return 0; ! 67: } ! 68: Usrf = 0; ! 69: nstr[0] = '\0'; ! 70: nextread = nextwrite = 0L; ! 71: } ! 72: ! 73: if (nstr[0] != '\0' && TransferSucceeded) { ! 74: fseek(fp, nextwrite, 0); ! 75: fputs(nstr, fp); ! 76: fseek(fp, nextread, 0); ! 77: } ! 78: ! 79: do { ! 80: nextwrite = ftell(fp); ! 81: if (fgets(str, MAXRQST, fp) == NULL) { ! 82: fclose(fp); ! 83: if (TransferSucceeded) ! 84: unlink(subfile(file)); ! 85: USRF(USR_COMP); ! 86: US_RRS(file, Usrf); ! 87: Usrf = 0; ! 88: file[0] = '\0'; ! 89: nstr[0] = '\0'; ! 90: fp = NULL; ! 91: return 0; ! 92: } ! 93: } while (!isupper(str[0])); ! 94: ! 95: nextread = ftell(fp); ! 96: strncpy(nstr, str, MAXRQST); ! 97: nstr[0] = tolower(nstr[0]); ! 98: return getargs(str, wvec, 20); ! 99: } ! 100: ! 101: ! 102: /* ! 103: * build list of work files for given system ! 104: * ! 105: * return value - 1 if work was found, else 0 ! 106: * ! 107: */ ! 108: ! 109: /* LOCAL only */ ! 110: int ! 111: bldflst (reqst, dir, pre) ! 112: char *reqst; ! 113: register char *dir, *pre; ! 114: { ! 115: static DIR *dirp = NULL; ! 116: register nfound; ! 117: char filename[NAMESIZE]; ! 118: int plen = strlen (pre); ! 119: int flen; ! 120: extern char MaxGrade; ! 121: ! 122: if (dirp == NULL) { ! 123: if ((dirp = opendir(subdir(dir,pre[0]))) == NULL) { ! 124: DEBUG(1,"opendir(%s) FAILS\n",subdir(dir,pre[0])); ! 125: return 0; ! 126: } ! 127: } ! 128: else ! 129: rewinddir(dirp); ! 130: for (nfound = 0, Nfiles = 0; gnamef(dirp, filename);) { ! 131: /* Check for two systems with the same prefix. ! 132: * Magic number "5" is 1 for "grade" character plus ! 133: * 4 for sequence number. The point here is to not ! 134: * send work for a system which has as a prefix the ! 135: * name of the system called for. ! 136: * Special case: prefix "X." does not do this check ! 137: * so uuxqt can use bldflst. ! 138: */ ! 139: flen = strlen(filename); ! 140: if (!prefix(pre, filename) || (plen != 2 && flen-plen != 5)) { ! 141: DEBUG(99,"bldflst rejects %s\n",filename); ! 142: continue; ! 143: } ! 144: if (filename[flen-5] > MaxGrade ) { ! 145: DEBUG(8,"bldflst rejects %s, grade too low\n",filename); ! 146: continue; ! 147: } ! 148: nfound++; ! 149: if (*reqst == 'c') ! 150: return 1; ! 151: entflst(filename); ! 152: } ! 153: return nfound? 1: 0; ! 154: } ! 155: ! 156: /* ! 157: * put new name if list is not full or new name is less than the MAX ! 158: * now in the list. ! 159: * ! 160: */ ! 161: ! 162: /* LOCAL only */ ! 163: int ! 164: entflst(file) ! 165: register char *file; ! 166: { ! 167: register int i; ! 168: ! 169: /* locate position for the new file and make room for it */ ! 170: for (i = Nfiles; i > 0; i--) { ! 171: if (pcompar(file, Filent[i-1]) <= 0) ! 172: break; ! 173: if (i <LLEN) ! 174: strcpy(Filent[i], Filent[i-1]); ! 175: } ! 176: ! 177: /* add new file (if there is room), and increase Nfiles if need be */ ! 178: if (i < LLEN) { ! 179: strcpy(Filent[i], file); ! 180: if (Nfiles < LLEN) ! 181: Nfiles++; ! 182: } ! 183: } ! 184: ! 185: /* ! 186: Compare priority of filenames p1 and p2. Return: ! 187: * < 0 if p1 "has lower priority than" p2. ! 188: * = 0 if p1 "has priority equal to" p2. ! 189: * > 0 if p1 "has greater priority than" p2. ! 190: * Priority: ! 191: * lower grade wins. ! 192: * lower sequence number wins (unless wrap-around is suspected). ! 193: * ! 194: */ ! 195: /* LOCAL only */ ! 196: int ! 197: pcompar(p1, p2) ! 198: register char *p1, *p2; ! 199: { ! 200: register int rc; ! 201: ! 202: /* assert: strlen(p1) and strlen(p2) are >= 5 */ ! 203: p1 += strlen(p1)-5; ! 204: p2 += strlen(p2)-5; ! 205: /* check 'grade' */ ! 206: if (rc = *p2++ - *p1++) ! 207: return rc; ! 208: /* check for sequence wrap-around */ ! 209: if (rc = *p2++ - *p1++) ! 210: if (rc < -10 || rc > 10) ! 211: return -rc; ! 212: else ! 213: return rc; ! 214: /* check remaining digits */ ! 215: return strcmp(p2, p1); ! 216: } ! 217: ! 218: /* ! 219: * get next work file ! 220: * ! 221: * return value: ! 222: * ! 223: * 0 - No file gotten ! 224: * 1 - File successfully gotten. ! 225: * ! 226: */ ! 227: ! 228: /* LOCAL only */ ! 229: gtwrkf(dir, file) ! 230: char *file, *dir; ! 231: { ! 232: register int i; ! 233: ! 234: if (Nfiles-- <= 0) { ! 235: Nfiles = 0; ! 236: return 0; ! 237: } ! 238: sprintf(file, "%s/%s", dir, Filent[0]); ! 239: for (i=0; i<Nfiles;i++) ! 240: strcpy(Filent[i], Filent[i+1]); ! 241: return 1; ! 242: } ! 243: ! 244: /* ! 245: * get work vector ! 246: * ! 247: * return codes: ! 248: * positive number - number of arguments ! 249: * 0 - no arguments - fail ! 250: */ ! 251: ! 252: /* EXTERNALLY CALLED */ ! 253: int ! 254: gtwvec(file, dir, wkpre, wrkvec) ! 255: char *dir, *wkpre, **wrkvec; ! 256: register char *file; ! 257: { ! 258: register int nargs, n; ! 259: ! 260: n = 0; ! 261: while ((nargs = anlwrk(file, wrkvec)) == 0) { ! 262: if (++n > 3 || !iswrk(file, "get", dir, wkpre)) ! 263: return 0; ! 264: } ! 265: return nargs; ! 266: } ! 267: ! 268: /* ! 269: * iswrk - this routine will check the work list (list). ! 270: * If it is empty or the present work is exhausted, it ! 271: * will call bldflst to generate a new list. ! 272: * The "reqst" field will be the string "chk" or "get" to ! 273: * check for work, or get the next work file respectively. ! 274: * ! 275: * return codes: ! 276: * 0 - no more work (or some error) ! 277: * 1 - there is work ! 278: * ! 279: */ ! 280: ! 281: /* EXTERNALLY CALLED */ ! 282: int ! 283: iswrk(file, reqst, dir, pre) ! 284: register char *file, *reqst, *dir, *pre; ! 285: { ! 286: static char *lastpre = 0; ! 287: register ret; ! 288: ! 289: /* Starting new system; re-init */ ! 290: if (lastpre == 0 || strcmp(lastpre,pre) != 0) { ! 291: anlwrk ("", (char **)0); /* Force close of work file */ ! 292: ! 293: /* Save last worked-on prefix */ ! 294: if (lastpre != 0) ! 295: free (lastpre); ! 296: lastpre = malloc((unsigned)(strlen(pre)+1)); ! 297: strcpy (lastpre, pre); ! 298: ! 299: /* Set the external indexes properly ! 300: */ ! 301: Nfiles = 0; ! 302: } ! 303: ! 304: /* If the list is empty or new files have entered ! 305: * the spool area, call "bldflst" to read ! 306: * some file names into it. Because names can ! 307: * be put in the list that later turn out to ! 308: * be unusable (from "gtwrkf"), this operation ! 309: * continues until either "bldflst" can't find ! 310: * any new files, or "gtwrkf" signals success. ! 311: */ ! 312: for (;;) { ! 313: ret = 0; ! 314: if (Nfiles <= 0 || newspool((time_t)TLIMIT)) { ! 315: ret = bldflst (reqst, dir, pre); ! 316: DEBUG(99,"bldflst returns %d\n",ret); ! 317: } ! 318: ! 319: /* If they only wanted to check, return ! 320: * boolean list not empty. NB: the list ! 321: * will be forcibly emptied as soon as ! 322: * a new system name is mentioned. ! 323: */ ! 324: if (*reqst == 'c') ! 325: return ret; ! 326: ! 327: if (Nfiles <= 0) ! 328: return 0; ! 329: ! 330: if (gtwrkf(dir, file)) ! 331: return 1; ! 332: } ! 333: } ! 334: ! 335: /* Return non-zero if there is new work in the spool ! 336: * area since last check. Assumes that if the sequence ! 337: * file has been modified, there is new work. This is ! 338: * not absolutely correct, but should be close enough. ! 339: * Only checks every <limit> seconds at most. Called ! 340: * from "iswrk()" when a new work file is requested. ! 341: */ ! 342: /* LOCAL only */ ! 343: int ! 344: newspool(limit) ! 345: time_t limit; ! 346: { ! 347: static time_t lastcheck = 0, lastmod = 0; ! 348: time_t check; ! 349: struct stat mod; ! 350: register int ret = 0; ! 351: ! 352: /* (void) */ time (&check); ! 353: if (check - lastcheck > limit || lastcheck - check > limit) { ! 354: mod.st_mtime = 0; ! 355: /* (void) */ stat (SEQFILE, &mod); ! 356: if (mod.st_mtime != lastmod) ! 357: ret = 1; ! 358: lastmod = mod.st_mtime; ! 359: } ! 360: lastcheck = check; ! 361: return ret; ! 362: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.