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