X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/177f020f122827214159c46dcfe7ded1e3c8d1c3..8699f1cc:/uip/sendsbr.c?ds=sidebyside diff --git a/uip/sendsbr.c b/uip/sendsbr.c index a7c398af..d7e76033 100644 --- a/uip/sendsbr.c +++ b/uip/sendsbr.c @@ -23,7 +23,13 @@ #ifdef OAUTH_SUPPORT #include +#endif +#include "h/done.h" +#include "sbr/m_maildir.h" +#include "sbr/m_mktemp.h" +#include "sbr/message_id.h" +#ifdef OAUTH_SUPPORT static int setup_oauth_params(char *[], int *, const char *, const char **); #endif /* OAUTH_SUPPORT */ @@ -95,7 +101,7 @@ sendsbr (char **vec, int vecp, char *program, char *draft, struct stat *st, execvp(buildprogram, buildvec); fprintf(stderr, "unable to exec "); perror(buildmimeproc); - _exit(-1); + _exit(1); break; default: @@ -104,7 +110,7 @@ sendsbr (char **vec, int vecp, char *program, char *draft, struct stat *st, break; } - done=armed_done; + set_done(armed_done); switch (setjmp (env)) { case OK: /* @@ -130,7 +136,7 @@ sendsbr (char **vec, int vecp, char *program, char *draft, struct stat *st, #ifdef OAUTH_SUPPORT const char *errmsg; if (setup_oauth_params(vec, nvecsp, auth_svc, &errmsg) != OK) { - adios(NULL, errmsg); + adios(NULL, "%s", errmsg); } #else adios(NULL, "send built without OAUTH_SUPPORT, " @@ -170,7 +176,7 @@ sendsbr (char **vec, int vecp, char *program, char *draft, struct stat *st, break; } - done=exit; + set_done(exit); if (distfile) (void) m_unlink (distfile); @@ -189,11 +195,11 @@ splitmsg (char **vec, int vecp, char *program, char *drft, int compnum, nparts, partno, state, status; long pos, start; time_t clock; - char *cp, *dp, buffer[BUFSIZ], msgid[BUFSIZ]; + char *cp, *dp, buffer[NMH_BUFSIZ], msgid[BUFSIZ]; char subject[BUFSIZ]; char name[NAMESZ], partnum[BUFSIZ]; FILE *in; - m_getfld_state_t gstate = 0; + m_getfld_state_t gstate; if ((in = fopen (drft, "r")) == NULL) adios (drft, "unable to open for reading"); @@ -205,10 +211,11 @@ splitmsg (char **vec, int vecp, char *program, char *drft, * Scan through the message and examine the various header fields, * as well as locate the beginning of the message body. */ - m_getfld_track_filepos (&gstate, in); + gstate = m_getfld_state_init(in); + m_getfld_track_filepos2(&gstate); for (compnum = 1;;) { int bufsz = sizeof buffer; - switch (state = m_getfld (&gstate, name, buffer, &bufsz, in)) { + switch (state = m_getfld2(&gstate, name, buffer, &bufsz)) { case FLD: case FLDPLUS: compnum++; @@ -219,7 +226,7 @@ splitmsg (char **vec, int vecp, char *program, char *drft, if (!strcasecmp (name, "Message-ID")) { while (state == FLDPLUS) { bufsz = sizeof buffer; - state = m_getfld (&gstate, name, buffer, &bufsz, in); + state = m_getfld2(&gstate, name, buffer, &bufsz); } } else if (uprf (name, XXX_FIELD_PRF) || !strcasecmp (name, VRSN_FIELD) @@ -245,7 +252,7 @@ splitmsg (char **vec, int vecp, char *program, char *drft, dp = add (concat (name, ":", buffer, NULL), dp); while (state == FLDPLUS) { bufsz = sizeof buffer; - state = m_getfld (&gstate, name, buffer, &bufsz, in); + state = m_getfld2(&gstate, name, buffer, &bufsz); dp = add (buffer, dp); } } else { @@ -256,7 +263,7 @@ splitmsg (char **vec, int vecp, char *program, char *drft, cp = add (concat (name, ":", buffer, NULL), cp); while (state == FLDPLUS) { bufsz = sizeof buffer; - state = m_getfld (&gstate, name, buffer, &bufsz, in); + state = m_getfld2(&gstate, name, buffer, &bufsz); cp = add (buffer, cp); } } @@ -296,7 +303,7 @@ splitmsg (char **vec, int vecp, char *program, char *drft, /* Only one part, nothing to split */ if (nparts == 1) { free (cp); - mh_xfree(dp); + free(dp); fclose (in); return sendaux (vec, vecp, program, drft, st); @@ -402,7 +409,7 @@ splitmsg (char **vec, int vecp, char *program, char *drft, } free (cp); - mh_xfree(dp); + free(dp); fclose (in); /* close the draft */ return status; @@ -418,7 +425,7 @@ static int sendaux (char **vec, int vecp, char *program, char *drft, struct stat *st) { pid_t child_id; - int i, status, fd, fd2; + int status, fd, fd2; char backup[BUFSIZ], buf[BUFSIZ]; fd = pushsw ? tmp_fd () : NOTOK; @@ -439,9 +446,7 @@ sendaux (char **vec, int vecp, char *program, char *drft, struct stat *st) done (1); vec[vecp] = NULL; - for (i = 0; (child_id = fork()) == NOTOK && i < 5; i++) - sleep (5); - + child_id = fork(); switch (child_id) { case -1: /* oops -- fork error */ @@ -452,7 +457,7 @@ sendaux (char **vec, int vecp, char *program, char *drft, struct stat *st) /* * child process -- send it * - * If fd is ok, then we are pushing and fd points to temp + * If fd is OK, then we are pushing and fd points to temp * file, so capture anything on stdout and stderr there. */ if (fd != NOTOK) { @@ -463,7 +468,7 @@ sendaux (char **vec, int vecp, char *program, char *drft, struct stat *st) execvp (program, vec); fprintf (stderr, "unable to exec "); perror (postproc); - _exit (-1); + _exit(1); default: /* @@ -508,14 +513,12 @@ static void alert (char *file, int out) { pid_t child_id; - int i, in, argp; + int in, argp; char buf[BUFSIZ]; char *program; char **arglist; - for (i = 0; (child_id = fork()) == NOTOK && i < 5; i++) - sleep (5); - + child_id = fork(); switch (child_id) { case NOTOK: /* oops -- fork error */ @@ -532,7 +535,7 @@ alert (char *file, int out) if ((in = open (file, O_RDONLY)) == NOTOK) { admonish (file, "unable to re-open"); } else { - lseek (out, (off_t) 0, SEEK_END); + lseek(out, 0, SEEK_END); strncpy (buf, "\nMessage not delivered to anyone.\n", sizeof(buf)); if (write (out, buf, strlen (buf)) < 0) { advise (file, "write"); @@ -551,7 +554,7 @@ alert (char *file, int out) admonish (buf, "unable to rename %s to", file); } } - lseek (out, (off_t) 0, SEEK_SET); + lseek(out, 0, SEEK_SET); dup2 (out, fileno (stdin)); close (out); /* create subject for error notification */ @@ -568,7 +571,7 @@ alert (char *file, int out) execvp (program, arglist); fprintf (stderr, "unable to exec "); perror (mailproc); - _exit (-1); + _exit(1); default: /* no waiting... */ break; @@ -586,9 +589,8 @@ tmp_fd (void) if (debugsw) inform("temporary file %s selected", tfile); - else - if (m_unlink (tfile) == NOTOK) - advise (tfile, "unable to remove"); + else if (m_unlink (tfile) == NOTOK) + advise (tfile, "unable to remove"); return fd; } @@ -709,7 +711,7 @@ annoaux (int fd) goto oops; } - lseek (fd, (off_t) 0, SEEK_SET); + lseek(fd, 0, SEEK_SET); if ((fp = fdopen (fd, "r")) == NULL) { if (debugsw) inform("unable to fdopen annotation list, continuing..."); @@ -746,7 +748,7 @@ handle_sendfrom(char **vec, int *vecp, char *draft, const char *auth_svc) { /* Extract address and host from From: header line in draft. */ if (get_from_header_info(draft, &addr, &host, &message) != OK) { - adios(draft, message); + adios(draft, "%s", message); } /* Merge in any address or host specific switches to post(1) from profile. */ @@ -763,7 +765,7 @@ handle_sendfrom(char **vec, int *vecp, char *draft, const char *auth_svc) { if (strcmp(*vp, "xoauth2") == 0) { #ifdef OAUTH_SUPPORT if (setup_oauth_params(vec, vecp, auth_svc, &message) != OK) { - adios(NULL, message); + adios(NULL, "%s", message); } break; #else @@ -822,7 +824,7 @@ setup_oauth_params(char *vec[], int *vecp, const char *auth_svc, vec[(*vecp)++] = mh_xstrdup("-authservice"); vec[(*vecp)++] = mh_xstrdup(auth_svc); vec[(*vecp)++] = mh_xstrdup("-oauthcredfile"); - vec[(*vecp)++] = mh_xstrdup(mh_oauth_cred_fn(auth_svc)); + vec[(*vecp)++] = mh_oauth_cred_fn(auth_svc); vec[(*vecp)++] = mh_xstrdup("-oauthclientid"); vec[(*vecp)++] = getcpy(svc.client_id); vec[(*vecp)++] = mh_xstrdup("-oauthclientsecret"); @@ -882,8 +884,7 @@ get_from_header_info(const char *filename, const char **addr, const char **host, /* Use the hostformat that corresponds to the successful addrformat. */ if ((*host = get_message_header_info(in, hostformat)) == NULL) { - fclose(in); - *message = "unable to find sender host in"; + *message = "unable to find sender host"; fclose(in); return NOTOK; } @@ -908,7 +909,7 @@ get_message_header_info(FILE *in, char *format) { struct format *fmt; struct stat st; int parsing_header; - m_getfld_state_t gstate = 0; + m_getfld_state_t gstate; charstring_t buffer = charstring_create(0); char *retval; @@ -924,10 +925,11 @@ get_message_header_info(FILE *in, char *format) { */ rewind (in); parsing_header = 1; + gstate = m_getfld_state_init(in); do { char name[NAMESZ], rbuf[NMH_BUFSIZ]; int bufsz = sizeof rbuf; - int state = m_getfld(&gstate, name, rbuf, &bufsz, in); + int state = m_getfld2(&gstate, name, rbuf, &bufsz); switch (state) { case FLD: @@ -937,14 +939,14 @@ get_message_header_info(FILE *in, char *format) { if (bucket != -1) { while (state == FLDPLUS) { bufsz = sizeof rbuf; - state = m_getfld(&gstate, name, rbuf, &bufsz, in); + state = m_getfld2(&gstate, name, rbuf, &bufsz); fmt_appendcomp(bucket, name, rbuf); } } while (state == FLDPLUS) { bufsz = sizeof rbuf; - state = m_getfld(&gstate, name, rbuf, &bufsz, in); + state = m_getfld2(&gstate, name, rbuf, &bufsz); } break; } @@ -1009,7 +1011,7 @@ merge_profile_entry(const char *addr, const char *host, char *vec[], int *vecp) } -static void +static void NORETURN armed_done (int status) { longjmp (env, status ? status : NOTOK);