Research V6 development
[unix-history] / usr / source / s2 / mail.c
CommitLineData
f92a7c4c
KT
1#
2/* mail command usage
3 mail
4 prints your mail
5 mail people
6 sends standard input to people
7 */
8
9#define SIGINT 2
10
11struct utmp {
12 char name[8];
13 char tty;
14 char pad1;
15 int ltime[2];
16 int pad2;
17};
18
19struct passwd {
20 char *pw_name;
21 char *pw_passwd;
22 int pw_uid;
23 int pw_gid;
24 char *pw_gecos;
25 char *pw_dir;
26 char *pw_shell;
27};
28
29char lettmp[] "/tmp/maxxxxx";
30char preptmp[] "/tmp/mbxxxxx";
31int pwfil;
32
33main(argc, argv)
34char **argv;
35{
36 register me;
37 extern fout;
38 register struct passwd *p;
39 register char *cp;
40 static struct utmp ubuf;
41 int uf;
42
43 maketemp();
44 if (argc==1 || argc==2 && argv[1][0]=='-') {
45 printmail(argc, argv);
46 delexit();
47 }
48 signal(SIGINT, delexit);
49 fout = creat(lettmp, 0600);
50 if (((me=ttyn(1))!='x' || (me=ttyn(2))!='x')
51 && (uf = open("/etc/utmp", 0)) > 0) {
52 while (read(uf, &ubuf, sizeof ubuf) == sizeof ubuf)
53 if (ubuf.tty == me) {
54 ubuf.name[8] = ' ';
55 close(uf);
56 for (cp=ubuf.name; *cp++!=' ';);
57 *--cp = 0;
58 bulkmail(argc, argv, ubuf.name);
59 }
60 }
61 me = getuid() & 0377;
62 setpw();
63 for (;;)
64 if ((p = getpwent()) && p->pw_uid == me)
65 bulkmail(argc, argv, p->pw_name);
66 fout = 1;
67 printf("Who are you?\n");
68 delexit();
69}
70
71printmail(argc, argv)
72char **argv;
73{
74 extern fin, fout;
75 register n, c, f;
76
77 if (fopen(".mail", &fin)>=0 && (c = getchar())) {
78 do {
79 putchar(c);
80 } while (c = getchar());
81 close(fin);
82 c = 'y';
83 if (argc<2) {
84 if (ttyn(0)!='x') {
85 printf("Save?");
86 fin = 0;
87 c = getchar();
88 }
89 } else
90 c = argv[1][1];
91 if (c=='y') {
92 prepend(".mail", "mbox");
93 printf("Saved mail in 'mbox'\n");
94 }
95 close(creat(".mail"));
96 } else
97 printf("No mail.\n");
98}
99
100bulkmail(argc, argv, from)
101char **argv, *from;
102{
103 extern fin, fout;
104 int tbuf[2];
105 register c;
106
107 fin = 0;
108 (&fin)[1] = 0;
109 time(tbuf);
110 printf("From %s %s", from, ctime(tbuf));
111 while (c = getchar())
112 putchar(c);
113 putchar('\n');
114 flush();
115 close(fout);
116 while (--argc > 0)
117 sendto(*++argv);
118 delexit();
119}
120
121sendto(person)
122char *person;
123{
124 static saved;
125 extern fout;
126 extern fin;
127 register struct passwd *p;
128
129 setpw();
130 while (p = getpwent()) {
131 if (equal(p->pw_name, person)) {
132 if (prepend(lettmp, cat(p->pw_dir, "/.mail"))==0)
133 break;
134 return;
135 }
136 }
137 fout = 1;
138 flush();
139 printf("Can't send to %s.\n", person);
140 if (ttyn(0)!='x' && saved==0) {
141 unlink("dead.letter");
142 saved++;
143 printf("Letter saved in 'dead.letter'\n");
144 prepend(lettmp, "dead.letter");
145 }
146}
147
148prepend(from, to)
149char *from, *to;
150{
151 extern int fin, fout;
152
153 fcreat(preptmp, &fout);
154 fopen(from, &fin);
155 while (putchar(getchar()));
156 close(fin);
157 fopen(to, &fin);
158 while (putchar(getchar()));
159 close(fin);
160 flush();
161 close(fout);
162 if (fcreat(to, &fout) < 0) {
163 fout = 1;
164 return(0);
165 }
166 fopen(preptmp, &fin);
167 while(putchar(getchar()));
168 flush();
169 close(fout);
170 close(fin);
171 fout = 1;
172 return(1);
173}
174
175setpw()
176{
177 extern fin;
178
179 if (pwfil == 0) {
180 fopen("/etc/passwd", &fin);
181 pwfil = fin;
182 } else
183 fin = pwfil;
184 (&fin)[1] = 0;
185 seek(fin, 0, 0);
186}
187
188getpwent()
189{
190 register char *p;
191 register c;
192 static struct passwd passwd;
193 static char line[100];
194 extern fin;
195
196 p = line;
197 while((c=getchar()) != '\n') {
198 if(c <= 0)
199 return(0);
200 if(p < line+98)
201 *p++ = c;
202 }
203 *p = 0;
204 p = line;
205 passwd.pw_name = p;
206 p = pwskip(p);
207 passwd.pw_passwd = p;
208 p = pwskip(p);
209 passwd.pw_uid = atoi(p);
210 p = pwskip(p);
211 passwd.pw_gid = atoi(p);
212 p = pwskip(p);
213 passwd.pw_gecos = p;
214 p = pwskip(p);
215 passwd.pw_dir = p;
216 p = pwskip(p);
217 passwd.pw_shell = p;
218 return(&passwd);
219}
220
221pwskip(ap)
222char *ap;
223{
224 register char *p;
225
226 p = ap;
227 while(*p != ':') {
228 if(*p == 0)
229 return(p);
230 p++;
231 }
232 *p++ = 0;
233 return(p);
234}
235
236delexit()
237{
238 unlink(lettmp);
239 unlink(preptmp);
240 exit(0);
241}
242
243maketemp()
244{
245 int i, pid, d;
246
247 pid = getpid();
248 for (i=11; i>=7; --i) {
249 d = (pid&07) + '0';
250 lettmp[i] = d;
251 preptmp[i] = d;
252 pid =>> 3;
253 }
254}
255
256equal(as1, as2)
257{
258 register char *s1, *s2;
259
260 s1 = as1;
261 s2 = as2;
262 while (*s1++ == *s2)
263 if (*s2++ == 0)
264 return(1);
265 return(0);
266}
267
268cat(ap1, ap2)
269char *ap1, *ap2;
270{
271 register char *p1, *p2;
272 static char fn[32];
273
274 p1 = ap1;
275 p2 = fn;
276 while (*p2++ = *p1++);
277 p2--;
278 p1 = ap2;
279 while (*p2++ = *p1++);
280 return(fn);
281}