/********************************************************************** * Copyright (c) Digital Equipment Corporation 1984, 1985, 1986. * * All Rights Reserved. * * Reference "/usr/src/COPYRIGHT" for applicable restrictions. * **********************************************************************/ static char Sccsid[] = "@(#)uusub.c 3.0 4/22/86"; /* CAVEAT EMPTOR -- probably does not work (subdirs mainly) rti!trt */ /* decvax!larry - untested and not used */ #include "uucp.h" #ifdef UUSUB #include <time.h> #include <sys/types.h> #include "uusub.h" #define rid 0 /* user id for super user */ /************* * uusub --- a command for monitoring uucp subnetwork * Probably should be limited to 'root', 'daemon', 'uucp'. */ main(argc, argv) char **argv; int argc; { extern char *optarg; extern int optind; struct ub_l l; struct ub_r r; short aflag,dflag,rflag,lflag,fflag,cflag,uflag; short ua, c; char aa[10], da[10], ca[10], s[128]; FILE *fp, *fq, *us_open(); int orig_uid = getuid(); aflag=dflag=rflag=lflag=fflag=cflag=uflag=0; while ((c=getopt(argc, argv, "x:a:d:c:u:rlf")) != EOF ) switch(c) { case 'x': chkdebug(orig_uid); Debug = atoi(optarg); break; case 'a': aflag++; strcpy(aa, optarg); break; case 'd': dflag++; strcpy(da, optarg); break; case 'c': cflag++; strcpy(ca, optarg); break; case 'u': uflag++; ua = atoi(optarg); break; case 'r': rflag++; break; case 'l': lflag++; break; case 'f': fflag++; break; case '?': fprintf(stderr,"Usage:uusub -a* -d* -c* -u* -r -l-f\n"); exit(2); } if (fflag) { /* flush L_sub file */ DEBUG(6, "Flush file %s\n", L_sub); edit('f',""); /* 2nd argument is irrelevant */ } if (dflag) { /* delete system "da" from "L_sub" */ DEBUG(6, "Delete system %s from subnetwork\n",da); edit('d',da); } if (aflag) { /* add 'aa' to L_sub file */ DEBUG(6, "Add system %s to subnetwork\n",aa); fp = us_open(L_sub, "a+", LCKLSUB, 30, 1); if (fp==NULL) return(FAIL); fseek(fp, 0L, 0); /* rewind */ while (fread(&l, sizeof(l), 1, fp)!=NULL) if (strcmp(l.sys,aa)==SAME) goto out; DEBUG(6, "system %s is added\n", aa); strcpy(l.sys, aa); /* manufacture a new entry */ time(&l.oktime); l.call = l.ok = l.noacu = l.login = l.nack = l.other = 0; fwrite(&l,sizeof(l),1,fp); out: fclose(fp); unlink(LCKLSUB); } if (cflag) { /* call system 'ca' */ if (strcmp(ca, "all") != SAME) xuucico(ca); else { /* call all systems */ fp=us_open(L_sub,"r","dummy",1,1); if (fp==NULL) return(FAIL); while (fread(&l,sizeof(l),1,fp)==1) xuucico(l.sys); } fclose(fp); } if (uflag) { /* update R_sub file from SYSLOG */ time_t tick, oldtick; char rmt[10], s_r[10]; long bytes; fp=us_open(L_sub, "r","dummy",1,1); if (fp==NULL) return(FAIL); fq=us_open(R_sub, "w",LCKRSUB,10,1); if (fq==NULL) return(FAIL); fseek(fq, 0L, 0); /* rewind */ /* Flush R_sub file */ DEBUG(6," Flush file %s\n", R_sub); r.sf = r.rf = (long) 0; r.sb = r.rb = 0; while(fread(&l,sizeof(l),1,fp)==1) { DEBUG(6," l.sys: %s\n", l.sys); strcpy(r.sys, l.sys); fwrite(&r,sizeof(r),1,fq); } fclose(fp); fclose(fq); unlink(LCKRSUB); fp=us_open(SYSLOG, "r","dummy",1,1); if (fp==NULL) return(FAIL); fq=us_open(R_sub,"r+",LCKRSUB,10,1); if (fq==NULL) return(FAIL); time(&tick); /* get current time */ while (fgets(s,128,fp)!=NULL) { sscanf(s,"%*s %s (%*d/%*d-%*d:%*d) (%ld) %s %*s %ld",rmt,&oldtick,s_r,&bytes); DEBUG(9," Rmt: %s ",rmt); DEBUG(9," s_r: %s", s_r); DEBUG(9," bytes: %ld ",bytes); DEBUG(9," oldtick: %ld\n",oldtick); if ((tick-oldtick)>(ua*3600L)) continue; DEBUG(8, " %s inside the time\n",rmt); fseek(fq, 0L, 0); /* rewind */ while (fread(&r,sizeof(r),1,fq)==1) if (strcmp(r.sys,rmt)==SAME) { if (strcmp(s_r,"sent")==SAME) { r.sf++; r.sb += bytes; } else { r.rf++; r.rb += bytes; } fseek(fq, - (long) sizeof(r), 1); fwrite(&r,sizeof(r),1,fq); DEBUG(7,"%s is written\n",r.sys); break; /* break inner 'while' */ } } fclose(fp); fclose(fq); unlink(LCKRSUB); } if (rflag) { /* print the R_sub file */ fp = us_open(R_sub, "r", "dummy", 1, 1); if (fp==NULL) return(FAIL); printf("sysname\tsfile\tsbyte\trfile\trbyte\n"); while (fread(&r, sizeof(r), 1, fp)!=NULL) printf("%-.7s\t%d\t%ld\t%d\t%ld\n",r.sys,r.sf,r.sb,r.rf,r.rb); fclose(fp); } if (lflag) { /* print the L_sub file */ struct tm *tp, *localtime(); fp = us_open(L_sub, "r", "dummy", 1, 1); if (fp==NULL) return(FAIL); printf("sysname\t\#call\t\#ok\tlatest-oktime\t\#noacu\t\#login"); printf("\t\#nack\t\#other\n"); while (fread(&l, sizeof(l), 1, fp)!=NULL) { tp=localtime(&l.oktime); printf("%-.7s\t%d\t%d", l.sys,l.call,l.ok); printf("\t(%d/%d-%d:%02d)\t", tp->tm_mon+1, tp->tm_mday, tp->tm_hour, tp->tm_min); printf("%d\t%d\t%d\t%d\n",l.noacu,l.login,l.nack,l.other); } fclose(fp); } } edit(flag,arg) /* edit "L_sub" file */ short flag; char *arg; { FILE *fq, *fp, *us_open(); struct ub_l l; char s[64]; DEBUG(6, "enter edit, flag: %d\n",flag); sprintf(s, "%s/%s.%.7d",Spool,"lsub",getpid()); fq = us_open(s, "w", "dummy", 1, 1); if (fq==NULL) return(FAIL); fp = us_open(L_sub, "r", "dummy", 1, 1); if (fp==NULL) return(FAIL); while (fread(&l, sizeof(l), 1, fp)!=NULL) switch(flag) { case 'f': l.call = l.ok = l.noacu = l.login = l.nack = l.other = 0; fwrite(&l,sizeof(l),1,fq); break; case 'd': if (strcmp(l.sys,arg)!=SAME) { DEBUG(7,"%s is retained\n",l.sys); fwrite(&l,sizeof(l),1,fq); } break; } fclose(fp); fclose(fq); fp = us_open(L_sub, "w", LCKLSUB, 30, 1); if (fp==NULL) return(FAIL); fq = us_open(s, "r", "dummy", 1, 1); if (fq==NULL) return(FAIL); while (fread(&l, sizeof(l), 1, fq)!=NULL) { fwrite(&l,sizeof(l),1,fp); } fclose(fp); fclose(fq); unlink(LCKLSUB); unlink(s); unlink("dummy"); return; } #else main(argc, argv) char **argv; { fprintf(stderr, "Uusub is not implemented on this system\n"); } #endif