Completely reworked the path convertion functions
[mmh] / uip / whatnowsbr.c
index f8b7223..8687815 100644 (file)
@@ -1,41 +1,41 @@
 /*
- * 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
- * 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.
- *
- *  Several commands have been added at the whatnow prompt:
- *
- *        cd [ directory ]        This option works just like the shell's
- *                                cd command and lets the user change the
- *                                directory from which attachments are
- *                                taken so that long path names are not
- *                                needed with every file.
- *
- *        ls [ ls-options ]       This option works just like the normal
- *                                ls command and exists to allow the user
- *                                to verify file names in the directory.
- *
- *        pwd                     This option works just like the normal
- *                                pwd command and exists to allow the user
- *                                to verify the directory.
- *
- *        attach files            This option attaches the named files to
- *                                the draft.
- *
- *        alist [-ln]             This option lists the attachments on the
- *                                draft.  -l gets long listings, -n gets
- *                                numbered listings.
- *
- *        detach files            This option removes attachments from the
- *        detach -n numbers       draft.  This can be done by file name or
- *                                by attachment number.
- */
+** 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
+** 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.
+**
+**  Several commands have been added at the whatnow prompt:
+**
+**        cd [ directory ]        This option works just like the shell's
+**                                cd command and lets the user change the
+**                                directory from which attachments are
+**                                taken so that long path names are not
+**                                needed with every file.
+**
+**        ls [ ls-options ]       This option works just like the normal
+**                                ls command and exists to allow the user
+**                                to verify file names in the directory.
+**
+**        pwd                     This option works just like the normal
+**                                pwd command and exists to allow the user
+**                                to verify the directory.
+**
+**        attach files            This option attaches the named files to
+**                                the draft.
+**
+**        alist [-ln]             This option lists the attachments on the
+**                                draft.  -l gets long listings, -n gets
+**                                numbered listings.
+**
+**        detach files            This option removes attachments from the
+**        detach -n numbers       draft.  This can be done by file name or
+**                                by attachment number.
+*/
 
 #include <h/mh.h>
 #include <fcntl.h>
@@ -60,8 +60,8 @@ static struct swit whatnowswitches[] = {
 };
 
 /*
- * Options at the "whatnow" prompt
- */
+** Options at the "whatnow" prompt
+*/
 static struct swit aleqs[] = {
 #define EDITSW  0
        { "edit [<editor> <switches>]", 0 },
@@ -99,15 +99,15 @@ static struct swit aleqs[] = {
 static char *myprompt = "\nWhat now? ";
 
 /*
- * static prototypes
- */
-static int editfile (char **, char **, char *, int, struct msgs *,
+** static prototypes
+*/
+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 buildfile(char **, char *);
+static int check_draft(char *);
+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 +115,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;
@@ -136,17 +136,17 @@ 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.
-        */
+       ** Get the initial current working directory.
+       */
 
        if (getcwd(cwd, sizeof (cwd)) == (char *)0) {
                adios("getcwd", "could not get working directory");
@@ -154,24 +154,27 @@ WhatNow (int argc, char **argv)
 
        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), "%s [switches] [file]", invo_name);
-                               print_help (buf, whatnowswitches, 1);
-                               done (1);
+                               snprintf(buf, sizeof(buf),
+                                               "%s [switches] [file]",
+                                               invo_name);
+                               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", argp[-2]);
+                                       adios(NULL, "missing argument to %s",
+                                                       argp[-2]);
                                nedit = 0;
                                continue;
                        case NEDITSW:
@@ -180,115 +183,122 @@ WhatNow (int argc, char **argv)
 
                        case PRMPTSW:
                                if (!(myprompt = *argp++) || *myprompt == '-')
-                                       adios (NULL, "missing argument to %s", argp[-2]);
+                                       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]);
+                                       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"));
+       if ((drft == NULL && (drft = getenv("mhdraft")) == NULL) || *drft == 0)
+               drft = getcpy(m_draft("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++;
        }
 
        /* start editing the draft, unless -noedit was given */
-       if (!nedit && editfile (&ed, NULL, drft, use, NULL, msgnam, NULL, 1) < 0)
-               done (1);
+       if (!nedit && editfile(&ed, NULL, drft, use, NULL, msgnam, NULL, 1)
+                       < 0)
+               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 */
+                       /*
+                       ** display the message being replied to,
+                       ** or distributed
+                       */
                        if (msgnam)
-                               showfile (++argp, msgnam);
+                               showfile(++argp, msgnam);
                        else
-                               advise (NULL, "no alternate message to display");
+                               advise(NULL, "no alternate message to display");
                        break;
 
                case BUILDMIMESW:
                        /* Translate MIME composition file */
-                       buildfile (++argp, drft);
+                       buildfile(++argp, drft);
                        break;
 
                case EDITSW:
                        /* Call an editor on the draft file */
                        if (*++argp)
                                ed = *argp++;
-                       if (editfile (&ed, argp, drft, NOUSE, NULL, msgnam, NULL, 1) == NOTOK)
-                               done (1);
+                       if (editfile(&ed, argp, drft, NOUSE, NULL,
+                                       msgnam, NULL, 1) == NOTOK)
+                               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)
-                                       advise (NULL, "draft left on %s", drft);
+                               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:
                        /*
-                        * Change the working directory for attachments
-                        *
-                        * Run the directory through the user's shell
-                        * so that we can take advantage of any syntax
-                        * that the user is accustomed to.  Read back
-                        * the absolute path.
-                        */
+                       ** Change the working directory for attachments
+                       **
+                       ** Run the directory through the user's shell
+                       ** so that we can take advantage of any syntax
+                       ** that the user is accustomed to.  Read back
+                       ** the absolute path.
+                       */
 
                        if (*(argp+1) == (char *)0) {
                                (void)sprintf(buf, "$SHELL -c \"cd;pwd\"");
@@ -315,24 +325,24 @@ WhatNow (int argc, char **argv)
 
                case LSCMDSW:
                        /*
-                        * List files in the current attachment working
-                        * directory
-                        *
-                        * Use the user's shell so that we can take
-                        * advantage of any syntax that the user is
-                        * accustomed to.
-                        */
+                       ** List files in the current attachment working
+                       ** directory
+                       **
+                       ** Use the user's shell so that we can take
+                       ** advantage of any syntax that the user is
+                       ** accustomed to.
+                       */
                        writelscmd(buf, sizeof(buf), argp);
                        (void)system_in_dir(cwd, buf);
                        break;
 
                case ALISTCMDSW:
                        /*
-                        * List attachments on current draft.  Options are:
-                        *
-                        * -l    long listing (full path names)
-                        * -n    numbers listing
-                        */
+                       ** List attachments on current draft.  Options are:
+                       **
+                       ** -l    long listing (full path names)
+                       ** -n    numbers listing
+                       */
 
                        if (attach == (char *)0) {
                                advise((char *)0, "can't list because no header field name was given.");
@@ -349,7 +359,8 @@ WhatNow (int argc, char **argv)
                                else if (strcmp(*argp, "-n") == 0)
                                        n = 1;
 
-                               else if (strcmp(*argp, "-ln") == 0 || strcmp(*argp, "-nl") == 0) {
+                               else if (strcmp(*argp, "-ln") == 0 ||
+                                               strcmp(*argp, "-nl") == 0) {
                                        l = "/";
                                        n = 1;
                                } else {
@@ -368,8 +379,8 @@ WhatNow (int argc, char **argv)
 
                case ATTACHCMDSW:
                        /*
-                        * Attach files to current draft.
-                        */
+                       ** Attach files to current draft.
+                       */
 
                        if (attach == (char *)0) {
                                advise((char *)0, "can't attach because no header field name was given.");
@@ -382,32 +393,36 @@ WhatNow (int argc, char **argv)
                        }
 
                        /*
-                        * Build a command line that causes the user's
-                        * shell to list the file name arguments.
-                        * This handles and wildcard expansion, tilde
-                        * expansion, etc.
-                        */
+                       ** Build a command line that causes the user's
+                       ** shell to list the file name arguments.
+                       ** This handles and wildcard expansion, tilde
+                       ** expansion, etc.
+                       */
                        writelscmd(buf, sizeof(buf), argp);
 
                        /*
-                        * Read back the response from the shell,
-                        * which contains a number of lines with one
-                        * file name per line.  Remove off the newline.
-                        * Determine whether we have an absolute or
-                        * relative path name.  Prepend the current
-                        * working directory to relative path names.
-                        * Add the attachment annotation to the draft.
-                        */
+                       ** Read back the response from the shell,
+                       ** which contains a number of lines with one
+                       ** file name per line.  Remove off the newline.
+                       ** Determine whether we have an absolute or
+                       ** relative path name.  Prepend the current
+                       ** 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) {
+                               while (fgets(shell, sizeof (shell), f)
+                                               != (char *)0) {
                                        *(strchr(shell, '\n')) = '\0';
 
                                        if (*shell == '/')
-                                               (void)annotate(drft, attach, shell, 1, 0, -2, 1);
+                                               annotate(drft, attach, shell,
+                                                               1, 0, -2, 1);
                                        else {
-                                               (void)sprintf(file, "%s/%s", cwd, shell);
-                                               (void)annotate(drft, attach, file, 1, 0, -2, 1);
+                                               sprintf(file, "%s/%s", cwd,
+                                                               shell);
+                                               annotate(drft, attach, file,
+                                                               1, 0, -2, 1);
                                        }
                                }
 
@@ -420,8 +435,8 @@ WhatNow (int argc, char **argv)
 
                case DETACHCMDSW:
                        /*
-                        * Detach files from current draft.
-                        */
+                       ** Detach files from current draft.
+                       */
 
                        if (attach == (char *)0) {
                                advise((char *)0, "can't detach because no header field name was given.");
@@ -429,12 +444,14 @@ WhatNow (int argc, char **argv)
                        }
 
                        /*
-                        * 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++) {
+                       ** 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++) {
                                if (strcmp(*arguments, "-n") == 0) {
                                                n = 1;
                                                break;
@@ -442,21 +459,24 @@ WhatNow (int argc, char **argv)
                        }
 
                        /*
-                        * A -n was found so interpret the arguments as
-                        * attachment numbers.  Decrement any remaining
-                        * argument number that is greater than the one
-                        * just processed after processing each one so
-                        * that the numbering stays correct.
-                        */
+                       ** A -n was found so interpret the arguments as
+                       ** attachment numbers.  Decrement any remaining
+                       ** argument number that is greater than the one
+                       ** just processed after processing each one so
+                       ** that the numbering stays correct.
+                       */
 
                        if (n == 1) {
-                               for (arguments = argp + 1; *arguments != (char *)0; arguments++) {
+                               for (arguments = argp + 1;
+                                               *arguments != (char *)0;
+                                               arguments++) {
                                        if (strcmp(*arguments, "-n") == 0)
                                                continue;
 
                                        if (**arguments != '\0') {
                                                n = atoi(*arguments);
-                                               (void)annotate(drft, attach, (char *)0, 1, 0, n, 1);
+                                               annotate(drft, attach, NULL,
+                                                               1, 0, n, 1);
 
                                                for (argp = arguments + 1; *argp != (char *)0; argp++) {
                                                        if (atoi(*argp) > n) {
@@ -471,22 +491,24 @@ WhatNow (int argc, char **argv)
                        }
 
                        /*
-                        * The arguments are interpreted as file names.
-                        * Run them through the user's shell for wildcard
-                        * expansion and other goodies.  Do this from
-                        * the current working directory if the argument
-                        * is not an absolute path name (does not begin
-                        * with a /).
-                        *
-                        * We feed all the file names to the shell at
-                        * once, otherwise you can't provide a file name
-                        * with a space in it.
-                        */
+                       ** The arguments are interpreted as file names.
+                       ** Run them through the user's shell for wildcard
+                       ** expansion and other goodies.  Do this from
+                       ** the current working directory if the argument
+                       ** is not an absolute path name (does not begin
+                       ** with a /).
+                       **
+                       ** We feed all the file names to the shell at
+                       ** once, otherwise you can't provide a file name
+                       ** with a space in it.
+                       */
                        writelscmd(buf, sizeof(buf), argp);
                        if ((f = popen_in_dir(cwd, buf, "r")) != (FILE *)0) {
-                               while (fgets(shell, sizeof (shell), f) != (char *)0) {
+                               while (fgets(shell, sizeof (shell), f)
+                                               != NULL) {
                                        *(strchr(shell, '\n')) = '\0';
-                                       (void)annotate(drft, attach, shell, 1, 0, 0, 1);
+                                       annotate(drft, attach, shell,
+                                                       1, 0, 0, 1);
                                }
                                pclose(f);
                        } else {
@@ -497,7 +519,7 @@ WhatNow (int argc, char **argv)
 
                default:
                        /* Unknown command */
-                       advise (NULL, "say what?");
+                       advise(NULL, "say what?");
                        break;
                }
        }
@@ -507,27 +529,30 @@ WhatNow (int argc, char **argv)
 
 
 /*
- * Build a command line of the form $SHELL -c "cd 'cwd'; cmd argp ... ;
- * trailcmd".
- */
+** Build a command line of the form $SHELL -c "cd 'cwd'; cmd argp ... ;
+** trailcmd".
+*/
 static void
 writesomecmd(char *buf, int bufsz, char *cmd, char *trailcmd, char **argp)
 {
        char *cp;
-       /* Note that we do not quote -- the argp from the user
-        * is assumed to be quoted as they desire. (We can't treat
-        * it as pure literal as that would prevent them using ~,
-        * wildcards, etc.) The buffer produced by this function
-        * should be given to popen_in_dir() or system_in_dir() so
-        * that the current working directory is set correctly.
-        */
+       /*
+       ** Note that we do not quote -- the argp from the user
+       ** is assumed to be quoted as they desire. (We can't treat
+       ** it as pure literal as that would prevent them using ~,
+       ** wildcards, etc.) The buffer produced by this function
+       ** should be given to popen_in_dir() or system_in_dir() so
+       ** that the current working directory is set correctly.
+       */
        int ln = snprintf(buf, bufsz, "$SHELL -c \"%s", cmd);
-       /* NB that some snprintf() return -1 on overflow rather than the
-        * new C99 mandated 'number of chars that would have been written'
-        */
-       /* length checks here and inside the loop allow for the
-        * trailing ';', trailcmd, '"' and NUL
-        */
+       /*
+       ** NB that some snprintf() return -1 on overflow rather than the
+       ** new C99 mandated 'number of chars that would have been written'
+       */
+       /*
+       ** length checks here and inside the loop allow for the
+       ** trailing ';', trailcmd, '"' and NUL
+       */
        int trailln = strlen(trailcmd) + 3;
        if (ln < 0 || ln + trailln > bufsz)
                adios((char *)0, "arguments too long");
@@ -553,18 +578,19 @@ writesomecmd(char *buf, int bufsz, char *cmd, char *trailcmd, char **argp)
 }
 
 /*
- * Build a command line that causes the user's shell to list the file name
- * arguments.  This handles and wildcard expansion, tilde expansion, etc.
- */
+** Build a command line that causes the user's shell to list the file name
+** arguments.  This handles and wildcard expansion, tilde expansion, etc.
+*/
 static void
 writelscmd(char *buf, int bufsz, char **argp)
 {
        writesomecmd(buf, bufsz, "ls", "", argp);
 }
 
-/* Like system(), but run the command in directory dir.
- * This assumes the program is single-threaded!
- */
+/*
+** Like system(), but run the command in directory dir.
+** This assumes the program is single-threaded!
+*/
 static int
 system_in_dir(const char *dir, const char *cmd)
 {
@@ -598,15 +624,15 @@ popen_in_dir(const char *dir, const char *cmd, const char *type)
 
 
 /*
- * EDIT
- */
+** EDIT
+*/
 
 static int  reedit = 0;  /* have we been here before? */
 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;
@@ -625,40 +651,43 @@ editfile (char **ed, char **arg, char *file, int use, struct msgs *mp,
        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", mp->foldpath, altmsg);
+                       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", cwd, altmsglink);
+                       snprintf(linkpath, sizeof(linkpath), "%s/%s",
+                                       cwd, altmsglink);
        }
 
        if (altmsg) {
-               unlink (linkpath);
+               unlink(linkpath);
 #ifdef HAVE_LSTAT
-               if (link (altpath, linkpath) == NOTOK) {
+               if (link(altpath, linkpath) == NOTOK) {
 #if 0
                        /* I don't think permission on symlinks matters /JLR */
-                       oumask = umask(0044);  /* PJS: else symlinks are world 'r' */
+                       /* PJS: else symlinks are world 'r' */
+                       oumask = umask(0044);
 #endif
-                       symlink (altpath, linkpath);
+                       symlink(altpath, linkpath);
 #if 0
                        umask(oumask);  /* PJS: else symlinks are world 'r' */
 #endif
@@ -667,57 +696,56 @@ editfile (char **ed, char **arg, char *file, int use, struct msgs *mp,
                        slinked = 0;
                }
 #else /* not HAVE_LSTAT */
-               link (altpath, linkpath);
+               link(altpath, linkpath);
 #endif /* not HAVE_LSTAT */
        }
 
-       context_save ();  /* save the context file */
-       fflush (stdout);
+       context_save();  /* save the context file */
+       fflush(stdout);
 
-       switch (pid = vfork ()) {
+       switch (pid = vfork()) {
                case NOTOK:
-                       advise ("fork", "unable to");
+                       advise("fork", "unable to");
                        status = NOTOK;
                        break;
 
                case OK:
                        if (cwd)
-                               chdir (cwd);
+                               chdir(cwd);
                        if (altmsg) {
                                if (mp)
-                                       m_putenv ("mhfolder", mp->foldpath);
-                               m_putenv ("editalt", altpath);
+                                       m_putenv("mhfolder", mp->foldpath);
+                               m_putenv("editalt", altpath);
                        }
 
                        vecp = 0;
-                       vec[vecp++] = r1bindex (*ed, '/');
+                       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);
+                       execvp(*ed, vec);
+                       fprintf(stderr, "unable to exec ");
+                       perror(*ed);
+                       _exit(-1);
 
                default:
-                       if ((status = pidwait (pid, NOTOK))) {
+                       if ((status = pidwait(pid, NOTOK))) {
 #ifdef ATTVIBUG
-                               if ((cp = r1bindex (*ed, '/'))
-                                               && strcmp (cp, "vi") == 0
-                                               && (status & 0x00ff) == 0)
+                               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);
+                                       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);
+                                               advise(NULL, "problems with edit--%s preserved", file);
                                        }
                                }
                                status = -2;  /* maybe "reedit ? -2 : -1"? */
@@ -729,37 +757,33 @@ editfile (char **ed, char **arg, char *file, int use, struct msgs *mp,
 
                        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;
 }
@@ -767,78 +791,75 @@ 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 */
 
 
 /*
- * SEND
- */
+** SEND
+*/
 
 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))
+       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)))
+       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 the sendproc is the nmh command `send', then we call
+       ** those routines directly rather than exec'ing the command.
+       */
+       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);
+               sleep(5);
        switch (child_id) {
                case NOTOK:
-                       advise (NULL, "unable to fork, so sending directly...");
+                       advise(NULL, "unable to fork, so sending directly...");
                case OK:
                        vecp = 0;
                        vec[vecp++] = invo_name;
@@ -850,25 +871,25 @@ sendfile (char **arg, char *file, int pushsw)
                        vec[vecp++] = file;
                        vec[vecp] = NULL;
 
-                       execvp (sendproc, vec);
-                       fprintf (stderr, "unable to exec ");
-                       perror (sendproc);
-                       _exit (-1);
+                       execvp(sendproc, vec);
+                       fprintf(stderr, "unable to exec ");
+                       perror(sendproc);
+                       _exit(-1);
 
                default:
                        if (pidwait(child_id, OK) == 0)
-                               done (0);
+                               done(0);
                        return 1;
        }
 }
 
 
 /*
- * Translate MIME composition file (call buildmimeproc)
- */
+** Translate MIME composition file (call buildmimeproc)
+*/
 
 static int
-buildfile (char **argp, char *file)
+buildfile(char **argp, char *file)
 {
        int i;
        char **args, *ed;
@@ -884,11 +905,11 @@ buildfile (char **argp, char *file)
        args = (char **) mh_xmalloc((i + 2) * sizeof(char *));
 
        /*
-        * For backward compatibility, we need to add -build
-        * if we are using mhn as buildmimeproc
-        */
+       ** For backward compatibility, we need to add -build
+       ** if we are using mhn as buildmimeproc
+       */
        i = 0;
-       if (strcmp (r1bindex (ed, '/'), "mhn") == 0)
+       if (strcmp(mhbasename(ed), "mhn") == 0)
                args[i++] = "-build";
 
        /* copy any other arguments */
@@ -896,42 +917,43 @@ buildfile (char **argp, char *file)
                args[i++] = *argp++;
        args[i] = NULL;
 
-       i = editfile (&ed, args, file, NOUSE, NULL, NULL, NULL, 0);
-       free (args);
+       i = editfile(&ed, args, file, NOUSE, NULL, NULL, NULL, 0);
+       free(args);
 
        return (i ? NOTOK : OK);
 }
 
 
 /*
- *  Check if draft is a mhbuild composition file
- */
+**  Check if draft is a mhbuild composition file
+*/
 
 static int
-check_draft (char *msgnam)
+check_draft(char *msgnam)
 {
        int state;
        char buf[BUFSIZ], name[NAMESZ];
        FILE *fp;
 
-       if ((fp = fopen (msgnam, "r")) == NULL)
+       if ((fp = fopen(msgnam, "r")) == NULL)
                return 0;
        for (state = FLD;;)
-               switch (state = m_getfld (state, name, buf, sizeof(buf), fp)) {
+               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);
+                               ** 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);
+                                       state = m_getfld(state, name, buf,
+                                                       sizeof(buf), fp);
                                break;
 
                        case BODY:
@@ -940,16 +962,17 @@ check_draft (char *msgnam)
 
                                        for (bp = buf; *bp; bp++)
                                                if (*bp != ' ' && *bp != '\t' && *bp != '\n') {
-                                                       fclose (fp);
+                                                       fclose(fp);
                                                        return 1;
                                                }
 
-                                       state = m_getfld (state, name, buf, sizeof(buf), fp);
+                                       state = m_getfld(state, name, buf,
+                                                       sizeof(buf), fp);
                                } while (state == BODY);
                                /* and fall... */
 
                        default:
-                               fclose (fp);
+                               fclose(fp);
                                return 0;
                }
 }
@@ -1043,15 +1066,14 @@ 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 */
+       int attachformat = 0;  /* mhbuild format specifier for attachments */
 
 #ifndef lint
        int distsw = 0;
@@ -1061,35 +1083,35 @@ sendit (char *sp, char **arg, char *file, int pushed)
 #endif
 
        /*
-        * Make sure these are defined.  In particular, we need
-        * vec[1] to be NULL, in case "arg" is NULL below.  It
-        * doesn't matter what is the value of vec[0], but we
-        * set it to NULL, to help catch "off-by-one" errors.
-        */
+       ** Make sure these are defined.  In particular, we need
+       ** vec[1] to be NULL, in case "arg" is NULL below.  It
+       ** doesn't matter what is the value of vec[0], but we
+       ** set it to NULL, to help catch "off-by-one" errors.
+       */
        vec[0] = NULL;
        vec[1] = NULL;
 
        /*
-        * Temporarily copy arg to vec, since the brkstring() call in
-        * getarguments() will wipe it out before it is merged in.
-        * Also, we skip the first element of vec, since getarguments()
-        * skips it.  Then we count the number of arguments
-        * copied.  The value of "n" will be one greater than
-        * this in order to simulate the standard argc/argv.
-        */
+       ** Temporarily copy arg to vec, since the brkstring() call in
+       ** getarguments() will wipe it out before it is merged in.
+       ** Also, we skip the first element of vec, since getarguments()
+       ** skips it.  Then we count the number of arguments
+       ** copied.  The value of "n" will be one greater than
+       ** this in order to simulate the standard argc/argv.
+       */
        if (arg) {
                char **bp;
 
-               copyip (arg, vec+1, MAXARGS-1);
+               copyip(arg, vec+1, MAXARGS-1);
                bp = vec+1;
                while (*bp++)
                        n++;
        }
 
        /*
-        * Merge any arguments from command line (now in vec)
-        * and arguments from profile.
-        */
+       ** Merge any arguments from command line (now in vec)
+       ** and arguments from profile.
+       */
        arguments = getarguments (sp, n, vec, 1);
        argp = arguments;
 
@@ -1104,24 +1126,25 @@ 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)) {
+                       switch (smatch(++cp, sendswitches)) {
                                case AMBIGSW:
-                                       ambigsw (cp, sendswitches);
+                                       ambigsw(cp, sendswitches);
                                        return;
                                case UNKWNSW:
-                                       advise (NULL, "-%s unknown\n", cp);
+                                       advise(NULL, "-%s unknown\n", cp);
                                        return;
 
                                case SHELPSW:
-                                       snprintf (buf, sizeof(buf), "%s [switches]", sp);
-                                       print_help (buf, sendswitches, 1);
+                                       snprintf(buf, sizeof(buf),
+                                                       "%s [switches]", sp);
+                                       print_help(buf, sendswitches, 1);
                                        return;
                                case SVERSIONSW:
-                                       print_version (invo_name);
+                                       print_version(invo_name);
                                        return;
 
                                case SPSHSW:
@@ -1182,28 +1205,27 @@ sendit (char *sp, char **arg, char *file, int pushed)
                                case PORTSW:
                                        vec[vecp++] = --cp;
                                        if (!(cp = *argp++) || *cp == '-') {
-                                               advise (NULL, "missing argument to %s", argp[-2]);
+                                               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]);
+                                       if (!(attach = *argp++) ||
+                                                       *attach == '-') {
+                                               advise(NULL, "missing argument to %s", argp[-2]);
                                                return;
                                        }
                                        continue;
 
                                case SNDATTACHFORMAT:
                                        if (! *argp || **argp == '-')
-                                               adios (NULL, "missing argument to %s", argp[-1]);
+                                               adios(NULL, "missing argument to %s", argp[-1]);
                                        else {
-                                               attachformat = atoi (*argp);
-                                               if (attachformat < 0 ||
-                                                       attachformat > ATTACHFORMATS - 1) {
-                                                       advise (NULL, "unsupported attachformat %d",
-                                                                       attachformat);
+                                               attachformat = atoi(*argp);
+                                               if (attachformat < 0 || attachformat > ATTACHFORMATS - 1) {
+                                                       advise(NULL, "unsupported attachformat %d", attachformat);
                                                        continue;
                                                }
                                        }
@@ -1211,83 +1233,82 @@ sendit (char *sp, char **arg, char *file, int pushed)
                                        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);
+       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);
+                       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 ((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, attach, attachformat) == OK)
+               done(0);
 }
 
 
 /*
- * Remove the draft file
- */
+** Remove the draft file
+*/
 
 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;
 }