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;
19 static void ready_msg(char *);
22 distout(char *drft, char *msgnam, char *backup)
25 register unsigned char *dp;
26 register char *resent;
27 char name[NAMESZ], buffer[BUFSIZ];
28 register FILE *ifp, *ofp;
30 strcpy(backup, m_mktemp(toabsdir(invo_name), NULL, NULL));
31 if (rename(drft, backup) == NOTOK) {
32 adios(backup, "unable to rename %s to",drft);
34 if (!(ifp = fopen(backup, "r"))) {
35 adios(backup, "unable to read");
38 if (!(ofp = fopen(drft, "w"))) {
39 adios(drft, "unable to create temporary file");
41 chmod(drft, m_gmprot());
44 lseek(hdrfd, (off_t) 0, SEEK_SET); /* msgnam not accurate */
45 cpydata(hdrfd, fileno(ofp), msgnam, drft);
50 switch (state = m_getfld(state, name, buffer, sizeof buffer,
55 if (!uprf(name, "resent")) {
56 advise(NULL, "Please re-edit draft to remove the ``%s'' header.", name);
60 resent = add(":", add(name, resent));
62 resent = add(buffer, resent);
63 fprintf(ofp, "%s: %s", name, buffer);
64 while (state == FLDPLUS) {
65 state = m_getfld(state, name, buffer,
67 resent = add(buffer, resent);
70 if (state == FLDEOF) {
77 for (dp = buffer; *dp; dp++) {
79 advise(NULL, "Please re-edit draft to consist of headers only.");
89 advise(NULL, "Please re-edit draft and fix that header.");
94 if (rename(backup, drft) == NOTOK) {
95 adios(drft, "unable to rename %s to", backup);
100 adios(NULL, "getfld() returned %d", state);
109 advise(NULL, "Please re-edit draft to include a ``Resent-To:'' header.");
112 if (rename(backup, drft) == NOTOK) {
113 adios(drft, "unable to rename %s to", backup);
119 if (txtfd != NOTOK) {
120 lseek(txtfd, (off_t) 0, SEEK_SET); /* msgnam not accurate */
121 cpydata(txtfd, fileno(ofp), msgnam, drft);
131 ready_msg(char *msgnam)
134 char name[NAMESZ], buffer[BUFSIZ], tmpfil[BUFSIZ];
135 register FILE *ifp, *ofp;
138 if (hdrfd != NOTOK) {
142 if (txtfd != NOTOK) {
146 if (!(ifp = fopen(msgnam, "r"))) {
147 adios(msgnam, "unable to open message");
150 cp = m_mktemp2(NULL, "dist", &hdrfd, NULL);
152 adios("distsbr", "unable to create temporary file");
155 strncpy(tmpfil, cp, sizeof(tmpfil));
156 if ((out = dup(hdrfd)) == NOTOK || !(ofp = fdopen(out, "w"))) {
157 adios(NULL, "no file descriptors -- you lose big");
163 state = m_getfld(state, name, buffer, sizeof buffer, ifp);
168 if (uprf(name, "resent")) {
169 fprintf(ofp, "Prev-");
171 fprintf(ofp, "%s: %s", name, buffer);
172 while (state == FLDPLUS) {
173 state = m_getfld(state, name, buffer,
177 if (state == FLDEOF) {
186 cp = m_mktemp2(NULL, "dist", &txtfd, NULL);
188 adios("distsbr", "unable to create temp file");
191 strncpy(tmpfil, cp, sizeof(tmpfil));
192 if ((out = dup(txtfd)) == NOTOK ||
193 !(ofp = fdopen(out, "w"))) {
194 adios(NULL, "no file descriptors -- you lose");
197 fprintf(ofp, "\n%s", buffer);
198 while (state == BODY) {
199 state = m_getfld(state, name, buffer,
208 adios(NULL, "format error in message %s", msgnam);
211 adios(NULL, "getfld() returned %d", state);