1*8221Smckusick static char sccsid[] = "@(#)netq.c 4.2 (Berkeley) 09/12/82";
28197Smckusick
38197Smckusick /* netq - print the netq send queue */
48197Smckusick /* netq [-] [mach] */
58197Smckusick /* must be setuid root */
68197Smckusick
78197Smckusick /* sccs id variable */
88197Smckusick static char *netq_sid = "@(#)netq.c 1.5";
98197Smckusick
108197Smckusick # include "defs.h"
118197Smckusick /* this is an internal table size -- only STSIZE entries will
128197Smckusick be sorted correctly */
138197Smckusick # define STSIZE 150
148197Smckusick
15*8221Smckusick static DIR *df;
168197Smckusick static char jname[16], printlong;
178197Smckusick static struct table {
188197Smckusick char name[16];
198197Smckusick long filesize;
208197Smckusick } stack[STSIZE], temp;
218197Smckusick static int stptr = 0;
228197Smckusick static char mach,visit[MAXINX];
238197Smckusick static char netcmd1[] = NETCMD1;
248197Smckusick static int hisuid,sumj,nsumj;
258197Smckusick static long sumb, nsumb;
268197Smckusick static struct stat statbuf;
278197Smckusick
288197Smckusick char _sobuf[BUFSIZ];
main(argc,argv)298197Smckusick main(argc,argv)
308197Smckusick char **argv; {
318197Smckusick int i;
328197Smckusick setbuf(stdout,_sobuf);
338197Smckusick hisuid = getuid();
348197Smckusick hisuid = uidmask(hisuid);
358197Smckusick if(stat(netcmd,&statbuf) >= 0)
368197Smckusick if((statbuf.st_mode & 07) == 0){
378197Smckusick printf("Network is down\n");
388197Smckusick exit(EX_UNAVAILABLE);
398197Smckusick }
408197Smckusick else if(stat(netcmd1,&statbuf) >= 0)
418197Smckusick if((statbuf.st_mode & 07) == 0){
428197Smckusick printf("Network is down\n");
438197Smckusick exit(EX_UNAVAILABLE);
448197Smckusick }
458197Smckusick while(argc > 1){
468197Smckusick switch(argv[1][0]){
478197Smckusick case '-': printlong++; break;
488197Smckusick default: mach = lookup(argv[1]);
498197Smckusick if(mach > 0 && machtype[chtoinx(mach)] == 0)mach = 0;
508197Smckusick break;
518197Smckusick }
528197Smckusick argc--, argv++;
538197Smckusick }
548197Smckusick if(mach){
558197Smckusick mach = gothru(local,mach); /* list to directly conn. machine */
568197Smckusick if(mach == 0){
578197Smckusick fprintf(stderr,"That machine not directly connected.\n");
588197Smckusick exit(EX_USAGE);
598197Smckusick }
608197Smckusick senddir[strlen(senddir)-1] = mach;
618197Smckusick if(chdir(senddir) < 0){
628197Smckusick perror(senddir);
638197Smckusick exit(EX_OSFILE);
648197Smckusick }
658197Smckusick pdir(senddir);
668197Smckusick }
678197Smckusick else for(i = 0; i < MAXINX; i++)
688197Smckusick if((mach = gothru(local,inxtoch(i))) && !visit[chtoinx(mach)]){
698197Smckusick visit[chtoinx(mach)] = 1;
708197Smckusick senddir[strlen(senddir)-1] = mach;
718197Smckusick if(chdir(senddir) < 0)continue;
728197Smckusick pdir(senddir);
738197Smckusick printf("---\n");
748197Smckusick }
758197Smckusick fflush(stdout);
768197Smckusick }
pdir(str)778197Smckusick static pdir(str)
788197Smckusick char *str; {
798197Smckusick int i;
808197Smckusick char more = 0, *cp;
818197Smckusick char listrest = 0;
828197Smckusick int (*compar)();
838197Smckusick char printhead = 0;
84*8221Smckusick register struct direct *dp;
85*8221Smckusick df = opendir(str);
868197Smckusick if(df == NULL){
878197Smckusick perror(str);
888197Smckusick exit(EX_OSFILE);
898197Smckusick }
908197Smckusick stptr = 0;
91*8221Smckusick while((dp = readdir(df)) != NULL){
92*8221Smckusick if(dp->d_name[0] != 'c'
93*8221Smckusick || dp->d_name[1] != 'f'
94*8221Smckusick || stat(dp->d_name,&statbuf) < 0)
958197Smckusick continue;
96*8221Smckusick if(mach != dp->d_name[2])continue;
97*8221Smckusick dp->d_name[0] = 'd';
98*8221Smckusick if(stat(dp->d_name,&statbuf) < 0)continue;
998197Smckusick #ifdef MAXSENDQ
1008197Smckusick if( stptr >= MAXSENDQ ) {
1018197Smckusick listrest++;
1028197Smckusick break;
1038197Smckusick }
1048197Smckusick #endif
1058197Smckusick
106*8221Smckusick if(!insert(dp->d_name,getsize(&statbuf))){
1078197Smckusick more++;
1088197Smckusick break;
1098197Smckusick }
1108197Smckusick }
1118197Smckusick if(stptr == 0){
1128197Smckusick printf("Network queue to/thru %s is empty.\n",longname(mach));
113*8221Smckusick closedir(df);
1148197Smckusick return;
1158197Smckusick }
1168197Smckusick cp = (char *)&(stack[0].name[0]);
1178197Smckusick sort(cp,stptr,sizeof temp,compar);
1188197Smckusick printf("Network queue to/thru %s:\n",longname(mach));
1198197Smckusick for(i = 0; i < stptr; i++){ /* screen size */
1208197Smckusick strcpy(jname,stack[i].name);
1218197Smckusick jname[0] = 'd';
1228197Smckusick if(stat(jname,&statbuf) < 0)
1238197Smckusick continue;
1248197Smckusick if(printlong || guid(statbuf.st_uid,statbuf.st_gid) == hisuid){
1258197Smckusick if(!printhead){
1268197Smckusick printhead = 1;
1278197Smckusick printf( "From To Len Code Time Command\n");
1288197Smckusick };
1298197Smckusick process();
1308197Smckusick }
1318197Smckusick else summarize( stack[i].filesize );
1328197Smckusick }
1338197Smckusick # ifdef MAXSENDQ
1348197Smckusick if( listrest )
135*8221Smckusick listem(dp);
1368197Smckusick # endif
137*8221Smckusick closedir(df);
1388197Smckusick printsum();
1398197Smckusick if(more)printf(" ... more ...\n");
1408197Smckusick }
summarize(size)1418197Smckusick summarize( size )
1428197Smckusick long size;
1438197Smckusick {
1448197Smckusick #ifndef DONTHOLDBIG
1458197Smckusick if( size > MAXDAYFILE ) {
1468197Smckusick nsumj++;
1478197Smckusick nsumb += size;
1488197Smckusick }
1498197Smckusick else {
1508197Smckusick sumj++;
1518197Smckusick sumb += size;
1528197Smckusick }
1538197Smckusick #else
1548197Smckusick sumb += size;
1558197Smckusick sumj++;
1568197Smckusick #endif
1578197Smckusick }
printsum()1588197Smckusick printsum(){
1598197Smckusick #ifndef DONTHOLDBIG
1608197Smckusick if( sumj != 0 || nsumj != 0 ){
1618197Smckusick printf("day jobs: %d request%s (%ld bytes)",
1628197Smckusick sumj, (sumj > 1 ? "s" : ""), sumb);
1638197Smckusick if(nsumj > 0)
1648197Smckusick printf("; night jobs: %d request%s (%ld bytes)",
1658197Smckusick nsumj, ( nsumj > 1 ? "s" : ""), nsumb );
1668197Smckusick putchar('\n');
1678197Smckusick nsumb = 0l;
1688197Smckusick nsumj = 0;
1698197Smckusick }
1708197Smckusick #else
1718197Smckusick if(sumj != 0){
1728197Smckusick printf("%d request%s, %ld bytes\n",
1738197Smckusick sumj,(sumj > 1 ? "s" : ""),sumb);
1748197Smckusick }
1758197Smckusick #endif
1768197Smckusick sumj = 0;
1778197Smckusick sumb = 0l;
1788197Smckusick }
process()1798197Smckusick process(){
1808197Smckusick static struct header hd;
1818197Smckusick static char nightheader = 0;
1828197Smckusick FILE *look;
1838197Smckusick char *cp;
1848197Smckusick long size;
1858197Smckusick
1868197Smckusick printsum();
1878197Smckusick look = fopen(jname,"r");
1888197Smckusick if(look == NULL)
1898197Smckusick return;
1908197Smckusick readhdfd(&hd,look);
1918197Smckusick fclose(look);
1928197Smckusick if(hd.hd_snfrom[0] == 0)strcat(hd.hd_addrfrom,"Internal");
1938197Smckusick expandcc(hd.hd_sttyname);
1948197Smckusick cp = ctime(&statbuf.st_mtime);
1958197Smckusick cp[strlen(cp)-9] = 0;
1968197Smckusick jname[3] = jname[2];
1978197Smckusick size = getsize(&statbuf);
1988197Smckusick if(size >= MAXDAYFILE && ! nightheader){
1998197Smckusick printf("(> %ld bytes, will only transfer between Midnight and 6AM.)\n", MAXDAYFILE);
2008197Smckusick nightheader = 1;
2018197Smckusick };
2028197Smckusick printf("%-10s %-10s %6ld %s %s %-.27s\n",
2038197Smckusick hd.hd_addrfrom,hd.hd_addrto,size,jname+3,cp+4,hd.hd_scmdvirt);
2048197Smckusick }
readhdfd(phd,fd)2058197Smckusick readhdfd(phd,fd)
2068197Smckusick register struct header *phd;
2078197Smckusick FILE *fd;
2088197Smckusick {
2098197Smckusick char sbuf[BUFSIZ], parmlist[PARMLIST];
2108197Smckusick char *s, cflag;
2118197Smckusick int c, i;
2128197Smckusick phd->hd_code = phd->hd_mchto = phd->hd_snto[0] = phd->hd_sinfile[0] = 0;
2138197Smckusick phd->hd_soutfile[0] = phd->hd_srespfile[0] = phd->hd_snfrom[0] = 0;
2148197Smckusick phd->hd_scmdact[0] = 0;
2158197Smckusick for(i=0;i<20;i++)phd->hd_sttyname[i] = 0;
2168197Smckusick
2178197Smckusick phd->hd_code = ngetc(fd);
2188197Smckusick if(phd->hd_code == 0)return;
2198197Smckusick phd->hd_mchto = ngetc(fd);
2208197Smckusick phd->hd_mchfrom = ngetc(fd); /* from machine */
2218197Smckusick phd->hd_vmajor = ngetc(fd);
2228197Smckusick phd->hd_vminor = ngetc(fd);
2238197Smckusick ngets(phd->hd_snto,NS,fd);
2248197Smckusick ngets(phd->hd_spasswd,20,fd); /* passwd */
2258197Smckusick ngets(phd->hd_sinfile,FNS,fd);
2268197Smckusick ngets(phd->hd_soutfile,FNS,fd);
2278197Smckusick ngets(phd->hd_srespfile,FNS,fd);
2288197Smckusick ngets(phd->hd_snfrom,NS,fd);
2298197Smckusick ngets(phd->hd_sttyname,20,fd);
2308197Smckusick cflag = ngetc(fd);
2318197Smckusick ngets(sbuf,BUFSIZ,fd); /* lttytime */
2328197Smckusick ngets(parmlist,PARMLIST,fd); /* jobno */
2338197Smckusick parseparmlist(parmlist);
2348197Smckusick ngets(sbuf,BUFSIZ,fd); /* timesent */
2358197Smckusick s = phd->hd_scmdact;
2368197Smckusick while((c = getc(fd)) != EOF && c != '\n'){
2378197Smckusick if(c == '\\')c = getc(fd);
2388197Smckusick *s++ = c;
2398197Smckusick }
2408197Smckusick *s = 0;
2418197Smckusick s = phd->hd_scmdvirt;
2428197Smckusick while((c = getc(fd)) != EOF && c != '\n'){
2438197Smckusick if(c == '\\')c = getc(fd);
2448197Smckusick *s++ = c;
2458197Smckusick }
2468197Smckusick *s = 0;
2478197Smckusick if(phd->hd_scmdvirt[0] == 0)strcpy(phd->hd_scmdvirt,phd->hd_scmdact);
2488197Smckusick sprintf(phd->hd_addrfrom,"%c:%s",phd->hd_mchfrom,phd->hd_snfrom);
2498197Smckusick sprintf(phd->hd_addrto ,"%c:%s",phd->hd_mchto ,phd->hd_snto );
2508197Smckusick }
ngetc(fd)2518197Smckusick ngetc(fd)
2528197Smckusick FILE *fd;
2538197Smckusick {
2548197Smckusick char b[3];
2558197Smckusick if(feof(fd))return(0);
2568197Smckusick if(fread(b,1,3,fd) != 3) return(0);
2578197Smckusick return(b[0]);
2588197Smckusick }
2598197Smckusick /* read a string s of max length maxlen out of queue file */
ngets(s,maxlen,fd)2608197Smckusick ngets(s,maxlen,fd)
2618197Smckusick int maxlen;
2628197Smckusick char *s;
2638197Smckusick FILE *fd;
2648197Smckusick {
2658197Smckusick int i;
2668197Smckusick if(feof(fd))return;
2678197Smckusick for(;;){
2688197Smckusick i = getc(fd);
2698197Smckusick if(i == EOF){
2708197Smckusick *s = 0;
2718197Smckusick return;
2728197Smckusick }
2738197Smckusick *s = i;
2748197Smckusick if(*s == '\\')*s = getc(fd);
2758197Smckusick if(*s == ' ')break;
2768197Smckusick if(maxlen-- > 0)s++;
2778197Smckusick }
2788197Smckusick *s = 0;
2798197Smckusick getc(fd);
2808197Smckusick }
insert(f,t)2818197Smckusick insert(f,t)
2828197Smckusick char *f;
2838197Smckusick long t; {
2848197Smckusick strcpy(stack[stptr].name,f);
2858197Smckusick stack[stptr++].filesize = t;
2868197Smckusick return(stptr <= STSIZE);
2878197Smckusick }
compar(a,b)2888197Smckusick compar(a,b)
2898197Smckusick register struct table *a,*b; {
2908197Smckusick if(a->filesize < b->filesize)return(-1);
2918197Smckusick if(a->filesize > b->filesize)return(1);
2928197Smckusick return(0);
2938197Smckusick }
sort()2948197Smckusick sort(){ /* use this cause qsort doesn't work */
2958197Smckusick register int i,j;
2968197Smckusick for(i=0; i< stptr-1; i++)
2978197Smckusick for(j=i+1;j<stptr;j++)
2988197Smckusick if(compar(&stack[i],&stack[j]) > 0)
2998197Smckusick swap(&stack[i],&stack[j]);
3008197Smckusick }
swap(a,b)3018197Smckusick swap(a,b)
3028197Smckusick register struct table *a, *b; {
3038197Smckusick char str[16];
3048197Smckusick long t;
3058197Smckusick strcpy(str,a->name);
3068197Smckusick t = a->filesize;
3078197Smckusick strcpy(a->name,b->name);
3088197Smckusick a->filesize = b->filesize;
3098197Smckusick strcpy(b->name,str);
3108197Smckusick b->filesize = t;
3118197Smckusick }
3128197Smckusick # ifdef MAXSENDQ
listem(dp)313*8221Smckusick listem(dp)
314*8221Smckusick register struct direct *dp; {
3158197Smckusick
316*8221Smckusick do {
317*8221Smckusick if(dp->d_name[0] != 'c'
318*8221Smckusick || dp->d_name[1] != 'f'
319*8221Smckusick || stat( dp->d_name, &statbuf ) < 0 )
3208197Smckusick continue;
321*8221Smckusick if( mach != dp->d_name[2] )
3228197Smckusick continue;
323*8221Smckusick dp->d_name[0] = 'd';
324*8221Smckusick if( stat( dp->d_name, &statbuf ) < 0 )
3258197Smckusick continue;
3268197Smckusick if( printlong || guid( statbuf.st_uid, statbuf.st_gid) == hisuid )
3278197Smckusick process();
3288197Smckusick else
3298197Smckusick summarize( getsize( &statbuf ) );
330*8221Smckusick } while((dp = readdir(df)) != NULL);
3318197Smckusick
3328197Smckusick return;
3338197Smckusick }
3348197Smckusick # endif MAXSENDQ
335