Bell 32V development
[unix-history] / usr / src / cmd / xsend / xsend.c
CommitLineData
f10981a1
TL
1#include "xmail.h"
2#include "sys/types.h"
3#include "pwd.h"
4#include "sys/stat.h"
5#include "sys/dir.h"
6extern int errno;
7struct stat stbuf;
8int uid, destuid;
9char *myname, *dest, *keyfile[128], line[128];
10struct direct dbuf;
11char *maildir = "/usr/spool/secretmail/";
12FILE *kf, *mf, *df;
13MINT *a[42], *cd[6][128];
14MINT *msg;
15char buf[256], eof;
16int dbg;
17main(argc, argv) char **argv;
18{ int i, nmax, len;
19 char *p;
20 long now;
21 if(argc != 2)
22 xfatal("mail to exactly one person");
23 uid = getuid();
24 p =getlogin();
25 if(p == NULL)
26 p = getpwuid(uid)->pw_name;
27 myname = malloc(strlen(p)+1);
28 strcpy(myname, p);
29 dest = argv[1];
30 strcpy(keyfile, maildir);
31 strcat(keyfile, dest);
32 strcat(keyfile, ".key");
33 if(stat(keyfile, &stbuf) <0)
34 xfatal("addressee not enrolled");
35 destuid = getpwnam(dest)->pw_uid;
36 if(destuid != stbuf.st_uid)
37 fprintf(stderr, "warning: addressee's key file may be subverted\n");
38 errno = 0;
39 kf = fopen(keyfile, "r");
40 if(kf == NULL)
41 xfatal("addressee's key weird");
42 df = fopen(maildir, "r");
43 if(df == NULL)
44 { perror(maildir);
45 exit(1);
46 }
47 strcpy(line, dest);
48 strcat(line, ".%d");
49 nmax = -1;
50 for(; !feof(df);)
51 { fread(&dbuf, sizeof(dbuf), 1, df);
52 if(dbuf.d_ino == 0) continue;
53 if(sscanf(dbuf.d_name, line, &i) != 1)
54 continue;
55 if(i>nmax) nmax = i;
56 }
57 nmax ++;
58 for(i=0; i<10; i++)
59 { sprintf(line, "%s%s.%d", maildir, dest, nmax+i);
60 if(creat(line, 0666) >= 0) break;
61 }
62 if(i==10) xfatal("cannot create mail file");
63 mf = fopen(line, "w");
64 init();
65 time(&now);
66 sprintf(buf, "From %s %s", myname, ctime(&now) );
67#ifdef DBG
68 dbg = 1;
69#endif
70 run();
71 sprintf(buf, "mail %s <%snotice", dest, maildir);
72 system(buf);
73 exit(0);
74}
75mkcd()
76{ int i, j, k, n;
77 for(i=0; i<42; i++)
78 nin(a[i], kf);
79 fclose(kf);
80 for(i=0; i<6; i++)
81 for(j=0; j<128; j++)
82 for(k=j, n=0; k>0 && n<7; n++, k>>=1)
83 if(k&01) madd(cd[i][j], a[7*i+n], cd[i][j]);
84}
85encipher(s) char s[6];
86{ int i;
87 msub(msg, msg, msg);
88 for(i=0; i<6; i++)
89 madd(msg, cd[i][s[i]&0177], msg);
90}
91init()
92{ int i, j;
93 msg = itom(0);
94 for(i=0; i<42; i++)
95 a[i] = itom(0);
96 for(i=0; i<6; i++)
97 for(j=0; j<128; j++)
98 cd[i][j] = itom(0);
99 mkcd();
100}
101run()
102{ char *p;
103 int i, len, eof = 0;
104 for(;;)
105 { len = strlen(buf);
106 for(i=0; i<len/6; i++)
107 {
108 encipher(buf+6*i);
109 nout(msg, mf);
110 }
111 p = buf;
112 for(i *= 6; i<len; i++)
113 *p++ = buf[i];
114 if(eof) return;
115 fgets(p, sizeof(buf)-6, stdin);
116 if(strcmp(p, ".\n") == 0 || feof(stdin))
117 { for(i=0; i<6; i++) *p++ = ' ';
118 *p = 0;
119 eof = 1;
120 }
121 }
122}