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