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: }