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