2 ** distsbr.c -- routines to do additional "dist-style" processing
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.
13 static int hdrfd = NOTOK;
14 static int txtfd = NOTOK;
16 #define BADHDR "please re-edit %s to remove the ``%s'' header!"
17 #define BADTXT "please re-edit %s to consist of headers only!"
18 #define BADMSG "please re-edit %s to include a ``Resent-To:''!"
19 #define BADRFT "please re-edit %s and fix that header!"
24 static void ready_msg(char *);
27 distout(char *drft, char *msgnam, char *backup)
30 register unsigned char *dp;
31 register char *resent;
32 char name[NAMESZ], buffer[BUFSIZ];
33 register FILE *ifp, *ofp;
35 if (rename(drft, strcpy(backup, m_backup(drft))) == NOTOK)
36 adios(backup, "unable to rename %s to",drft);
37 if ((ifp = fopen(backup, "r")) == NULL)
38 adios(backup, "unable to read");
40 if ((ofp = fopen(drft, "w")) == NULL)
41 adios(drft, "unable to create temporary file");
42 chmod(drft, m_gmprot());
45 lseek(hdrfd, (off_t) 0, SEEK_SET); /* msgnam not accurate */
46 cpydata(hdrfd, fileno(ofp), msgnam, drft);
48 for (state = FLD, resent = NULL;;)
49 switch (state = m_getfld (state, name, buffer,
50 sizeof buffer, ifp)) {
54 if (uprf(name, "distribute-"))
55 snprintf(name, sizeof(name), "%s%s",
57 if (uprf(name, "distribution-"))
58 snprintf(name, sizeof(name), "%s%s",
60 if (!uprf(name, "resent")) {
61 advise(NULL, BADHDR, "draft", name);
65 resent = add(":", add(name, resent));
66 resent = add(buffer, resent);
67 fprintf(ofp, "%s: %s", name, buffer);
68 while (state == FLDPLUS) {
69 state = m_getfld(state, name, buffer,
71 resent = add(buffer, resent);
80 for (dp = buffer; *dp; dp++)
82 advise(NULL, BADTXT, "draft");
91 advise(NULL, BADRFT, "draft");
96 if (rename(backup, drft) == NOTOK)
97 adios(drft, "unable to rename %s to", backup);
101 adios(NULL, "getfld() returned %d", state);
108 advise(NULL, BADMSG, "draft");
111 if (rename(backup, drft) == NOTOK)
112 adios(drft, "unable to rename %s to", backup);
117 if (txtfd != NOTOK) {
118 lseek(txtfd, (off_t) 0, SEEK_SET); /* msgnam not accurate */
119 cpydata(txtfd, fileno(ofp), msgnam, drft);
129 ready_msg(char *msgnam)
132 char name[NAMESZ], buffer[BUFSIZ], tmpfil[BUFSIZ];
133 register FILE *ifp, *ofp;
137 close(hdrfd), hdrfd = NOTOK;
139 close(txtfd), txtfd = NOTOK;
141 if ((ifp = fopen(msgnam, "r")) == NULL)
142 adios(msgnam, "unable to open message");
144 cp = m_mktemp2(NULL, "dist", &hdrfd, NULL);
146 adios("distsbr", "unable to create temporary file");
149 strncpy(tmpfil, cp, sizeof(tmpfil));
150 if ((out = dup(hdrfd)) == NOTOK
151 || (ofp = fdopen(out, "w")) == NULL)
152 adios(NULL, "no file descriptors -- you lose big");
155 for (state = FLD;;) {
156 state = m_getfld(state, name, buffer, sizeof buffer, ifp);
161 if (uprf(name, "resent"))
162 fprintf(ofp, "Prev-");
163 fprintf(ofp, "%s: %s", name, buffer);
164 while (state == FLDPLUS) {
165 state = m_getfld(state, name, buffer,
177 cp = m_mktemp2(NULL, "dist", &txtfd, NULL);
179 adios("distsbr", "unable to create temporary file");
182 strncpy(tmpfil, cp, sizeof(tmpfil));
183 if ((out = dup(txtfd)) == NOTOK
184 || (ofp = fdopen(out, "w")) == NULL)
185 adios(NULL, "no file descriptors -- you lose big");
187 fprintf(ofp, "\n%s", buffer);
188 while (state == BODY) {
189 state = m_getfld(state, name, buffer,
198 adios(NULL, "format error in message %s", msgnam);
201 adios(NULL, "getfld() returned %d", state);