xref: /original-bsd/usr.bin/xsend/xget/xget.c (revision 92d3de31)
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