|
|
1.1 root 1: /* distsbr.c - routines to do additional "dist-style" processing */
2:
3: #include "../h/mh.h"
4: #include <ctype.h>
5: #include <stdio.h>
6:
7:
8: static int hdrfd = NOTOK;
9: static int txtfd = NOTOK;
10:
11:
12: long lseek();
13:
14: static void ready_msg();
15:
16: /* */
17:
18: #define BADHDR "please re-edit %s to remove the ``%s'' header!"
19: #define BADTXT "please re-edit %s to consist of headers only!"
20: #define BADMSG "please re-edit %s to include a ``Resent-To:''!"
21: #define BADRFT "please re-edit %s and fix that header!"
22:
23: distout(drft, msgnam, backup)
24: register char *drft, *msgnam, *backup;
25: {
26: int state;
27: register char *dp,
28: *resent;
29: char name[NAMESZ],
30: buffer[BUFSIZ];
31: register FILE *ifp,
32: *ofp;
33:
34: if (rename (drft, strcpy (backup, m_backup (drft))) == NOTOK)
35: adios (backup, "unable to rename %s to",drft);
36: if ((ifp = fopen (backup, "r")) == NULL)
37: adios (backup, "unable to read");
38:
39: if ((ofp = fopen (drft, "w")) == NULL)
40: adios (drft, "unable to create temporary file");
41: (void) chmod (drft, m_gmprot ());
42:
43: ready_msg (msgnam);
44: (void) lseek (hdrfd, 0L, 0); /* msgnam not accurate */
45: cpydata (hdrfd, fileno (ofp), msgnam, drft);
46:
47: /* */
48:
49: for (state = FLD, resent = NULL;;)
50: switch (state =
51: m_getfld (state, name, buffer, sizeof buffer, ifp)) {
52: case FLD:
53: case FLDPLUS:
54: case FLDEOF:
55: if (uprf (name, "distribute-"))
56: (void) sprintf (name, "%s%s", "Resent", &name[10]);
57: if (uprf (name, "distribution-"))
58: (void) sprintf (name, "%s%s", "Resent", &name[12]);
59: if (!uprf (name, "resent")) {
60: advise (NULLCP, BADHDR, "draft", name);
61: goto leave_bad;
62: }
63: if (state == FLD)
64: resent = add (":", add (name, resent));
65: resent = add (buffer, resent);
66: fprintf (ofp, "%s: %s", name, buffer);
67: while (state == FLDPLUS) {
68: state = m_getfld (state, name,
69: buffer, sizeof buffer, ifp);
70: resent = add (buffer, resent);
71: fputs (buffer, ofp);
72: }
73: if (state == FLDEOF)
74: goto process;
75: break;
76:
77: case BODY:
78: case BODYEOF:
79: for (dp = buffer; *dp; dp++)
80: if (!isspace (*dp)) {
81: advise (NULLCP, BADTXT, "draft");
82: goto leave_bad;
83: }
84:
85: case FILEEOF:
86: goto process;
87:
88: case LENERR:
89: case FMTERR:
90: advise (NULLCP, BADRFT, "draft");
91: leave_bad: ;
92: (void) fclose (ifp);
93: (void) fclose (ofp);
94: (void) unlink (drft);
95: if (rename (backup, drft) == NOTOK)
96: adios (drft, "unable to rename %s to", backup);
97: return NOTOK;
98:
99: default:
100: adios (NULLCP, "getfld() returned %d", state);
101: }
102: process: ;
103: (void) fclose (ifp);
104: (void) fflush (ofp);
105:
106: /* */
107:
108: if (!resent) {
109: advise (NULLCP, BADMSG, "draft");
110: (void) fclose (ofp);
111: (void) unlink (drft);
112: if (rename (backup, drft) == NOTOK)
113: adios (drft, "unable to rename %s to", backup);
114: return NOTOK;
115: }
116: free (resent);
117:
118: if (txtfd != NOTOK) {
119: (void) lseek (txtfd, 0L, 0); /* msgnam not accurate */
120: cpydata (txtfd, fileno (ofp), msgnam, drft);
121: }
122:
123: (void) fclose (ofp);
124:
125: return OK;
126: }
127:
128: /* */
129:
130: static void
131: ready_msg(msgnam)
132: register char *msgnam;
133: {
134: int state,
135: out;
136: char name[NAMESZ],
137: buffer[BUFSIZ],
138: tmpfil[BUFSIZ];
139: register FILE *ifp,
140: *ofp;
141:
142: if (hdrfd != NOTOK)
143: (void) close (hdrfd), hdrfd = NOTOK;
144: if (txtfd != NOTOK)
145: (void) close (txtfd), txtfd = NOTOK;
146:
147: if ((ifp = fopen (msgnam, "r")) == NULL)
148: adios (msgnam, "unable to open message");
149:
150: (void) strcpy (tmpfil, m_tmpfil ("dist"));
151: if ((hdrfd = creat (tmpfil, 0600)) == NOTOK)
152: adios (tmpfil, "unable to create temporary file");
153: (void) close (hdrfd);
154: if ((hdrfd = open (tmpfil, 2)) == NOTOK)
155: adios (tmpfil, "unable to re-open temporary file");
156: if ((out = dup (hdrfd)) == NOTOK
157: || (ofp = fdopen (out, "w")) == NULL)
158: adios (NULLCP, "no file descriptors -- you lose big");
159: (void) unlink (tmpfil);
160:
161: /* */
162:
163: for (state = FLD;;)
164: switch (state =
165: m_getfld (state, name, buffer, sizeof buffer, ifp)) {
166: case FLD:
167: case FLDPLUS:
168: case FLDEOF:
169: if (uprf (name, "resent"))
170: fprintf (ofp, "Prev-");
171: fprintf (ofp, "%s: %s", name, buffer);
172: while (state == FLDPLUS) {
173: state = m_getfld (state, name,
174: buffer, sizeof buffer, ifp);
175: fputs (buffer, ofp);
176: }
177: if (state == FLDEOF)
178: goto process;
179: break;
180:
181: case BODY:
182: case BODYEOF:
183: (void) fclose (ofp);
184:
185: (void) strcpy (tmpfil, m_tmpfil ("dist"));
186: if ((txtfd = creat (tmpfil, 0600)) == NOTOK)
187: adios (tmpfil, "unable to create temporary file");
188: (void) close (txtfd);
189: if ((txtfd = open (tmpfil, 2)) == NOTOK)
190: adios (tmpfil, "unable to re-open temporary file");
191: if ((out = dup (txtfd)) == NOTOK
192: || (ofp = fdopen (out, "w")) == NULL)
193: adios (NULLCP, "no file descriptors -- you lose big");
194: (void) unlink (tmpfil);
195: fprintf (ofp, "\n%s", buffer);
196: while (state == BODY) {
197: state = m_getfld (state, name,
198: buffer, sizeof buffer, ifp);
199: fputs (buffer, ofp);
200: }
201: case FILEEOF:
202: goto process;
203:
204: case LENERR:
205: case FMTERR:
206: adios (NULLCP, "format error in message %s", msgnam);
207:
208: default:
209: adios (NULLCP, "getfld() returned %d", state);
210: }
211: process: ;
212: (void) fclose (ifp);
213: (void) fclose (ofp);
214: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.