X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/fbc0e57bf904a7f727cb6e02b24916c0125341c1..475fef2edee9db3c63fc089df76f8e93e3d598cd:/uip/sendsbr.c diff --git a/uip/sendsbr.c b/uip/sendsbr.c index fd80a0f0..020949d0 100644 --- a/uip/sendsbr.c +++ b/uip/sendsbr.c @@ -52,7 +52,7 @@ static int sendaux (char **, int, char *, char *, struct stat *); */ int -sendsbr (char **vec, int vecp, char *program, char *drft, struct stat *st, +sendsbr (char **vec, int vecp, char *program, char *draft, struct stat *st, int rename_drft) { int status, i; @@ -60,6 +60,7 @@ sendsbr (char **vec, int vecp, char *program, char *drft, struct stat *st, char buffer[BUFSIZ], file[BUFSIZ]; struct stat sts; char **buildvec, *buildprogram; + char *volatile drft = draft; /* * Run the mimebuildproc (which is by default mhbuild) on the message @@ -76,7 +77,7 @@ sendsbr (char **vec, int vecp, char *program, char *drft, struct stat *st, buildvec[i++] = "-auto"; if (distfile) buildvec[i++] = "-dist"; - buildvec[i++] = drft; + buildvec[i++] = (char *) drft; buildvec[i] = NULL; execvp(buildprogram, buildvec); fprintf(stderr, "unable to exec "); @@ -98,10 +99,11 @@ sendsbr (char **vec, int vecp, char *program, char *drft, struct stat *st, * rename the draft file. I'm not quite sure why. */ if (pushsw && unique) { - char *cp = m_mktemp2(drft, invo_name, NULL, NULL); - if (cp == NULL) { - adios ("sendsbr", "unable to create temporary file"); - } + char *cp = m_mktemp2(drft, invo_name, NULL, NULL); + if (cp == NULL) { + adios(NULL, "unable to create temporary file in %s", + get_temp_dir()); + } if (rename (drft, strncpy(file, cp, sizeof(file))) == NOTOK) adios (file, "unable to rename %s to", drft); drft = file; @@ -111,16 +113,18 @@ sendsbr (char **vec, int vecp, char *program, char *drft, struct stat *st, * Check if we need to split the message into * multiple messages of type "message/partial". */ - if (splitsw >= 0 && !distfile && stat (drft, &sts) != NOTOK + if (splitsw >= 0 && !distfile && stat ((char *) drft, &sts) != NOTOK && sts.st_size >= CPERMSG) { - status = splitmsg (vec, vecp, program, drft, st, splitsw) ? NOTOK : OK; + status = splitmsg (vec, vecp, program, drft, + st, splitsw) ? NOTOK : OK; } else { status = sendaux (vec, vecp, program, drft, st) ? NOTOK : OK; } /* rename the original draft */ if (rename_drft && status == OK && - rename (drft, strncpy (buffer, m_backup (drft), sizeof(buffer))) == NOTOK) + rename (drft, strncpy (buffer, m_backup (drft), + sizeof(buffer))) == NOTOK) advise (buffer, "unable to rename %s to", drft); break; @@ -131,7 +135,7 @@ sendsbr (char **vec, int vecp, char *program, char *drft, struct stat *st, done=exit; if (distfile) - unlink (distfile); + (void) m_unlink (distfile); return status; } @@ -283,10 +287,10 @@ splitmsg (char **vec, int vecp, char *program, char *drft, char *cp = m_mktemp2(drft, invo_name, NULL, &out); if (cp == NULL) { - adios (drft, "unable to create temporary file for"); + adios(NULL, "unable to create temporary file in %s", + get_temp_dir()); } strncpy(tmpdrf, cp, sizeof(tmpdrf)); - chmod (tmpdrf, 0600); /* * Output the header fields @@ -350,7 +354,7 @@ splitmsg (char **vec, int vecp, char *program, char *drft, snprintf (partnum, sizeof(partnum), "%d", partno); status = sendaux (vec, vecp, program, tmpdrf, st); - unlink (tmpdrf); + (void) m_unlink (tmpdrf); if (status != OK) break; @@ -392,7 +396,8 @@ sendaux (char **vec, int vecp, char *program, char *drft, struct stat *st) snprintf (buf, sizeof(buf), "%d", fd2); vec[vecp++] = buf; } else { - admonish (NULL, "unable to create file for annotation list"); + admonish (NULL, "unable to create temporary file in %s " + "for annotation list", get_temp_dir()); } } if (distfile && distout (drft, distfile, backup) == NOTOK) @@ -447,7 +452,7 @@ sendaux (char **vec, int vecp, char *program, char *drft, struct stat *st) if (annotext && fd2 != NOTOK) close (fd2); if (distfile) { - unlink (drft); + (void) m_unlink (drft); if (rename (backup, drft) == NOTOK) advise (drft, "unable to rename %s to", backup); } @@ -533,16 +538,14 @@ static int tmp_fd (void) { int fd; - char *tfile = NULL; + char *tfile; - tfile = m_mktemp2(NULL, invo_name, &fd, NULL); - if (tfile == NULL) return NOTOK; - fchmod(fd, 0600); + if ((tfile = m_mktemp2(NULL, invo_name, &fd, NULL)) == NULL) return NOTOK; if (debugsw) advise (NULL, "temporary file %s selected", tfile); else - if (unlink (tfile) == NOTOK) + if (m_unlink (tfile) == NOTOK) advise (tfile, "unable to remove"); return fd; @@ -585,6 +588,8 @@ anno (int fd, struct stat *st) sigaddset (&set, SIGTERM); sigprocmask (SIG_BLOCK, &set, &oset); + unregister_for_removal(0); + annoaux (fd); if (child_id == OK) _exit (0);