Annotation of 42BSD/usr.bin/xsend/xget.c, revision 1.1.1.1

1.1       root        1: #ifndef lint
                      2: static char sccsid[] = "@(#)xget.c     4.4 6/30/83";
                      3: #endif
                      4: 
                      5: #include "xmail.h"
                      6: #include <sys/types.h>
                      7: #include <sys/dir.h>
                      8: #include <ctype.h>
                      9: #include <pwd.h>
                     10: #include <sys/stat.h>
                     11: char *myname;
                     12: int uid;
                     13: struct direct *dbuf;
                     14: char *maildir = "/usr/spool/secretmail/";
                     15: FILE *kf, *mf;
                     16: DIR *df;
                     17: MINT *x, *b, *one, *t45, *z, *q, *r;
                     18: MINT *two, *t15, *mbuf;
                     19: char buf[256], line[128];
                     20: #define MXF 100
                     21: int fnum[MXF], fcnt;
                     22: struct stat stbuf;
                     23: main()
                     24: {      int i;
                     25:        char *p;
                     26: 
                     27:        uid = getuid();
                     28:        myname = (char *)getlogin();
                     29:        if(myname == NULL)
                     30:                myname = getpwuid(uid)->pw_name;
                     31:        comminit();
                     32:        mbuf = itom(0);
                     33:        files();
                     34:        setup(getpass("Key: "));
                     35:        mkb();
                     36:        mkx();
                     37: #ifndef debug
                     38:        invert(x, b, x);
                     39: #else
                     40:        invert(x, b, z);
                     41:        mult(x, z, z);
                     42:        mdiv(z, b, q, z);
                     43:        omout(z);
                     44:        invert(x, b, x);
                     45: #endif
                     46:        for(i=0; i<fcnt; i++)
                     47:        {       sprintf(line, "%s%s.%d", maildir, myname, fnum[i]);
                     48:                if(stat(line, &stbuf)<0)
                     49:                {       perror(line);
                     50:                        continue;
                     51:                }
                     52:                if(stbuf.st_size == 0)
                     53:                {       printf("zero length mail file\n");
                     54:                        unlink(line);
                     55:                        continue;
                     56:                }
                     57:                if((mf = fopen(line, "r"))==NULL)
                     58:                {       perror(line);
                     59:                        continue;
                     60:                }
                     61:                decipher(mf, stdout);
                     62:        cmnd:
                     63:                printf("? ");
                     64:                fgets(buf, sizeof(buf), stdin);
                     65:                if(feof(stdin)) exit(0);
                     66:                switch(buf[0])
                     67:                {
                     68:                case 'q':
                     69:                        exit(0);
                     70:                case 'n':
                     71:                case 'd':
                     72:                case '\n':
                     73:                        fclose(mf);
                     74:                        unlink(line);
                     75:                        break;
                     76:                case '!':
                     77:                        system(buf+1);
                     78:                        printf("!\n");
                     79:                        goto cmnd;
                     80:                case 's':
                     81:                case 'w':
                     82:                        rewind(mf);
                     83:                        if(buf[1] == '\n' || buf[1] == '\0')
                     84:                                strcpy(buf, "s mbox\n");
                     85:                        for(p = buf+1; isspace(*p); p++);
                     86:                        p[strlen(p)-1] = 0;
                     87:                        kf = fopen(p, "a");
                     88:                        if(kf == NULL)
                     89:                        {       perror(p);
                     90:                                goto cmnd;
                     91:                        }
                     92:                        decipher(mf, kf);
                     93:                        fclose(mf);
                     94:                        fclose(kf);
                     95:                        unlink(line);
                     96:                        break;
                     97:                default:
                     98:                        printf("Commands are:\n");
                     99:                        printf("q       quit, leaving unread messages\n");
                    100:                        printf("n       delete current message and goto next\n");
                    101:                        printf("d       same as above\n");
                    102:                        printf("\\n     same as above\n");
                    103:                        printf("!       execute shell command\n");
                    104:                        printf("s       save message in the named file or mbox\n");
                    105:                        printf("w       same as above\n");
                    106:                        printf("?       prints this list\n");
                    107:                        goto cmnd;
                    108:                }
                    109:        }
                    110:        exit(0);
                    111: }
                    112: icmp(a, b) int *a, *b;
                    113: {
                    114:        return(*a - *b);
                    115: }
                    116: files()
                    117: {      int i;
                    118:        if((df = opendir(maildir)) == NULL)
                    119:        {       perror(maildir);
                    120:                exit(1);
                    121:        }
                    122:        strcpy(line, myname);
                    123:        strcat(line, ".%d");
                    124:        while ((dbuf = readdir(df)) != NULL) 
                    125:        {
                    126:                if(sscanf(dbuf->d_name, line, &i) != 1)
                    127:                        continue;
                    128:                if(fcnt >= MXF)
                    129:                        break;
                    130:                fnum[fcnt++] = i;
                    131:        }
                    132:        closedir(df);
                    133:        if(fcnt == 0)
                    134:        {       printf("no secret mail\n");
                    135:                exit(0);
                    136:        }
                    137:        qsort(fnum, fcnt, sizeof(int), icmp);
                    138: }
                    139: decipher(u, w) FILE *u, *w;
                    140: {      int i;
                    141:        short a;
                    142:        for(;;)
                    143:        {       nin(mbuf, u);
                    144:                if(feof(u)) break;
                    145:                mult(mbuf, x, mbuf);
                    146:                mdiv(mbuf, b, q, mbuf);
                    147:                for(i=1; i<=3; i++)
                    148:                {       a = mbuf->val[i];
                    149:                        putc(a&0177, w);
                    150:                        a >>= 8;
                    151:                        putc(a&0177, w);
                    152:                }
                    153:        }
                    154: }

unix.superglobalmegacorp.com

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