]> diplodocus.org Git - nmh/blobdiff - uip/whatnowsbr.c
Beginning of work to run mhbuild always. A bit more complicated than I
[nmh] / uip / whatnowsbr.c
index eb6106a7fac75efba759490858453bcfaed98f12..3010bff08d2ebc5bd5efc31ef4a4557c956341cd 100644 (file)
@@ -26,8 +26,9 @@
  *                             pwd command and exists to allow the user
  *                             to verify the directory.
  *
- *     attach files            This option attaches the named files to
- *                             the draft.
+ *     attach [-v] files       This option attaches the named files to
+ *                             the draft.  -v displays the mhbuild
+ *                             directive that send(1) will use.
  *
  *     alist [-ln]             This option lists the attachments on the
  *                             draft.  -l gets long listings, -n gets
@@ -40,7 +41,6 @@
 
 #include <h/mh.h>
 #include <fcntl.h>
-#include <signal.h>
 #include <h/mime.h>
 #include <h/utils.h>
 
@@ -81,8 +81,8 @@ DEFINE_SWITCH_ARRAY(WHATNOW, whatnowswitches);
     X("cd [directory]", 0, CDCMDSW) \
     X("pwd", 0, PWDCMDSW) \
     X("ls", 2, LSCMDSW) \
-    X("attach", 0, ATTACHCMDSW) \
-    X("detach [-n]", 2, DETACHCMDSW) \
+    X("attach [-v]", 0, ATTACHCMDSW) \
+    X("detach [-n]", 0, DETACHCMDSW) \
     X("alist [-ln] ", 2, ALISTCMDSW) \
 
 #define X(sw, minchars, id) id,
@@ -110,11 +110,7 @@ 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);
-
-
-#ifdef HAVE_LSTAT
 static int copyf (char *, char *);
-#endif
 
 
 int
@@ -398,18 +394,30 @@ WhatNow (int argc, char **argv)
 
            break;
 
-       case ATTACHCMDSW:
+       case ATTACHCMDSW: {
            /*
             *  Attach files to current draft.
             */
 
+            int verbose = 0;
+            char **ap;
+
            if (attach == (char *)0) {
                advise((char *)0, "can't attach because no header field name was given.");
                break;
            }
 
+           for (ap = argp+1; *ap; ++ap) {
+               if (strcmp(*ap, "-v") == 0) {
+                   ++argp;
+                   verbose = 1;
+               } else if (*ap[0] != '-') {
+                   break;
+               }
+           }
+
            if (*(argp+1) == (char *)0) {
-               advise((char *)0, "attach command requires file argument(s).");
+               advise(NULL, "attach command requires file argument(s).");
                break;
            }
 
@@ -417,7 +425,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), "-d", argp);
+           writelscmd(buf, sizeof(buf), "-d --", argp);
 
            /*
             *  Read back the response from the shell, which contains a number of lines
@@ -429,13 +437,28 @@ WhatNow (int argc, char **argv)
 
            if ((f = popen_in_dir(cwd, buf, "r")) != (FILE *)0) {
                while (fgets(shell, sizeof (shell), f) != (char *)0) {
+                   char *build_directive;
+
                    *(strchr(shell, '\n')) = '\0';
 
-                   if (*shell == '/')
+                   if (*shell == '/') {
                        (void)annotate(drft, attach, shell, 1, 0, -2, 1);
-                   else {
+                       if (verbose) {
+                           build_directive =
+                               construct_build_directive (shell, NULL, 1);
+                       }
+                   } else {
                        (void)sprintf(file, "%s/%s", cwd, shell);
                        (void)annotate(drft, attach, file, 1, 0, -2, 1);
+                       if (verbose) {
+                           build_directive =
+                               construct_build_directive (file, NULL, 1);
+                       }
+                   }
+
+                   if (verbose) {
+                       printf ("%s", build_directive);
+                       free (build_directive);
                    }
                }
 
@@ -446,7 +469,7 @@ WhatNow (int argc, char **argv)
            }
 
            break;
-
+       }
        case DETACHCMDSW:
            /*
             *  Detach files from current draft.
@@ -506,7 +529,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), "-d", 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';
@@ -580,7 +603,7 @@ writesomecmd(char *buf, int bufsz, char *cmd, char *trailcmd, char **argp)
 static void
 writelscmd(char *buf, int bufsz, char *lsoptions, char **argp)
 {
-  char *lscmd = concat ("ls ", lsoptions, " --", NULL);
+  char *lscmd = concat ("ls ", lsoptions, NULL);
   writesomecmd(buf, bufsz, lscmd, "", argp);
   free (lscmd);
 }
@@ -647,9 +670,7 @@ editfile (char **ed, char **arg, char *file, int use, struct msgs *mp,
     char *cp, *prog, **vec;
     struct stat st;
 
-#ifdef HAVE_LSTAT
     int        slinked = 0;
-#endif /* HAVE_LSTAT */
 
     /* Was there a previous edit session? */
     if (reedit) {
@@ -681,16 +702,12 @@ editfile (char **ed, char **arg, char *file, int use, struct msgs *mp,
 
        if (atfile) {
            unlink (linkpath);
-#ifdef HAVE_LSTAT
            if (link (altpath, linkpath) == NOTOK) {
                symlink (altpath, linkpath);
                slinked = 1;
            } else {
                slinked = 0;
            }
-#else /* not HAVE_LSTAT */
-           link (altpath, linkpath);
-#endif /* not HAVE_LSTAT */
        }
     }
 
@@ -741,7 +758,6 @@ editfile (char **ed, char **arg, char *file, int use, struct msgs *mp,
            }
 
            reedit++;
-#ifdef HAVE_LSTAT
            if (altmsg
                    && mp
                    && !is_readonly(mp)
@@ -754,16 +770,6 @@ editfile (char **ed, char **arg, char *file, int use, struct msgs *mp,
                                && (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);
-#endif /* HAVE_LSTAT */
     }
 
     /* normally, we remember which editor we used */
@@ -778,7 +784,6 @@ editfile (char **ed, char **arg, char *file, int use, struct msgs *mp,
 }
 
 
-#ifdef HAVE_LSTAT
 static int
 copyf (char *ifile, char *ofile)
 {
@@ -804,7 +809,6 @@ copyf (char *ifile, char *ofile)
     close (out);
     return i;
 }
-#endif /* HAVE_LSTAT */
 
 
 /*
@@ -1023,7 +1027,7 @@ check_draft (char *msgnam)
     X("saslmaxssf", SASLminc(-10), SASLMXSSFSW) \
     X("saslmech", SASLminc(-5), SASLMECHSW) \
     X("user", SASLminc(-4), USERSW) \
-    X("attach file", 6, SNDATTACHSW) \
+    X("attach fieldname", 6, SNDATTACHSW) \
     X("noattach", 0, SNDNOATTACHSW) \
     X("attachformat", 7, SNDATTACHFORMAT) \
     X("port server-port-name/number", 4, PORTSW) \
@@ -1062,9 +1066,6 @@ sendit (char *sp, char **arg, char *file, int pushed)
     char *cp, buf[BUFSIZ], **argp, *program;
     char **arguments, *savearg[MAXARGS], **vec;
     struct stat st;
-    char       *attach = NMH_ATTACH_HEADER;/* attachment header field name */
-    int                attachformat = 1;       /* mhbuild format specifier for
-                                          attachments */
 
 #ifndef        lint
     int        distsw = 0;
@@ -1122,13 +1123,19 @@ sendit (char *sp, char **arg, char *file, int pushed)
     vec[vecp++] = getcpy (m_maildir (""));
 
     if ((cp = context_find ("fileproc"))) {
-      vec[vecp++] = "-fileproc";
-      vec[vecp++] = cp;
+       vec[vecp++] = "-fileproc";
+       vec[vecp++] = cp;
     }
 
     if ((cp = context_find ("mhlproc"))) {
-      vec[vecp++] = "-mhlproc";
-      vec[vecp++] = cp;
+       vec[vecp++] = "-mhlproc";
+       vec[vecp++] = cp;
+    }
+
+    if ((cp = context_find ("credentials"))) {
+       /* post doesn't read context so need to pass credentials. */
+       vec[vecp++] = "-credentials";
+       vec[vecp++] = cp;
     }
 
     while ((cp = *argp++)) {
@@ -1236,28 +1243,14 @@ sendit (char *sp, char **arg, char *file, int pushed)
                    continue;
 
                case SNDATTACHSW:
-                   if (!(attach = *argp++) || *attach == '-') {
-                       advise (NULL, "missing argument to %s", argp[-2]);
-                       return;
-                   }
+                   advise(NULL, "The -attach switch is deprecated");
                    continue;
                case SNDNOATTACHSW:
-                   attach = NULL;
+                   advise(NULL, "The -noattach switch is deprecated");
                    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;
+                   advise(NULL, "The -attachformat switch is deprecated");
                    continue;
            }
        }
@@ -1312,7 +1305,7 @@ sendit (char *sp, char **arg, char *file, int pushed)
 
     closefds (3);
 
-    if (sendsbr (vec, vecp, program, file, &st, 1, attach, attachformat) == OK)
+    if (sendsbr (vec, vecp, program, file, &st, 1) == OK)
        done (0);
 }