X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/4857e59b250f28a2d020bccac8bbcb489b48e328..ec173fd2c:/uip/whatnowsbr.c?ds=inline diff --git a/uip/whatnowsbr.c b/uip/whatnowsbr.c index 207f1a8c..945afbab 100644 --- a/uip/whatnowsbr.c +++ b/uip/whatnowsbr.c @@ -1,6 +1,4 @@ - -/* - * whatnowsbr.c -- the WhatNow shell +/* whatnowsbr.c -- the WhatNow shell * * This code is Copyright (c) 2002, by the authors of nmh. See the * COPYRIGHT file in the root directory of the nmh distribution for @@ -39,10 +37,44 @@ * by attachment number. */ -#include +#include "h/mh.h" +#include "whatnowsbr.h" +#include "sendsbr.h" +#include "annosbr.h" +#include "sbr/m_getfld.h" +#include "sbr/getarguments.h" +#include "sbr/read_switch_multiword_via_readline.h" +#include "sbr/concat.h" +#include "sbr/showfile.h" +#include "sbr/smatch.h" +#include "sbr/r1bindex.h" +#include "sbr/refile.h" +#include "sbr/closefds.h" +#include "sbr/copyip.h" +#include "sbr/getcpy.h" +#include "sbr/m_draft.h" +#include "sbr/m_backup.h" +#include "sbr/geteditor.h" +#include "sbr/context_save.h" +#include "sbr/context_find.h" +#include "sbr/brkstring.h" +#include "sbr/ambigsw.h" +#include "sbr/push.h" +#include "sbr/path.h" +#include "sbr/print_version.h" +#include "sbr/print_help.h" +#include "sbr/arglist.h" +#include "sbr/error.h" #include -#include -#include +#include "h/mime.h" +#include "h/utils.h" +#ifdef OAUTH_SUPPORT +#include "h/oauth.h" +#endif +#include "h/done.h" +#include "sbr/m_maildir.h" +#include "sbr/m_mktemp.h" +#include "sbr/mime_type.h" #define WHATNOW_SWITCHES \ X("draftfolder +folder", 0, DFOLDSW) \ @@ -53,8 +85,6 @@ X("prompt string", 4, PRMPTSW) \ X("version", 0, VERSIONSW) \ X("help", 0, HELPSW) \ - X("attach header-field-name", -6, ATTACHSW) \ - X("noattach", -8, NOATTACHSW) \ #define X(sw, minchars, id) id, @@ -117,14 +147,15 @@ static int copyf (char *, char *); int WhatNow (int argc, char **argv) { - int isdf = 0, nedit = 0, use = 0, atfile = 1; + int isdf = 0; + bool nedit = false; + int use = 0, atfile = 1; char *cp, *dfolder = NULL, *dmsg = NULL; char *ed = NULL, *drft = NULL, *msgnam = NULL; - char buf[BUFSIZ], prompt[BUFSIZ]; + char buf[BUFSIZ]; char **argp, **arguments; struct stat st; char cwd[PATH_MAX + 1]; /* current working directory */ - char file[PATH_MAX + 1]; /* file name buffer */ char shell[PATH_MAX + 1]; /* shell response buffer */ FILE *f; /* read pointer for bgnd proc */ char *l; /* set on -l to alist command */ @@ -140,7 +171,7 @@ WhatNow (int argc, char **argv) * Get the initial current working directory. */ - if (getcwd(cwd, sizeof (cwd)) == (char *)0) { + if (getcwd(cwd, sizeof (cwd)) == NULL) { adios("getcwd", "could not get working directory"); } @@ -151,7 +182,7 @@ WhatNow (int argc, char **argv) ambigsw (cp, whatnowswitches); done (1); case UNKWNSW: - adios (NULL, "-%s unknown", cp); + die("-%s unknown", cp); case HELPSW: snprintf (buf, sizeof(buf), "%s [switches] [file]", invo_name); @@ -163,17 +194,17 @@ WhatNow (int argc, char **argv) case DFOLDSW: if (dfolder) - adios (NULL, "only one draft folder at a time!"); + die("only one draft folder at a time!"); if (!(cp = *argp++) || *cp == '-') - adios (NULL, "missing argument to %s", argp[-2]); + die("missing argument to %s", argp[-2]); dfolder = path (*cp == '+' || *cp == '@' ? cp + 1 : cp, *cp != '@' ? TFOLDER : TSUBCWF); continue; case DMSGSW: if (dmsg) - adios (NULL, "only one draft message at a time!"); + die("only one draft message at a time!"); if (!(dmsg = *argp++) || *dmsg == '-') - adios (NULL, "missing argument to %s", argp[-2]); + die("missing argument to %s", argp[-2]); continue; case NDFLDSW: dfolder = NULL; @@ -182,37 +213,28 @@ WhatNow (int argc, char **argv) case EDITRSW: if (!(ed = *argp++) || *ed == '-') - adios (NULL, "missing argument to %s", argp[-2]); - nedit = 0; + die("missing argument to %s", argp[-2]); + nedit = false; continue; case NEDITSW: - nedit++; + nedit = true; continue; case PRMPTSW: if (!(myprompt = *argp++) || *myprompt == '-') - adios (NULL, "missing argument to %s", argp[-2]); - continue; - - case ATTACHSW: - advise(NULL, "The -attach switch is deprecated"); - continue; - - case NOATTACHSW: - advise(NULL, "The -noattach switch is deprecated"); + die("missing argument to %s", argp[-2]); continue; } } if (drft) - adios (NULL, "only one draft at a time!"); - else - drft = cp; + die("only one draft at a time!"); + drft = cp; } if ((drft == NULL && (drft = getenv ("mhdraft")) == NULL) || *drft == 0) - drft = getcpy (m_draft (dfolder, dmsg, 1, &isdf)); + drft = mh_xstrdup(m_draft(dfolder, dmsg, 1, &isdf)); - msgnam = (cp = getenv ("mhaltmsg")) && *cp ? getcpy (cp) : NULL; + msgnam = (cp = getenv ("mhaltmsg")) && *cp ? mh_xstrdup(cp) : NULL; if ((cp = getenv ("mhatfile")) && *cp) atfile = atoi(cp); @@ -222,7 +244,7 @@ WhatNow (int argc, char **argv) if (ed == NULL && ((ed = getenv ("mheditor")) == NULL || *ed == 0)) { ed = NULL; - nedit++; + nedit = true; } /* start editing the draft, unless -noedit was given */ @@ -230,12 +252,11 @@ WhatNow (int argc, char **argv) NULL, 1, atfile) < 0) done (1); - snprintf (prompt, sizeof(prompt), myprompt, invo_name); for (;;) { #ifdef READLINE_SUPPORT - if (!(argp = getans_via_readline (prompt, aleqs))) { + if (!(argp = read_switch_multiword_via_readline(myprompt, aleqs))) { #else /* ! READLINE_SUPPORT */ - if (!(argp = getans (prompt, aleqs))) { + if (!(argp = read_switch_multiword(myprompt, aleqs))) { #endif /* READLINE_SUPPORT */ (void) m_unlink (LINK); done (1); @@ -246,7 +267,7 @@ WhatNow (int argc, char **argv) if (msgnam) showfile (++argp, msgnam); else - advise (NULL, "no alternate message to display"); + inform("no alternate message to display"); break; case BUILDMIMESW: @@ -280,7 +301,7 @@ WhatNow (int argc, char **argv) removefile (drft); } else { if (stat (drft, &st) != NOTOK) - advise (NULL, "draft left on %s", drft); + inform("draft left on %s", drft); } done (1); @@ -314,20 +335,17 @@ WhatNow (int argc, char **argv) * is accustomed to. Read back the absolute path. */ - if (*(argp+1) == (char *)0) { - (void)sprintf(buf, "$SHELL -c \"cd&&pwd\""); + if (*(argp+1) == NULL) { + strcpy(buf, "$SHELL -c \"cd&&pwd\""); } else { writesomecmd(buf, BUFSIZ, "cd", "pwd", argp); } - if ((f = popen_in_dir(cwd, buf, "r")) != (FILE *)0) { + if ((f = popen_in_dir(cwd, buf, "r")) != NULL) { if (fgets(cwd, sizeof (cwd), f) == NULL) { advise (buf, "fgets"); } - - if (strchr(cwd, '\n') != (char *)0) - *strchr(cwd, '\n') = '\0'; - + trim_suffix_c(cwd, '\n'); pclose(f); } else { @@ -338,7 +356,7 @@ WhatNow (int argc, char **argv) case PWDCMDSW: /* Print the working directory for attachments */ - printf("%s\n", cwd); + puts(cwd); break; case LSCMDSW: @@ -362,10 +380,10 @@ WhatNow (int argc, char **argv) if (checkmimeheader(drft)) break; - l = (char *)0; + l = NULL; n = 0; - while (*++argp != (char *)0) { + while (*++argp != NULL) { if (strcmp(*argp, "-l") == 0) l = "/"; @@ -384,7 +402,7 @@ WhatNow (int argc, char **argv) } if (n == -1) - advise((char *)0, "usage is alist [-ln]."); + inform("usage is alist [-ln]."); else annolist(drft, ATTACH_FIELD, l, n); @@ -396,7 +414,7 @@ WhatNow (int argc, char **argv) * Attach files to current draft. */ - int verbose = 0; + bool verbose = false; char **ap; if (checkmimeheader(drft)) @@ -405,14 +423,14 @@ WhatNow (int argc, char **argv) for (ap = argp+1; *ap; ++ap) { if (strcmp(*ap, "-v") == 0) { ++argp; - verbose = 1; + verbose = true; } else if (*ap[0] != '-') { break; } } - if (*(argp+1) == (char *)0) { - advise(NULL, "attach command requires file argument(s)."); + if (*(argp+1) == NULL) { + inform("attach command requires file argument(s)."); break; } @@ -430,11 +448,13 @@ WhatNow (int argc, char **argv) * draft. */ - if ((f = popen_in_dir(cwd, buf, "r")) != (FILE *)0) { - while (fgets(shell, sizeof (shell), f) != (char *)0) { + if ((f = popen_in_dir(cwd, buf, "r")) != NULL) { + char file[2 * PATH_MAX + 2]; /* file name buffer */ + + while (fgets(shell, sizeof (shell), f) != NULL) { char *ctype; - *(strchr(shell, '\n')) = '\0'; + trim_suffix_c(shell, '\n'); if (*shell == '/') { strncpy(file, shell, sizeof(file)); @@ -472,7 +492,7 @@ WhatNow (int argc, char **argv) if (checkmimeheader(drft)) break; - for (n = 0, arguments = argp + 1; *arguments != (char *)0; arguments++) { + for (n = 0, arguments = argp + 1; *arguments != NULL; arguments++) { if (strcmp(*arguments, "-n") == 0) { n = 1; break; @@ -487,15 +507,15 @@ WhatNow (int argc, char **argv) */ if (n == 1) { - for (arguments = argp + 1; *arguments != (char *)0; arguments++) { + for (arguments = argp + 1; *arguments != NULL; arguments++) { if (strcmp(*arguments, "-n") == 0) continue; if (**arguments != '\0') { n = atoi(*arguments); - annotate(drft, ATTACH_FIELD, (char *)0, 1, 0, n, 1); + annotate(drft, ATTACH_FIELD, NULL, 1, 0, n, 1); - for (argp = arguments + 1; *argp != (char *)0; argp++) { + for (argp = arguments + 1; *argp != NULL; argp++) { if (atoi(*argp) > n) { if (atoi(*argp) == 1) *argp = ""; @@ -517,9 +537,9 @@ WhatNow (int argc, char **argv) * provide a file name with a space in it. */ writelscmd(buf, sizeof(buf), "-d --", argp); - if ((f = popen_in_dir(cwd, buf, "r")) != (FILE *)0) { - while (fgets(shell, sizeof (shell), f) != (char *)0) { - *(strchr(shell, '\n')) = '\0'; + if ((f = popen_in_dir(cwd, buf, "r")) != NULL) { + while (fgets(shell, sizeof (shell), f) != NULL) { + trim_suffix_c(shell, '\n'); annotate(drft, ATTACH_FIELD, shell, 1, 0, 0, 1); } pclose(f); @@ -531,7 +551,7 @@ WhatNow (int argc, char **argv) default: /* Unknown command */ - advise (NULL, "say what?"); + inform("say what?"); break; } } @@ -561,7 +581,7 @@ writesomecmd(char *buf, int bufsz, char *cmd, char *trailcmd, char **argp) */ int trailln = strlen(trailcmd) + 4; if (ln < 0 || ln + trailln > bufsz) - adios((char *)0, "arguments too long"); + die("arguments too long"); cp = buf + ln; @@ -569,7 +589,7 @@ writesomecmd(char *buf, int bufsz, char *cmd, char *trailcmd, char **argp) ln = strlen(*argp); /* +1 for leading space */ if (ln + trailln + 1 > bufsz - (cp-buf)) - adios((char *)0, "arguments too long"); + die("arguments too long"); *cp++ = ' '; memcpy(cp, *argp, ln+1); cp += ln; @@ -644,7 +664,7 @@ popen_in_dir(const char *dir, const char *cmd, const char *type) * EDIT */ -static int reedit = 0; /* have we been here before? */ +static bool reedit; /* have we been here before? */ static char *edsave = NULL; /* the editor we used previously */ @@ -657,7 +677,7 @@ editfile (char **ed, char **arg, char *file, int use, struct msgs *mp, char *cp, *prog, **vec; struct stat st; - int slinked = 0; + bool slinked = false; /* Was there a previous edit session? */ if (reedit && (*ed || edsave)) { @@ -693,9 +713,9 @@ editfile (char **ed, char **arg, char *file, int use, struct msgs *mp, if (symlink (altpath, linkpath) < 0) { adios (linkpath, "symlink"); } - slinked = 1; + slinked = true; } else { - slinked = 0; + slinked = false; } } } @@ -717,8 +737,8 @@ editfile (char **ed, char **arg, char *file, int use, struct msgs *mp, } if (altmsg) { if (mp) - m_putenv ("mhfolder", mp->foldpath); - m_putenv ("editalt", altpath); + setenv("mhfolder", mp->foldpath, 1); + setenv("editalt", altpath, 1); } vec = argsplit(*ed, &prog, &vecp); @@ -732,7 +752,7 @@ editfile (char **ed, char **arg, char *file, int use, struct msgs *mp, execvp (prog, vec); fprintf (stderr, "unable to exec "); perror (*ed); - _exit (-1); + _exit(1); default: if ((status = pidwait (pid, NOTOK))) { @@ -740,16 +760,16 @@ editfile (char **ed, char **arg, char *file, int use, struct msgs *mp, && (!reedit || (status & 0x00ff))) { if (!use && (status & 0xff00) && (rename (file, cp = m_backup (file)) != NOTOK)) { - advise (NULL, "problems with edit--draft left in %s", cp); + inform("problems with edit--draft left in %s", cp); } else { - advise (NULL, "problems with edit--%s preserved", file); + inform("problems with edit--%s preserved", file); } } status = -2; /* maybe "reedit ? -2 : -1"? */ break; } - reedit++; + reedit = true; if (altmsg && mp && !is_readonly(mp) @@ -811,7 +831,7 @@ static int sendfile (char **arg, char *file, int pushsw) { pid_t child_id; - int i, vecp; + int vecp; char *cp, *sp, **vec, *program; /* @@ -828,11 +848,11 @@ sendfile (char **arg, char *file, int pushsw) context_save (); /* save the context file */ fflush (stdout); - for (i = 0; (child_id = fork()) == NOTOK && i < 5; i++) - sleep (5); + child_id = fork(); switch (child_id) { case NOTOK: - advise (NULL, "unable to fork, so sending directly..."); + adios("fork", "failed:"); + case OK: vec = argsplit(sendproc, &program, &vecp); if (pushsw) @@ -846,7 +866,7 @@ sendfile (char **arg, char *file, int pushsw) execvp (program, vec); fprintf (stderr, "unable to exec "); perror (sendproc); - _exit (-1); + _exit(1); default: if (pidwait(child_id, OK) == 0) @@ -874,7 +894,7 @@ buildfile (char **argp, char *file) while (argp[i]) i++; } - args = (char **) mh_xmalloc((i + 2) * sizeof(char *)); + args = mh_xmalloc((i + 2) * sizeof(char *)); /* * For backward compatibility, we need to add -build @@ -892,7 +912,7 @@ buildfile (char **argp, char *file) i = editfile (&ed, args, file, NOUSE, NULL, NULL, NULL, 0, 0); free (args); - return (i ? NOTOK : OK); + return i ? NOTOK : OK; } @@ -938,21 +958,21 @@ buildfile (char **argp, char *file) X("client host", -6, CLIESW) \ X("server host", 6, SERVSW) \ X("snoop", -5, SNOOPSW) \ - X("draftfolder +folder", -6, SDRFSW) \ - X("draftmessage msg", -6, SDRMSW) \ - X("nodraftfolder", -3, SNDRFSW) \ - X("sasl", SASLminc(-4), SASLSW) \ - X("nosasl", SASLminc(-6), NOSASLSW) \ - X("saslmaxssf", SASLminc(-10), SASLMXSSFSW) \ - X("saslmech", SASLminc(-5), SASLMECHSW) \ - X("user", SASLminc(-4), USERSW) \ - X("attach fieldname", 6, SNDATTACHSW) \ - X("noattach", 0, SNDNOATTACHSW) \ - X("attachformat", 7, SNDATTACHFORMAT) \ + X("draftfolder +folder", 0, SDRFSW) \ + X("draftmessage msg", 0, SDRMSW) \ + X("nodraftfolder", 0, SNDRFSW) \ + X("sasl", SASLminc(4), SASLSW) \ + X("nosasl", SASLminc(6), NOSASLSW) \ + X("saslmech", SASLminc(5), SASLMECHSW) \ + X("authservice", SASLminc(0), AUTHSERVICESW) \ + X("user username", SASLminc(4), USERSW) \ X("port server-port-name/number", 4, PORTSW) \ X("tls", TLSminc(-3), TLSSW) \ X("initialtls", TLSminc(-10), INITTLSSW) \ X("notls", TLSminc(-5), NTLSSW) \ + X("certverify", TLSminc(-10), CERTVERSW) \ + X("nocertverify", TLSminc(-12), NOCERTVERSW) \ + X("sendmail program", 0, MTSSM) \ X("mts smtp|sendmail/smtp|sendmail/pipe", 2, MTSSW) \ X("messageid localname|random", 2, MESSAGEIDSW) \ @@ -966,12 +986,12 @@ DEFINE_SWITCH_ARRAY(SEND, sendswitches); extern int debugsw; /* from sendsbr.c */ -extern int forwsw; +extern bool forwsw; extern int inplace; -extern int pushsw; +extern bool pushsw; extern int splitsw; -extern int unique; -extern int verbsw; +extern bool unique; +extern bool verbsw; extern char *altmsg; /* .. */ extern char *annotext; @@ -984,12 +1004,10 @@ sendit (char *sp, char **arg, char *file, int pushed) int vecp, n = 1; char *cp, buf[BUFSIZ], **argp, *program; char **arguments, *savearg[MAXARGS], **vec; + const char *user = NULL, *saslmech = NULL; + char *auth_svc = NULL; struct stat st; -#ifndef lint - int distsw = 0; -#endif - /* * Make sure these are defined. In particular, we need * savearg[1] to be NULL, in case "arg" is NULL below. It @@ -1024,9 +1042,9 @@ sendit (char *sp, char **arg, char *file, int pushed) argp = arguments; debugsw = 0; - forwsw = 1; + forwsw = true; inplace = 1; - unique = 0; + unique = false; altmsg = NULL; annotext = NULL; @@ -1039,7 +1057,7 @@ sendit (char *sp, char **arg, char *file, int pushed) vec = argsplit(postproc, &program, &vecp); vec[vecp++] = "-library"; - vec[vecp++] = getcpy (m_maildir ("")); + vec[vecp++] = mh_xstrdup(m_maildir("")); if ((cp = context_find ("fileproc"))) { vec[vecp++] = "-fileproc"; @@ -1064,7 +1082,7 @@ sendit (char *sp, char **arg, char *file, int pushed) ambigsw (cp, sendswitches); return; case UNKWNSW: - advise (NULL, "-%s unknown\n", cp); + inform("-%s unknown\n", cp); return; case SHELPSW: @@ -1084,35 +1102,36 @@ sendit (char *sp, char **arg, char *file, int pushed) case SPLITSW: if (!(cp = *argp++) || sscanf (cp, "%d", &splitsw) != 1) { - advise (NULL, "missing argument to %s", argp[-2]); + inform("missing argument to %s", argp[-2]); return; } continue; case UNIQSW: - unique++; + unique = true; continue; case NUNIQSW: - unique = 0; + unique = false; continue; case FORWSW: - forwsw++; + forwsw = true; continue; case NFORWSW: - forwsw = 0; + forwsw = false; continue; case VERBSW: - verbsw++; + verbsw = true; vec[vecp++] = --cp; continue; case NVERBSW: - verbsw = 0; + verbsw = false; vec[vecp++] = --cp; continue; case DEBUGSW: - debugsw++; /* fall */ + debugsw++; + /* FALLTHRU */ case NFILTSW: case FRMTSW: case NFRMTSW: @@ -1124,56 +1143,65 @@ sendit (char *sp, char **arg, char *file, int pushed) case NMSGDSW: case WATCSW: case NWATCSW: - case SNOOPSW: case SASLSW: case NOSASLSW: case TLSSW: case INITTLSSW: case NTLSSW: + case CERTVERSW: + case NOCERTVERSW: + vec[vecp++] = --cp; + continue; + + case SNOOPSW: vec[vecp++] = --cp; continue; + case AUTHSERVICESW: +#ifdef OAUTH_SUPPORT + if (!(auth_svc = *argp++) || *auth_svc == '-') + die("missing argument to %s", argp[-2]); +#else + NMH_UNUSED (user); + NMH_UNUSED (auth_svc); + die("not built with OAuth support"); +#endif + continue; + + case SASLMECHSW: + saslmech = *argp; + /* FALLTHRU */ case ALIASW: case FILTSW: case WIDTHSW: case CLIESW: case SERVSW: - case SASLMXSSFSW: - case SASLMECHSW: case USERSW: case PORTSW: + case MTSSM: case MTSSW: case MESSAGEIDSW: vec[vecp++] = --cp; if (!(cp = *argp++) || *cp == '-') { - advise (NULL, "missing argument to %s", argp[-2]); + inform("missing argument to %s", argp[-2]); return; } vec[vecp++] = cp; + user = cp; continue; case SDRFSW: case SDRMSW: if (!(cp = *argp++) || *cp == '-') { - advise (NULL, "missing argument to %s", argp[-2]); + inform("missing argument to %s", argp[-2]); return; } - case SNDRFSW: continue; - - case SNDATTACHSW: - advise(NULL, "The -attach switch is deprecated"); - continue; - case SNDNOATTACHSW: - advise(NULL, "The -noattach switch is deprecated"); - continue; - - case SNDATTACHFORMAT: - advise(NULL, "The -attachformat switch is deprecated"); + case SNDRFSW: continue; } } - advise (NULL, "usage: %s [switches]", sp); + inform("usage: %s [switches]", sp); return; } @@ -1181,7 +1209,7 @@ sendit (char *sp, char **arg, char *file, int pushed) if ((cp = context_find ("Aliasfile"))) { char **ap, *dp; - dp = getcpy (cp); + dp = mh_xstrdup(cp); for (ap = brkstring (dp, " ", "\n"); ap && *ap; ap++) { vec[vecp++] = "-alias"; vec[vecp++] = *ap; @@ -1190,7 +1218,7 @@ sendit (char *sp, char **arg, char *file, int pushed) if ((cp = getenv ("SIGNATURE")) == NULL || *cp == 0) if ((cp = context_find ("signature")) && *cp) - m_putenv ("SIGNATURE", cp); + setenv("SIGNATURE", cp, 1); if ((annotext = getenv ("mhannotate")) == NULL || *annotext == 0) annotext = NULL; @@ -1201,16 +1229,13 @@ sendit (char *sp, char **arg, char *file, int pushed) if ((cp = getenv ("mhdist")) && *cp -#ifndef lint - && (distsw = atoi (cp)) -#endif /* not lint */ + && atoi(cp) && altmsg) { vec[vecp++] = "-dist"; if ((cp = m_mktemp2(altmsg, invo_name, NULL, NULL)) == NULL) { - adios(NULL, "unable to create temporary file in %s", - get_temp_dir()); + die("unable to create temporary file"); } - distfile = getcpy (cp); + distfile = mh_xstrdup(cp); (void) m_unlink(distfile); if (link (altmsg, distfile) == NOTOK) adios (distfile, "unable to link %s to", altmsg); @@ -1218,6 +1243,20 @@ sendit (char *sp, char **arg, char *file, int pushed) distfile = NULL; } +#ifdef OAUTH_SUPPORT + if (auth_svc == NULL) { + if (saslmech && ! strcasecmp(saslmech, "xoauth2")) { + die("must specify -authservice with -saslmech xoauth2"); + } + } else { + if (user == NULL) { + die("must specify -user with -saslmech xoauth2"); + } + } +#else + NMH_UNUSED(saslmech); +#endif /* OAUTH_SUPPORT */ + if (altmsg == NULL || stat (altmsg, &st) == NOTOK) { st.st_mtime = 0; st.st_dev = 0; @@ -1228,7 +1267,7 @@ sendit (char *sp, char **arg, char *file, int pushed) closefds (3); - if (sendsbr (vec, vecp, program, file, &st, 1) == OK) + if (sendsbr (vec, vecp, program, file, &st, 1, auth_svc) == OK) done (0); } @@ -1262,10 +1301,10 @@ whomfile (char **arg, char *file) execvp (program, vec); fprintf (stderr, "unable to exec "); perror (whomproc); - _exit (-1); /* NOTREACHED */ + _exit(1); /* NOTREACHED */ default: - return (pidwait (pid, NOTOK) & 0377 ? 1 : 0); + return pidwait(pid, NOTOK) & 0377 ? 1 : 0; } } @@ -1285,31 +1324,33 @@ removefile (char *drft) /* - * Return 1 if we already have a MIME-Verson header, 0 otherwise. + * Return 1 if we already have a MIME-Version header, 0 otherwise. */ static int checkmimeheader (char *drft) { FILE *f; - m_getfld_state_t gstate = 0; - char buf[BUFSIZ], name[NAMESZ]; - int state, retval = 0; + m_getfld_state_t gstate; + char buf[NMH_BUFSIZ], name[NAMESZ]; + int state; + bool retval = false; if ((f = fopen(drft, "r")) == NULL) { admonish(drft, "unable to read draft"); - return (0); + return 0; } + gstate = m_getfld_state_init(f); for (;;) { int bufsz = sizeof(buf); - switch (state = m_getfld(&gstate, name, buf, &bufsz, f)) { + switch (state = m_getfld2(&gstate, name, buf, &bufsz)) { case FLD: case FLDPLUS: if (strcasecmp(name, VRSN_FIELD) == 0) { - advise(NULL, "Cannot use attach commands with already-" + inform("Cannot use attach commands with already-" "formatted MIME message \"%s\"", drft); - retval = 1; + retval = true; break; } continue;