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