|
|
1.1 root 1: #include <stdio.h>
2: #include <errno.h>
3: #include <sys/param.h>
4: #include <sys/types.h>
5: #include <sys/stat.h>
6: #include <dir.h>
7: #include "defs.h"
8: #include "load.h"
9:
10: /* globals for mail scanning */
11: FILE *mlfp = NULL;
12: struct stat s;
13: struct stat os;
14: int doscan = FALSE;
15: char *user[NOFILE];
16:
17: /* imported */
18: extern int errno;
19:
20: /* initialize */
21: init()
22: {
23: initload();
24: }
25:
26: /* return my name */
27: char *
28: myname()
29: {
30: return ("mon");
31: }
32:
33: /* send the current information to a client */
34: sendinfo (fd)
35: int fd;
36: {
37: char *p, *strchr();
38: char buf[128];
39: char line[128];
40: char token[128];
41: int len, n;
42:
43: /* send the load */
44: sprintf(buf, "load %f time %d vec %d %d %d %d %d\n",
45: load.l_runq, load.l_time, load.l_cp[0], load.l_cp[1],
46: load.l_cp[2], load.l_cp[3], load.l_cp[4]);
47: len = strlen(buf);
48: if (write (fd, buf, len) != len)
49: return (-1);
50:
51: /* check for mail if its time */
52: strcpy(token, "delivered ");
53: strcat(token, user);
54: strcat(token, " From ");
55: n = strlen(token);
56: if (doscan) {
57: if (fseek(mlfp, os.st_size, 0) < 0) {
58: os.st_ino = 0;
59: return 0;
60: }
61: while (fgets(line, sizeof(line), mlfp)!=NULL) {
62: if (strncmp(token, line, n)!=0)
63: continue;
64: p = strchr(&line[n], ' ');
65: if (p==NULL)
66: continue;
67: *p = '\0';
68: sprintf(buf, "from %s\n", &line[n]);
69: len = strlen(buf);
70: if (write (fd, buf, len) != len)
71: return (-1);
72: }
73: }
74: return (0);
75: }
76:
77: /* generate the current information */
78: generate()
79: {
80: long now;
81: static long lastscan;
82: #define MAILNAME "/usr/spool/mail/mail.log"
83:
84: /* get load info */
85: genload ();
86:
87: /* find out if we should scanmn the mail */
88: now = time (NULL);
89: doscan = (now - lastscan) > 60;
90: if (doscan) {
91: os = s;
92: lastscan = now;
93: if (stat(MAILNAME, &s)<0) {
94: doscan = FALSE;
95: } else if (os.st_dev != s.st_dev || os.st_ino != s.st_ino) {
96: if (mlfp)
97: fclose(mlfp);
98: mlfp = fopen (MAILNAME, "r");
99: os.st_size = 0;
100: } else if (os.st_size == s.st_size) {
101: doscan = FALSE;
102: }
103: }
104: }
105:
106: /* add a client */
107: void
108: add (fd, who)
109: int fd;
110: char *who;
111: {
112: char *strdup();
113:
114: if (user[fd])
115: free(user[fd]);
116: user[fd] = strdup(who);
117: }
118:
119: /* drop a client */
120: void
121: drop (fd)
122: {
123: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.