xref: /csrg-svn/old/berknet/netq.c (revision 8221)
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