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