X-Git-Url: http://git.marmaro.de/?a=blobdiff_plain;f=uip%2Fwhatnowsbr.c;h=3ed0ea4a172f52bca3bb8ddccaa03aba4bb04af4;hb=47a78dcb28c6a836574f73f40b05d4adc9c3ad81;hp=0dfc3d72194e4eaa8a70eee9f9cfa6ba9f505f13;hpb=ced6090a330d3d83d0bce709f756aa3d7d65fea4;p=mmh diff --git a/uip/whatnowsbr.c b/uip/whatnowsbr.c index 0dfc3d7..3ed0ea4 100644 --- a/uip/whatnowsbr.c +++ b/uip/whatnowsbr.c @@ -5,9 +5,9 @@ ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. ** -** Several options have been added to ease the inclusion of attachments -** using the header field name mechanism added to anno and send. The -** -attach option is used to specify the header field name for attachments. +** The inclusion of attachments is eased by +** using the header field name mechanism added to anno and send. +** The header field name for attachments is predefined. ** ** Several commands have been added at the whatnow prompt: ** @@ -54,8 +54,6 @@ static struct swit whatnowswitches[] = { { "version", 0 }, #define HELPSW 4 { "help", 0 }, -#define ATTACHSW 5 - { "attach header-field-name", 0 }, { NULL, 0 } }; @@ -67,31 +65,29 @@ static struct swit aleqs[] = { { "edit [ ]", 0 }, #define REFILEOPT 1 { "refile [] +folder", 0 }, -#define BUILDMIMESW 2 - { "mime []", 0 }, -#define DISPSW 3 +#define DISPSW 2 { "display []", 0 }, -#define LISTSW 4 +#define LISTSW 3 { "list []", 0 }, -#define SENDSW 5 +#define SENDSW 4 { "send []", 0 }, -#define PUSHSW 6 +#define PUSHSW 5 { "push []", 0 }, -#define QUITSW 7 +#define QUITSW 6 { "quit [-delete]", 0 }, -#define DELETESW 8 +#define DELETESW 7 { "delete", 0 }, -#define CDCMDSW 9 +#define CDCMDSW 8 { "cd [directory]", 0 }, -#define PWDCMDSW 10 +#define PWDCMDSW 9 { "pwd", 0 }, -#define LSCMDSW 11 +#define LSCMDSW 10 { "ls", 0 }, -#define ATTACHCMDSW 12 +#define ATTACHCMDSW 11 { "attach", 0 }, -#define DETACHCMDSW 13 +#define DETACHCMDSW 12 { "detach [-n]", 2 }, -#define ALISTCMDSW 14 +#define ALISTCMDSW 13 { "alist [-ln] ", 2 }, { NULL, 0 } }; @@ -101,13 +97,11 @@ static char *myprompt = "\nWhat now? "; /* ** static prototypes */ -static int editfile (char **, char **, char *, int, struct msgs *, +static int editfile(char **, char **, char *, int, struct msgs *, char *, char *, int); -static int sendfile (char **, char *, int); -static void sendit (char *, char **, char *, int); -static int buildfile (char **, char *); -static int check_draft (char *); -static int removefile (char *); +static int sendfile(char **, char *, int); +static void sendit(char *, char **, char *, int); +static int removefile(char *); static void writelscmd(char *, int, char **); static void writesomecmd(char *buf, int bufsz, char *cmd, char *trailcmd, char **argp); static FILE* popen_in_dir(const char *dir, const char *cmd, const char *type); @@ -115,12 +109,12 @@ static int system_in_dir(const char *dir, const char *cmd); #ifdef HAVE_LSTAT -static int copyf (char *, char *); +static int copyf(char *, char *); #endif int -WhatNow (int argc, char **argv) +WhatNow(int argc, char **argv) { int nedit = 0, use = 0; char *cp; @@ -128,7 +122,6 @@ WhatNow (int argc, char **argv) char buf[BUFSIZ], prompt[BUFSIZ]; char **argp, **arguments; struct stat st; - char *attach = (char *)0; /* attachment header field name */ char cwd[MAXPATHLEN + 1]; /* current working directory */ char file[MAXPATHLEN + 1]; /* file name buffer */ char shell[MAXPATHLEN + 1]; /* shell response buffer */ @@ -136,44 +129,44 @@ WhatNow (int argc, char **argv) char *l; /* set on -l to alist command */ int n; /* set on -n to alist command */ - invo_name = r1bindex (argv[0], '/'); + invo_name = mhbasename(argv[0]); /* read user profile/context */ context_read(); - arguments = getarguments (invo_name, argc, argv, 1); + arguments = getarguments(invo_name, argc, argv, 1); argp = arguments; /* ** 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"); } while ((cp = *argp++)) { if (*cp == '-') { - switch (smatch (++cp, whatnowswitches)) { + switch (smatch(++cp, whatnowswitches)) { case AMBIGSW: - ambigsw (cp, whatnowswitches); - done (1); + ambigsw(cp, whatnowswitches); + done(1); case UNKWNSW: - adios (NULL, "-%s unknown", cp); + adios(NULL, "-%s unknown", cp); case HELPSW: - snprintf (buf, sizeof(buf), + snprintf(buf, sizeof(buf), "%s [switches] [file]", invo_name); - print_help (buf, whatnowswitches, 1); - done (1); + print_help(buf, whatnowswitches, 1); + done(1); case VERSIONSW: print_version(invo_name); - done (1); + done(1); case EDITRSW: if (!(ed = *argp++) || *ed == '-') - adios (NULL, "missing argument to %s", + adios(NULL, "missing argument to %s", argp[-2]); nedit = 0; continue; @@ -183,34 +176,27 @@ WhatNow (int argc, char **argv) case PRMPTSW: if (!(myprompt = *argp++) || *myprompt == '-') - adios (NULL, "missing argument to %s", + adios(NULL, "missing argument to %s", argp[-2]); continue; - case ATTACHSW: - if (attach != (char *)0) - adios(NULL, "only one attachment header field name at a time!"); - if (!(attach = *argp++) || *attach == '-') - adios (NULL, "missing argument to %s", - argp[-2]); - continue; } } if (drft) - adios (NULL, "only one draft at a time!"); + adios(NULL, "only one draft at a time!"); else drft = cp; } if ((drft == NULL && (drft = getenv("mhdraft")) == NULL) || *drft == 0) - drft = getcpy (m_draft("cur")); + drft = getcpy(m_draft(seq_cur)); - msgnam = (cp = getenv ("mhaltmsg")) && *cp ? getcpy (cp) : NULL; + msgnam = (cp = getenv("mhaltmsg")) && *cp ? getcpy(cp) : NULL; - if ((cp = getenv ("mhuse")) && *cp) - use = atoi (cp); + if ((cp = getenv("mhuse")) && *cp) + use = atoi(cp); - if (ed == NULL && ((ed = getenv ("mheditor")) == NULL || *ed == 0)) { + if (ed == NULL && ((ed = getenv("mheditor")) == NULL || *ed == 0)) { ed = NULL; nedit++; } @@ -218,76 +204,71 @@ WhatNow (int argc, char **argv) /* start editing the draft, unless -noedit was given */ if (!nedit && editfile(&ed, NULL, drft, use, NULL, msgnam, NULL, 1) < 0) - done (1); + done(1); - snprintf (prompt, sizeof(prompt), myprompt, invo_name); + snprintf(prompt, sizeof(prompt), myprompt, invo_name); for (;;) { - if (!(argp = getans (prompt, aleqs))) { - unlink (altmsglink); - done (1); + if (!(argp = getans(prompt, aleqs))) { + unlink(altmsglink); + done(1); } - switch (smatch (*argp, aleqs)) { + switch (smatch(*argp, aleqs)) { case DISPSW: /* ** display the message being replied to, ** or distributed */ if (msgnam) - showfile (++argp, msgnam); + showfile(++argp, msgnam); else - advise (NULL, "no alternate message to display"); - break; - - case BUILDMIMESW: - /* Translate MIME composition file */ - buildfile (++argp, drft); + advise(NULL, "no alternate message to display"); break; case EDITSW: /* Call an editor on the draft file */ if (*++argp) ed = *argp++; - if (editfile (&ed, argp, drft, NOUSE, NULL, + if (editfile(&ed, argp, drft, NOUSE, NULL, msgnam, NULL, 1) == NOTOK) - done (1); + done(1); break; case LISTSW: /* display the draft file */ - showfile (++argp, drft); + showfile(++argp, drft); break; case QUITSW: /* Quit, and possibly delete the draft */ if (*++argp && (*argp[0] == 'd' || ((*argp)[0] == '-' && (*argp)[1] == 'd'))) { - removefile (drft); + removefile(drft); } else { - if (stat (drft, &st) != NOTOK) + if (stat(drft, &st) != NOTOK) advise(NULL, "draft left on %s", drft); } - done (1); + done(1); case DELETESW: /* Delete draft and exit */ - removefile (drft); - done (1); + removefile(drft); + done(1); case PUSHSW: /* Send draft in background */ - if (sendfile (++argp, drft, 1)) - done (1); + if (sendfile(++argp, drft, 1)) + done(1); break; case SENDSW: /* Send draft */ - sendfile (++argp, drft, 0); + sendfile(++argp, drft, 0); break; case REFILEOPT: /* Refile the draft */ - if (refile (++argp, drft) == 0) - done (0); + if (refile(++argp, drft) == 0) + done(0); break; case CDCMDSW: @@ -300,15 +281,15 @@ WhatNow (int argc, char **argv) ** the absolute path. */ - if (*(argp+1) == (char *)0) { - (void)sprintf(buf, "$SHELL -c \"cd;pwd\""); + if (*(argp+1) == NULL) { + sprintf(buf, "$SHELL -c \"cd;pwd\""); } else { writesomecmd(buf, BUFSIZ, "cd", "pwd", argp); } if ((f = popen_in_dir(cwd, buf, "r")) != (FILE *)0) { fgets(cwd, sizeof (cwd), f); - if (strchr(cwd, '\n') != (char *)0) + if (strchr(cwd, '\n') != NULL) *strchr(cwd, '\n') = '\0'; pclose(f); @@ -333,7 +314,7 @@ WhatNow (int argc, char **argv) ** accustomed to. */ writelscmd(buf, sizeof(buf), argp); - (void)system_in_dir(cwd, buf); + system_in_dir(cwd, buf); break; case ALISTCMDSW: @@ -344,15 +325,10 @@ WhatNow (int argc, char **argv) ** -n numbers listing */ - if (attach == (char *)0) { - advise((char *)0, "can't list because no header field name was given."); - break; - } - - l = (char *)0; + l = NULL; n = 0; - while (*++argp != (char *)0) { + while (*++argp != NULL) { if (strcmp(*argp, "-l") == 0) l = "/"; @@ -370,10 +346,10 @@ WhatNow (int argc, char **argv) } if (n == -1) - advise((char *)0, "usage is alist [-ln]."); + advise(NULL, "usage is alist [-ln]."); else - annolist(drft, attach, l, n); + annolist(drft, attach_hdr, l, n); break; @@ -382,13 +358,8 @@ WhatNow (int argc, char **argv) ** Attach files to current draft. */ - if (attach == (char *)0) { - advise((char *)0, "can't attach because no header field name was given."); - break; - } - - if (*(argp+1) == (char *)0) { - advise((char *)0, "attach command requires file argument(s)."); + if (*(argp+1) == NULL) { + advise(NULL, "attach command requires file argument(s)."); break; } @@ -409,20 +380,21 @@ WhatNow (int argc, char **argv) ** working directory to relative path names. ** Add the attachment annotation to the draft. */ - if ((f = popen_in_dir(cwd, buf, "r")) != (FILE *)0) { while (fgets(shell, sizeof (shell), f) - != (char *)0) { + != NULL) { *(strchr(shell, '\n')) = '\0'; if (*shell == '/') - annotate(drft, attach, shell, - 1, 0, -2, 1); + annotate(drft, attach_hdr, + shell, 1, 0, + -2, 1); else { sprintf(file, "%s/%s", cwd, shell); - annotate(drft, attach, file, - 1, 0, -2, 1); + annotate(drft, attach_hdr, + file, 1, 0, + -2, 1); } } @@ -436,21 +408,14 @@ WhatNow (int argc, char **argv) case DETACHCMDSW: /* ** Detach files from current draft. - */ - - if (attach == (char *)0) { - advise((char *)0, "can't detach because no header field name was given."); - break; - } - - /* + ** ** Scan the arguments for a -n. Mixed file ** names and numbers aren't allowed, so this ** catches a -n anywhere in the argument list. */ for (n = 0, arguments = argp + 1; - *arguments != (char *)0; + *arguments != NULL; arguments++) { if (strcmp(*arguments, "-n") == 0) { n = 1; @@ -468,22 +433,23 @@ WhatNow (int argc, char **argv) if (n == 1) { for (arguments = argp + 1; - *arguments != (char *)0; + *arguments != NULL; arguments++) { if (strcmp(*arguments, "-n") == 0) continue; if (**arguments != '\0') { n = atoi(*arguments); - annotate(drft, attach, NULL, - 1, 0, n, 1); + annotate(drft, attach_hdr, + 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 = ""; else - (void)sprintf(*argp, "%d", atoi(*argp) - 1); + sprintf(*argp, "%d", atoi(*argp) - 1); } } } @@ -507,7 +473,7 @@ WhatNow (int argc, char **argv) while (fgets(shell, sizeof (shell), f) != NULL) { *(strchr(shell, '\n')) = '\0'; - annotate(drft, attach, shell, + annotate(drft, attach_hdr, shell, 1, 0, 0, 1); } pclose(f); @@ -519,7 +485,7 @@ WhatNow (int argc, char **argv) default: /* Unknown command */ - advise (NULL, "say what?"); + advise(NULL, "say what?"); break; } } @@ -555,15 +521,15 @@ writesomecmd(char *buf, int bufsz, char *cmd, char *trailcmd, char **argp) */ int trailln = strlen(trailcmd) + 3; if (ln < 0 || ln + trailln > bufsz) - adios((char *)0, "arguments too long"); + adios(NULL, "arguments too long"); cp = buf + ln; - while (*++argp != (char *)0) { + while (*++argp != NULL) { ln = strlen(*argp); /* +1 for leading space */ if (ln + trailln + 1 > bufsz - (cp-buf)) - adios((char *)0, "arguments too long"); + adios(NULL, "arguments too long"); *cp++ = ' '; memcpy(cp, *argp, ln+1); cp += ln; @@ -632,7 +598,7 @@ static char *edsave = NULL; /* the editor we used previously */ static int -editfile (char **ed, char **arg, char *file, int use, struct msgs *mp, +editfile(char **ed, char **arg, char *file, int use, struct msgs *mp, char *altmsg, char *cwd, int save_editor) { int pid, status, vecp; @@ -642,152 +608,135 @@ editfile (char **ed, char **arg, char *file, int use, struct msgs *mp, #ifdef HAVE_LSTAT int slinked = 0; -#if 0 - int oumask; /* PJS: for setting permissions on symlinks. */ -#endif #endif /* HAVE_LSTAT */ /* Was there a previous edit session? */ if (reedit) { if (!*ed) { /* no explicit editor */ *ed = edsave; /* so use the previous one */ - if ((cp = r1bindex (*ed, '/')) == NULL) + if ((cp = mhbasename(*ed)) == NULL) cp = *ed; /* unless we've specified it via "editor-next" */ - cp = concat (cp, "-next", NULL); - if ((cp = context_find (cp)) != NULL) + cp = concat(cp, "-next", NULL); + if ((cp = context_find(cp)) != NULL) *ed = cp; } } else { /* set initial editor */ - if (*ed == NULL && (*ed = context_find ("editor")) == NULL) + if (*ed == NULL && (*ed = context_find("editor")) == NULL) *ed = defaulteditor; } if (altmsg) { if (mp == NULL || *altmsg == '/' || cwd == NULL) - strncpy (altpath, altmsg, sizeof(altpath)); + strncpy(altpath, altmsg, sizeof(altpath)); else - snprintf (altpath, sizeof(altpath), "%s/%s", + snprintf(altpath, sizeof(altpath), "%s/%s", mp->foldpath, altmsg); if (cwd == NULL) - strncpy (linkpath, altmsglink, sizeof(linkpath)); + strncpy(linkpath, altmsglink, sizeof(linkpath)); else - snprintf (linkpath, sizeof(linkpath), "%s/%s", + snprintf(linkpath, sizeof(linkpath), "%s/%s", cwd, altmsglink); } if (altmsg) { - unlink (linkpath); + unlink(linkpath); #ifdef HAVE_LSTAT - if (link (altpath, linkpath) == NOTOK) { -#if 0 - /* I don't think permission on symlinks matters /JLR */ - /* PJS: else symlinks are world 'r' */ - oumask = umask(0044); -#endif - symlink (altpath, linkpath); -#if 0 - umask(oumask); /* PJS: else symlinks are world 'r' */ -#endif + if (link(altpath, linkpath) == NOTOK) { + symlink(altpath, linkpath); slinked = 1; } else { slinked = 0; } #else /* not HAVE_LSTAT */ - link (altpath, linkpath); + link(altpath, linkpath); #endif /* not HAVE_LSTAT */ } - context_save (); /* save the context file */ - fflush (stdout); - - switch (pid = vfork ()) { - case NOTOK: - advise ("fork", "unable to"); - status = NOTOK; - break; - - case OK: - if (cwd) - chdir (cwd); - if (altmsg) { - if (mp) - m_putenv ("mhfolder", mp->foldpath); - m_putenv ("editalt", altpath); - } - - vecp = 0; - vec[vecp++] = r1bindex (*ed, '/'); - if (arg) - while (*arg) - vec[vecp++] = *arg++; - vec[vecp++] = file; - vec[vecp] = NULL; - - execvp (*ed, vec); - fprintf (stderr, "unable to exec "); - perror (*ed); - _exit (-1); + context_save(); /* save the context file */ + fflush(stdout); + + switch (pid = fork()) { + case NOTOK: + advise("fork", "unable to"); + status = NOTOK; + break; + + case OK: + if (cwd) + chdir(cwd); + if (altmsg) { + if (mp) + m_putenv("mhfolder", mp->foldpath); + m_putenv("editalt", altpath); + } - default: - if ((status = pidwait (pid, NOTOK))) { + vecp = 0; + vec[vecp++] = mhbasename(*ed); + if (arg) + while (*arg) + vec[vecp++] = *arg++; + vec[vecp++] = file; + vec[vecp] = NULL; + + execvp(*ed, vec); + fprintf(stderr, "unable to exec "); + perror(*ed); + _exit(-1); + + default: + if ((status = pidwait(pid, NOTOK))) { #ifdef ATTVIBUG - if ((cp = r1bindex (*ed, '/')) - && strcmp (cp, "vi") == 0 - && (status & 0x00ff) == 0) - status = 0; - else { + if ((cp = mhbasename(*ed)) && strcmp(cp, "vi") == 0 && + (status & 0x00ff) == 0) + status = 0; + else { #endif - if (((status & 0xff00) != 0xff00) - && (!reedit || (status & 0x00ff))) { - if (!use && (status & 0xff00) && - (rename (file, cp = m_backup (file)) != NOTOK)) { - advise (NULL, "problems with edit--draft left in %s", cp); - } else { - advise (NULL, "problems with edit--%s preserved", file); - } + if (((status & 0xff00) != 0xff00) + && (!reedit || (status & 0x00ff))) { + if (!use && (status & 0xff00) && (rename(file, cp = m_backup (file)) != NOTOK)) { + advise(NULL, "problems with edit--draft left in %s", cp); + } else { + advise(NULL, "problems with edit--%s preserved", file); } - status = -2; /* maybe "reedit ? -2 : -1"? */ - break; + } + status = -2; /* maybe "reedit ? -2 : -1"? */ + break; #ifdef ATTVIBUG - } -#endif } +#endif + } - reedit++; + reedit++; #ifdef HAVE_LSTAT - if (altmsg - && mp - && !is_readonly(mp) - && (slinked - ? lstat (linkpath, &st) != NOTOK - && S_ISREG(st.st_mode) - && copyf (linkpath, altpath) == NOTOK - : stat (linkpath, &st) != NOTOK - && st.st_nlink == 1 - && (unlink (altpath) == NOTOK - || link (linkpath, altpath) == NOTOK))) - advise (linkpath, "unable to update %s from", altmsg); + if (altmsg && mp && !is_readonly(mp) && (slinked ? + lstat (linkpath, &st) != NOTOK && + S_ISREG(st.st_mode) && + copyf(linkpath, altpath) == NOTOK : + stat(linkpath, &st) != NOTOK && + st.st_nlink == 1 && + (unlink(altpath) == NOTOK || + link(linkpath, altpath) == NOTOK))) + advise(linkpath, "unable to update %s from", altmsg); #else /* HAVE_LSTAT */ - if (altmsg && mp && !is_readonly(mp) - && stat (linkpath, &st) != NOTOK - && st.st_nlink == 1 - && (unlink (altpath) == NOTOK - || link (linkpath, altpath) == NOTOK)) - advise (linkpath, "unable to update %s from", - altmsg); + if (altmsg && mp && !is_readonly(mp) && + stat(linkpath, &st) != NOTOK && + st.st_nlink == 1 && + (unlink(altpath) == NOTOK || + link(linkpath, altpath) == NOTOK)) + advise(linkpath, "unable to update %s from", altmsg); #endif /* HAVE_LSTAT */ } /* normally, we remember which editor we used */ if (save_editor) - edsave = getcpy (*ed); + edsave = getcpy(*ed); *ed = NULL; if (altmsg) - unlink (linkpath); + unlink(linkpath); return status; } @@ -795,28 +744,28 @@ editfile (char **ed, char **arg, char *file, int use, struct msgs *mp, #ifdef HAVE_LSTAT static int -copyf (char *ifile, char *ofile) +copyf(char *ifile, char *ofile) { int i, in, out; char buffer[BUFSIZ]; - if ((in = open (ifile, O_RDONLY)) == NOTOK) + if ((in = open(ifile, O_RDONLY)) == NOTOK) return NOTOK; - if ((out = open (ofile, O_WRONLY | O_TRUNC)) == NOTOK) { - admonish (ofile, "unable to open and truncate"); - close (in); + if ((out = open(ofile, O_WRONLY | O_TRUNC)) == NOTOK) { + admonish(ofile, "unable to open and truncate"); + close(in); return NOTOK; } - while ((i = read (in, buffer, sizeof(buffer))) > OK) - if (write (out, buffer, i) != i) { - advise (ofile, "may have damaged"); + while ((i = read(in, buffer, sizeof(buffer))) > OK) + if (write(out, buffer, i) != i) { + advise(ofile, "may have damaged"); i = NOTOK; break; } - close (in); - close (out); + close(in); + close(out); return i; } #endif /* HAVE_LSTAT */ @@ -827,158 +776,52 @@ copyf (char *ifile, char *ofile) */ static int -sendfile (char **arg, char *file, int pushsw) +sendfile(char **arg, char *file, int pushsw) { pid_t child_id; int i, vecp; char *cp, *sp, *vec[MAXARGS]; - /* Translate MIME composition file, if necessary */ - if ((cp = context_find ("automimeproc")) && (!strcmp (cp, "1")) - && !getenv ("NOMHNPROC") && check_draft (file) - && (buildfile (NULL, file) == NOTOK)) - return 0; - - /* For backwards compatibility */ - if ((cp = context_find ("automhnproc")) && !getenv ("NOMHNPROC") - && check_draft (file) && (i = editfile (&cp, NULL, - file, NOUSE, NULL, NULL, NULL, 0))) - return 0; - /* ** If the sendproc is the nmh command `send', then we call ** those routines directly rather than exec'ing the command. */ - if (strcmp (sp = r1bindex (sendproc, '/'), "send") == 0) { + if (strcmp(sp = mhbasename(sendproc), "send") == 0) { cp = invo_name; - sendit (invo_name = sp, arg, file, pushsw); + sendit(invo_name = sp, arg, file, pushsw); invo_name = cp; return 1; } - context_save (); /* save the context file */ - fflush (stdout); + context_save(); /* save the context file */ + fflush(stdout); - for (i = 0; (child_id = vfork()) == NOTOK && i < 5; i++) - sleep (5); + for (i = 0; (child_id = fork()) == NOTOK && i < 5; i++) + sleep(5); switch (child_id) { - case NOTOK: - advise (NULL, "unable to fork, so sending directly..."); - case OK: - vecp = 0; - vec[vecp++] = invo_name; - if (pushsw) - vec[vecp++] = "-push"; - if (arg) - while (*arg) - vec[vecp++] = *arg++; - vec[vecp++] = file; - vec[vecp] = NULL; - - execvp (sendproc, vec); - fprintf (stderr, "unable to exec "); - perror (sendproc); - _exit (-1); - - default: - if (pidwait(child_id, OK) == 0) - done (0); - return 1; - } -} - - -/* -** Translate MIME composition file (call buildmimeproc) -*/ - -static int -buildfile (char **argp, char *file) -{ - int i; - char **args, *ed; - - ed = buildmimeproc; - - /* allocate space for arguments */ - i = 0; - if (argp) { - while (argp[i]) - i++; + case NOTOK: + advise(NULL, "unable to fork, so sending directly..."); + case OK: + vecp = 0; + vec[vecp++] = invo_name; + if (pushsw) + vec[vecp++] = "-push"; + if (arg) + while (*arg) + vec[vecp++] = *arg++; + vec[vecp++] = file; + vec[vecp] = NULL; + + execvp(sendproc, vec); + fprintf(stderr, "unable to exec "); + perror(sendproc); + _exit(-1); + + default: + if (pidwait(child_id, OK) == 0) + done(0); + return 1; } - args = (char **) mh_xmalloc((i + 2) * sizeof(char *)); - - /* - ** For backward compatibility, we need to add -build - ** if we are using mhn as buildmimeproc - */ - i = 0; - if (strcmp (r1bindex (ed, '/'), "mhn") == 0) - args[i++] = "-build"; - - /* copy any other arguments */ - while (argp && *argp) - args[i++] = *argp++; - args[i] = NULL; - - i = editfile (&ed, args, file, NOUSE, NULL, NULL, NULL, 0); - free (args); - - return (i ? NOTOK : OK); -} - - -/* -** Check if draft is a mhbuild composition file -*/ - -static int -check_draft (char *msgnam) -{ - int state; - char buf[BUFSIZ], name[NAMESZ]; - FILE *fp; - - if ((fp = fopen (msgnam, "r")) == NULL) - return 0; - for (state = FLD;;) - switch (state = m_getfld (state, name, buf, sizeof(buf), fp)) { - case FLD: - case FLDPLUS: - case FLDEOF: - /* - ** If draft already contains any of the - ** Content-XXX fields, then assume it already - ** been converted. - */ - if (uprf (name, XXX_FIELD_PRF)) { - fclose (fp); - return 0; - } - while (state == FLDPLUS) - state = m_getfld (state, name, buf, - sizeof(buf), fp); - break; - - case BODY: - do { - char *bp; - - for (bp = buf; *bp; bp++) - if (*bp != ' ' && *bp != '\t' && *bp != '\n') { - fclose (fp); - return 1; - } - - state = m_getfld (state, name, buf, - sizeof(buf), fp); - } while (state == BODY); - /* and fall... */ - - default: - fclose (fp); - return 0; - } } @@ -999,60 +842,24 @@ static struct swit sendswitches[] = { { "forward", 0 }, #define NFORWSW 7 { "noforward", 0 }, -#define MIMESW 8 - { "mime", 0 }, -#define NMIMESW 9 - { "nomime", 0 }, -#define MSGDSW 10 - { "msgid", 0 }, -#define NMSGDSW 11 - { "nomsgid", 0 }, -#define SPSHSW 12 +#define SPSHSW 8 { "push", 0 }, -#define NSPSHSW 13 +#define NSPSHSW 9 { "nopush", 0 }, -#define UNIQSW 14 - { "unique", -6 }, -#define NUNIQSW 15 - { "nounique", -8 }, -#define VERBSW 16 +#define VERBSW 10 { "verbose", 0 }, -#define NVERBSW 17 +#define NVERBSW 11 { "noverbose", 0 }, -#define WATCSW 18 +#define WATCSW 12 { "watch", 0 }, -#define NWATCSW 19 +#define NWATCSW 13 { "nowatch", 0 }, -#define WIDTHSW 20 +#define WIDTHSW 14 { "width columns", 0 }, -#define SVERSIONSW 21 +#define SVERSIONSW 15 { "version", 0 }, -#define SHELPSW 22 +#define SHELPSW 16 { "help", 0 }, -#define BITSTUFFSW 23 - { "dashstuffing", -12 }, -#define NBITSTUFFSW 24 - { "nodashstuffing", -14 }, -#define MAILSW 25 - { "mail", -4 }, -#define SAMLSW 26 - { "saml", -4 }, -#define SSNDSW 27 - { "send", -4 }, -#define SOMLSW 28 - { "soml", -4 }, -#define CLIESW 29 - { "client host", -6 }, -#define SERVSW 30 - { "server host", 6 }, -#define SNOOPSW 31 - { "snoop", -5 }, -#define SNDATTACHSW 32 - { "attach file", 6 }, -#define SNDATTACHFORMAT 33 - { "attachformat", 7 }, -#define PORTSW 34 - { "port server-port-name/number", 4 }, { NULL, 0 } }; @@ -1061,7 +868,6 @@ extern int debugsw; /* from sendsbr.c */ extern int forwsw; extern int inplace; extern int pushsw; -extern int unique; extern int verbsw; extern char *altmsg; /* .. */ @@ -1070,21 +876,16 @@ extern char *distfile; static void -sendit (char *sp, char **arg, char *file, int pushed) +sendit(char *sp, char **arg, char *file, int pushed) { int vecp, n = 1; char *cp, buf[BUFSIZ], **argp; char **arguments, *vec[MAXARGS]; struct stat st; - char *attach = (char *)0; /* attachment header field name */ - int attachformat = 0; /* mhbuild format specifier for attachments */ #ifndef lint int distsw = 0; #endif -#ifdef UCI - FILE *fp; -#endif /* ** Make sure these are defined. In particular, we need @@ -1106,7 +907,7 @@ sendit (char *sp, char **arg, char *file, int pushed) if (arg) { char **bp; - copyip (arg, vec+1, MAXARGS-1); + copyip(arg, vec+1, MAXARGS-1); bp = vec+1; while (*bp++) n++; @@ -1122,7 +923,6 @@ sendit (char *sp, char **arg, char *file, int pushed) debugsw = 0; forwsw = 1; inplace = 1; - unique = 0; altmsg = NULL; annotext = NULL; @@ -1130,178 +930,126 @@ sendit (char *sp, char **arg, char *file, int pushed) vecp = 1; /* we'll get the zero'th element later */ vec[vecp++] = "-library"; - vec[vecp++] = getcpy (m_maildir ("")); + vec[vecp++] = getcpy(toabsdir("+")); while ((cp = *argp++)) { if (*cp == '-') { - switch (smatch (++cp, sendswitches)) { - case AMBIGSW: - ambigsw (cp, sendswitches); - return; - case UNKWNSW: - advise (NULL, "-%s unknown\n", cp); - return; + switch (smatch(++cp, sendswitches)) { + case AMBIGSW: + ambigsw(cp, sendswitches); + return; + case UNKWNSW: + advise(NULL, "-%s unknown\n", cp); + return; + + case SHELPSW: + snprintf(buf, sizeof(buf), + "%s [switches]", sp); + print_help(buf, sendswitches, 1); + return; + case SVERSIONSW: + print_version(invo_name); + return; - case SHELPSW: - snprintf (buf, sizeof(buf), - "%s [switches]", sp); - print_help (buf, sendswitches, 1); - return; - case SVERSIONSW: - print_version (invo_name); - return; + case SPSHSW: + pushed++; + continue; + case NSPSHSW: + pushed = 0; + continue; - case SPSHSW: - pushed++; - continue; - case NSPSHSW: - pushed = 0; - continue; - - case UNIQSW: - unique++; - continue; - case NUNIQSW: - unique = 0; - continue; - case FORWSW: - forwsw++; - continue; - case NFORWSW: - forwsw = 0; - continue; - - case VERBSW: - verbsw++; - vec[vecp++] = --cp; - continue; - case NVERBSW: - verbsw = 0; - vec[vecp++] = --cp; - continue; - - case DEBUGSW: - debugsw++; /* fall */ - case NFILTSW: - case FRMTSW: - case NFRMTSW: - case BITSTUFFSW: - case NBITSTUFFSW: - case MIMESW: - case NMIMESW: - case MSGDSW: - case NMSGDSW: - case WATCSW: - case NWATCSW: - case MAILSW: - case SAMLSW: - case SSNDSW: - case SOMLSW: - case SNOOPSW: - vec[vecp++] = --cp; - continue; - - case ALIASW: - case FILTSW: - case WIDTHSW: - case CLIESW: - case SERVSW: - case PORTSW: - vec[vecp++] = --cp; - if (!(cp = *argp++) || *cp == '-') { - advise (NULL, "missing argument to %s", argp[-2]); - return; - } - vec[vecp++] = cp; - continue; - - case SNDATTACHSW: - if (!(attach = *argp++) || - *attach == '-') { - advise (NULL, "missing argument to %s", argp[-2]); - return; - } - continue; + case FORWSW: + forwsw++; + continue; + case NFORWSW: + forwsw = 0; + continue; + + case VERBSW: + verbsw++; + vec[vecp++] = --cp; + continue; + case NVERBSW: + verbsw = 0; + vec[vecp++] = --cp; + continue; + + case DEBUGSW: + debugsw++; /* fall */ + case NFILTSW: + case FRMTSW: + case NFRMTSW: + case WATCSW: + case NWATCSW: + vec[vecp++] = --cp; + continue; + + case ALIASW: + case FILTSW: + case WIDTHSW: + vec[vecp++] = --cp; + if (!(cp = *argp++) || *cp == '-') { + advise(NULL, "missing argument to %s", + argp[-2]); + return; + } + vec[vecp++] = cp; + continue; - case SNDATTACHFORMAT: - if (! *argp || **argp == '-') - adios (NULL, "missing argument to %s", argp[-1]); - else { - attachformat = atoi (*argp); - if (attachformat < 0 || attachformat > ATTACHFORMATS - 1) { - advise (NULL, "unsupported attachformat %d", attachformat); - continue; - } - } - ++argp; - continue; } } - advise (NULL, "usage: %s [switches]", sp); + advise(NULL, "usage: %s [switches]", sp); return; } /* allow Aliasfile: profile entry */ - if ((cp = context_find ("Aliasfile"))) { + if ((cp = context_find("Aliasfile"))) { char **ap, *dp; - dp = getcpy (cp); - for (ap = brkstring (dp, " ", "\n"); ap && *ap; ap++) { + dp = getcpy(cp); + for (ap = brkstring(dp, " ", "\n"); ap && *ap; ap++) { vec[vecp++] = "-alias"; vec[vecp++] = *ap; } } - if ((cp = getenv ("SIGNATURE")) == NULL || *cp == 0) - if ((cp = context_find ("signature")) && *cp) - m_putenv ("SIGNATURE", cp); -#ifdef UCI - else { - snprintf (buf, sizeof(buf), "%s/.signature", mypath); - if ((fp = fopen (buf, "r")) != NULL - && fgets (buf, sizeof(buf), fp) != NULL) { - fclose (fp); - if (cp = strchr (buf, '\n')) - *cp = 0; - m_putenv ("SIGNATURE", buf); - } - } -#endif /* UCI */ + if (!(cp = getenv("SIGNATURE")) || !*cp) + if ((cp = context_find("signature")) && *cp) + m_putenv("SIGNATURE", cp); - if ((annotext = getenv ("mhannotate")) == NULL || *annotext == 0) + if ((annotext = getenv("mhannotate")) == NULL || *annotext == 0) annotext = NULL; - if ((altmsg = getenv ("mhaltmsg")) == NULL || *altmsg == 0) + if ((altmsg = getenv("mhaltmsg")) == NULL || *altmsg == 0) altmsg = NULL; - if (annotext && ((cp = getenv ("mhinplace")) != NULL && *cp != 0)) - inplace = atoi (cp); + if (annotext && ((cp = getenv("mhinplace")) != NULL && *cp != 0)) + inplace = atoi(cp); - if ((cp = getenv ("mhdist")) - && *cp + if ((cp = getenv("mhdist")) && *cp #ifndef lint && (distsw = atoi (cp)) #endif /* not lint */ && altmsg) { vec[vecp++] = "-dist"; - distfile = getcpy (m_mktemp2(altmsg, invo_name, NULL, NULL)); - if (link (altmsg, distfile) == NOTOK) - adios (distfile, "unable to link %s to", altmsg); + distfile = getcpy(m_mktemp2(altmsg, invo_name, NULL, NULL)); + if (link(altmsg, distfile) == NOTOK) + adios(distfile, "unable to link %s to", altmsg); } else { distfile = NULL; } - if (altmsg == NULL || stat (altmsg, &st) == NOTOK) { + if (altmsg == NULL || stat(altmsg, &st) == NOTOK) { st.st_mtime = 0; st.st_dev = 0; st.st_ino = 0; } if ((pushsw = pushed)) - push (); + push(); - vec[0] = r1bindex (postproc, '/'); - closefds (3); + vec[0] = mhbasename(postproc); + closefds(3); - if (sendsbr (vec, vecp, file, &st, 1, attach, attachformat) == OK) - done (0); + if (sendsbr(vec, vecp, file, &st, 1) == OK) + done(0); } @@ -1310,10 +1058,10 @@ sendit (char *sp, char **arg, char *file, int pushed) */ static int -removefile (char *drft) +removefile(char *drft) { - if (unlink (drft) == NOTOK) - adios (drft, "unable to unlink"); + if (unlink(drft) == NOTOK) + adios(drft, "unable to unlink"); return OK; }