X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/fe86b6d55ac470e6e832c53ea2c71e680efe5274..69819af4834557e60c33bb378e29cf3d4e8269f8:/uip/sendsbr.c diff --git a/uip/sendsbr.c b/uip/sendsbr.c index 191f5628..cc00e0ce 100644 --- a/uip/sendsbr.c +++ b/uip/sendsbr.c @@ -1,6 +1,4 @@ - -/* - * sendsbr.c -- routines to help WhatNow/Send along +/* sendsbr.c -- routines to help WhatNow/Send along * * This code is Copyright (c) 2002, by the authors of nmh. See the * COPYRIGHT file in the root directory of the nmh distribution for @@ -25,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 */ @@ -97,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: @@ -106,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: /* @@ -116,8 +120,7 @@ sendsbr (char **vec, int vecp, char *program, char *draft, struct stat *st, if (pushsw && unique) { char *cp = m_mktemp2(drft, invo_name, NULL, NULL); if (cp == NULL) { - adios(NULL, "unable to create temporary file in %s", - get_temp_dir()); + die("unable to create temporary file"); } if (rename (drft, strncpy(file, cp, sizeof(file))) == NOTOK) adios (file, "unable to rename %s to", drft); @@ -132,10 +135,10 @@ 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); + die("%s", errmsg); } #else - adios(NULL, "send built without OAUTH_SUPPORT, " + die("send built without OAUTH_SUPPORT, " "so auth_svc %s is not supported", auth_svc); #endif /* OAUTH_SUPPORT */ } @@ -172,7 +175,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); @@ -191,11 +194,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"); @@ -207,10 +210,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++; @@ -221,7 +225,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) @@ -247,7 +251,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 { @@ -258,7 +262,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); } } @@ -272,17 +276,17 @@ splitmsg (char **vec, int vecp, char *program, char *drft, case LENERR: case FMTERR: - adios (NULL, "message format error in component #%d", compnum); + die("message format error in component #%d", compnum); default: - adios (NULL, "getfld () returned %d", state); + die("getfld () returned %d", state); } break; } m_getfld_state_destroy (&gstate); if (cp == NULL) - adios (NULL, "headers missing from draft"); + die("headers missing from draft"); nparts = 1; pos = start; @@ -298,7 +302,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); @@ -325,8 +329,7 @@ splitmsg (char **vec, int vecp, char *program, char *drft, char *cp = m_mktemp2(drft, invo_name, NULL, &out); if (cp == NULL) { - adios(NULL, "unable to create temporary file in %s", - get_temp_dir()); + die("unable to create temporary file"); } strncpy(tmpdrf, cp, sizeof(tmpdrf)); @@ -359,7 +362,7 @@ splitmsg (char **vec, int vecp, char *program, char *drft, if (!fgets (buffer, sizeof buffer, in)) { if (partno == nparts) break; - adios (NULL, "premature eof"); + die("premature eof"); } if ((pos += (len = strlen (buffer))) > CPERMSG) { @@ -404,7 +407,7 @@ splitmsg (char **vec, int vecp, char *program, char *drft, } free (cp); - mh_xfree(dp); + free(dp); fclose (in); /* close the draft */ return status; @@ -420,7 +423,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; @@ -441,9 +444,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 */ @@ -454,7 +455,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) { @@ -465,7 +466,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: /* @@ -510,14 +511,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 */ @@ -534,7 +533,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"); @@ -553,7 +552,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 */ @@ -570,7 +569,7 @@ alert (char *file, int out) execvp (program, arglist); fprintf (stderr, "unable to exec "); perror (mailproc); - _exit (-1); + _exit(1); default: /* no waiting... */ break; @@ -588,9 +587,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; } @@ -711,7 +709,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..."); @@ -748,7 +746,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. */ @@ -765,12 +763,12 @@ 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); + die("%s", message); } break; #else NMH_UNUSED(auth_svc); - adios(NULL, "send built without OAUTH_SUPPORT, " + die("send built without OAUTH_SUPPORT, " "so -saslmech xoauth2 is not supported"); #endif /* OAUTH_SUPPORT */ } @@ -818,13 +816,13 @@ setup_oauth_params(char *vec[], int *vecp, const char *auth_svc, if (saslmech && ! strcasecmp(saslmech, "xoauth2")) { if (! mh_oauth_get_service_info(auth_svc, &svc, errbuf, sizeof(errbuf))) - adios(NULL, "Unable to retrieve oauth profile entries: %s", + die("Unable to retrieve oauth profile entries: %s", errbuf); 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"); @@ -884,8 +882,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; } @@ -910,7 +907,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; @@ -926,10 +923,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: @@ -939,14 +937,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; } @@ -1011,7 +1009,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);