annotate zotnet/mf/uminc.c @ 0:bce86c4163a3

Initial revision
author kono
date Mon, 18 Apr 2005 23:46:02 +0900
parents
children a6481689f99c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1 /* uminc.c - uucp to mmdf inc */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2 #ifndef lint
bce86c4163a3 Initial revision
kono
parents:
diff changeset
3 static char Id[] = "@(#)$Id$";
bce86c4163a3 Initial revision
kono
parents:
diff changeset
4 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
5
bce86c4163a3 Initial revision
kono
parents:
diff changeset
6 #include "mf.h"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
7 #include <stdio.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
8 #include "../mts/mts.h"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
9 #include <errno.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
10 #include <sys/types.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
11 #include <sys/stat.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
12
bce86c4163a3 Initial revision
kono
parents:
diff changeset
13
bce86c4163a3 Initial revision
kono
parents:
diff changeset
14 static int mmdf = NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
15 static int uucp = NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
16 static char mmdfbox[LINESIZ];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
17 static char uucpbox[LINESIZ];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
18
bce86c4163a3 Initial revision
kono
parents:
diff changeset
19
bce86c4163a3 Initial revision
kono
parents:
diff changeset
20 off_t lseek ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
21
bce86c4163a3 Initial revision
kono
parents:
diff changeset
22 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
23
bce86c4163a3 Initial revision
kono
parents:
diff changeset
24 main (argc, argv)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
25 int argc;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
26 char *argv[];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
27 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
28 int fd,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
29 tmp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
30 struct stat st1,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
31 st2;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
32
bce86c4163a3 Initial revision
kono
parents:
diff changeset
33 mts_init (*argv);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
34 sprintf (uucpbox, "%s/%s", UUCPDIR, UUCPFIL);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
35 if (stat (uucpbox, &st1) == NOTOK || st1.st_size == 0L)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
36 exit (0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
37 if ((uucp = lkopen (uucpbox, 0)) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
38 die ("unable to lock and open %s", uucpbox);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
39 tmp = tmp_open (&fd);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
40
bce86c4163a3 Initial revision
kono
parents:
diff changeset
41 switch (fd = uucp2mmdf (uucp, fd, FALSE)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
42 case MFOK:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
43 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
44
bce86c4163a3 Initial revision
kono
parents:
diff changeset
45 case MFPRM:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
46 die ("internal error while filtering UUCP mail");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
47
bce86c4163a3 Initial revision
kono
parents:
diff changeset
48 case MFSIO:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
49 die ("no free file pointers -- you lose");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
50
bce86c4163a3 Initial revision
kono
parents:
diff changeset
51 case MFERR:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
52 die ("i/o error while filtering UUCP mail");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
53
bce86c4163a3 Initial revision
kono
parents:
diff changeset
54 case MFROM:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
55 case MFHDR:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
56 case MFTXT:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
57 fprintf (stderr, "UUCP mailbox in bad format, patched...\n");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
58 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
59 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
60
bce86c4163a3 Initial revision
kono
parents:
diff changeset
61 sprintf (mmdfbox, "%s/%s", MAILDIR, MAILFIL);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
62 mmdf = mbx_open (mmdfbox);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
63 mbx_copy (tmp, mmdf);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
64 close (tmp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
65 lkclose (mmdf, mmdfbox), mmdf = NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
66
bce86c4163a3 Initial revision
kono
parents:
diff changeset
67 if (stat (uucpbox, &st2) != NOTOK && st1.st_mtime != st2.st_mtime)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
68 fprintf (stderr, "UUCP mailbox has been updated... (%s)\n",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
69 "so it won't be removed");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
70 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
71 if (unlink (uucpbox) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
72 if ((fd = creat (uucpbox, st1.st_mode & ~S_IFMT)) != NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
73 close (fd);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
74 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
75 fprintf (stderr, "unable to remove or zero UUCP mailbox\n");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
76 lkclose (uucp, uucpbox), uucp = NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
77
bce86c4163a3 Initial revision
kono
parents:
diff changeset
78 exit (0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
79 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
80
bce86c4163a3 Initial revision
kono
parents:
diff changeset
81 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
82
bce86c4163a3 Initial revision
kono
parents:
diff changeset
83 static int mbx_open (file)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
84 char *file;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
85 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
86 int clear,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
87 count,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
88 fd;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
89 extern int errno;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
90 struct stat stbuf;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
91
bce86c4163a3 Initial revision
kono
parents:
diff changeset
92 for (clear = FALSE, count = 2; count > 0; count--)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
93 if ((fd = lkopen (file, 6)) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
94 switch (errno) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
95 case ENOENT:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
96 mbx_create (file);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
97 clear++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
98 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
99
bce86c4163a3 Initial revision
kono
parents:
diff changeset
100 case ETXTBSY:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
101 sleep (5);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
102 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
103
bce86c4163a3 Initial revision
kono
parents:
diff changeset
104 default:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
105 goto openerr;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
106 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
107 else {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
108 if (fstat (fd, &stbuf) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
109 die ("unable to stat MMDF mailbox '%s'", file);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
110 clear = stbuf.st_size == 0L;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
111 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
112 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
113
bce86c4163a3 Initial revision
kono
parents:
diff changeset
114 if (fd == NOTOK) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
115 openerr:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
116 if (errno == ETXTBSY)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
117 die ("your MMDF mailbox '%s' is busy", file);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
118 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
119 die ("unable to open MMDF mailbox '%s'", file);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
120 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
121 if (!clear)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
122 mbx_chk (fd, file);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
123
bce86c4163a3 Initial revision
kono
parents:
diff changeset
124 return fd;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
125 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
126
bce86c4163a3 Initial revision
kono
parents:
diff changeset
127 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
128
bce86c4163a3 Initial revision
kono
parents:
diff changeset
129 static mbx_create (file)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
130 char *file;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
131 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
132 int fd;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
133
bce86c4163a3 Initial revision
kono
parents:
diff changeset
134 if ((fd = creat (file, MBXMODE)) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
135 die ("unable to create MMDF mailbox '%s'", file);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
136
bce86c4163a3 Initial revision
kono
parents:
diff changeset
137 close (fd);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
138 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
139
bce86c4163a3 Initial revision
kono
parents:
diff changeset
140
bce86c4163a3 Initial revision
kono
parents:
diff changeset
141 static mbx_chk (fd, file)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
142 int fd;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
143 char *file;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
144 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
145 int count;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
146 char ldelim[20];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
147
bce86c4163a3 Initial revision
kono
parents:
diff changeset
148 count = strlen (mmdlm2);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
149
bce86c4163a3 Initial revision
kono
parents:
diff changeset
150 if (lseek (fd, (off_t) - count, 2) == (off_t) NOTOK
bce86c4163a3 Initial revision
kono
parents:
diff changeset
151 || read (fd, ldelim, count) != count)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
152 die ("error reading MMDF mailbox '%s'", file);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
153 ldelim[count] = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
154
bce86c4163a3 Initial revision
kono
parents:
diff changeset
155 if (strcmp (ldelim, mmdlm2)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
156 fprintf (stderr,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
157 "MMDF mailbox '%s' has bad delimiter, patching...\n",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
158 file);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
159 if (write (fd, mmdlm2, count) != count)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
160 die ("error writing MMDF mailbox '%s'", file);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
161 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
162 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
163
bce86c4163a3 Initial revision
kono
parents:
diff changeset
164 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
165
bce86c4163a3 Initial revision
kono
parents:
diff changeset
166 static mbx_copy (in, out)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
167 int in,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
168 out;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
169 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
170 int i;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
171 char buffer[BUFSIZ];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
172
bce86c4163a3 Initial revision
kono
parents:
diff changeset
173 lseek (in, (off_t)0, 0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
174
bce86c4163a3 Initial revision
kono
parents:
diff changeset
175 while ((i = read (in, buffer, sizeof buffer)) > 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
176 if (write (out, buffer, i) != i)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
177 die ("error writing MMDF mailbox");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
178 if (i < 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
179 die ("error reading temporary file");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
180
bce86c4163a3 Initial revision
kono
parents:
diff changeset
181 close (in);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
182 close (out);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
183 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
184
bce86c4163a3 Initial revision
kono
parents:
diff changeset
185 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
186
bce86c4163a3 Initial revision
kono
parents:
diff changeset
187 static int tmp_open (mbx_fd)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
188 int *mbx_fd;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
189 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
190 int fd;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
191 char tmpfil[LINESIZ];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
192
bce86c4163a3 Initial revision
kono
parents:
diff changeset
193 strcpy (tmpfil, "/tmp/umincXXXXXX");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
194 unlink (mktemp (tmpfil));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
195 if ((fd = creat (tmpfil, TMPMODE)) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
196 die ("unable to create temporary file '%s'", tmpfil);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
197 close (fd);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
198
bce86c4163a3 Initial revision
kono
parents:
diff changeset
199 if ((fd = open (tmpfil, 2)) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
200 die ("unable to create temporary file '%s'", tmpfil);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
201 unlink (tmpfil);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
202
bce86c4163a3 Initial revision
kono
parents:
diff changeset
203 if ((*mbx_fd = dup (fd)) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
204 die ("unable to duplicate fd for temporary file '%s'", tmpfil);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
205
bce86c4163a3 Initial revision
kono
parents:
diff changeset
206 return fd;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
207 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
208
bce86c4163a3 Initial revision
kono
parents:
diff changeset
209 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
210
bce86c4163a3 Initial revision
kono
parents:
diff changeset
211 static die (fmt, a, b, c, d)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
212 char *fmt,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
213 *a,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
214 *b,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
215 *c,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
216 *d;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
217 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
218 lkclose (mmdf, mmdfbox), mmdf = NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
219 lkclose (uucp, uucpbox), uucp = NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
220
bce86c4163a3 Initial revision
kono
parents:
diff changeset
221 fflush (stdout);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
222 fprintf (stderr, fmt, a, b, c, d);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
223 putc ('\n', stderr);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
224
bce86c4163a3 Initial revision
kono
parents:
diff changeset
225 exit (1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
226 }