Annotation of 3BSD/cmd/net/netq.c, revision 1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.