Added "-d --" to invocation of ls when figuring out what files
[mmh] / uip / whatnowsbr.c
index ddfc998..d54877e 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 */
@@ -176,10 +176,10 @@ WhatNow (int argc, char **argv)
            case HELPSW:
                snprintf (buf, sizeof(buf), "%s [switches] [file]", invo_name);
                print_help (buf, whatnowswitches, 1);
-               done (1);
+               done (0);
            case VERSIONSW:
                print_version(invo_name);
-               done (1);
+               done (0);
 
            case DFOLDSW:
                if (dfolder)
@@ -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)
@@ -821,14 +833,12 @@ sendfile (char **arg, char *file, int pushsw)
     /* 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, 0)))
        return 0;
@@ -1075,6 +1085,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 }
 };
 
@@ -1251,6 +1265,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]);