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)
28 struct field f = {{0}};
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);
39 if (ready_msg(msgnam) != OK) {
43 if (!(ifp = fopen(backup, "r"))) {
44 advise(backup, "unable to read");
48 if (!(ofp = fopen(drft, "w"))) {
50 advise(drft, "unable to create temporary file");
53 chmod(drft, m_gmprot());
55 lseek(hdrfd, (off_t) 0, SEEK_SET); /* msgnam not accurate */
56 cpydata(hdrfd, fileno(ofp), msgnam, drft);
60 switch (state = m_getfld2(state, &f, ifp)) {
62 if (!uprf(f.name, "resent")) {
63 advise(NULL, "Please re-edit draft to remove the ``%s'' header.", f.name);
67 fprintf(ofp, "%s: %s", f.name, f.value);
71 for (dp = f.value; *dp; dp++) {
73 advise(NULL, "Please re-edit draft to consist of headers only.");
84 advise(NULL, "Please re-edit draft and fix that header.");
89 if (rename(backup, drft) == NOTOK) {
90 advise(drft, "unable to rename %s to", backup);
95 advise(NULL, "getfld() returned %d", state);
105 advise(NULL, "Please re-edit draft to include a ``Resent-To:'' header.");
108 if (rename(backup, drft) == NOTOK) {
109 advise(drft, "unable to rename %s to", backup);
114 if (txtfd != NOTOK) {
115 lseek(txtfd, (off_t) 0, SEEK_SET); /* msgnam not accurate */
116 cpydata(txtfd, fileno(ofp), msgnam, drft);
126 ready_msg(char *msgnam)
129 struct field f = {{0}};
135 if (hdrfd != NOTOK) {
139 if (txtfd != NOTOK) {
143 if (!(ifp = fopen(msgnam, "r"))) {
144 advise(msgnam, "unable to open message");
148 cp = m_mktemp2(NULL, "dist", &hdrfd, NULL);
151 advise("distsbr", "unable to create temporary file");
155 strncpy(tmpfil, cp, sizeof(tmpfil));
156 if ((out = dup(hdrfd)) == NOTOK || !(ofp = fdopen(out, "w"))) {
158 advise(NULL, "no file descriptors -- you lose big");
165 state = m_getfld2(state, &f, ifp);
168 if (uprf(f.name, "resent")) {
169 fprintf(ofp, "Prev-");
171 fprintf(ofp, "%s: %s", f.name, f.value);
177 cp = m_mktemp2(NULL, "dist", &txtfd, NULL);
179 advise("distsbr", "unable to create temp file");
183 strncpy(tmpfil, cp, sizeof(tmpfil));
184 if ((out = dup(txtfd)) == NOTOK ||
185 !(ofp = fdopen(out, "w"))) {
186 advise(NULL, "no file descriptors -- you lose");
191 while (state == BODY2) {
193 state = m_getfld2(state, &f, ifp);
203 advise(NULL, "format error in message %s", msgnam);
207 advise(NULL, "getfld() returned %d", state);