Blame


1 5cdb1798 2005-10-29 devnull #include "common.h"
2 5cdb1798 2005-10-29 devnull #include "dat.h"
3 5cdb1798 2005-10-29 devnull
4 5cdb1798 2005-10-29 devnull String*
5 5cdb1798 2005-10-29 devnull getaddr(Node *p)
6 5cdb1798 2005-10-29 devnull {
7 5cdb1798 2005-10-29 devnull for(; p; p = p->next){
8 5cdb1798 2005-10-29 devnull if(p->s && p->addr)
9 5cdb1798 2005-10-29 devnull return p->s;
10 5cdb1798 2005-10-29 devnull }
11 5cdb1798 2005-10-29 devnull return nil;
12 5cdb1798 2005-10-29 devnull }
13 5cdb1798 2005-10-29 devnull
14 5cdb1798 2005-10-29 devnull /* send messae adding our own reply-to and precedence */
15 5cdb1798 2005-10-29 devnull void
16 5cdb1798 2005-10-29 devnull getaddrs(void)
17 5cdb1798 2005-10-29 devnull {
18 5cdb1798 2005-10-29 devnull Field *f;
19 5cdb1798 2005-10-29 devnull
20 5cdb1798 2005-10-29 devnull for(f = firstfield; f; f = f->next){
21 5cdb1798 2005-10-29 devnull if(f->node->c == FROM && from == nil)
22 5cdb1798 2005-10-29 devnull from = getaddr(f->node);
23 5cdb1798 2005-10-29 devnull if(f->node->c == SENDER && sender == nil)
24 5cdb1798 2005-10-29 devnull sender = getaddr(f->node);
25 5cdb1798 2005-10-29 devnull }
26 5cdb1798 2005-10-29 devnull }
27 5cdb1798 2005-10-29 devnull
28 5cdb1798 2005-10-29 devnull /* write address file, should be append only */
29 5cdb1798 2005-10-29 devnull void
30 5cdb1798 2005-10-29 devnull writeaddr(char *file, char *addr, int rem, char *listname)
31 5cdb1798 2005-10-29 devnull {
32 5cdb1798 2005-10-29 devnull int fd;
33 5cdb1798 2005-10-29 devnull Dir nd;
34 5cdb1798 2005-10-29 devnull
35 5cdb1798 2005-10-29 devnull fd = open(file, OWRITE);
36 5cdb1798 2005-10-29 devnull if(fd < 0){
37 5cdb1798 2005-10-29 devnull fd = create(file, OWRITE, DMAPPEND|0666);
38 5cdb1798 2005-10-29 devnull if(fd < 0)
39 5cdb1798 2005-10-29 devnull sysfatal("creating address list %s: %r", file);
40 5cdb1798 2005-10-29 devnull nulldir(&nd);
41 5cdb1798 2005-10-29 devnull nd.mode = DMAPPEND|0666;
42 5cdb1798 2005-10-29 devnull dirwstat(file, &nd);
43 5cdb1798 2005-10-29 devnull } else
44 5cdb1798 2005-10-29 devnull seek(fd, 0, 2);
45 5cdb1798 2005-10-29 devnull if(rem)
46 5cdb1798 2005-10-29 devnull fprint(fd, "!%s\n", addr);
47 5cdb1798 2005-10-29 devnull else
48 5cdb1798 2005-10-29 devnull fprint(fd, "%s\n", addr);
49 5cdb1798 2005-10-29 devnull close(fd);
50 5cdb1798 2005-10-29 devnull
51 5cdb1798 2005-10-29 devnull if(*addr != '#')
52 5cdb1798 2005-10-29 devnull sendnotification(addr, listname, rem);
53 5cdb1798 2005-10-29 devnull }
54 5cdb1798 2005-10-29 devnull
55 5cdb1798 2005-10-29 devnull void
56 5cdb1798 2005-10-29 devnull remaddr(char *addr)
57 5cdb1798 2005-10-29 devnull {
58 5cdb1798 2005-10-29 devnull Addr **l;
59 5cdb1798 2005-10-29 devnull Addr *a;
60 5cdb1798 2005-10-29 devnull
61 5cdb1798 2005-10-29 devnull for(l = &al; *l; l = &(*l)->next){
62 5cdb1798 2005-10-29 devnull a = *l;
63 5cdb1798 2005-10-29 devnull if(strcmp(addr, a->addr) == 0){
64 5cdb1798 2005-10-29 devnull (*l) = a->next;
65 5cdb1798 2005-10-29 devnull free(a);
66 5cdb1798 2005-10-29 devnull na--;
67 5cdb1798 2005-10-29 devnull break;
68 5cdb1798 2005-10-29 devnull }
69 5cdb1798 2005-10-29 devnull }
70 5cdb1798 2005-10-29 devnull }
71 5cdb1798 2005-10-29 devnull
72 5cdb1798 2005-10-29 devnull int
73 5cdb1798 2005-10-29 devnull addaddr(char *addr)
74 5cdb1798 2005-10-29 devnull {
75 5cdb1798 2005-10-29 devnull Addr **l;
76 5cdb1798 2005-10-29 devnull Addr *a;
77 5cdb1798 2005-10-29 devnull
78 5cdb1798 2005-10-29 devnull for(l = &al; *l; l = &(*l)->next){
79 5cdb1798 2005-10-29 devnull if(strcmp(addr, (*l)->addr) == 0)
80 5cdb1798 2005-10-29 devnull return 0;
81 5cdb1798 2005-10-29 devnull }
82 5cdb1798 2005-10-29 devnull na++;
83 5cdb1798 2005-10-29 devnull *l = a = malloc(sizeof(*a)+strlen(addr)+1);
84 5cdb1798 2005-10-29 devnull if(a == nil)
85 5cdb1798 2005-10-29 devnull sysfatal("allocating: %r");
86 5cdb1798 2005-10-29 devnull a->addr = (char*)&a[1];
87 5cdb1798 2005-10-29 devnull strcpy(a->addr, addr);
88 5cdb1798 2005-10-29 devnull a->next = nil;
89 5cdb1798 2005-10-29 devnull *l = a;
90 5cdb1798 2005-10-29 devnull return 1;
91 5cdb1798 2005-10-29 devnull }
92 5cdb1798 2005-10-29 devnull
93 5cdb1798 2005-10-29 devnull /* read address file */
94 5cdb1798 2005-10-29 devnull void
95 5cdb1798 2005-10-29 devnull readaddrs(char *file)
96 5cdb1798 2005-10-29 devnull {
97 5cdb1798 2005-10-29 devnull Biobuf *b;
98 5cdb1798 2005-10-29 devnull char *p;
99 5cdb1798 2005-10-29 devnull
100 5cdb1798 2005-10-29 devnull b = Bopen(file, OREAD);
101 5cdb1798 2005-10-29 devnull if(b == nil)
102 5cdb1798 2005-10-29 devnull return;
103 5cdb1798 2005-10-29 devnull
104 5cdb1798 2005-10-29 devnull while((p = Brdline(b, '\n')) != nil){
105 5cdb1798 2005-10-29 devnull p[Blinelen(b)-1] = 0;
106 5cdb1798 2005-10-29 devnull if(*p == '#')
107 5cdb1798 2005-10-29 devnull continue;
108 5cdb1798 2005-10-29 devnull if(*p == '!')
109 5cdb1798 2005-10-29 devnull remaddr(p+1);
110 5cdb1798 2005-10-29 devnull else
111 5cdb1798 2005-10-29 devnull addaddr(p);
112 5cdb1798 2005-10-29 devnull }
113 5cdb1798 2005-10-29 devnull Bterm(b);
114 5cdb1798 2005-10-29 devnull }
115 5cdb1798 2005-10-29 devnull
116 5cdb1798 2005-10-29 devnull /* start a mailer sending to all the receivers */
117 5cdb1798 2005-10-29 devnull int
118 5cdb1798 2005-10-29 devnull startmailer(char *name)
119 5cdb1798 2005-10-29 devnull {
120 5cdb1798 2005-10-29 devnull int pfd[2];
121 5cdb1798 2005-10-29 devnull char **av;
122 5cdb1798 2005-10-29 devnull int ac;
123 5cdb1798 2005-10-29 devnull Addr *a;
124 5cdb1798 2005-10-29 devnull
125 5cdb1798 2005-10-29 devnull putenv("upasname", "/dev/null");
126 5cdb1798 2005-10-29 devnull if(pipe(pfd) < 0)
127 5cdb1798 2005-10-29 devnull sysfatal("creating pipe: %r");
128 5cdb1798 2005-10-29 devnull switch(fork()){
129 5cdb1798 2005-10-29 devnull case -1:
130 5cdb1798 2005-10-29 devnull sysfatal("starting mailer: %r");
131 5cdb1798 2005-10-29 devnull case 0:
132 5cdb1798 2005-10-29 devnull close(pfd[1]);
133 5cdb1798 2005-10-29 devnull break;
134 5cdb1798 2005-10-29 devnull default:
135 5cdb1798 2005-10-29 devnull close(pfd[0]);
136 5cdb1798 2005-10-29 devnull return pfd[1];
137 5cdb1798 2005-10-29 devnull }
138 5cdb1798 2005-10-29 devnull
139 5cdb1798 2005-10-29 devnull dup(pfd[0], 0);
140 5cdb1798 2005-10-29 devnull close(pfd[0]);
141 5cdb1798 2005-10-29 devnull
142 5cdb1798 2005-10-29 devnull av = malloc(sizeof(char*)*(na+2));
143 5cdb1798 2005-10-29 devnull if(av == nil)
144 5cdb1798 2005-10-29 devnull sysfatal("starting mailer: %r");
145 5cdb1798 2005-10-29 devnull ac = 0;
146 5cdb1798 2005-10-29 devnull av[ac++] = name;
147 5cdb1798 2005-10-29 devnull for(a = al; a != nil; a = a->next)
148 5cdb1798 2005-10-29 devnull av[ac++] = a->addr;
149 5cdb1798 2005-10-29 devnull av[ac] = 0;
150 5cdb1798 2005-10-29 devnull exec("/bin/upas/send", av);
151 5cdb1798 2005-10-29 devnull sysfatal("execing mailer: %r");
152 5cdb1798 2005-10-29 devnull
153 5cdb1798 2005-10-29 devnull /* not reached */
154 5cdb1798 2005-10-29 devnull return -1;
155 5cdb1798 2005-10-29 devnull }
156 5cdb1798 2005-10-29 devnull
157 5cdb1798 2005-10-29 devnull void
158 5cdb1798 2005-10-29 devnull sendnotification(char *addr, char *listname, int rem)
159 5cdb1798 2005-10-29 devnull {
160 5cdb1798 2005-10-29 devnull int pfd[2];
161 5cdb1798 2005-10-29 devnull Waitmsg *w;
162 5cdb1798 2005-10-29 devnull
163 5cdb1798 2005-10-29 devnull putenv("upasname", "/dev/null");
164 5cdb1798 2005-10-29 devnull if(pipe(pfd) < 0)
165 5cdb1798 2005-10-29 devnull sysfatal("creating pipe: %r");
166 5cdb1798 2005-10-29 devnull switch(fork()){
167 5cdb1798 2005-10-29 devnull case -1:
168 5cdb1798 2005-10-29 devnull sysfatal("starting mailer: %r");
169 5cdb1798 2005-10-29 devnull case 0:
170 5cdb1798 2005-10-29 devnull close(pfd[1]);
171 5cdb1798 2005-10-29 devnull dup(pfd[0], 0);
172 5cdb1798 2005-10-29 devnull close(pfd[0]);
173 5cdb1798 2005-10-29 devnull execl("/bin/upas/send", "mlnotify", addr, nil);
174 5cdb1798 2005-10-29 devnull sysfatal("execing mailer: %r");
175 5cdb1798 2005-10-29 devnull break;
176 5cdb1798 2005-10-29 devnull default:
177 5cdb1798 2005-10-29 devnull close(pfd[0]);
178 5cdb1798 2005-10-29 devnull fprint(pfd[1], "From: %s-owner\n\n", listname);
179 5cdb1798 2005-10-29 devnull if(rem)
180 5cdb1798 2005-10-29 devnull fprint(pfd[1], "You have removed from the %s mailing list\n", listname);
181 5cdb1798 2005-10-29 devnull else{
182 5cdb1798 2005-10-29 devnull fprint(pfd[1], "You have been added to the %s mailing list\n", listname);
183 5cdb1798 2005-10-29 devnull fprint(pfd[1], "To be removed, send an email to %s-owner containing\n",
184 5cdb1798 2005-10-29 devnull listname);
185 5cdb1798 2005-10-29 devnull fprint(pfd[1], "the word 'remove' in the subject or body.\n");
186 5cdb1798 2005-10-29 devnull }
187 5cdb1798 2005-10-29 devnull close(pfd[1]);
188 fa325e9b 2020-01-10 cross
189 5cdb1798 2005-10-29 devnull /* wait for mailer to end */
190 5cdb1798 2005-10-29 devnull while(w = wait()){
191 5cdb1798 2005-10-29 devnull if(w->msg != nil && w->msg[0])
192 5cdb1798 2005-10-29 devnull sysfatal("%s", w->msg);
193 5cdb1798 2005-10-29 devnull free(w);
194 5cdb1798 2005-10-29 devnull }
195 5cdb1798 2005-10-29 devnull break;
196 5cdb1798 2005-10-29 devnull }
197 5cdb1798 2005-10-29 devnull }