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