Fix to 25581a94c5113eb78b2baf7110408df96efc4418: always set $editalt,
[mmh] / uip / whatnowsbr.c
index 316c2c9..3890537 100644 (file)
@@ -97,7 +97,7 @@ static struct swit aleqs[] = {
 #define        PWDCMDSW                      11
     { "pwd", 0 },
 #define        LSCMDSW                       12
-    { "ls", 0 },
+    { "ls", 2 },
 #define        ATTACHCMDSW                   13
     { "attach", 0 },
 #define        DETACHCMDSW                   14
@@ -120,7 +120,7 @@ static int buildfile (char **, char *);
 static int check_draft (char *);
 static int whomfile (char **, char *);
 static int removefile (char *);
-static void writelscmd(char *, int, char **);
+static void writelscmd(char *, int, char *, 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);
 static int system_in_dir(const char *dir, const char *cmd);
@@ -141,9 +141,9 @@ WhatNow (int argc, char **argv)
     char **argp, **arguments;
     struct stat st;
     char       *attach = NMH_ATTACH_HEADER;/* 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 */
+    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 */
     int                n;                      /* set on -n to alist command */
@@ -336,7 +336,7 @@ WhatNow (int argc, char **argv)
             */
 
            if (*(argp+1) == (char *)0) {
-               (void)sprintf(buf, "$SHELL -c \"cd;pwd\"");
+               (void)sprintf(buf, "$SHELL -c \"cd&&pwd\"");
            }
            else {
                writesomecmd(buf, BUFSIZ, "cd", "pwd", argp);
@@ -366,7 +366,7 @@ WhatNow (int argc, char **argv)
             *  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);
+           writelscmd(buf, sizeof(buf), "", argp);
            (void)system_in_dir(cwd, buf);
            break;
 
@@ -431,7 +431,7 @@ 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.
             */
-           writelscmd(buf, sizeof(buf), argp);
+           writelscmd(buf, sizeof(buf), "-d", argp);
 
            /*
             *  Read back the response from the shell, which contains a number of lines
@@ -520,7 +520,7 @@ WhatNow (int argc, char **argv)
             * 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);
+           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';
@@ -561,9 +561,9 @@ writesomecmd(char *buf, int bufsz, char *cmd, char *trailcmd, char **argp)
      * 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
+     * trailing "&&", trailcmd, '"' and NUL
      */
-    int trailln = strlen(trailcmd) + 3;
+    int trailln = strlen(trailcmd) + 4;
     if (ln < 0 || ln + trailln > bufsz)
        adios((char *)0, "arguments too long");
     
@@ -579,9 +579,9 @@ writesomecmd(char *buf, int bufsz, char *cmd, char *trailcmd, char **argp)
        cp += ln;
     }
     if (*trailcmd) {
-       *cp++ = ';';
+       *cp++ = '&'; *cp++ = '&';
        strcpy(cp, trailcmd);
-       cp += trailln - 3;
+       cp += trailln - 4;
     }
     *cp++ = '"';
     *cp = 0;
@@ -592,9 +592,11 @@ writesomecmd(char *buf, int bufsz, char *cmd, char *trailcmd, char **argp)
  * arguments.  This handles and wildcard expansion, tilde expansion, etc.
  */
 static void
-writelscmd(char *buf, int bufsz, char **argp)
+writelscmd(char *buf, int bufsz, char *lsoptions, char **argp)
 {
-    writesomecmd(buf, bufsz, "ls", "", argp);
+  char *lscmd = concat ("ls ", lsoptions, " --", NULL);
+  writesomecmd(buf, bufsz, lscmd, "", argp);
+  free (lscmd);
 }
 
 /* Like system(), but run the command in directory dir.
@@ -605,6 +607,11 @@ system_in_dir(const char *dir, const char *cmd)
 {
     char olddir[BUFSIZ];
     int r;
+
+    /* ensure that $SHELL exists, as the cmd was written relying on
+       a non-blank $SHELL... */
+    setenv("SHELL","/bin/sh",0); /* don't overwrite */
+
     if (getcwd(olddir, sizeof(olddir)) == 0)
        adios("getcwd", "could not get working directory");
     if (chdir(dir) != 0)
@@ -621,6 +628,11 @@ popen_in_dir(const char *dir, const char *cmd, const char *type)
 {
     char olddir[BUFSIZ];
     FILE *f;
+
+    /* ensure that $SHELL exists, as the cmd was written relying on
+       a non-blank $SHELL... */
+    setenv("SHELL","/bin/sh",0); /* don't overwrite */
+    
     if (getcwd(olddir, sizeof(olddir)) == 0)
        adios("getcwd", "could not get working directory");
     if (chdir(dir) != 0)
@@ -671,7 +683,7 @@ editfile (char **ed, char **arg, char *file, int use, struct msgs *mp,
            *ed = defaulteditor;
     }
 
-    if (altmsg && atfile) {
+    if (altmsg) {
        if (mp == NULL || *altmsg == '/' || cwd == NULL)
            strncpy (altpath, altmsg, sizeof(altpath));
        else
@@ -681,17 +693,19 @@ editfile (char **ed, char **arg, char *file, int use, struct msgs *mp,
        else
            snprintf (linkpath, sizeof(linkpath), "%s/%s", cwd, LINK);
 
-       unlink (linkpath);
+       if (atfile) {
+           unlink (linkpath);
 #ifdef HAVE_LSTAT
-       if (link (altpath, linkpath) == NOTOK) {
-           symlink (altpath, linkpath);
-           slinked = 1;
-       } else {
-           slinked = 0;
-       }
+           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 */
@@ -1073,6 +1087,10 @@ static struct swit  sendswitches[] = {
     { "tls", TLSminc(-3) },
 #define NTLSSW            46
     { "notls", TLSminc(-5) },
+#define MTSSW            47
+    { "mts smtp|sendmail/smtp|sendmail/pipe", 2 },
+#define MESSAGEIDSW      48
+    { "messageid localname|random", 2 },
     { NULL, 0 }
 };
 
@@ -1249,6 +1267,8 @@ sendit (char *sp, char **arg, char *file, int pushed)
                case SASLMECHSW:
                case USERSW:
                case PORTSW:
+               case MTSSW:
+               case MESSAGEIDSW:
                    vec[vecp++] = --cp;
                    if (!(cp = *argp++) || *cp == '-') {
                        advise (NULL, "missing argument to %s", argp[-2]);