annotate uip/sbboards.c @ 12:441a2190cfae

Lion fix
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sat, 21 Apr 2012 13:10:49 +0900
parents bce86c4163a3
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1 #ifndef SPOP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2 /* sbboards.c - MH style mailer to write to a ZOTnet BBoard */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
3 #else SPOP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
4 /* spop.c - MH style mailer to write to a POP subscriber */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
5 #endif SPOP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
6 #ifndef lint
12
441a2190cfae Lion fix
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
7 static char ident[] = "@(#)$Id: sbboards.c,v 1.1.1.1 2005/04/18 14:46:07 kono Exp $";
0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
8 #endif lint
bce86c4163a3 Initial revision
kono
parents:
diff changeset
9
bce86c4163a3 Initial revision
kono
parents:
diff changeset
10 #ifndef SPOP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
11
bce86c4163a3 Initial revision
kono
parents:
diff changeset
12 /* This program acts like the MMDF ch_bboards channel: it does local
bce86c4163a3 Initial revision
kono
parents:
diff changeset
13 delivery to a ZOTnet BBoard and/or addition re-distribution to other
bce86c4163a3 Initial revision
kono
parents:
diff changeset
14 recipients of the BBoard. This program can function both as a SendMail
bce86c4163a3 Initial revision
kono
parents:
diff changeset
15 mailer and an MH .mh_receive file, depending on whether SENDMTS or
bce86c4163a3 Initial revision
kono
parents:
diff changeset
16 MHMTS is set. Currently, the MHMTS version of this program does not do
bce86c4163a3 Initial revision
kono
parents:
diff changeset
17 re-distribution.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
18
bce86c4163a3 Initial revision
kono
parents:
diff changeset
19 This program should be used ONLY if you have "bboards on" set in your
bce86c4163a3 Initial revision
kono
parents:
diff changeset
20 MH configuration, and if you have "mts sendmail" or "mts mh" set as well.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
21 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
22
bce86c4163a3 Initial revision
kono
parents:
diff changeset
23 #else SPOP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
24
bce86c4163a3 Initial revision
kono
parents:
diff changeset
25 /* This program acts like the MMDF-II ch_pop channel: it does local
bce86c4163a3 Initial revision
kono
parents:
diff changeset
26 delivery for non-local users. These users are known as POP subscribers
bce86c4163a3 Initial revision
kono
parents:
diff changeset
27 and use the Post Office Protocol with a POP server in order to access
bce86c4163a3 Initial revision
kono
parents:
diff changeset
28 their maildrop.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
29 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
30
bce86c4163a3 Initial revision
kono
parents:
diff changeset
31 #endif SPOP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
32
bce86c4163a3 Initial revision
kono
parents:
diff changeset
33 #undef DISTRIBUTE
bce86c4163a3 Initial revision
kono
parents:
diff changeset
34 #ifdef SENDMTS
bce86c4163a3 Initial revision
kono
parents:
diff changeset
35 #ifndef SPOP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
36 #define DISTRIBUTE
bce86c4163a3 Initial revision
kono
parents:
diff changeset
37 #endif not SPOP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
38 #endif SENDMTS
bce86c4163a3 Initial revision
kono
parents:
diff changeset
39
bce86c4163a3 Initial revision
kono
parents:
diff changeset
40 #include "../h/mh.h"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
41 #ifndef SPOP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
42 #include "../h/addrsbr.h"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
43 #endif not SPOP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
44 #include "../h/dropsbr.h"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
45 #include "../zotnet/bboards.h"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
46 #include "../zotnet/tws.h"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
47 #include <stdio.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
48 #include "../zotnet/mts.h"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
49 #include <pwd.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
50 #ifndef SYS5
bce86c4163a3 Initial revision
kono
parents:
diff changeset
51 #include <sysexits.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
52 #else SYS5
bce86c4163a3 Initial revision
kono
parents:
diff changeset
53 #define EX_CANTCREAT 1
bce86c4163a3 Initial revision
kono
parents:
diff changeset
54 #define EX_IOERR 1
bce86c4163a3 Initial revision
kono
parents:
diff changeset
55 #define EX_NOINPUT 1
bce86c4163a3 Initial revision
kono
parents:
diff changeset
56 #define EX_NOUSER 1
bce86c4163a3 Initial revision
kono
parents:
diff changeset
57 #define EX_OK 0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
58 #define EX_OSERR 1
bce86c4163a3 Initial revision
kono
parents:
diff changeset
59 #define EX_OSFILE 1
bce86c4163a3 Initial revision
kono
parents:
diff changeset
60 #define EX_UNAVAILABLE 1
bce86c4163a3 Initial revision
kono
parents:
diff changeset
61 #define EX_USAGE 1
bce86c4163a3 Initial revision
kono
parents:
diff changeset
62 #endif SYS5
bce86c4163a3 Initial revision
kono
parents:
diff changeset
63 #ifdef DISTRIBUTE
bce86c4163a3 Initial revision
kono
parents:
diff changeset
64 #include "../mts/sendmail/smail.h"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
65 #endif DISTRIBUTE
bce86c4163a3 Initial revision
kono
parents:
diff changeset
66 #ifdef LOCALE
bce86c4163a3 Initial revision
kono
parents:
diff changeset
67 #include <locale.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
68 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
69 #ifdef linux
bce86c4163a3 Initial revision
kono
parents:
diff changeset
70 #include <sys/types.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
71 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
72 #if defined(UNISTD) && !defined(sgi)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
73 #include <unistd.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
74 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
75
bce86c4163a3 Initial revision
kono
parents:
diff changeset
76 #define NBB 100
bce86c4163a3 Initial revision
kono
parents:
diff changeset
77
bce86c4163a3 Initial revision
kono
parents:
diff changeset
78 #ifndef SPOP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
79 #define ENTITY "bboard"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
80 #else SPOP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
81 #define ENTITY "subscriber"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
82 #endif SPOP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
83
bce86c4163a3 Initial revision
kono
parents:
diff changeset
84 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
85
bce86c4163a3 Initial revision
kono
parents:
diff changeset
86 static int bb_fderr;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
87
bce86c4163a3 Initial revision
kono
parents:
diff changeset
88 static int bb_uid;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
89 static int bb_gid;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
90
bce86c4163a3 Initial revision
kono
parents:
diff changeset
91 static int dst_rcpt ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
92
bce86c4163a3 Initial revision
kono
parents:
diff changeset
93
bce86c4163a3 Initial revision
kono
parents:
diff changeset
94 #ifndef SPOP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
95 static char bb_from[BUFSIZ];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
96 static char bb_head[BUFSIZ];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
97 static char bb_home[BUFSIZ];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
98 static char bb_time[BUFSIZ];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
99 #ifdef DISTRIBUTE
bce86c4163a3 Initial revision
kono
parents:
diff changeset
100 static char bb_rept[BUFSIZ];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
101 #endif DISTRIBUTE
bce86c4163a3 Initial revision
kono
parents:
diff changeset
102 #else SPOP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
103 #define bb_head NULLCP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
104 #endif SPOP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
105
bce86c4163a3 Initial revision
kono
parents:
diff changeset
106 static struct bboard *bb[NBB];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
107
bce86c4163a3 Initial revision
kono
parents:
diff changeset
108 #if defined(UNISTD) && !defined(sgi)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
109 #include <unistd.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
110 #else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
111 off_t lseek ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
112 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
113
bce86c4163a3 Initial revision
kono
parents:
diff changeset
114 #ifndef __STDC__
bce86c4163a3 Initial revision
kono
parents:
diff changeset
115 #ifdef SYS5
bce86c4163a3 Initial revision
kono
parents:
diff changeset
116 struct passwd *getpwnam ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
117 #endif /* SYS5 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
118 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
119
bce86c4163a3 Initial revision
kono
parents:
diff changeset
120 #ifndef SPOP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
121 static int mbx_init();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
122 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
123 #ifdef DISTRIBUTE
bce86c4163a3 Initial revision
kono
parents:
diff changeset
124 static int distribute(), notify(), encap(),
bce86c4163a3 Initial revision
kono
parents:
diff changeset
125 dst_init(), dst_text(),
bce86c4163a3 Initial revision
kono
parents:
diff changeset
126 dst_end(), dst_lose(), dst_adrs();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
127 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
128
bce86c4163a3 Initial revision
kono
parents:
diff changeset
129 /* hack */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
130 #define adios my_adios
bce86c4163a3 Initial revision
kono
parents:
diff changeset
131 static localmail(), arginit();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
132 static int lose(), copyfile();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
133 static void adios();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
134 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
135
bce86c4163a3 Initial revision
kono
parents:
diff changeset
136 /* ARGSUSED */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
137
bce86c4163a3 Initial revision
kono
parents:
diff changeset
138 main (argc, argv, envp)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
139 int argc;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
140 char **argv,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
141 **envp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
142 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
143 int fd;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
144 char tmpfil[BUFSIZ];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
145
bce86c4163a3 Initial revision
kono
parents:
diff changeset
146 #ifdef LOCALE
bce86c4163a3 Initial revision
kono
parents:
diff changeset
147 setlocale(LC_ALL, "");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
148 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
149 #ifdef JAPAN
bce86c4163a3 Initial revision
kono
parents:
diff changeset
150 ml_init();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
151 #endif /* JAPAN */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
152 #ifdef MHMTS
bce86c4163a3 Initial revision
kono
parents:
diff changeset
153 if (argc != 5)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
154 adios (EX_USAGE, NULL, "you lose really big");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
155 #endif MHMTS
bce86c4163a3 Initial revision
kono
parents:
diff changeset
156 arginit (argv);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
157
bce86c4163a3 Initial revision
kono
parents:
diff changeset
158 fflush (stdout);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
159 discard (stdout); /* XXX: reference discard to help loader */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
160
bce86c4163a3 Initial revision
kono
parents:
diff changeset
161 fd = copyfile (fileno (stdin), tmpfil);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
162 (void) unlink (tmpfil);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
163
bce86c4163a3 Initial revision
kono
parents:
diff changeset
164 localmail (fd);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
165 #ifdef DISTRIBUTE
bce86c4163a3 Initial revision
kono
parents:
diff changeset
166 distribute (fd);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
167 notify (fd);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
168 #endif DISTRIBUTE
bce86c4163a3 Initial revision
kono
parents:
diff changeset
169
bce86c4163a3 Initial revision
kono
parents:
diff changeset
170 exit (EX_OK);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
171 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
172
bce86c4163a3 Initial revision
kono
parents:
diff changeset
173 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
174
bce86c4163a3 Initial revision
kono
parents:
diff changeset
175 static localmail (fd)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
176 int fd;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
177 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
178 int i,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
179 md;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
180 register struct bboard *bp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
181
bce86c4163a3 Initial revision
kono
parents:
diff changeset
182 for (i = 0; bp = bb[i]; i++)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
183 if (bp -> bb_file && *bp -> bb_file) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
184 (void) lseek (fd, (off_t)0, 0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
185 #ifndef SPOP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
186 if ((md = mbx_open (bp -> bb_file, bb_uid, bb_gid, BBMODE))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
187 #else SPOP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
188 if ((md = mbx_open (bp -> bb_file, bb_uid, bb_gid, POMODE))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
189 #endif SPOP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
190 == NOTOK) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
191 (void) lose ("unable to open %s", bp -> bb_file);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
192 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
193 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
194 #ifndef SPOP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
195 if (mbx_init (bp) != NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
196 #endif not SPOP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
197 (void) mbx_copy (bp -> bb_file, md, fd, 1, bb_head, 0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
198 (void) mbx_close (bp -> bb_file, md);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
199 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
200 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
201
bce86c4163a3 Initial revision
kono
parents:
diff changeset
202 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
203
bce86c4163a3 Initial revision
kono
parents:
diff changeset
204 #ifndef SPOP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
205 static int mbx_init (bp)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
206 register struct bboard *bp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
207 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
208 int fd,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
209 clear;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
210 register struct bboard *ip;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
211 register FILE *fp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
212
bce86c4163a3 Initial revision
kono
parents:
diff changeset
213 if ((fd = mbx_Xopen (bp -> bb_info, bb_uid, bb_gid, BBMODE, &clear))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
214 == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
215 return lose ("unable to lock and open %s", bp -> bb_info);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
216 if ((fp = fdopen (fd, "w")) == NULL) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
217 (void) mbx_close (bp -> bb_info, fd);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
218 return lose ("unable to fdopen %s", bp -> bb_info);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
219 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
220
bce86c4163a3 Initial revision
kono
parents:
diff changeset
221 if ((ip = getbbnam (bp -> bb_name)) == NULL) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
222 (void) lkfclose (fp, bp -> bb_info);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
223 return lose ("unable to get information on BBoard %s", bp -> bb_name);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
224 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
225 (void) strcpy (bb_time, dtimenow ());
bce86c4163a3 Initial revision
kono
parents:
diff changeset
226 (void) sprintf (bb_head, "BBoard-ID: %d\nBB-Posted: %s\n",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
227 bp -> bb_maxima = ++ip -> bb_maxima, bb_time);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
228
bce86c4163a3 Initial revision
kono
parents:
diff changeset
229 fprintf (fp, "%d\n%s\n", bp -> bb_maxima, bb_time);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
230 (void) lkfclose (fp, bp -> bb_info);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
231
bce86c4163a3 Initial revision
kono
parents:
diff changeset
232 return OK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
233 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
234 #endif not SPOP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
235
bce86c4163a3 Initial revision
kono
parents:
diff changeset
236 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
237
bce86c4163a3 Initial revision
kono
parents:
diff changeset
238 #ifdef DISTRIBUTE
bce86c4163a3 Initial revision
kono
parents:
diff changeset
239 static distribute (fd)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
240 int fd;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
241 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
242 int i;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
243 register struct bboard *bp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
244
bce86c4163a3 Initial revision
kono
parents:
diff changeset
245 for (i = 0; bp = bb[i]; i++)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
246 if (bp -> bb_dist && *bp -> bb_dist)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
247 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
248 if (bp == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
249 return;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
250
bce86c4163a3 Initial revision
kono
parents:
diff changeset
251 if (dst_init () == NOTOK) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
252 dst_lose ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
253 return;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
254 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
255 for (i = 0; bp = bb[i]; i++)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
256 if (bp -> bb_dist && *bp -> bb_dist)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
257 if (dst_adrs (bp) == NOTOK) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
258 dst_lose ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
259 return;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
260 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
261 if (dst_text (fd) == NOTOK || dst_end () == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
262 dst_lose ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
263 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
264
bce86c4163a3 Initial revision
kono
parents:
diff changeset
265 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
266
bce86c4163a3 Initial revision
kono
parents:
diff changeset
267 static int dst_init ()
bce86c4163a3 Initial revision
kono
parents:
diff changeset
268 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
269 int retval;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
270
bce86c4163a3 Initial revision
kono
parents:
diff changeset
271 if (rp_isbad (retval = sm_init (NULLCP, NULLCP, 0, 0, 0, 0, 0))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
272 || rp_isbad (retval = sm_winit (S_MAIL, bb_from)))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
273 return lose ("problem initializing SendMail; %s",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
274 rp_string (retval));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
275
bce86c4163a3 Initial revision
kono
parents:
diff changeset
276 return OK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
277 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
278
bce86c4163a3 Initial revision
kono
parents:
diff changeset
279 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
280
bce86c4163a3 Initial revision
kono
parents:
diff changeset
281 static int dst_adrs (bp)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
282 register struct bboard *bp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
283 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
284 if (getbbdist (bp, dst_rcpt))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
285 return lose ("getbbdist failed: %s", getbberr ());
bce86c4163a3 Initial revision
kono
parents:
diff changeset
286
bce86c4163a3 Initial revision
kono
parents:
diff changeset
287 return OK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
288 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
289
bce86c4163a3 Initial revision
kono
parents:
diff changeset
290 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
291
bce86c4163a3 Initial revision
kono
parents:
diff changeset
292 static int dst_rcpt (mbox, host)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
293 register char *mbox,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
294 *host;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
295 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
296 int retval;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
297
bce86c4163a3 Initial revision
kono
parents:
diff changeset
298 switch (retval = sm_wadr (mbox, host, NULLCP)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
299 case RP_OK:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
300 return OK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
301
bce86c4163a3 Initial revision
kono
parents:
diff changeset
302 case RP_NO:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
303 case RP_USER:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
304 (void) lose ("%s@%s: loses; %s", mbox, host, rp_string (retval));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
305 return OK; /* fail-soft */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
306
bce86c4163a3 Initial revision
kono
parents:
diff changeset
307 default:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
308 return lose ("%s@%s: unexpected response; %s",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
309 mbox, host, rp_string (retval));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
310 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
311 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
312
bce86c4163a3 Initial revision
kono
parents:
diff changeset
313 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
314
bce86c4163a3 Initial revision
kono
parents:
diff changeset
315 static int dst_text (fd)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
316 int fd;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
317 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
318 int i,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
319 retval;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
320 char buffer[BUFSIZ];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
321
bce86c4163a3 Initial revision
kono
parents:
diff changeset
322 if (rp_isbad (retval = sm_waend ()))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
323 return lose ("problem ending addresses; %s", rp_string (retval));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
324
bce86c4163a3 Initial revision
kono
parents:
diff changeset
325 (void) lseek (fd, (off_t)0, 0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
326 while ((i = read (fd, buffer, sizeof buffer)) > 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
327 if (rp_isbad (retval = sm_wtxt (buffer, i)))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
328 return lose ("problem writing text; %s", rp_string (retval));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
329
bce86c4163a3 Initial revision
kono
parents:
diff changeset
330 return (i != NOTOK ? OK : lose ("error reading from file"));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
331 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
332
bce86c4163a3 Initial revision
kono
parents:
diff changeset
333 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
334
bce86c4163a3 Initial revision
kono
parents:
diff changeset
335 static int dst_end ()
bce86c4163a3 Initial revision
kono
parents:
diff changeset
336 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
337 int retval;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
338
bce86c4163a3 Initial revision
kono
parents:
diff changeset
339 switch (retval = sm_wtend ()) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
340 case RP_OK:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
341 (void) sm_end (OK);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
342 return OK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
343
bce86c4163a3 Initial revision
kono
parents:
diff changeset
344 case RP_NO:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
345 case RP_NDEL:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
346 return lose ("posting failed; %s", rp_string (retval));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
347
bce86c4163a3 Initial revision
kono
parents:
diff changeset
348 default:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
349 return lose ("unexpected response; %s", rp_string (retval));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
350 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
351 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
352
bce86c4163a3 Initial revision
kono
parents:
diff changeset
353 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
354
bce86c4163a3 Initial revision
kono
parents:
diff changeset
355 static dst_lose ()
bce86c4163a3 Initial revision
kono
parents:
diff changeset
356 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
357 (void) sm_end (NOTOK);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
358 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
359
bce86c4163a3 Initial revision
kono
parents:
diff changeset
360 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
361
bce86c4163a3 Initial revision
kono
parents:
diff changeset
362 /* VARARGS1 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
363
bce86c4163a3 Initial revision
kono
parents:
diff changeset
364 static int lose (fmt, a, b, c, d)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
365 char *fmt,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
366 *a,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
367 *b,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
368 *c,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
369 *d;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
370 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
371 int fd,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
372 i;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
373 char *bp,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
374 buffer[BUFSIZ];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
375
bce86c4163a3 Initial revision
kono
parents:
diff changeset
376 if (bb_fderr == NOTOK) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
377 if ((fd = open ("/dev/null", 0)) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
378 adios (EX_OSERR, "/dev/null", "unable to open");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
379 bb_fderr = copyfile (fd, bb_rept);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
380 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
381
bce86c4163a3 Initial revision
kono
parents:
diff changeset
382 (void) sprintf (bp = buffer, fmt, a, b, c, d);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
383 bp += strlen (bp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
384 bp += strlen (strcpy(bp, "\n"));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
385 i = bp - buffer;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
386 if (write (bb_fderr, buffer, i) != i)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
387 adios (EX_IOERR, bb_rept, "error writing");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
388
bce86c4163a3 Initial revision
kono
parents:
diff changeset
389 return NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
390 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
391
bce86c4163a3 Initial revision
kono
parents:
diff changeset
392 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
393
bce86c4163a3 Initial revision
kono
parents:
diff changeset
394 static notify (fd)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
395 int fd;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
396 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
397 int i;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
398 char buffer[BUFSIZ];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
399
bce86c4163a3 Initial revision
kono
parents:
diff changeset
400 if (bb_fderr == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
401 return;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
402
bce86c4163a3 Initial revision
kono
parents:
diff changeset
403 if (rp_isbad (sm_init (NULLCP, NULLCP, 0, 0, 0, 0, 0))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
404 || rp_isbad (sm_winit (S_MAIL, bb_from)))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
405 goto sm_err;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
406
bce86c4163a3 Initial revision
kono
parents:
diff changeset
407 switch (sm_wadr (bb_from, NULLCP, NULLCP)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
408 case RP_OK:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
409 for (i = 0; bb[i]; i++) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
410 (void) sprintf (buffer, "local-%s-request", bb[i] -> bb_name);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
411 (void) sm_wadr (buffer, LocalName (), NULLCP);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
412 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
413 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
414
bce86c4163a3 Initial revision
kono
parents:
diff changeset
415 default:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
416 goto sm_err;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
417 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
418
bce86c4163a3 Initial revision
kono
parents:
diff changeset
419 if (rp_isbad (sm_waend ()))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
420 goto sm_err;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
421
bce86c4163a3 Initial revision
kono
parents:
diff changeset
422 (void) sprintf (buffer,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
423 "Date: %s\nFrom: %s\nTo: %s\nSubject: BBoards Failure\n\n",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
424 dtimenow (), bb_from, bb_from);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
425 if (rp_isbad (sm_wtxt (buffer, strlen (buffer))))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
426 goto sm_err;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
427
bce86c4163a3 Initial revision
kono
parents:
diff changeset
428 for (i = 0; bb[i]; i++) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
429 (void) sprintf (buffer, "BBoard %s\n", bb[i] -> bb_name);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
430 if (rp_isbad (sm_wtxt (buffer, strlen (buffer))))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
431 goto sm_err;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
432 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
433
bce86c4163a3 Initial revision
kono
parents:
diff changeset
434 (void) lseek (bb_fderr, (off_t)0, 0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
435 while ((i = read (bb_fderr, buffer, sizeof buffer)) > 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
436 if (rp_isbad (sm_wtxt (buffer, i)))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
437 goto sm_err;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
438
bce86c4163a3 Initial revision
kono
parents:
diff changeset
439 (void) strcpy (buffer, "\n------- Forwarded Message\n\n");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
440 if (rp_isbad (sm_wtxt (buffer, strlen (buffer))) || encap (fd) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
441 goto sm_err;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
442 (void) strcpy (buffer, "\n------- End of Forwarded Message\n\n");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
443 if (rp_isbad (sm_wtxt (buffer, strlen (buffer))))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
444 goto sm_err;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
445
bce86c4163a3 Initial revision
kono
parents:
diff changeset
446 switch (sm_wtend ()) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
447 case RP_OK:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
448 (void) unlink (bb_rept);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
449 (void) sm_end (OK);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
450 return;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
451
bce86c4163a3 Initial revision
kono
parents:
diff changeset
452 default:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
453 sm_err: ;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
454 adios (EX_UNAVAILABLE, NULLCP,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
455 "failed and unable to post advisory, see %s for details",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
456 bb_rept);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
457 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
458 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
459
bce86c4163a3 Initial revision
kono
parents:
diff changeset
460 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
461
bce86c4163a3 Initial revision
kono
parents:
diff changeset
462 /* very similar to sbr/cpydgst.c */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
463
bce86c4163a3 Initial revision
kono
parents:
diff changeset
464 #define S1 0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
465 #define S2 1
bce86c4163a3 Initial revision
kono
parents:
diff changeset
466
bce86c4163a3 Initial revision
kono
parents:
diff changeset
467 #define output(c) if (bp >= dp) flush (), *bp++ = c; else *bp++ = c
bce86c4163a3 Initial revision
kono
parents:
diff changeset
468 #define flush() if ((j = bp - outbuf) \
bce86c4163a3 Initial revision
kono
parents:
diff changeset
469 && rp_isbad (sm_wtxt (outbuf, j))) \
bce86c4163a3 Initial revision
kono
parents:
diff changeset
470 return NOTOK; \
bce86c4163a3 Initial revision
kono
parents:
diff changeset
471 else \
bce86c4163a3 Initial revision
kono
parents:
diff changeset
472 bp = outbuf
bce86c4163a3 Initial revision
kono
parents:
diff changeset
473
bce86c4163a3 Initial revision
kono
parents:
diff changeset
474 static int encap (fd)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
475 register int fd;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
476 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
477 register int i,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
478 state;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
479 register char *cp,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
480 *ep;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
481 char buffer[BUFSIZ];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
482 register int j;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
483 register char *bp,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
484 *dp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
485 char outbuf[BUFSIZ];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
486
bce86c4163a3 Initial revision
kono
parents:
diff changeset
487 (void) lseek (fd, (off_t)0, 0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
488
bce86c4163a3 Initial revision
kono
parents:
diff changeset
489 dp = (bp = outbuf) + sizeof outbuf;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
490 for (state = S1; (i = read (fd, buffer, sizeof buffer)) > 0;)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
491 for (ep = (cp = buffer) + i; cp < ep; cp++) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
492 if (*cp == '\0')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
493 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
494 switch (state) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
495 case S1:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
496 if (*cp == '-') {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
497 output ('-');
bce86c4163a3 Initial revision
kono
parents:
diff changeset
498 output (' ');
bce86c4163a3 Initial revision
kono
parents:
diff changeset
499 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
500 state = S2; /* fall */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
501
bce86c4163a3 Initial revision
kono
parents:
diff changeset
502 case S2:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
503 output (*cp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
504 if (*cp == '\n')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
505 state = S1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
506 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
507 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
508 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
509
bce86c4163a3 Initial revision
kono
parents:
diff changeset
510 if (i == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
511 return NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
512 flush ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
513
bce86c4163a3 Initial revision
kono
parents:
diff changeset
514 return OK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
515 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
516 #endif DISTRIBUTE
bce86c4163a3 Initial revision
kono
parents:
diff changeset
517
bce86c4163a3 Initial revision
kono
parents:
diff changeset
518 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
519
bce86c4163a3 Initial revision
kono
parents:
diff changeset
520 #ifndef DISTRIBUTE
bce86c4163a3 Initial revision
kono
parents:
diff changeset
521 /* VARARGS1 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
522
bce86c4163a3 Initial revision
kono
parents:
diff changeset
523 static int lose (fmt, a, b, c, d)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
524 char *fmt,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
525 *a,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
526 *b,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
527 *c,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
528 *d;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
529 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
530 adios (EX_UNAVAILABLE, NULLCP, fmt, a, b, c, d);/* NOTREACHED */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
531 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
532 #endif not DISTRIBUTE
bce86c4163a3 Initial revision
kono
parents:
diff changeset
533
bce86c4163a3 Initial revision
kono
parents:
diff changeset
534 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
535
bce86c4163a3 Initial revision
kono
parents:
diff changeset
536 static arginit (vec)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
537 register char **vec;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
538 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
539 register int i;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
540 #ifdef MHMTS
bce86c4163a3 Initial revision
kono
parents:
diff changeset
541 register char *ap;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
542 #endif MHMTS
bce86c4163a3 Initial revision
kono
parents:
diff changeset
543 char addr[BUFSIZ];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
544 register struct bboard *bp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
545 register struct passwd *pw;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
546
bce86c4163a3 Initial revision
kono
parents:
diff changeset
547 invo_name = r1bindex (*vec++, '/');
bce86c4163a3 Initial revision
kono
parents:
diff changeset
548 if (strlen(invo_name) > NAMESZ) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
549 fprintf(stderr, "%s: argv[0] too long\n", invo_name);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
550 exit(1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
551 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
552 m_foil (NULLCP);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
553 mts_init (invo_name);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
554
bce86c4163a3 Initial revision
kono
parents:
diff changeset
555 #ifndef SPOP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
556 if ((pw = getpwnam (BBOARDS)) == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
557 adios (EX_OSFILE, NULLCP, "no entry for ~%s", BBOARDS);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
558 #else SPOP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
559 if ((pw = getpwnam (POPUID)) == NULL || !setpwinfo (pw, POPDB, 1))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
560 adios (EX_OSFILE, NULLCP, "%s", pw ? getbberr () : "POP user-id unknown");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
561 #endif SPOP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
562
bce86c4163a3 Initial revision
kono
parents:
diff changeset
563 if (pw -> pw_uid != geteuid ())
bce86c4163a3 Initial revision
kono
parents:
diff changeset
564 #ifndef SPOP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
565 adios (EX_OSERR, NULLCP, "not running setuid to %s", BBOARDS);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
566 #else SPOP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
567 adios (EX_OSERR, NULLCP, "not running setuid to %s", POPUID);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
568 #endif SPOP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
569
bce86c4163a3 Initial revision
kono
parents:
diff changeset
570 bb_uid = pw -> pw_uid;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
571 bb_gid = pw -> pw_gid;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
572 #ifndef SPOP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
573 (void) strcpy (bb_from, adrsprintf (pw -> pw_name, LocalName ()));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
574 (void) strcpy (bb_home, pw -> pw_dir);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
575 #endif not SPOP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
576
bce86c4163a3 Initial revision
kono
parents:
diff changeset
577 #ifdef MHMTS
bce86c4163a3 Initial revision
kono
parents:
diff changeset
578 vec += 3;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
579 #endif MHMTS
bce86c4163a3 Initial revision
kono
parents:
diff changeset
580 if (*vec == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
581 adios (EX_USAGE, NULLCP, "usage: %s %s [%s ...]",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
582 invo_name, ENTITY, ENTITY);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
583
bce86c4163a3 Initial revision
kono
parents:
diff changeset
584 for (i = 0; *vec; vec++) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
585 if (strlen(*vec) >= BUFSIZ / 4)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
586 adios (NULLCP, "argument too long");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
587 #ifdef MHMTS
bce86c4163a3 Initial revision
kono
parents:
diff changeset
588 if (ap = index (*vec, '.'))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
589 *vec = ++ap;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
590 #endif MHMTS
bce86c4163a3 Initial revision
kono
parents:
diff changeset
591 make_lower (addr, *vec);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
592
bce86c4163a3 Initial revision
kono
parents:
diff changeset
593 if ((bp = getbbnam (addr)) == NULL
bce86c4163a3 Initial revision
kono
parents:
diff changeset
594 && (bp = getbbaka (addr)) == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
595 adios (EX_NOUSER, NULLCP, "no such %s as %s", ENTITY, *vec);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
596 if ((bb[i++] = getbbcpy (bp)) == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
597 adios (EX_UNAVAILABLE, NULLCP, "insufficient memory on %s", *vec);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
598
bce86c4163a3 Initial revision
kono
parents:
diff changeset
599 if (i >= NBB - 1)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
600 adios (EX_USAGE, NULLCP, "too many %ss, starting with %s",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
601 ENTITY, *vec);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
602 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
603 bb[i] = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
604
bce86c4163a3 Initial revision
kono
parents:
diff changeset
605 (void) umask (0022);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
606
bce86c4163a3 Initial revision
kono
parents:
diff changeset
607 bb_fderr = NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
608 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
609
bce86c4163a3 Initial revision
kono
parents:
diff changeset
610 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
611
bce86c4163a3 Initial revision
kono
parents:
diff changeset
612 static int copyfile (qd, tmpfil)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
613 int qd;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
614 register char *tmpfil;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
615 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
616 int i,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
617 fd;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
618 char buffer[BUFSIZ];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
619
bce86c4163a3 Initial revision
kono
parents:
diff changeset
620 (void) strcpy (tmpfil, m_tmpfil (invo_name));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
621 if ((fd = creat (tmpfil, 0600)) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
622 adios (EX_CANTCREAT, tmpfil, "unable to create");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
623 (void) close (fd);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
624 if ((fd = open (tmpfil, 2)) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
625 adios (EX_NOINPUT, tmpfil, "unable to re-open");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
626
bce86c4163a3 Initial revision
kono
parents:
diff changeset
627 (void) lseek (qd, (off_t)0, 0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
628 while ((i = read (qd, buffer, sizeof buffer)) > 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
629 if (write (fd, buffer, i) != i)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
630 adios (EX_IOERR, tmpfil, "error writing");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
631 if (i == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
632 adios (EX_IOERR, "input", "error reading");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
633
bce86c4163a3 Initial revision
kono
parents:
diff changeset
634 (void) lseek (fd, (off_t)0, 0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
635
bce86c4163a3 Initial revision
kono
parents:
diff changeset
636 return fd;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
637 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
638
bce86c4163a3 Initial revision
kono
parents:
diff changeset
639 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
640
bce86c4163a3 Initial revision
kono
parents:
diff changeset
641 /* VARARGS3 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
642
bce86c4163a3 Initial revision
kono
parents:
diff changeset
643 #ifdef MHMTS
bce86c4163a3 Initial revision
kono
parents:
diff changeset
644 /* ARGSUSED */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
645 #endif MHMTS
bce86c4163a3 Initial revision
kono
parents:
diff changeset
646
bce86c4163a3 Initial revision
kono
parents:
diff changeset
647 static void adios (code, what, fmt, a, b, c, d, e, f)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
648 int code;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
649 char *what,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
650 *fmt,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
651 *a,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
652 *b,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
653 *c,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
654 *d,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
655 *e,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
656 *f;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
657 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
658 advise (what, fmt, a, b, c, d, e, f);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
659 #ifdef SENDMTS
bce86c4163a3 Initial revision
kono
parents:
diff changeset
660 done (code);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
661 #endif SENDMTS
bce86c4163a3 Initial revision
kono
parents:
diff changeset
662 #ifdef MHMTS
bce86c4163a3 Initial revision
kono
parents:
diff changeset
663 done (1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
664 #endif MHMTS
bce86c4163a3 Initial revision
kono
parents:
diff changeset
665 }