Annotation of 43BSD/usr.bin/uucp/uusnap.c, revision 1.1.1.1

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: }

unix.superglobalmegacorp.com

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