|
|
1.1 ! root 1: #ifndef lint ! 2: static char sccsid[] = "@(#)uusnap.c 5.7 (Berkeley) 10/9/85"; ! 3: #endif ! 4: ! 5: /* ! 6: * Uusnap - displays a snapshot of the uucp system. ! 7: * originally by RJKing WECo-MG6565 May 83 ! 8: */ ! 9: ! 10: #include "uucp.h" ! 11: #include <sys/stat.h> ! 12: #ifdef NDIR ! 13: #include "ndir.h" ! 14: #else ! 15: #include <sys/dir.h> ! 16: #endif ! 17: #include <ctype.h> ! 18: ! 19: #ifndef SYSBUF ! 20: char SYSBUF[BUFSIZ]; ! 21: #endif ! 22: ! 23: #define NSYSTEM 100 /* max # of systems queued */ ! 24: ! 25: #define CMDSLEN 5 /* Length of trailer */ ! 26: #define DATALEN 5 /* Length of trailer */ ! 27: #define XEQTLEN 5 /* Length of trailer */ ! 28: #define NUMCTRS 3 /* # file types to count */ ! 29: #define CMDTYPE 0 /* Index into scnt.cntr */ ! 30: #define DATTYPE 1 /* Index into scnt.cntr */ ! 31: #define XEQTYPE 2 /* Index into scnt.cntr */ ! 32: ! 33: struct scnt { /* System count structure */ ! 34: char name[MAXBASENAME+1]; /* Name of system */ ! 35: short cntr[NUMCTRS]; /* Count */ ! 36: char stst[32]; /* STST Message */ ! 37: time_t locked; /* If LCK..sys present */ ! 38: int st_type; /* STST Type */ ! 39: int st_count; /* STST Count */ ! 40: time_t st_lastime; /* STST Last time tried */ ! 41: time_t st_retry; /* STST Secs to retry */ ! 42: }; ! 43: ! 44: int sndx; /* Number of systems */ ! 45: struct scnt sys[NSYSTEM]; /* Systems queued */ ! 46: int xqtisrunning = 0; ! 47: ! 48: main() ! 49: { register int i, j, nlen = 0; ! 50: time_t curtime, t; ! 51: ! 52: setbuf(stdout, SYSBUF); ! 53: scandir(CMDSDIR, "C.", CMDSLEN, NULL, CMDTYPE); ! 54: scandir(DATADIR, "D.", DATALEN, NULL, DATTYPE); ! 55: scandir(XEQTDIR, "X.", XEQTLEN, 'X', XEQTYPE); ! 56: getstst(SPOOL); ! 57: time(&curtime); ! 58: for(i=0; i<sndx; ++i) ! 59: if((j = strlen(sys[i].name)) > nlen) ! 60: nlen = j; ! 61: for(i=0; i<sndx; ++i) { ! 62: t = (sys[i].st_lastime +sys[i].st_retry) - curtime; ! 63: ! 64: /* decide if STST text is worth printing */ ! 65: if (-t < ONEDAY*2 && sys[i].st_type == SS_WRONGTIME) { ! 66: sys[i].stst[0] = '\0'; ! 67: if (sys[i].cntr[0]+sys[i].cntr[1]+sys[i].cntr[2] == 0) ! 68: continue; /* ignore entire line */ ! 69: } ! 70: ! 71: printf("%-*.*s ", nlen, nlen, sys[i].name); ! 72: if(sys[i].cntr[CMDTYPE]) ! 73: printf("%3.d Cmd%s ", sys[i].cntr[CMDTYPE], ! 74: sys[i].cntr[CMDTYPE]>1?"s":" "); ! 75: else ! 76: printf(" --- "); ! 77: if(sys[i].cntr[DATTYPE]) ! 78: printf("%3.d Data ", sys[i].cntr[DATTYPE]); ! 79: else ! 80: printf(" --- "); ! 81: if(sys[i].cntr[XEQTYPE]) ! 82: printf("%3.d Xqt%s ", sys[i].cntr[XEQTYPE], ! 83: sys[i].cntr[XEQTYPE]>1?"s":" "); ! 84: else ! 85: printf(" --- "); ! 86: if(*sys[i].stst == NULL || sys[i].locked > sys[i].st_lastime) { ! 87: if(sys[i].locked) ! 88: printf("LOCKED\n"); ! 89: else ! 90: printf("\n"); ! 91: continue; ! 92: } ! 93: printf("%s ", sys[i].stst); ! 94: /* decide if STST info is worth pursuing */ ! 95: if (-t < ONEDAY*2 && (sys[i].st_count == 0 ! 96: || sys[i].st_type == SS_WRONGTIME ! 97: || (sys[i].st_type == SS_INPROGRESS && sys[i].locked))) { ! 98: printf("\n"); ! 99: continue; ! 100: } ! 101: t = (sys[i].st_lastime +sys[i].st_retry) - curtime; ! 102: if (-t < ONEDAY*2 && sys[i].st_type != SS_FAIL) ! 103: t = 0; ! 104: ! 105: if (sys[i].st_count > MAXRECALLS) ! 106: printf("at MAX RECALLS"); ! 107: else if (-t >= ONEDAY*2) ! 108: printf("%ld days ago", (long)-t/ONEDAY); ! 109: else if (t <= 0) ! 110: printf("Retry time reached"); ! 111: else if (t < 60) ! 112: printf("Retry time %ld sec%s", (long)(t%60), ! 113: (t%60)!=1? "s": ""); ! 114: else ! 115: printf("Retry time %ld min%s", (long)(t/60), ! 116: (t/60)!=1? "s": ""); ! 117: if(sys[i].st_count > 1) ! 118: printf(" Count: %d\n", sys[i].st_count); ! 119: else ! 120: printf("\n"); ! 121: } ! 122: if (xqtisrunning) ! 123: printf("\nUuxqt is running\n"); ! 124: exit(0); ! 125: } ! 126: ! 127: scandir(dnam, prfx, flen, fchr, type) ! 128: char *dnam, *prfx, fchr; ! 129: { ! 130: register struct direct *dentp; ! 131: register DIR *dirp; ! 132: register int i, fnamlen, plen; ! 133: char fnam[MAXNAMLEN+1]; ! 134: ! 135: plen = strlen(prfx); ! 136: if(chdir(dnam) < 0) { ! 137: perror(dnam); ! 138: exit(1); ! 139: } ! 140: if ((dirp = opendir(".")) == NULL) { ! 141: perror(dnam); ! 142: exit(1); ! 143: } ! 144: while((dentp = readdir(dirp)) != NULL) { ! 145: if(*dentp->d_name == '.') ! 146: continue; ! 147: if(strncmp(dentp->d_name, prfx, plen) != SAME) { ! 148: fprintf(stderr, "strange file (%s) in %s\n", ! 149: dentp->d_name, dnam); ! 150: continue; ! 151: } ! 152: strcpy(fnam, &dentp->d_name[plen]); ! 153: fnamlen = strlen(fnam); ! 154: if(flen > 0) { ! 155: char c; ! 156: fnamlen -= flen; ! 157: c = fnam[fnamlen]; ! 158: if (islower(c)) ! 159: c = toupper(c); ! 160: if (type == DATTYPE && (c != 'S' && c != 'B')) { ! 161: fnamlen -= 2; /* For Honey DanBer */ ! 162: fnam[fnamlen] = NULL; ! 163: } else { ! 164: fnam[fnamlen] = NULL; ! 165: fnamlen = MAXBASENAME; /* yes, after = NULL*/ ! 166: } ! 167: } else { ! 168: for(; fnamlen>0; --fnamlen) { ! 169: if(fnam[fnamlen] == fchr) { ! 170: fnam[fnamlen] = NULL; ! 171: break; ! 172: } ! 173: } ! 174: fnamlen = MAXBASENAME; ! 175: } ! 176: for(i=0; i<sndx; ++i) { ! 177: if(strncmp(fnam, sys[i].name, fnamlen) == SAME) { ! 178: ++sys[i].cntr[type]; ! 179: break; ! 180: } ! 181: } ! 182: if(i == sndx) { ! 183: strcpy(sys[i].name, fnam); ! 184: ++sys[i].cntr[type]; ! 185: ++sndx; ! 186: } ! 187: } ! 188: closedir(dirp); ! 189: } ! 190: ! 191: getstst(sdir) ! 192: char *sdir; ! 193: { ! 194: register int i, csys; ! 195: register char *tp; ! 196: char fnam[MAXNAMLEN+1], buff[128]; ! 197: register struct direct *dentp; ! 198: register DIR *dirp; ! 199: register FILE *st; ! 200: struct stat stbuf; ! 201: long atol(); ! 202: ! 203: if (chdir(sdir) < 0) { ! 204: perror(sdir); ! 205: exit(1); ! 206: } ! 207: if ((dirp = opendir(LOCKDIR)) == NULL) { ! 208: perror(sdir); ! 209: exit(1); ! 210: } ! 211: while ((dentp = readdir(dirp)) != NULL) { ! 212: if (strcmp(&dentp->d_name[5], X_LOCK) == SAME) { ! 213: xqtisrunning++; ! 214: continue; ! 215: } ! 216: if(strncmp(dentp->d_name, "LCK..", 5) == SAME) { ! 217: if(strncmp(&dentp->d_name[5], "tty", 3) == SAME || ! 218: strncmp(&dentp->d_name[5], "cul", 3) == SAME) ! 219: continue; ! 220: strcpy(fnam, dentp->d_name); ! 221: for(csys=0; csys<sndx; ++csys) { ! 222: if(strncmp(&fnam[5], sys[csys].name, SYSNSIZE) ! 223: == SAME) ! 224: break; ! 225: } ! 226: strcpy(sys[csys].name, &fnam[5]); ! 227: if(csys == sndx) { ! 228: ++sndx; ! 229: } ! 230: if (stat(fnam, &stbuf) < 0) ! 231: sys[csys].locked = 1; ! 232: else ! 233: sys[csys].locked = stbuf.st_mtime; ! 234: continue; ! 235: } ! 236: } ! 237: closedir(dirp); ! 238: if (chdir("STST") < 0) { ! 239: perror("STST"); ! 240: exit(1); ! 241: } ! 242: if ((dirp = opendir(".")) == NULL) { ! 243: perror("STST"); ! 244: exit(1); ! 245: } ! 246: while ((dentp = readdir(dirp)) != NULL) { ! 247: if(*dentp->d_name == '.') ! 248: continue; ! 249: strcpy(fnam, dentp->d_name); ! 250: for(csys=0; csys<sndx; ++csys) { ! 251: if(strncmp(fnam, sys[csys].name, SYSNSIZE) == SAME) ! 252: break; ! 253: } ! 254: strcpy(sys[csys].name, fnam); ! 255: if(csys == sndx) { ! 256: ++sndx; ! 257: } ! 258: if((st = fopen(fnam, "r")) == NULL) { ! 259: sys[csys].stst[0] = '\0'; ! 260: continue; ! 261: } ! 262: buff[0] = '\0'; ! 263: fgets(buff, sizeof(buff), st); ! 264: fclose(st); ! 265: if(tp = rindex(buff, ' ')) ! 266: *tp = NULL; /* drop system name */ ! 267: else ! 268: continue; ! 269: for(i=0, tp=buff; i<4; ++i, ++tp) ! 270: if((tp = index(tp, ' ')) == NULL) ! 271: break; ! 272: if(i != 4) ! 273: continue; ! 274: strncpy(sys[csys].stst, tp, sizeof(sys[csys].stst)); ! 275: tp = buff; ! 276: sys[csys].st_type = atoi(tp); ! 277: tp = index(tp+1, ' '); ! 278: sys[csys].st_count = atoi(tp+1); ! 279: tp = index(tp+1, ' '); ! 280: sys[csys].st_lastime = atol(tp+1); ! 281: tp = index(tp+1, ' '); ! 282: sys[csys].st_retry = atol(tp+1); ! 283: } ! 284: } ! 285: /* ! 286: * Return the ptr in sp at which the character c appears; ! 287: * NULL if not found ! 288: */ ! 289: ! 290: char * ! 291: index(sp, c) ! 292: register char *sp, c; ! 293: { ! 294: do { ! 295: if (*sp == c) ! 296: return sp; ! 297: } while (*sp++); ! 298: return NULL; ! 299: } ! 300: ! 301: /* ! 302: * Return the ptr in sp at which the character c last ! 303: * appears; NULL if not found ! 304: */ ! 305: ! 306: char * ! 307: rindex(sp, c) ! 308: register char *sp, c; ! 309: { ! 310: register char *r; ! 311: ! 312: r = NULL; ! 313: do { ! 314: if (*sp == c) ! 315: r = sp; ! 316: } while (*sp++); ! 317: return r; ! 318: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.