|
|
1.1 ! root 1: static char sccsid[] = "@(#)netq.c 4.2 (Berkeley) 9/12/82"; ! 2: ! 3: /* netq - print the netq send queue */ ! 4: /* netq [-] [mach] */ ! 5: /* must be setuid root */ ! 6: ! 7: /* sccs id variable */ ! 8: static char *netq_sid = "@(#)netq.c 1.5"; ! 9: ! 10: # include "defs.h" ! 11: /* this is an internal table size -- only STSIZE entries will ! 12: be sorted correctly */ ! 13: # define STSIZE 150 ! 14: ! 15: static DIR *df; ! 16: static char jname[16], printlong; ! 17: static struct table { ! 18: char name[16]; ! 19: long filesize; ! 20: } stack[STSIZE], temp; ! 21: static int stptr = 0; ! 22: static char mach,visit[MAXINX]; ! 23: static char netcmd1[] = NETCMD1; ! 24: static int hisuid,sumj,nsumj; ! 25: static long sumb, nsumb; ! 26: static struct stat statbuf; ! 27: ! 28: char _sobuf[BUFSIZ]; ! 29: main(argc,argv) ! 30: char **argv; { ! 31: int i; ! 32: setbuf(stdout,_sobuf); ! 33: hisuid = getuid(); ! 34: hisuid = uidmask(hisuid); ! 35: if(stat(netcmd,&statbuf) >= 0) ! 36: if((statbuf.st_mode & 07) == 0){ ! 37: printf("Network is down\n"); ! 38: exit(EX_UNAVAILABLE); ! 39: } ! 40: else if(stat(netcmd1,&statbuf) >= 0) ! 41: if((statbuf.st_mode & 07) == 0){ ! 42: printf("Network is down\n"); ! 43: exit(EX_UNAVAILABLE); ! 44: } ! 45: while(argc > 1){ ! 46: switch(argv[1][0]){ ! 47: case '-': printlong++; break; ! 48: default: mach = lookup(argv[1]); ! 49: if(mach > 0 && machtype[chtoinx(mach)] == 0)mach = 0; ! 50: break; ! 51: } ! 52: argc--, argv++; ! 53: } ! 54: if(mach){ ! 55: mach = gothru(local,mach); /* list to directly conn. machine */ ! 56: if(mach == 0){ ! 57: fprintf(stderr,"That machine not directly connected.\n"); ! 58: exit(EX_USAGE); ! 59: } ! 60: senddir[strlen(senddir)-1] = mach; ! 61: if(chdir(senddir) < 0){ ! 62: perror(senddir); ! 63: exit(EX_OSFILE); ! 64: } ! 65: pdir(senddir); ! 66: } ! 67: else for(i = 0; i < MAXINX; i++) ! 68: if((mach = gothru(local,inxtoch(i))) && !visit[chtoinx(mach)]){ ! 69: visit[chtoinx(mach)] = 1; ! 70: senddir[strlen(senddir)-1] = mach; ! 71: if(chdir(senddir) < 0)continue; ! 72: pdir(senddir); ! 73: printf("---\n"); ! 74: } ! 75: fflush(stdout); ! 76: } ! 77: static pdir(str) ! 78: char *str; { ! 79: int i; ! 80: char more = 0, *cp; ! 81: char listrest = 0; ! 82: int (*compar)(); ! 83: char printhead = 0; ! 84: register struct direct *dp; ! 85: df = opendir(str); ! 86: if(df == NULL){ ! 87: perror(str); ! 88: exit(EX_OSFILE); ! 89: } ! 90: stptr = 0; ! 91: while((dp = readdir(df)) != NULL){ ! 92: if(dp->d_name[0] != 'c' ! 93: || dp->d_name[1] != 'f' ! 94: || stat(dp->d_name,&statbuf) < 0) ! 95: continue; ! 96: if(mach != dp->d_name[2])continue; ! 97: dp->d_name[0] = 'd'; ! 98: if(stat(dp->d_name,&statbuf) < 0)continue; ! 99: #ifdef MAXSENDQ ! 100: if( stptr >= MAXSENDQ ) { ! 101: listrest++; ! 102: break; ! 103: } ! 104: #endif ! 105: ! 106: if(!insert(dp->d_name,getsize(&statbuf))){ ! 107: more++; ! 108: break; ! 109: } ! 110: } ! 111: if(stptr == 0){ ! 112: printf("Network queue to/thru %s is empty.\n",longname(mach)); ! 113: closedir(df); ! 114: return; ! 115: } ! 116: cp = (char *)&(stack[0].name[0]); ! 117: sort(cp,stptr,sizeof temp,compar); ! 118: printf("Network queue to/thru %s:\n",longname(mach)); ! 119: for(i = 0; i < stptr; i++){ /* screen size */ ! 120: strcpy(jname,stack[i].name); ! 121: jname[0] = 'd'; ! 122: if(stat(jname,&statbuf) < 0) ! 123: continue; ! 124: if(printlong || guid(statbuf.st_uid,statbuf.st_gid) == hisuid){ ! 125: if(!printhead){ ! 126: printhead = 1; ! 127: printf( "From To Len Code Time Command\n"); ! 128: }; ! 129: process(); ! 130: } ! 131: else summarize( stack[i].filesize ); ! 132: } ! 133: # ifdef MAXSENDQ ! 134: if( listrest ) ! 135: listem(dp); ! 136: # endif ! 137: closedir(df); ! 138: printsum(); ! 139: if(more)printf(" ... more ...\n"); ! 140: } ! 141: summarize( size ) ! 142: long size; ! 143: { ! 144: #ifndef DONTHOLDBIG ! 145: if( size > MAXDAYFILE ) { ! 146: nsumj++; ! 147: nsumb += size; ! 148: } ! 149: else { ! 150: sumj++; ! 151: sumb += size; ! 152: } ! 153: #else ! 154: sumb += size; ! 155: sumj++; ! 156: #endif ! 157: } ! 158: printsum(){ ! 159: #ifndef DONTHOLDBIG ! 160: if( sumj != 0 || nsumj != 0 ){ ! 161: printf("day jobs: %d request%s (%ld bytes)", ! 162: sumj, (sumj > 1 ? "s" : ""), sumb); ! 163: if(nsumj > 0) ! 164: printf("; night jobs: %d request%s (%ld bytes)", ! 165: nsumj, ( nsumj > 1 ? "s" : ""), nsumb ); ! 166: putchar('\n'); ! 167: nsumb = 0l; ! 168: nsumj = 0; ! 169: } ! 170: #else ! 171: if(sumj != 0){ ! 172: printf("%d request%s, %ld bytes\n", ! 173: sumj,(sumj > 1 ? "s" : ""),sumb); ! 174: } ! 175: #endif ! 176: sumj = 0; ! 177: sumb = 0l; ! 178: } ! 179: process(){ ! 180: static struct header hd; ! 181: static char nightheader = 0; ! 182: FILE *look; ! 183: char *cp; ! 184: long size; ! 185: ! 186: printsum(); ! 187: look = fopen(jname,"r"); ! 188: if(look == NULL) ! 189: return; ! 190: readhdfd(&hd,look); ! 191: fclose(look); ! 192: if(hd.hd_snfrom[0] == 0)strcat(hd.hd_addrfrom,"Internal"); ! 193: expandcc(hd.hd_sttyname); ! 194: cp = ctime(&statbuf.st_mtime); ! 195: cp[strlen(cp)-9] = 0; ! 196: jname[3] = jname[2]; ! 197: size = getsize(&statbuf); ! 198: if(size >= MAXDAYFILE && ! nightheader){ ! 199: printf("(> %ld bytes, will only transfer between Midnight and 6AM.)\n", MAXDAYFILE); ! 200: nightheader = 1; ! 201: }; ! 202: printf("%-10s %-10s %6ld %s %s %-.27s\n", ! 203: hd.hd_addrfrom,hd.hd_addrto,size,jname+3,cp+4,hd.hd_scmdvirt); ! 204: } ! 205: readhdfd(phd,fd) ! 206: register struct header *phd; ! 207: FILE *fd; ! 208: { ! 209: char sbuf[BUFSIZ], parmlist[PARMLIST]; ! 210: char *s, cflag; ! 211: int c, i; ! 212: phd->hd_code = phd->hd_mchto = phd->hd_snto[0] = phd->hd_sinfile[0] = 0; ! 213: phd->hd_soutfile[0] = phd->hd_srespfile[0] = phd->hd_snfrom[0] = 0; ! 214: phd->hd_scmdact[0] = 0; ! 215: for(i=0;i<20;i++)phd->hd_sttyname[i] = 0; ! 216: ! 217: phd->hd_code = ngetc(fd); ! 218: if(phd->hd_code == 0)return; ! 219: phd->hd_mchto = ngetc(fd); ! 220: phd->hd_mchfrom = ngetc(fd); /* from machine */ ! 221: phd->hd_vmajor = ngetc(fd); ! 222: phd->hd_vminor = ngetc(fd); ! 223: ngets(phd->hd_snto,NS,fd); ! 224: ngets(phd->hd_spasswd,20,fd); /* passwd */ ! 225: ngets(phd->hd_sinfile,FNS,fd); ! 226: ngets(phd->hd_soutfile,FNS,fd); ! 227: ngets(phd->hd_srespfile,FNS,fd); ! 228: ngets(phd->hd_snfrom,NS,fd); ! 229: ngets(phd->hd_sttyname,20,fd); ! 230: cflag = ngetc(fd); ! 231: ngets(sbuf,BUFSIZ,fd); /* lttytime */ ! 232: ngets(parmlist,PARMLIST,fd); /* jobno */ ! 233: parseparmlist(parmlist); ! 234: ngets(sbuf,BUFSIZ,fd); /* timesent */ ! 235: s = phd->hd_scmdact; ! 236: while((c = getc(fd)) != EOF && c != '\n'){ ! 237: if(c == '\\')c = getc(fd); ! 238: *s++ = c; ! 239: } ! 240: *s = 0; ! 241: s = phd->hd_scmdvirt; ! 242: while((c = getc(fd)) != EOF && c != '\n'){ ! 243: if(c == '\\')c = getc(fd); ! 244: *s++ = c; ! 245: } ! 246: *s = 0; ! 247: if(phd->hd_scmdvirt[0] == 0)strcpy(phd->hd_scmdvirt,phd->hd_scmdact); ! 248: sprintf(phd->hd_addrfrom,"%c:%s",phd->hd_mchfrom,phd->hd_snfrom); ! 249: sprintf(phd->hd_addrto ,"%c:%s",phd->hd_mchto ,phd->hd_snto ); ! 250: } ! 251: ngetc(fd) ! 252: FILE *fd; ! 253: { ! 254: char b[3]; ! 255: if(feof(fd))return(0); ! 256: if(fread(b,1,3,fd) != 3) return(0); ! 257: return(b[0]); ! 258: } ! 259: /* read a string s of max length maxlen out of queue file */ ! 260: ngets(s,maxlen,fd) ! 261: int maxlen; ! 262: char *s; ! 263: FILE *fd; ! 264: { ! 265: int i; ! 266: if(feof(fd))return; ! 267: for(;;){ ! 268: i = getc(fd); ! 269: if(i == EOF){ ! 270: *s = 0; ! 271: return; ! 272: } ! 273: *s = i; ! 274: if(*s == '\\')*s = getc(fd); ! 275: if(*s == ' ')break; ! 276: if(maxlen-- > 0)s++; ! 277: } ! 278: *s = 0; ! 279: getc(fd); ! 280: } ! 281: insert(f,t) ! 282: char *f; ! 283: long t; { ! 284: strcpy(stack[stptr].name,f); ! 285: stack[stptr++].filesize = t; ! 286: return(stptr <= STSIZE); ! 287: } ! 288: compar(a,b) ! 289: register struct table *a,*b; { ! 290: if(a->filesize < b->filesize)return(-1); ! 291: if(a->filesize > b->filesize)return(1); ! 292: return(0); ! 293: } ! 294: sort(){ /* use this cause qsort doesn't work */ ! 295: register int i,j; ! 296: for(i=0; i< stptr-1; i++) ! 297: for(j=i+1;j<stptr;j++) ! 298: if(compar(&stack[i],&stack[j]) > 0) ! 299: swap(&stack[i],&stack[j]); ! 300: } ! 301: swap(a,b) ! 302: register struct table *a, *b; { ! 303: char str[16]; ! 304: long t; ! 305: strcpy(str,a->name); ! 306: t = a->filesize; ! 307: strcpy(a->name,b->name); ! 308: a->filesize = b->filesize; ! 309: strcpy(b->name,str); ! 310: b->filesize = t; ! 311: } ! 312: # ifdef MAXSENDQ ! 313: listem(dp) ! 314: register struct direct *dp; { ! 315: ! 316: do { ! 317: if(dp->d_name[0] != 'c' ! 318: || dp->d_name[1] != 'f' ! 319: || stat( dp->d_name, &statbuf ) < 0 ) ! 320: continue; ! 321: if( mach != dp->d_name[2] ) ! 322: continue; ! 323: dp->d_name[0] = 'd'; ! 324: if( stat( dp->d_name, &statbuf ) < 0 ) ! 325: continue; ! 326: if( printlong || guid( statbuf.st_uid, statbuf.st_gid) == hisuid ) ! 327: process(); ! 328: else ! 329: summarize( getsize( &statbuf ) ); ! 330: } while((dp = readdir(df)) != NULL); ! 331: ! 332: return; ! 333: } ! 334: # endif MAXSENDQ
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.