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