|
|
1.1 root 1: /* msgchk.c - check for mail */
2:
3: #include "../h/mh.h"
4: #include <stdio.h>
5: #include "../zotnet/mts.h"
6: #include "../zotnet/tws.h"
7: #include <sys/types.h>
8: #include <sys/stat.h>
9: #include <pwd.h>
10:
11: /* */
12:
13: static struct swit switches[] = {
14: #define HELPSW 0
15: "help", 4,
16:
17: #ifdef POP
18: #define HOSTSW 1
19: "host host", 0,
20: #define USERSW 2
21: "user user", 0,
22:
23: #define RPOPSW 3
24: "rpop", 0,
25: #define NRPOPSW 4
26: "norpop", 0,
27: #endif POP
28:
29:
30: NULL, NULL
31: };
32:
33: /* */
34:
35: #define NONEOK 0x0
36: #define UUCPOLD 0x1
37: #define UUCPNEW 0x2
38: #define UUCPOK (UUCPOLD | UUCPNEW)
39: #define MMDFOLD 0x4
40: #define MMDFNEW 0x8
41: #define MMDFOK (MMDFOLD | MMDFNEW)
42:
43:
44: #ifdef POP
45: int snoop = 0;
46: #endif POP
47:
48:
49: #ifdef SYS5
50: struct passwd *getpwuid(), *getpwnam();
51: #endif SYS5
52:
53: /* */
54:
55: /* ARGSUSED */
56:
57: main(argc, argv)
58: int argc;
59: char *argv[];
60: {
61: int vecp = 0;
62: #ifdef POP
63: int rpop = 1;
64: #endif POP
65: char *cp,
66: #ifdef POP
67: *host = NULL,
68: #endif POP
69: buf[80],
70: **ap,
71: **argp,
72: *arguments[MAXARGS],
73: *vec[50];
74: struct passwd *pw;
75:
76: invo_name = r1bindex (argv[0], '/');
77: mts_init (invo_name);
78: #ifdef POP
79: if (pophost && *pophost)
80: host = pophost;
81: if ((cp = getenv ("MHPOPDEBUG")) && *cp)
82: snoop++;
83: #endif POP
84: if ((cp = m_find (invo_name)) != NULL) {
85: ap = brkstring (cp = getcpy (cp), " ", "\n");
86: ap = copyip (ap, arguments);
87: }
88: else
89: ap = arguments;
90: (void) copyip (argv + 1, ap);
91: argp = arguments;
92:
93: /* */
94:
95: while (cp = *argp++) {
96: if (*cp == '-')
97: switch (smatch (++cp, switches)) {
98: case AMBIGSW:
99: ambigsw (cp, switches);
100: done (1);
101: case UNKWNSW:
102: adios (NULLCP, "-%s unknown", cp);
103: case HELPSW:
104: (void) sprintf (buf, "%s [switches] [users ...]",
105: invo_name);
106: help (buf, switches);
107: done (1);
108:
109: #ifdef POP
110: case HOSTSW:
111: if (!(host = *argp++) || *host == '-')
112: adios (NULLCP, "missing argument to %s", argp[-2]);
113: continue;
114: case USERSW:
115: if (!(cp = *argp++) || *cp == '-')
116: adios (NULLCP, "missing argument to %s", argp[-2]);
117: vec[vecp++] = cp;
118: continue;
119: case RPOPSW:
120: rpop++;
121: continue;
122: case NRPOPSW:
123: rpop = 0;
124: continue;
125: #endif POP
126: }
127: vec[vecp++] = cp;
128: }
129:
130: /* */
131:
132: #ifdef POP
133: if (!*host)
134: host = NULL;
135: if (!host || !rpop)
136: (void) setuid (getuid ());
137: #endif POP
138: if (vecp == 0) {
139: #ifdef POP
140: if (host)
141: remotemail (host, NULLCP, rpop, 1);
142: else
143: #endif POP
144: if ((pw = getpwuid (getuid ())) == NULL)
145: adios (NULLCP, "you lose");
146: else
147: checkmail (pw, 1);
148: }
149: else {
150: vec[vecp] = NULL;
151:
152: for (vecp = 0; cp = vec[vecp]; vecp++)
153: #ifdef POP
154: if (host)
155: remotemail (host, cp, rpop, 0);
156: else
157: #endif POP
158: if (pw = getpwnam (cp))
159: checkmail (pw, 0);
160: else
161: advise (NULLCP, "no such user as %s", cp);
162: }
163:
164: done (0);
165: }
166:
167: /* */
168:
169: checkmail(pw, personal)
170: register struct passwd *pw;
171: int personal;
172: {
173: int mf;
174: char buffer[BUFSIZ];
175: struct stat st;
176:
177: (void) sprintf (buffer, "%s/%s",
178: mmdfldir[0] ? mmdfldir : pw -> pw_dir,
179: mmdflfil[0] ? mmdflfil : pw -> pw_name);
180: #ifndef MF
181: st.st_size = 0;
182: st.st_atime = st.st_mtime = 0;
183: #endif MF
184: mf = (stat (buffer, &st) == NOTOK || st.st_size == 0) ? NONEOK
185: : st.st_atime <= st.st_mtime ? MMDFNEW : MMDFOLD;
186:
187: #ifdef MF
188: if (umincproc != NULL && *umincproc != NULL) {
189: (void) sprintf (buffer, "%s/%s",
190: uucpldir[0] ? uucpldir : pw -> pw_dir,
191: uucplfil[0] ? uucplfil : pw -> pw_name);
192: mf |= (stat (buffer, &st) == NOTOK || st.st_size == 0) ? NONEOK
193: : st.st_atime <= st.st_mtime ? UUCPNEW : UUCPOLD;
194: }
195: #endif MF
196:
197: if ((mf & UUCPOK) || (mf & MMDFOK)) {
198: printf (personal ? "You have " : "%s has ", pw -> pw_name);
199: if (mf & UUCPOK)
200: printf ("%s old-style bell", mf & UUCPOLD ? "old" : "new");
201: if ((mf & UUCPOK) && (mf & MMDFOK))
202: printf (" and ");
203: if (mf & MMDFOK)
204: printf ("%s%s", mf & MMDFOLD ? "old" : "new",
205: mf & UUCPOK ? " Internet" : "");
206: printf (" mail waiting");
207: }
208: else
209: printf (personal ? "You don't %s%s" : "%s doesn't %s",
210: personal ? "" : pw -> pw_name, "have any mail waiting");
211:
212: #ifndef MF
213: if (st.st_atime)
214: printf ("; last read on %s",
215: dasctime (dlocaltime ((long *) & st.st_atime), TW_NULL));
216: #endif MF
217:
218: printf ("\n");
219: }
220:
221: /* */
222:
223: #ifdef POP
224: extern char response[];
225:
226:
227: remotemail(host, user, rpop, personal)
228: register char *host;
229: char *user;
230: int rpop, personal;
231: {
232: int nmsgs,
233: nbytes;
234: char *pass;
235:
236: if (rpop) {
237: if (user == NULL)
238: user = getusr ();
239: pass = getusr ();
240: }
241: else
242: ruserpass (host, &user, &pass);
243:
244: if (pop_init (host, user, pass, snoop, rpop) == NOTOK
245: || pop_stat (&nmsgs, &nbytes) == NOTOK
246: || pop_quit () == NOTOK) {
247: advise (NULLCP, "%s", response);
248: return;
249: }
250:
251: if (nmsgs) {
252: printf (personal ? "You have " : "%s has ", user);
253: printf ("%d message%s (%d bytes)",
254: nmsgs, nmsgs != 1 ? "s" : "", nbytes);
255: }
256: else
257: printf (personal ? "You don't %s%s" : "%s doesn't %s",
258: personal ? "" : user, "have any mail waiting");
259: printf (" on %s\n", host);
260: }
261: #endif POP
262:
263: /*
264: * XXX We need to force config.o to be linked in to get around
265: * library order problems
266: */
267: /* XXX don't bother if linking with the shared library */
268: #ifndef SHARED
269: static void
270: kludge()
271: {
272: (void)libpath((char *)0);
273: }
274: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.