** 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.
+** The inclusion of attachments is eased by
+** using the header field name mechanism added to anno and send.
+** The header field name for attachments is predefined.
**
** Several commands have been added at the whatnow prompt:
**
{ "version", 0 },
#define HELPSW 4
{ "help", 0 },
-#define ATTACHSW 5
- { "attach header-field-name", 0 },
{ NULL, 0 }
};
{ "edit [<editor> <switches>]", 0 },
#define REFILEOPT 1
{ "refile [<switches>] +folder", 0 },
-#define BUILDMIMESW 2
- { "mime [<switches>]", 0 },
-#define DISPSW 3
+#define DISPSW 2
{ "display [<switches>]", 0 },
-#define LISTSW 4
+#define LISTSW 3
{ "list [<switches>]", 0 },
-#define SENDSW 5
+#define SENDSW 4
{ "send [<switches>]", 0 },
-#define PUSHSW 6
+#define PUSHSW 5
{ "push [<switches>]", 0 },
-#define QUITSW 7
+#define QUITSW 6
{ "quit [-delete]", 0 },
-#define DELETESW 8
+#define DELETESW 7
{ "delete", 0 },
-#define CDCMDSW 9
+#define CDCMDSW 8
{ "cd [directory]", 0 },
-#define PWDCMDSW 10
+#define PWDCMDSW 9
{ "pwd", 0 },
-#define LSCMDSW 11
+#define LSCMDSW 10
{ "ls", 0 },
-#define ATTACHCMDSW 12
+#define ATTACHCMDSW 11
{ "attach", 0 },
-#define DETACHCMDSW 13
+#define DETACHCMDSW 12
{ "detach [-n]", 2 },
-#define ALISTCMDSW 14
+#define ALISTCMDSW 13
{ "alist [-ln] ", 2 },
{ NULL, 0 }
};
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 void writelscmd(char *, int, char **);
static void writesomecmd(char *buf, int bufsz, char *cmd, char *trailcmd, char **argp);
char buf[BUFSIZ], prompt[BUFSIZ];
char **argp, **arguments;
struct stat st;
- char *attach = NULL; /* 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 */
argp[-2]);
continue;
- case ATTACHSW:
- if (attach != NULL)
- adios(NULL, "only one attachment header field name at a time!");
- if (!(attach = *argp++) || *attach == '-')
- adios(NULL, "missing argument to %s",
- argp[-2]);
- continue;
}
}
if (drft)
advise(NULL, "no alternate message to display");
break;
- case BUILDMIMESW:
- /* Translate MIME composition file */
- buildfile(++argp, drft);
- break;
-
case EDITSW:
/* Call an editor on the draft file */
if (*++argp)
** -n numbers listing
*/
- if (attach == NULL) {
- advise(NULL, "can't list because no header field name was given.");
- break;
- }
-
l = NULL;
n = 0;
advise(NULL, "usage is alist [-ln].");
else
- annolist(drft, attach, l, n);
+ annolist(drft, attach_hdr, l, n);
break;
** Attach files to current draft.
*/
- if (attach == NULL) {
- advise(NULL, "can't attach because no header field name was given.");
- break;
- }
-
if (*(argp+1) == NULL) {
advise(NULL, "attach command requires file argument(s).");
break;
** 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)
!= NULL) {
*(strchr(shell, '\n')) = '\0';
if (*shell == '/')
- annotate(drft, attach, shell,
- 1, 0, -2, 1);
+ annotate(drft, attach_hdr,
+ shell, 1, 0,
+ -2, 1);
else {
sprintf(file, "%s/%s", cwd,
shell);
- annotate(drft, attach, file,
- 1, 0, -2, 1);
+ annotate(drft, attach_hdr,
+ file, 1, 0,
+ -2, 1);
}
}
case DETACHCMDSW:
/*
** Detach files from current draft.
- */
-
- if (attach == NULL) {
- advise(NULL, "can't detach because no header field name was given.");
- break;
- }
-
- /*
+ **
** Scan the arguments for a -n. Mixed file
** names and numbers aren't allowed, so this
** catches a -n anywhere in the argument list.
if (**arguments != '\0') {
n = atoi(*arguments);
- annotate(drft, attach, NULL,
- 1, 0, n, 1);
+ annotate(drft, attach_hdr,
+ NULL, 1, 0,
+ n, 1);
for (argp = arguments + 1; *argp != NULL; argp++) {
if (atoi(*argp) > n) {
while (fgets(shell, sizeof (shell), f)
!= NULL) {
*(strchr(shell, '\n')) = '\0';
- annotate(drft, attach, shell,
+ annotate(drft, attach_hdr, shell,
1, 0, 0, 1);
}
pclose(f);
#ifdef HAVE_LSTAT
int slinked = 0;
-#if 0
- int oumask; /* PJS: for setting permissions on symlinks. */
-#endif
#endif /* HAVE_LSTAT */
/* Was there a previous edit session? */
unlink(linkpath);
#ifdef HAVE_LSTAT
if (link(altpath, linkpath) == NOTOK) {
-#if 0
- /* I don't think permission on symlinks matters /JLR */
- /* PJS: else symlinks are world 'r' */
- oumask = umask(0044);
-#endif
symlink(altpath, linkpath);
-#if 0
- umask(oumask); /* PJS: else symlinks are world 'r' */
-#endif
slinked = 1;
} else {
slinked = 0;
int i, vecp;
char *cp, *sp, *vec[MAXARGS];
- /* Translate MIME composition file, if necessary */
- if ((cp = context_find("automimeproc")) && (strcmp(cp, "1")==0) &&
- !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)))
- return 0;
-
/*
** If the sendproc is the nmh command `send', then we call
** those routines directly rather than exec'ing the command.
}
-/*
-** Translate MIME composition file (call buildmimeproc)
-*/
-
-static int
-buildfile(char **argp, char *file)
-{
- int i;
- char **args, *ed;
-
- ed = buildmimeproc;
-
- /* allocate space for arguments */
- i = 0;
- if (argp) {
- while (argp[i])
- i++;
- }
- args = (char **) mh_xmalloc((i + 2) * sizeof(char *));
-
- /*
- ** For backward compatibility, we need to add -build
- ** if we are using mhn as buildmimeproc
- */
- i = 0;
- if (strcmp(mhbasename(ed), "mhn") == 0)
- args[i++] = "-build";
-
- /* copy any other arguments */
- while (argp && *argp)
- args[i++] = *argp++;
- args[i] = NULL;
-
- i = editfile(&ed, args, file, NOUSE, NULL, NULL, NULL, 0);
- free(args);
-
- return (i ? NOTOK : OK);
-}
-
-
-/*
-** Check if draft is a mhbuild composition file
-*/
-
-static int
-check_draft(char *msgnam)
-{
- int state;
- char buf[BUFSIZ], name[NAMESZ];
- FILE *fp;
-
- if ((fp = fopen(msgnam, "r")) == NULL)
- return 0;
- for (state = FLD;;)
- 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);
- return 0;
- }
- while (state == FLDPLUS)
- state = m_getfld(state, name, buf,
- sizeof(buf), fp);
- break;
-
- case BODY:
- do {
- char *bp;
-
- for (bp = buf; *bp; bp++)
- if (*bp != ' ' && *bp != '\t' &&
- *bp != '\n') {
- fclose(fp);
- return 1;
- }
-
- state = m_getfld(state, name, buf,
- sizeof(buf), fp);
- } while (state == BODY);
- /* and fall... */
-
- default:
- fclose(fp);
- return 0;
- }
-}
-
-
static struct swit sendswitches[] = {
#define ALIASW 0
{ "alias aliasfile", 0 },
{ "server host", 6 },
#define SNOOPSW 31
{ "snoop", -5 },
-#define SNDATTACHSW 32
- { "attach file", 6 },
-#define SNDATTACHFORMAT 33
- { "attachformat", 7 },
-#define PORTSW 34
+#define PORTSW 32
{ "port server-port-name/number", 4 },
{ NULL, 0 }
};
char *cp, buf[BUFSIZ], **argp;
char **arguments, *vec[MAXARGS];
struct stat st;
- char *attach = NULL; /* attachment header field name */
- int attachformat = 0; /* mhbuild format specifier for attachments */
#ifndef lint
int distsw = 0;
#endif
-#ifdef UCI
- FILE *fp;
-#endif
/*
** Make sure these are defined. In particular, we need
vec[vecp++] = cp;
continue;
- case SNDATTACHSW:
- 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]);
- else {
- attachformat = atoi(*argp);
- if (attachformat < 0 || attachformat > ATTACHFORMATS - 1) {
- advise(NULL, "unsupported attachformat %d", attachformat);
- continue;
- }
- }
- ++argp;
- continue;
}
}
advise(NULL, "usage: %s [switches]", sp);
}
}
- if ((cp = getenv("SIGNATURE")) == NULL || *cp == 0)
+ if (!(cp = getenv("SIGNATURE")) || !*cp)
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);
- }
- }
-#endif /* UCI */
if ((annotext = getenv("mhannotate")) == NULL || *annotext == 0)
annotext = NULL;
vec[0] = mhbasename(postproc);
closefds(3);
- if (sendsbr(vec, vecp, file, &st, 1, attach, attachformat) == OK)
+ if (sendsbr(vec, vecp, file, &st, 1) == OK)
done(0);
}