2BSD/src/net/netq.c
/* Copyright (c) 1979 Regents of the University of California */
# include "defs.h"
# define STSIZE 100
# define SCREEN 21
/* must be setuid root */
/* netq - print the netq send queue */
/* netq [-a] [mach] */
static FILE *df, *look;
static char jname[16], printlong;
static struct table {
char name[16];
long filesize;
} stack[STSIZE], temp;
static int stptr = 0;
static char mach,visit[26];
static char netcmd1[] = NETCMD1;
static int hisuid,sumj;
static long sumb;
main(argc,argv)
char **argv; {
char outbuf[BUFSIZ];
int i;
setbuf(stdout,outbuf);
hisuid = getuid();
if(stat(netcmd,&statbuf) >= 0)
if((statbuf.st_mode & 07) == 0){
printf("Network is down\n");
exit(1);
}
else if(stat(netcmd1,&statbuf) >= 0)
if((statbuf.st_mode & 07) == 0){
printf("Network is down\n");
exit(1);
}
while(argc > 1){
switch(argv[1][0]){
case '-': printlong++; break;
default: mach = lookup(argv[1]);
if(mach > 0 && machtype[mach-'a'] == 0)mach = 0;
break;
}
argc--, argv++;
}
if(mach){
mach = gothru(local,mach); /* list to directly conn. machine */
senddir[strlen(senddir)-1] = mach;
pdir(senddir);
}
else for(i = 'a'; i <= 'z'; i++)
if((mach = gothru(local,i)) && !visit[mach - 'a']){
visit[mach - 'a'] = 1;
senddir[strlen(senddir)-1] = mach;
if(chdir(senddir) < 0)continue;
pdir(senddir);
printf("---\n");
}
fflush(stdout);
}
static pdir(str)
char *str; {
int i;
char more = 0, *cp;
int literal = 0;
int (*compar)();
df = fopen(str,"r");
if(df == NULL){
perror(str);
exit(1);
}
stptr = 0;
while(fread(&dirbuf,1,sizeof dirbuf,df)==sizeof dirbuf){
if(dirbuf.d_ino == 0
|| dirbuf.d_name[0] != 'c'
|| dirbuf.d_name[1] != 'f'
|| stat(dirbuf.d_name,&statbuf) < 0)
continue;
if(mach != dirbuf.d_name[2])continue;
dirbuf.d_name[0] = 'd';
if(stat(dirbuf.d_name,&statbuf) < 0)continue;
if(!insert(dirbuf.d_name,getsize(&statbuf))){
more++;
break;
}
}
if(stptr == 0){
printf("Network queue to %s is empty.\n",longname(mach));
return;
}
cp = (char *)&(stack[0].name[0]);
sort(cp,stptr,sizeof temp,compar);
printf("Network queue to %s:\n",longname(mach));
printf(
" LocalName(Remote) Mach Len Code Time Command\n");
for(i = 0; i < stptr; i++){ /* screen size */
strcpy(jname,stack[i].name);
jname[0] = 'd';
if(stat(jname,&statbuf) < 0)
continue;
if(printlong || guid(statbuf.st_uid,statbuf.st_gid) == hisuid)
process();
else summarize(i);
}
printsum();
if(more)printf(" ... more ...\n");
}
summarize(i){
sumb += stack[i].filesize;
sumj++;
}
printsum(){
if(sumj != 0){
printf("%d request%s, %ld bytes\n",
sumj,(sumj > 1 ? "s" : ""),sumb);
sumj = 0;
sumb = 0L;
}
}
process(){
int code, tm;
char login[NS], passwd[FNS], infile[FNS], ttystr[20];
char outfile[FNS], resp[FNS];
char localname[NS], cmd[BFS*2];
char realcmd[BFS*2];
char b1[10], b2[10];
char *cp;
int c, i;
char *s;
printsum();
look = fopen(jname,"r");
if(look == NULL)
return;
code = tm = login[0] = passwd[0] = infile[0] = 0;
outfile[0] = resp[0] = localname[0] = 0;
cmd[0] = 0;
code = ngetc();
if(code == 0)return;
tm = ngetc();
ngetc(); /* from machine */
ngetc();
ngetc();
ngets(login);
ngets(passwd);
ngets(infile);
ngets(outfile);
ngets(resp);
ngets(localname);
if(localname[0] == 0)strcpy(localname,"Int.");
for(i=0;i<20;i++)ttystr[i] = 0;
ngets(ttystr);
expandcc(ttystr);
ngetc(); /* cflag */
ngets(b1);
ngets(b1); /* jobno */
ngets(b2); /* unused */
s = cmd;
while((c = getc(look)) != EOF && c != '\n'){
if(c == '\\')c = getc(look);
*s++ = c;
}
*s = 0;
s = realcmd;
while((c = getc(look)) != EOF && c != '\n'){
if(c == '\\')c = getc(look);
*s++ = c;
}
*s = 0;
if(realcmd[0] == 0)strcpy(realcmd,cmd);
fclose(look);
i = strlen(login);
login[i] = ')';
login[i+1] = 0;
cp = ctime(&statbuf.st_mtime);
cp[strlen(cp)-9] = 0;
jname[3] = jname[2];
printf("%-8s(%-9s %-4s %5ld %s %s %-.25s\n",
localname,login,longname(tm),getsize(&statbuf),
jname+3,cp+4,realcmd);
}
ngetc(){
char b[3];
if(feof(look))return(0);
if(fread(b,1,3,look) != 3){
/*
error("bad read ");
*/
return(0);
}
return(b[0]);
}
ngets(s)
char *s; {
int i;
if(feof(look))return;
for(;;){
i = getc(look);
if(i == EOF){
*s = 0;
return;
}
*s = i;
if(*s == '\\')*s = getc(look);
if(*s == ' ')break;
s++;
}
*s = 0;
getc(look);
}
insert(f,t)
char *f;
long t; {
strcpy(stack[stptr].name,f);
stack[stptr++].filesize = t;
return(stptr <= STSIZE);
}
compar(a,b)
register struct table *a,*b; {
if(a->filesize < b->filesize)return(-1);
if(a->filesize > b->filesize)return(1);
return(0);
}
sort(){ /* use this cause qsort doesn't work */
register int i,j;
for(i=0; i< stptr-1; i++)
for(j=i+1;j<stptr;j++)
if(compar(&stack[i],&stack[j]) > 0)
swap(&stack[i],&stack[j]);
}
swap(a,b)
register struct table *a, *b; {
char str[16];
long t;
strcpy(str,a->name);
t = a->filesize;
strcpy(a->name,b->name);
a->filesize = b->filesize;
strcpy(b->name,str);
b->filesize = t;
}
expandcc(s)
char *s; {
char w[100],*p;
strcpy(w,s);
p = w;
while(*p){
if(!isprint(*p)){
*s++ = '^';
*s++ = *p++ + 0140;
}
else *s++ = *p++;
}
}