annotate zotnet/mf/muinc.c @ 10:a6481689f99c

*** empty log message ***
author kono
date Wed, 06 Dec 2006 03:17:53 +0900
parents bce86c4163a3
children 441a2190cfae
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1 /* muinc.c - mmdf to uucp 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
bce86c4163a3 Initial revision
kono
parents:
diff changeset
21 main (argc, argv)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
22 int argc;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
23 char *argv[];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
24 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
25 int fd,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
26 tmp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
27 struct stat st1,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
28 st2;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
29
bce86c4163a3 Initial revision
kono
parents:
diff changeset
30 mts_init (*argv);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
31 sprintf (mmdfbox, "%s/%s", MAILDIR, MAILFIL);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
32 if (stat (mmdfbox, &st1) == NOTOK || st1.st_size == 0L)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
33 exit (0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
34 if ((mmdf = lkopen (mmdfbox, 0)) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
35 die ("unable to lock and open %s", mmdfbox);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
36 tmp = tmp_open (&fd);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
37
bce86c4163a3 Initial revision
kono
parents:
diff changeset
38 switch (fd = mmdf2uucp (mmdf, fd, FALSE)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
39 case MFOK:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
40 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
41
bce86c4163a3 Initial revision
kono
parents:
diff changeset
42 case MFPRM:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
43 die ("internal error while filtering MMDF mail");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
44
bce86c4163a3 Initial revision
kono
parents:
diff changeset
45 case MFSIO:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
46 die ("no free file pointers -- you lose");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
47
bce86c4163a3 Initial revision
kono
parents:
diff changeset
48 case MFERR:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
49 die ("i/o error while filtering MMDF mail");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
50
bce86c4163a3 Initial revision
kono
parents:
diff changeset
51 case MFROM:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
52 case MFHDR:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
53 case MFTXT:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
54 fprintf (stderr, "MMDF mailbox in bad format, patched...\n");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
55 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
56 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
57
bce86c4163a3 Initial revision
kono
parents:
diff changeset
58 sprintf (uucpbox, "%s/%s", UUCPDIR, UUCPFIL);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
59 uucp = mbx_open (uucpbox);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
60 mbx_copy (tmp, uucp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
61 close (tmp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
62 lkclose (uucp, uucpbox), uucp = NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
63
bce86c4163a3 Initial revision
kono
parents:
diff changeset
64 if (stat (mmdfbox, &st2) != NOTOK && st1.st_mtime != st2.st_mtime)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
65 fprintf (stderr, "MMDF mailbox has been updated... (%s)\n",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
66 "so it won't be zero'd");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
67 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
68 if ((fd = creat (mmdfbox, st1.st_mode & ~S_IFMT)) != NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
69 close (fd);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
70 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
71 fprintf (stderr, "unable to zero MMDF mailbox\n");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
72 lkclose (mmdf, mmdfbox), mmdf = NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
73
bce86c4163a3 Initial revision
kono
parents:
diff changeset
74 exit (0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
75 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
76
bce86c4163a3 Initial revision
kono
parents:
diff changeset
77 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
78
bce86c4163a3 Initial revision
kono
parents:
diff changeset
79 static int mbx_open (file)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
80 char *file;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
81 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
82 int count,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
83 fd;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
84
bce86c4163a3 Initial revision
kono
parents:
diff changeset
85 for (count = 2; count > 0; count--)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
86 if ((fd = lkopen (file, 1)) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
87 switch (errno) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
88 case ENOENT:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
89 mbx_create (file);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
90 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
91 case ETXTBSY:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
92 sleep (5);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
93 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
94 default:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
95 goto openerr;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
96 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
97
bce86c4163a3 Initial revision
kono
parents:
diff changeset
98 if (fd == NOTOK) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
99 openerr:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
100 if (errno == ETXTBSY)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
101 die ("your UUCP mailbox '%s' is busy", file);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
102 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
103 die ("unable to open UUCP mailbox '%s'", file);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
104 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
105
bce86c4163a3 Initial revision
kono
parents:
diff changeset
106 lseek (fd, (off_t)0, 2);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
107
bce86c4163a3 Initial revision
kono
parents:
diff changeset
108 return fd;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
109 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
110
bce86c4163a3 Initial revision
kono
parents:
diff changeset
111 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
112
bce86c4163a3 Initial revision
kono
parents:
diff changeset
113 static mbx_create (file)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
114 char *file;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
115 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
116 int fd;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
117
bce86c4163a3 Initial revision
kono
parents:
diff changeset
118 if ((fd = creat (file, MBXMODE)) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
119 die ("unable to create UUCP mailbox '%s'", file);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
120
bce86c4163a3 Initial revision
kono
parents:
diff changeset
121 close (fd);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
122 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
123
bce86c4163a3 Initial revision
kono
parents:
diff changeset
124 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
125
bce86c4163a3 Initial revision
kono
parents:
diff changeset
126 static mbx_copy (in, out)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
127 int in,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
128 out;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
129 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
130 int i;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
131 char buffer[BUFSIZ];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
132
bce86c4163a3 Initial revision
kono
parents:
diff changeset
133 lseek (in, (off_t)0, 0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
134
bce86c4163a3 Initial revision
kono
parents:
diff changeset
135 while ((i = read (in, buffer, sizeof buffer)) > 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
136 if (write (out, buffer, i) != i)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
137 die ("error writing UUCP mailbox");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
138 if (i < 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
139 die ("error reading temporary file");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
140 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
141
bce86c4163a3 Initial revision
kono
parents:
diff changeset
142 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
143
bce86c4163a3 Initial revision
kono
parents:
diff changeset
144 static int tmp_open (mbx_fd)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
145 int *mbx_fd;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
146 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
147 int fd;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
148 char tmpfil[LINESIZ];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
149
bce86c4163a3 Initial revision
kono
parents:
diff changeset
150 strcpy (tmpfil, "/tmp/muincXXXXXX");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
151 unlink (mktemp (tmpfil));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
152 if ((fd = creat (tmpfil, TMPMODE)) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
153 die ("unable to create temporary file '%s'", tmpfil);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
154 close (fd);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
155
bce86c4163a3 Initial revision
kono
parents:
diff changeset
156 if ((fd = open (tmpfil, 2)) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
157 die ("unable to create temporary file '%s'", tmpfil);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
158 unlink (tmpfil);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
159
bce86c4163a3 Initial revision
kono
parents:
diff changeset
160 if ((*mbx_fd = dup (fd)) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
161 die ("unable to duplicate fd for temporary file '%s'", tmpfil);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
162
bce86c4163a3 Initial revision
kono
parents:
diff changeset
163 return fd;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
164 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
165
bce86c4163a3 Initial revision
kono
parents:
diff changeset
166 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
167
bce86c4163a3 Initial revision
kono
parents:
diff changeset
168 static die (fmt, a, b, c, d)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
169 char *fmt,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
170 *a,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
171 *b,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
172 *c,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
173 *d;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
174 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
175 lkclose (mmdf, mmdfbox), mmdf = NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
176 lkclose (uucp, uucpbox), uucp = NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
177
bce86c4163a3 Initial revision
kono
parents:
diff changeset
178 fflush (stdout);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
179 fprintf (stderr, fmt, a, b, c, d);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
180 putc ('\n', stderr);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
181
bce86c4163a3 Initial revision
kono
parents:
diff changeset
182 exit (1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
183 }