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