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.
16 static int hdrfd = NOTOK;
17 static int txtfd = NOTOK;
22 static int ready_msg(char *);
25 distout(char *drft, char *msgnam, char *backup)
30 char name[NAMESZ], buffer[BUFSIZ];
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);
38 if (!(ifp = fopen(backup, "r"))) {
39 advise(backup, "unable to read");
43 if (!(ofp = fopen(drft, "w"))) {
44 advise(drft, "unable to create temporary file");
47 chmod(drft, m_gmprot());
49 if (ready_msg(msgnam) != OK) {
52 lseek(hdrfd, (off_t) 0, SEEK_SET); /* msgnam not accurate */
53 cpydata(hdrfd, fileno(ofp), msgnam, drft);
58 switch (state = m_getfld(state, name, buffer, sizeof buffer,
63 if (!uprf(name, "resent")) {
64 advise(NULL, "Please re-edit draft to remove the ``%s'' header.", name);
68 resent = add(":", add(name, resent));
70 resent = add(buffer, resent);
71 fprintf(ofp, "%s: %s", name, buffer);
72 while (state == FLDPLUS) {
73 state = m_getfld(state, name, buffer,
75 resent = add(buffer, resent);
78 if (state == FLDEOF) {
85 for (dp = buffer; *dp; dp++) {
87 advise(NULL, "Please re-edit draft to consist of headers only.");
97 advise(NULL, "Please re-edit draft and fix that header.");
102 if (rename(backup, drft) == NOTOK) {
103 advise(drft, "unable to rename %s to", backup);
108 advise(NULL, "getfld() returned %d", state);
118 advise(NULL, "Please re-edit draft to include a ``Resent-To:'' header.");
121 if (rename(backup, drft) == NOTOK) {
122 advise(drft, "unable to rename %s to", backup);
128 if (txtfd != NOTOK) {
129 lseek(txtfd, (off_t) 0, SEEK_SET); /* msgnam not accurate */
130 cpydata(txtfd, fileno(ofp), msgnam, drft);
140 ready_msg(char *msgnam)
143 char name[NAMESZ], buffer[BUFSIZ], tmpfil[BUFSIZ];
147 if (hdrfd != NOTOK) {
151 if (txtfd != NOTOK) {
155 if (!(ifp = fopen(msgnam, "r"))) {
156 advise(msgnam, "unable to open message");
160 cp = m_mktemp2(NULL, "dist", &hdrfd, NULL);
162 advise("distsbr", "unable to create temporary file");
166 strncpy(tmpfil, cp, sizeof(tmpfil));
167 if ((out = dup(hdrfd)) == NOTOK || !(ofp = fdopen(out, "w"))) {
168 advise(NULL, "no file descriptors -- you lose big");
175 state = m_getfld(state, name, buffer, sizeof buffer, ifp);
180 if (uprf(name, "resent")) {
181 fprintf(ofp, "Prev-");
183 fprintf(ofp, "%s: %s", name, buffer);
184 while (state == FLDPLUS) {
185 state = m_getfld(state, name, buffer,
189 if (state == FLDEOF) {
198 cp = m_mktemp2(NULL, "dist", &txtfd, NULL);
200 advise("distsbr", "unable to create temp file");
204 strncpy(tmpfil, cp, sizeof(tmpfil));
205 if ((out = dup(txtfd)) == NOTOK ||
206 !(ofp = fdopen(out, "w"))) {
207 advise(NULL, "no file descriptors -- you lose");
211 fprintf(ofp, "\n%s", buffer);
212 while (state == BODY) {
213 state = m_getfld(state, name, buffer,
222 advise(NULL, "format error in message %s", msgnam);
226 advise(NULL, "getfld() returned %d", state);