|
|
1.1 root 1: /*
2: * notify user on mail arrival
3: */
4: #include <stdio.h>
5: #include <sys/types.h>
6: #include <sys/stat.h>
7: #include <utmp.h>
8: #include "string.h"
9:
10: /* imports */
11: extern char *thissys;
12: extern unsigned int alarm();
13:
14: extern void
15: setnotify()
16: {
17: struct stat s;
18: char *ttyname();
19: char *p;
20:
21: fstat(2, &s);
22: setgid(getgid());
23: setuid(getuid());
24: if ((p = ttyname(2)) && *p)
25: chmod(p, s.st_mode ^ S_IEXEC);
26: }
27:
28:
29: static int
30: blurbtime()
31: {
32: }
33:
34: static void
35: blurb(tty, sender, maxsize)
36: char *tty, *sender;
37: {
38: FILE *f = NULL;
39: struct stat s;
40: char devtty[32];
41:
42: strcpy(devtty, "/dev/");
43: strncat(devtty, tty, maxsize);
44: signal(SIGALRM, blurbtime);
45: alarm(30);
46: stat(devtty, &s);
47: if (s.st_mode & S_IEXEC) /* notify only if enabled */
48: if ((f = fopen(devtty, "w")) != NULL) {
49: fprintf(f, "\r\n[%s: mail from %s]\r\n\7", thissys,
50: sender);
51: }
52: if (f)
53: fclose(f);
54: alarm(0);
55: }
56:
57: extern int
58: notify(name, sender)
59: char *name, *sender;
60: {
61: struct utmp entry;
62: FILE *f;
63:
64: if ((f = fopen("/etc/utmp", "r")) == NULL)
65: return;
66: while (fread((char *)&entry, sizeof(entry), 1, f) == 1) {
67: if (strncmp(name, entry.ut_name, sizeof(entry.ut_name)) == 0)
68: blurb(entry.ut_line, sender, sizeof(entry.ut_line));
69: }
70: fclose(f);
71: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.