1 #ifndef lint 2 static char sccsid[] = "@(#)xget.c 4.1 03/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, *df; 16 MINT *x, *b, *one, *t45, *z, *q, *r; 17 MINT *two, *t15, *mbuf; 18 char buf[256], line[128]; 19 #define MXF 100 20 int fnum[MXF], fcnt; 21 struct stat stbuf; 22 main() 23 { int i; 24 char *p; 25 uid = getuid(); 26 myname = getlogin(); 27 if(myname == NULL) 28 myname = getpwuid(uid)->pw_name; 29 comminit(); 30 mbuf = itom(0); 31 files(); 32 setup(getpass("Key: ")); 33 mkb(); 34 mkx(); 35 #ifndef debug 36 invert(x, b, x); 37 #else 38 invert(x, b, z); 39 mult(x, z, z); 40 mdiv(z, b, q, z); 41 omout(z); 42 invert(x, b, x); 43 #endif 44 for(i=0; i<fcnt; i++) 45 { sprintf(line, "%s%s.%d", maildir, myname, fnum[i]); 46 if(stat(line, &stbuf)<0) 47 { perror(line); 48 continue; 49 } 50 if(stbuf.st_size == 0) 51 { printf("zero length mail file\n"); 52 unlink(line); 53 continue; 54 } 55 if((mf = fopen(line, "r"))==NULL) 56 { perror(line); 57 continue; 58 } 59 decipher(mf, stdout); 60 cmnd: 61 printf("? "); 62 fgets(buf, sizeof(buf), stdin); 63 if(feof(stdin)) exit(0); 64 switch(buf[0]) 65 { 66 case 'q': 67 exit(0); 68 case 'n': 69 case 'd': 70 case '\n': 71 unlink(line); 72 fclose(mf); 73 break; 74 case '!': 75 system(buf+1); 76 printf("!\n"); 77 goto cmnd; 78 case 's': 79 case 'w': 80 rewind(mf); 81 if(buf[1] == '\n' || buf[1] == '\0') 82 strcpy(buf, "s mbox\n"); 83 for(p=buf; !isspace(*p); p++); 84 for(; isspace(*p); p++); 85 p[strlen(p)-1] = 0; 86 kf = fopen(p, "a"); 87 if(kf == NULL) 88 { perror(p); 89 break; 90 } 91 decipher(mf, kf); 92 fclose(mf); 93 fclose(kf); 94 unlink(line); 95 break; 96 } 97 } 98 exit(0); 99 } 100 icmp(a, b) int *a, *b; 101 { 102 return(*a - *b); 103 } 104 files() 105 { int i; 106 if((df = fopen(maildir, "r")) == NULL) 107 { perror(maildir); 108 exit(1); 109 } 110 strcpy(line, myname); 111 strcat(line, ".%d"); 112 for(; !feof(df);) 113 { fread(&dbuf, sizeof(dbuf), 1, df); 114 if(feof(df)) break; 115 if(dbuf.d_ino == 0) continue; 116 if(sscanf(dbuf.d_name, line, &i) != 1) 117 continue; 118 if(fcnt >= MXF) 119 break; 120 fnum[fcnt++] = i; 121 } 122 if(fcnt == 0) 123 { printf("no secret mail\n"); 124 exit(0); 125 } 126 qsort(fnum, fcnt, sizeof(int), icmp); 127 } 128 decipher(u, w) FILE *u, *w; 129 { int i; 130 short a; 131 for(;;) 132 { nin(mbuf, u); 133 if(feof(u)) break; 134 mult(mbuf, x, mbuf); 135 mdiv(mbuf, b, q, mbuf); 136 for(i=1; i<=3; i++) 137 { a = mbuf->val[i]; 138 putc(a&0177, w); 139 a >>= 8; 140 putc(a&0177, w); 141 } 142 } 143 } 144