|
|
1.1 root 1: #include <signal.h>
2: #include "mail.h"
3: #include "string.h"
4: #include "message.h"
5: #include <sys/stat.h>
6: #include <utmp.h>
7:
8: SIGRETURN
9: ding(s)
10: int s;
11: {
12: signal(SIGALRM, ding);
13: }
14:
15: /* output message to one terminal */
16: static void
17: tell(dev, sender, date)
18: char *dev, *sender, *date;
19: {
20: int fd;
21: static string *msg=NULL;
22:
23: signal(SIGALRM, ding);
24: alarm(30);
25: if((fd = open(dev, 1))<0)
26: return;
27: if(msg==NULL)
28: msg=s_new();
29: s_append(s_restart(msg), "[\007From ");
30: s_append(msg, sender);
31: s_append(msg, " ");
32: s_append(msg, date);
33: s_append(msg, "\007]\n");
34: write(fd, s_to_c(msg), strlen(s_to_c(msg)));
35: alarm(0);
36: close(fd);
37: }
38:
39: /* loop through all logins */
40: notify(user, mp)
41: char *user;
42: message *mp;
43: {
44: int fd;
45: struct utmp u;
46: char dev[128];
47: struct stat sbuf;
48:
49: if((fd=open("/etc/utmp", 0))<0)
50: return;
51: while(read(fd, (char *)&u, sizeof(u))==sizeof(u)) {
52: if (strncmp(u.ut_name, user, sizeof(u.ut_name))!=0)
53: continue;
54: strcpy(dev, "/dev/");
55: strncat(dev, u.ut_line, sizeof(u.ut_line));
56: dev[sizeof(u.ut_line)+sizeof("/dev/")-1] = '\0';
57: if (stat(dev, &sbuf)<0)
58: continue;
59: if (sbuf.st_mode&S_IEXEC)
60: tell(dev, s_to_c(mp->sender), s_to_c(mp->date));
61: }
62: close(fd);
63: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.