|
|
1.1 ! root 1: #include "uucp.h" ! 2: ! 3: #define USAGE "[-xNUM] [-uNUM]" ! 4: ! 5: short Uopt; ! 6: void cleanup(); ! 7: ! 8: void logent(){} /* to load ulockf.c */ ! 9: ! 10: main(argc, argv, envp) ! 11: char *argv[]; ! 12: char **envp; ! 13: { ! 14: register int i; ! 15: ! 16: Uopt = 0; ! 17: Env = envp; ! 18: ! 19: (void) strcpy(Progname, "uusched"); ! 20: while ((i = getopt(argc, argv, "u:x:")) != EOF) { ! 21: switch(i){ ! 22: case 'x': ! 23: Debug = atoi(optarg); ! 24: if (Debug <= 0) ! 25: Debug = 1; ! 26: break; ! 27: case 'u': ! 28: Uopt = atoi(optarg); ! 29: if (Uopt <= 0) ! 30: Uopt = 1; ! 31: break; ! 32: default: ! 33: (void) fprintf(stderr, "\tusage: %s %s\n", ! 34: Progname, USAGE); ! 35: cleanup(1); ! 36: } ! 37: } ! 38: if (argc != optind) { ! 39: (void) fprintf(stderr, "\tusage: %s %s\n", Progname, USAGE); ! 40: cleanup(1); ! 41: } ! 42: if (toomany()) ! 43: cleanup(0); ! 44: if (chdir(SPOOL) < 0) { ! 45: DEBUG(4, "can't chdir to spooldir\n", 0); ! 46: cleanup(101); ! 47: } ! 48: while (work()) ! 49: ; /* keep going till nothing to do */ ! 50: cleanup(0); ! 51: } ! 52: ! 53: /* ! 54: * are there too many uuscheds already? ! 55: */ ! 56: toomany() ! 57: { ! 58: FILE *fp; ! 59: int maxnum; ! 60: char lockname[MAXNAMESIZE]; ! 61: ! 62: if ((fp = fopen(LMTUUSCHED, "r")) == NULL) { ! 63: DEBUG(4, "%s not found\n", LMTUUSCHED); ! 64: return (0); /* assume OK */ ! 65: } ! 66: if (fscanf(fp, "%d", &maxnum) != 1) { ! 67: DEBUG(4, "%s contains nonsense\n", LMTUUSCHED); ! 68: fclose(fp); ! 69: return (0); ! 70: } ! 71: fclose(fp); ! 72: DEBUG(4, "limit %d scheds\n", maxnum); ! 73: while (--maxnum >= 0) { ! 74: sprintf(lockname, "%s.%d", S_LOCK, maxnum); ! 75: if (ulockf(lockname, (time_t)X_LOCKTIME) == 0) { ! 76: DEBUG(4, "grabbed lock %d\n", maxnum); ! 77: return (0); ! 78: } ! 79: } ! 80: DEBUG(4, "too many scheds\n", 0); ! 81: return (1); ! 82: } ! 83: ! 84: /* ! 85: * one pass through the spool directory ! 86: * return nonzero if we did some work ! 87: */ ! 88: work() ! 89: { ! 90: DIR *spool; ! 91: int ndone; ! 92: char ent[NAMESIZE]; ! 93: ! 94: DEBUG(4, "work\n", 0); ! 95: ndone = 0; ! 96: if ((spool = opendir(".")) == NULL) { ! 97: DEBUG(4, "can't opendir .\n", 0); ! 98: cleanup(101); ! 99: } ! 100: while (gnamef(spool, ent) == TRUE) { ! 101: if (strncmp(ent, "LCK.", 4) == 0) ! 102: continue; ! 103: if (!DIRECTORY(ent)) ! 104: continue; ! 105: DEBUG(4, "try %s: ", ent); ! 106: ndone += onework(ent); ! 107: } ! 108: closedir(spool); ! 109: return (ndone); ! 110: } ! 111: ! 112: onework(dir) ! 113: char *dir; ! 114: { ! 115: DIR *dp; ! 116: char file[NAMESIZE]; ! 117: char lockname[MAXNAMESIZE]; ! 118: ! 119: if (callok(dir) != 0) { ! 120: DEBUG(4, "not ok to call\n", 0); ! 121: return (0); ! 122: } ! 123: if ((dp = opendir(dir)) == NULL) { ! 124: DEBUG(4, "can't open\n", 0); ! 125: return (0); ! 126: } ! 127: while (gnamef(dp, file) == TRUE) { ! 128: if (file[0] == CMDPRE && file[1] == '.') { ! 129: DEBUG(4, "found work ...", 0); ! 130: closedir(dp); ! 131: sprintf(lockname, "%s.%s", LOCKPRE, dir); ! 132: if (checkLock(lockname) == FAIL) { ! 133: DEBUG(4, "locked\n", 0); ! 134: return (0); ! 135: } ! 136: DEBUG(4, "call it\n", 0); ! 137: return (exuucico(dir)); ! 138: } ! 139: } ! 140: DEBUG(4, "no work\n", 0); ! 141: closedir(dp); ! 142: return (0); ! 143: } ! 144: ! 145: exuucico(name) ! 146: char *name; ! 147: { ! 148: char cmd[BUFSIZ]; ! 149: int ret; ! 150: char uopt[5]; ! 151: char sopt[BUFSIZ]; ! 152: int pid, rpid; ! 153: ! 154: (void) sprintf(sopt, "-s%s", name); ! 155: if (Uopt) ! 156: (void) sprintf(uopt, "-x%.1d", Uopt); ! 157: ! 158: if ((pid = fork()) == 0) { ! 159: if (Uopt) ! 160: (void) execle(UUCICO, "UucicO", "-r1", uopt, sopt, (char *)0, Env); ! 161: else ! 162: (void) execle(UUCICO, "UucicO", "-r1", sopt, (char *)0, Env); ! 163: ! 164: cleanup(100); ! 165: } ! 166: while ((rpid = wait(&ret)) > 0 && rpid != pid) ! 167: ; ! 168: ! 169: DEBUG(3, "ret=%d, ", ret); ! 170: DEBUG(3, "errno=%d\n", errno); ! 171: return (ret == 0); ! 172: } ! 173: ! 174: ! 175: void ! 176: cleanup(code) ! 177: int code; ! 178: { ! 179: DEBUG(4, "cleanup %d\n", code); ! 180: rmlock(CNULL); ! 181: exit(code); ! 182: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.