|
|
1.1 root 1: /* netq - print the netq send queue */
2: /* netq [-a] [mach] */
3: /* must be setuid root */
4:
5: # include "defs.h"
6: # define STSIZE 150
7:
8: static FILE *df;
9: static char jname[16], printlong;
10: static struct table {
11: char name[16];
12: long filesize;
13: } stack[STSIZE], temp;
14: static int stptr = 0;
15: static char mach,visit[26];
16: static char netcmd1[] = NETCMD1;
17: static int hisuid,sumj;
18: static long sumb;
19: static struct stat statbuf;
20: static struct direct dirbuf;
21:
22: char _sobuf[BUFSIZ];
23: main(argc,argv)
24: char **argv; {
25: int i;
26: setbuf(stdout,_sobuf);
27: hisuid = getuid();
28: hisuid = uidmask(hisuid);
29: if(stat(netcmd,&statbuf) >= 0)
30: if((statbuf.st_mode & 07) == 0){
31: printf("Network is down\n");
32: exit(EX_UNAVAILABLE);
33: }
34: else if(stat(netcmd1,&statbuf) >= 0)
35: if((statbuf.st_mode & 07) == 0){
36: printf("Network is down\n");
37: exit(EX_UNAVAILABLE);
38: }
39: while(argc > 1){
40: switch(argv[1][0]){
41: case '-': printlong++; break;
42: default: mach = lookup(argv[1]);
43: if(mach > 0 && machtype[mach-'a'] == 0)mach = 0;
44: break;
45: }
46: argc--, argv++;
47: }
48: if(mach){
49: mach = gothru(local,mach); /* list to directly conn. machine */
50: if(mach == 0){
51: fprintf(stderr,"That machine not directly connected.\n");
52: exit(EX_USAGE);
53: }
54: senddir[strlen(senddir)-1] = mach;
55: if(chdir(senddir) < 0){
56: perror(senddir);
57: exit(EX_OSFILE);
58: }
59: pdir(senddir);
60: }
61: else for(i = 'a'; i <= 'z'; i++)
62: if((mach = gothru(local,i)) && !visit[mach - 'a']){
63: visit[mach - 'a'] = 1;
64: senddir[strlen(senddir)-1] = mach;
65: if(chdir(senddir) < 0)continue;
66: pdir(senddir);
67: printf("---\n");
68: }
69: fflush(stdout);
70: }
71: static pdir(str)
72: char *str; {
73: int i;
74: char more = 0, *cp;
75: int (*compar)();
76: df = fopen(str,"r");
77: if(df == NULL){
78: perror(str);
79: exit(EX_OSFILE);
80: }
81: stptr = 0;
82: while(fread(&dirbuf,1,sizeof dirbuf,df)==sizeof dirbuf){
83: if(dirbuf.d_ino == 0
84: || dirbuf.d_name[0] != 'c'
85: || dirbuf.d_name[1] != 'f'
86: || stat(dirbuf.d_name,&statbuf) < 0)
87: continue;
88: if(mach != dirbuf.d_name[2])continue;
89: dirbuf.d_name[0] = 'd';
90: if(stat(dirbuf.d_name,&statbuf) < 0)continue;
91:
92: if(!insert(dirbuf.d_name,getsize(&statbuf))){
93: more++;
94: break;
95: }
96: }
97: if(stptr == 0){
98: printf("Network queue to/thru %s is empty.\n",longname(mach));
99: return;
100: }
101: cp = (char *)&(stack[0].name[0]);
102: sort(cp,stptr,sizeof temp,compar);
103: printf("Network queue to/thru %s:\n",longname(mach));
104: printf(
105: "From To Len Code Time Command\n");
106: for(i = 0; i < stptr; i++){ /* screen size */
107: strcpy(jname,stack[i].name);
108: jname[0] = 'd';
109: if(stat(jname,&statbuf) < 0)
110: continue;
111: if(printlong || guid(statbuf.st_uid,statbuf.st_gid) == hisuid)
112: process();
113: else summarize(i);
114: }
115: printsum();
116: if(more)printf(" ... more ...\n");
117: }
118: summarize(i){
119: sumb += stack[i].filesize;
120: sumj++;
121: }
122: printsum(){
123: if(sumj != 0){
124: printf("%d request%s, %ld bytes\n",
125: sumj,(sumj > 1 ? "s" : ""),sumb);
126: sumj = 0;
127: sumb = 0L;
128: }
129: }
130: process(){
131: static struct header hd;
132: FILE *look;
133: char *cp;
134:
135: printsum();
136: look = fopen(jname,"r");
137: if(look == NULL)
138: return;
139: readhdfd(&hd,look);
140: fclose(look);
141: if(hd.hd_snfrom[0] == 0)strcat(hd.hd_addrfrom,"Internal");
142: expandcc(hd.hd_sttyname);
143: cp = ctime(&statbuf.st_mtime);
144: cp[strlen(cp)-9] = 0;
145: jname[3] = jname[2];
146: printf("%-10s %-10s %5ld %s %s %-.27s\n",
147: hd.hd_addrfrom,hd.hd_addrto,getsize(&statbuf),
148: jname+3,cp+4,hd.hd_scmdvirt);
149: }
150: readhdfd(phd,fd)
151: register struct header *phd;
152: FILE *fd;
153: {
154: char sbuf[BUFSIZ], parmlist[PARMLIST];
155: char *s, cflag;
156: int c, i;
157: phd->hd_code = phd->hd_mchto = phd->hd_snto[0] = phd->hd_sinfile[0] = 0;
158: phd->hd_soutfile[0] = phd->hd_srespfile[0] = phd->hd_snfrom[0] = 0;
159: phd->hd_scmdact[0] = 0;
160: for(i=0;i<20;i++)phd->hd_sttyname[i] = 0;
161:
162: phd->hd_code = ngetc(fd);
163: if(phd->hd_code == 0)return;
164: phd->hd_mchto = ngetc(fd);
165: phd->hd_mchfrom = ngetc(fd); /* from machine */
166: phd->hd_vmajor = ngetc(fd);
167: phd->hd_vminor = ngetc(fd);
168: ngets(phd->hd_snto,NS,fd);
169: ngets(phd->hd_spasswd,20,fd); /* passwd */
170: ngets(phd->hd_sinfile,FNS,fd);
171: ngets(phd->hd_soutfile,FNS,fd);
172: ngets(phd->hd_srespfile,FNS,fd);
173: ngets(phd->hd_snfrom,NS,fd);
174: ngets(phd->hd_sttyname,20,fd);
175: cflag = ngetc(fd);
176: ngets(sbuf,BUFSIZ,fd); /* lttytime */
177: ngets(parmlist,PARMLIST,fd); /* jobno */
178: parseparmlist(parmlist);
179: ngets(sbuf,BUFSIZ,fd); /* timesent */
180: s = phd->hd_scmdact;
181: while((c = getc(fd)) != EOF && c != '\n'){
182: if(c == '\\')c = getc(fd);
183: *s++ = c;
184: }
185: *s = 0;
186: s = phd->hd_scmdvirt;
187: while((c = getc(fd)) != EOF && c != '\n'){
188: if(c == '\\')c = getc(fd);
189: *s++ = c;
190: }
191: *s = 0;
192: if(phd->hd_scmdvirt[0] == 0)strcpy(phd->hd_scmdvirt,phd->hd_scmdact);
193: sprintf(phd->hd_addrfrom,"%c:%s",phd->hd_mchfrom,phd->hd_snfrom);
194: sprintf(phd->hd_addrto ,"%c:%s",phd->hd_mchto ,phd->hd_snto );
195: }
196: ngetc(fd)
197: FILE *fd;
198: {
199: char b[3];
200: if(feof(fd))return(0);
201: if(fread(b,1,3,fd) != 3) return(0);
202: return(b[0]);
203: }
204: /* read a string s of max length maxlen out of queue file */
205: ngets(s,maxlen,fd)
206: int maxlen;
207: char *s;
208: FILE *fd;
209: {
210: int i;
211: if(feof(fd))return;
212: for(;;){
213: i = getc(fd);
214: if(i == EOF){
215: *s = 0;
216: return;
217: }
218: *s = i;
219: if(*s == '\\')*s = getc(fd);
220: if(*s == ' ')break;
221: if(maxlen-- > 0)s++;
222: }
223: *s = 0;
224: getc(fd);
225: }
226: insert(f,t)
227: char *f;
228: long t; {
229: strcpy(stack[stptr].name,f);
230: stack[stptr++].filesize = t;
231: return(stptr <= STSIZE);
232: }
233: compar(a,b)
234: register struct table *a,*b; {
235: if(a->filesize < b->filesize)return(-1);
236: if(a->filesize > b->filesize)return(1);
237: return(0);
238: }
239: sort(){ /* use this cause qsort doesn't work */
240: register int i,j;
241: for(i=0; i< stptr-1; i++)
242: for(j=i+1;j<stptr;j++)
243: if(compar(&stack[i],&stack[j]) > 0)
244: swap(&stack[i],&stack[j]);
245: }
246: swap(a,b)
247: register struct table *a, *b; {
248: char str[16];
249: long t;
250: strcpy(str,a->name);
251: t = a->filesize;
252: strcpy(a->name,b->name);
253: a->filesize = b->filesize;
254: strcpy(b->name,str);
255: b->filesize = t;
256: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.