X-Git-Url: http://git.marmaro.de/?p=mmh;a=blobdiff_plain;f=uip%2Fdistsbr.c;h=21b42a5cf883c3b6e9f859ffc0e719ecba1f5879;hp=319e496adf15582d60195651d3decbab77153ae6;hb=a87df3543d3bc128ba4079d1f95638476ba5ca50;hpb=714b5c530ece27ea2835a313013f5b770163403c diff --git a/uip/distsbr.c b/uip/distsbr.c index 319e496..21b42a5 100644 --- a/uip/distsbr.c +++ b/uip/distsbr.c @@ -9,114 +9,107 @@ #include #include #include +#include +#include +#include static int hdrfd = NOTOK; static int txtfd = NOTOK; -#define BADHDR "please re-edit %s to remove the ``%s'' header!" -#define BADTXT "please re-edit %s to consist of headers only!" -#define BADMSG "please re-edit %s to include a ``Resent-To:''!" -#define BADRFT "please re-edit %s and fix that header!" - /* ** static prototypes */ -static void ready_msg(char *); +static int ready_msg(char *); int distout(char *drft, char *msgnam, char *backup) { - int state; - register unsigned char *dp; - register char *resent; - char name[NAMESZ], buffer[BUFSIZ]; - register FILE *ifp, *ofp; - - if (rename(drft, strcpy(backup, m_backup(drft))) == NOTOK) - adios(backup, "unable to rename %s to",drft); - if ((ifp = fopen(backup, "r")) == NULL) - adios(backup, "unable to read"); - - if ((ofp = fopen(drft, "w")) == NULL) - adios(drft, "unable to create temporary file"); + enum state state; + struct field f = free_field; + unsigned char *dp; + int resent = 0; + FILE *ifp, *ofp; + + strcpy(backup, m_mktemp(toabsdir(invo_name), NULL, NULL)); + if (rename(drft, backup) == NOTOK) { + advise(backup, "unable to rename %s to",drft); + return NOTOK; + } + if (!(ifp = fopen(backup, "r"))) { + advise(backup, "unable to read"); + return NOTOK; + } + + if (!(ofp = fopen(drft, "w"))) { + advise(drft, "unable to create temporary file"); + return NOTOK; + } chmod(drft, m_gmprot()); - ready_msg(msgnam); + if (ready_msg(msgnam) != OK) { + return NOTOK; + } lseek(hdrfd, (off_t) 0, SEEK_SET); /* msgnam not accurate */ cpydata(hdrfd, fileno(ofp), msgnam, drft); - for (state = FLD, resent = NULL;;) - switch (state = m_getfld (state, name, buffer, - sizeof buffer, ifp)) { - case FLD: - case FLDPLUS: - case FLDEOF: - if (uprf(name, "distribute-")) - snprintf(name, sizeof(name), "%s%s", - "Resent", &name[10]); - if (uprf(name, "distribution-")) - snprintf(name, sizeof(name), "%s%s", - "Resent", &name[12]); - if (!uprf(name, "resent")) { - advise(NULL, BADHDR, "draft", name); + state = FLD2; + while (1) { + switch (state = m_getfld2(state, &f, ifp)) { + case FLD2: + if (!uprf(f.name, "resent")) { + advise(NULL, "Please re-edit draft to remove the ``%s'' header.", f.name); + goto leave_bad; + } + resent = 1; + fprintf(ofp, "%s: %s", f.name, f.value); + break; + + case BODY2: + for (dp = f.value; *dp; dp++) { + if (!isspace(*dp)) { + advise(NULL, "Please re-edit draft to consist of headers only."); goto leave_bad; } - if (state == FLD) - resent = add(":", add(name, resent)); - resent = add(buffer, resent); - fprintf(ofp, "%s: %s", name, buffer); - while (state == FLDPLUS) { - state = m_getfld(state, name, buffer, - sizeof buffer, ifp); - resent = add(buffer, resent); - fputs(buffer, ofp); - } - if (state == FLDEOF) - goto process; - break; - - case BODY: - case BODYEOF: - for (dp = buffer; *dp; dp++) - if (!isspace(*dp)) { - advise(NULL, BADTXT, "draft"); - goto leave_bad; - } - - case FILEEOF: - goto process; - - case LENERR: - case FMTERR: - advise(NULL, BADRFT, "draft"); - leave_bad: ; - fclose(ifp); - fclose(ofp); - unlink(drft); - if (rename(backup, drft) == NOTOK) - adios(drft, "unable to rename %s to", - backup); - return NOTOK; - - default: - adios(NULL, "getfld() returned %d", state); + } + + case FILEEOF2: + goto process; + + case LENERR2: + case FMTERR2: + case IOERR2: + advise(NULL, "Please re-edit draft and fix that header."); +leave_bad: ; + fclose(ifp); + fclose(ofp); + unlink(drft); + if (rename(backup, drft) == NOTOK) { + advise(drft, "unable to rename %s to", backup); + } + return NOTOK; + + default: + advise(NULL, "getfld() returned %d", state); + return NOTOK; } + } + process: ; fclose(ifp); fflush(ofp); if (!resent) { - advise(NULL, BADMSG, "draft"); + advise(NULL, "Please re-edit draft to include a ``Resent-To:'' header."); fclose(ofp); unlink(drft); - if (rename(backup, drft) == NOTOK) - adios(drft, "unable to rename %s to", backup); + if (rename(backup, drft) == NOTOK) { + advise(drft, "unable to rename %s to", backup); + } return NOTOK; } - free(resent); if (txtfd != NOTOK) { - lseek(txtfd, (off_t) 0, SEEK_SET); /* msgnam not accurate */ + lseek(txtfd, (off_t) 0, SEEK_SET); /* msgnam not accurate */ cpydata(txtfd, fileno(ofp), msgnam, drft); } @@ -126,84 +119,92 @@ process: ; } -static void +static int ready_msg(char *msgnam) { - int state, out; - char name[NAMESZ], buffer[BUFSIZ], tmpfil[BUFSIZ]; - register FILE *ifp, *ofp; + enum state state; + struct field f = free_field; + char tmpfil[BUFSIZ]; + int out; + FILE *ifp, *ofp; char *cp = NULL; - if (hdrfd != NOTOK) - close(hdrfd), hdrfd = NOTOK; - if (txtfd != NOTOK) - close(txtfd), txtfd = NOTOK; - - if ((ifp = fopen(msgnam, "r")) == NULL) - adios(msgnam, "unable to open message"); + if (hdrfd != NOTOK) { + close(hdrfd); + hdrfd = NOTOK; + } + if (txtfd != NOTOK) { + close(txtfd); + txtfd = NOTOK; + } + if (!(ifp = fopen(msgnam, "r"))) { + advise(msgnam, "unable to open message"); + return NOTOK; + } cp = m_mktemp2(NULL, "dist", &hdrfd, NULL); - if (cp == NULL) { - adios("distsbr", "unable to create temporary file"); + if (!cp) { + advise("distsbr", "unable to create temporary file"); + return NOTOK; } fchmod(hdrfd, 0600); strncpy(tmpfil, cp, sizeof(tmpfil)); - if ((out = dup(hdrfd)) == NOTOK - || (ofp = fdopen(out, "w")) == NULL) - adios(NULL, "no file descriptors -- you lose big"); + if ((out = dup(hdrfd)) == NOTOK || !(ofp = fdopen(out, "w"))) { + advise(NULL, "no file descriptors -- you lose big"); + return NOTOK; + } unlink(tmpfil); - for (state = FLD;;) - switch (state = m_getfld (state, name, buffer, sizeof buffer, - ifp)) { - case FLD: - case FLDPLUS: - case FLDEOF: - if (uprf(name, "resent")) - fprintf(ofp, "Prev-"); - fprintf(ofp, "%s: %s", name, buffer); - while (state == FLDPLUS) { - state = m_getfld(state, name, buffer, - sizeof buffer, ifp); - fputs(buffer, ofp); - } - if (state == FLDEOF) - goto process; - break; - - case BODY: - case BODYEOF: - fclose(ofp); - - cp = m_mktemp2(NULL, "dist", &txtfd, NULL); - if (cp == NULL) { - adios("distsbr", "unable to create temporary file"); - } - fchmod(txtfd, 0600); - strncpy(tmpfil, cp, sizeof(tmpfil)); - if ((out = dup(txtfd)) == NOTOK - || (ofp = fdopen(out, "w")) - == NULL) - adios(NULL, "no file descriptors -- you lose big"); - unlink(tmpfil); - fprintf(ofp, "\n%s", buffer); - while (state == BODY) { - state = m_getfld(state, name, buffer, - sizeof buffer, ifp); - fputs(buffer, ofp); - } - case FILEEOF: - goto process; - - case LENERR: - case FMTERR: - adios(NULL, "format error in message %s", - msgnam); - - default: - adios(NULL, "getfld() returned %d", state); + state = FLD2; + while (1) { + state = m_getfld2(state, &f, ifp); + switch (state) { + case FLD2: + if (uprf(f.name, "resent")) { + fprintf(ofp, "Prev-"); + } + fprintf(ofp, "%s: %s", f.name, f.value); + break; + + case BODY2: + fclose(ofp); + + cp = m_mktemp2(NULL, "dist", &txtfd, NULL); + if (!cp) { + advise("distsbr", "unable to create temp file"); + return NOTOK; + } + fchmod(txtfd, 0600); + strncpy(tmpfil, cp, sizeof(tmpfil)); + if ((out = dup(txtfd)) == NOTOK || + !(ofp = fdopen(out, "w"))) { + advise(NULL, "no file descriptors -- you lose"); + return NOTOK; + } + unlink(tmpfil); + fprintf(ofp, "\n%s", f.value); + while (state == BODY2) { + state = m_getfld2(state, &f, ifp); + fputs(f.value, ofp); + } + /* FALL */ + + case FILEEOF2: + goto process; + + case LENERR2: + case FMTERR2: + case IOERR2: + advise(NULL, "format error in message %s", msgnam); + return NOTOK; + + default: + advise(NULL, "getfld() returned %d", state); + return NOTOK; } + } process: ; fclose(ifp); fclose(ofp); + return OK; }