X-Git-Url: http://git.marmaro.de/?p=mmh;a=blobdiff_plain;f=uip%2Fdistsbr.c;h=2662c02dd9184c64d7f13f9f8b9271e415fb9b86;hp=a600b77b0666ad13da91f570d4a92c63bd5b62e7;hb=6e9577f324bef90765a5edc02044eb111ec48072;hpb=d4c34b4439a9dbd89664de460ed37ecddc260fb1 diff --git a/uip/distsbr.c b/uip/distsbr.c index a600b77..2662c02 100644 --- a/uip/distsbr.c +++ b/uip/distsbr.c @@ -24,10 +24,10 @@ static int ready_msg(char *); int distout(char *drft, char *msgnam, char *backup) { - int state; + enum state state; + struct field f = {{0}}; unsigned char *dp; - char *resent; - char name[NAMESZ], buffer[BUFSIZ]; + int resent = 0; FILE *ifp, *ofp; strcpy(backup, m_mktemp(toabsdir(invo_name), NULL, NULL)); @@ -35,60 +35,52 @@ distout(char *drft, char *msgnam, char *backup) advise(backup, "unable to rename %s to",drft); return NOTOK; } + + if (ready_msg(msgnam) != OK) { + return NOTOK; + } + if (!(ifp = fopen(backup, "r"))) { advise(backup, "unable to read"); return NOTOK; } if (!(ofp = fopen(drft, "w"))) { + fclose(ifp); advise(drft, "unable to create temporary file"); return NOTOK; } chmod(drft, m_gmprot()); - if (ready_msg(msgnam) != OK) { - return NOTOK; - } lseek(hdrfd, (off_t) 0, SEEK_SET); /* msgnam not accurate */ cpydata(hdrfd, fileno(ofp), msgnam, drft); - state = FLD; - resent = NULL; + state = FLD2; while (1) { - switch (state = m_getfld(state, name, buffer, sizeof buffer, - ifp)) { - case FLD: - case FLDPLUS: - if (!uprf(name, "resent")) { - advise(NULL, "Please re-edit draft to remove the ``%s'' header.", name); + 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; } - 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); - } + resent = 1; + fprintf(ofp, "%s: %s", f.name, f.value); break; - case BODY: - for (dp = buffer; *dp; dp++) { + 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; } } - case FILEEOF: + case FILEEOF2: goto process; - case LENERR: - case FMTERR: + case LENERR2: + case FMTERR2: + case IOERR2: advise(NULL, "Please re-edit draft and fix that header."); leave_bad: ; fclose(ifp); @@ -118,7 +110,6 @@ process: ; } return NOTOK; } - mh_free0(&resent); if (txtfd != NOTOK) { lseek(txtfd, (off_t) 0, SEEK_SET); /* msgnam not accurate */ @@ -134,8 +125,10 @@ process: ; static int ready_msg(char *msgnam) { - int state, out; - char name[NAMESZ], buffer[BUFSIZ], tmpfil[BUFSIZ]; + enum state state; + struct field f = {{0}}; + char tmpfil[BUFSIZ]; + int out; FILE *ifp, *ofp; char *cp = NULL; @@ -154,35 +147,31 @@ ready_msg(char *msgnam) cp = m_mktemp2(NULL, "dist", &hdrfd, NULL); if (!cp) { + fclose(ifp); 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"))) { + fclose(ifp); advise(NULL, "no file descriptors -- you lose big"); return NOTOK; } unlink(tmpfil); - state = FLD; + state = FLD2; while (1) { - state = m_getfld(state, name, buffer, sizeof buffer, ifp); + state = m_getfld2(state, &f, ifp); switch (state) { - case FLD: - case FLDPLUS: - if (uprf(name, "resent")) { + case FLD2: + if (uprf(f.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); - } + fprintf(ofp, "%s: %s", f.name, f.value); break; - case BODY: + case BODY2: fclose(ofp); cp = m_mktemp2(NULL, "dist", &txtfd, NULL); @@ -198,17 +187,19 @@ ready_msg(char *msgnam) return NOTOK; } unlink(tmpfil); - fprintf(ofp, "\n%s", buffer); - while (state == BODY) { - state = m_getfld(state, name, buffer, - sizeof buffer, ifp); - fputs(buffer, ofp); + fputs("\n", ofp); + while (state == BODY2) { + fputs(f.value, ofp); + state = m_getfld2(state, &f, ifp); } - case FILEEOF: + /* FALL */ + + case FILEEOF2: goto process; - case LENERR: - case FMTERR: + case LENERR2: + case FMTERR2: + case IOERR2: advise(NULL, "format error in message %s", msgnam); return NOTOK;