* 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 [-a 0|1|2]] files
+ * This option attaches the named files to
+ * the draft. -v displays the mhbuild
+ * directive, using the optionally specified
+ * attachformat [-a] if that is also provided
+ * to send(1).
*
* alist [-ln] This option lists the attachments on the
* draft. -l gets long listings, -n gets
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 [-a 0|1|2]]", 0, ATTACHCMDSW) \
+ X("detach [-n]", 0, DETACHCMDSW) \
X("alist [-ln] ", 2, ALISTCMDSW) \
#define X(sw, minchars, id) id,
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
break;
- case ATTACHCMDSW:
+ case ATTACHCMDSW: {
/*
* Attach files to current draft.
*/
+ int verbose = 0;
+ int attachformat = 1;
+ 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 (strcmp(*ap, "-a") == 0) {
+ ++argp;
+ if (*(ap+1) == NULL ||
+ ! isdigit ((unsigned char) *(ap+1)[0])) {
+ advise(NULL,
+ "ignoring attach -a without format argument.");
+ } else {
+ ++argp;
+ ++ap;
+ if ((attachformat = atoi(*ap)) > 2) {
+ advise(NULL,
+ "ingoring invalid attachformat value of %d",
+ attachformat);
+ attachformat = 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;
}
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,
+ attachformat);
+ }
+ } 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,
+ attachformat);
+ }
+ }
+
+ if (verbose) {
+ printf ("%s", build_directive);
+ free (build_directive);
}
}
}
break;
-
+ }
case DETACHCMDSW:
/*
* Detach files from current draft.
char *cp, *prog, **vec;
struct stat st;
-#ifdef HAVE_LSTAT
int slinked = 0;
-#endif /* HAVE_LSTAT */
/* Was there a previous edit session? */
if (reedit) {
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 */
}
}
}
reedit++;
-#ifdef HAVE_LSTAT
if (altmsg
&& mp
&& !is_readonly(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 */
}
-#ifdef HAVE_LSTAT
static int
copyf (char *ifile, char *ofile)
{
close (out);
return i;
}
-#endif /* HAVE_LSTAT */
/*
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) \