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