#include <h/utils.h>
#include <sysexits.h>
#include <sys/wait.h>
+#include <unistd.h>
+#include <ctype.h>
+#include <sys/stat.h>
+#include <locale.h>
#ifdef HAVE_SYS_TIME_H
# include <sys/time.h>
#endif
#include <time.h>
+#ifdef HAVE_SYS_PARAM_H
+# include <sys/param.h>
+#endif
+
int debugsw = 0; /* global */
char *altmsg = NULL;
char *annotext = NULL;
{ NULL, 0 }
};
+char *version=VERSION;
int
main(int argc, char **argv)
int msgnum, status;
int in, out;
int n;
- char *cp, *maildir = NULL;
+ char *cp, *maildir = NULL, *folder = NULL;
char buf[BUFSIZ], **argp, **arguments;
char *msgs[MAXARGS], *vec[MAXARGS];
char *files[MAXARGS];
switch (smatch(++cp, switches)) {
case AMBIGSW:
ambigsw(cp, switches);
- exit(1);
+ exit(EX_USAGE);
case UNKWNSW:
- adios(NULL, "-%s unknown\n", cp);
+ adios(EX_USAGE, NULL, "-%s unknown\n", cp);
case HELPSW:
snprintf(buf, sizeof(buf),
"%s [file] [switches]",
invo_name);
print_help(buf, switches, 1);
- exit(0);
+ exit(argc == 2 ? EX_OK : EX_USAGE);
case VERSIONSW:
print_version(invo_name);
- exit(0);
+ exit(argc == 2 ? EX_OK : EX_USAGE);
case DEBUGSW:
debugsw++;
vec[vecp++] = --cp;
continue;
}
+ } else if (*cp == '+' || *cp == '@') {
+ if (folder) {
+ adios(EX_USAGE, NULL, "only one folder at a time!");
+ } else {
+ folder = mh_xstrdup(expandfol(cp));
+ }
} else {
if (*cp == '/') {
files[nfiles++] = cp;
}
if (nmsgs) {
- maildir = toabsdir(draftfolder);
+ folder = folder ? folder : draftfolder;
+ maildir = toabsdir(folder);
if (chdir(maildir) == NOTOK) {
- adios(maildir, "unable to change directory to");
+ adios(EX_OSERR, maildir, "unable to change directory to");
}
- if (!(mp = folder_read(draftfolder))) {
- adios(NULL, "unable to read draft folder %s",
- draftfolder);
+ if (!(mp = folder_read(folder))) {
+ adios(EX_IOERR, NULL, "unable to read folder %s",
+ folder);
}
if (mp->nummsg == 0) {
- adios(NULL, "no messages in draft folder %s",
- draftfolder);
+ adios(EX_DATAERR, NULL, "no messages in folder %s",
+ folder);
}
/* parse all the msgranges/sequences and set SELECTED */
for (msgnum = 0; msgnum < nmsgs; msgnum++) {
if (!m_convert(mp, msgs[msgnum])) {
- exit(1);
+ exit(EX_USAGE);
}
}
seq_setprev(mp);
for (nmsgs = 0, msgnum = mp->lowsel;
msgnum <= mp->hghsel; msgnum++) {
if (is_selected(mp, msgnum)) {
- files[nfiles++] = getcpy(m_name(msgnum));
+ files[nfiles++] = mh_xstrdup(m_name(msgnum));
unset_exists(mp, msgnum);
}
}
for (n = 0; n < nfiles; n++) {
if (stat(files[n], &st) == NOTOK) {
- adios(files[n], "unable to stat draft file");
+ adios(EX_IOERR, files[n], "unable to stat draft file");
}
}
if ((cp = getenv("mhdist")) && *cp && (distsw = atoi(cp)) && altmsg) {
vec[vecp++] = "-dist";
if ((in = open(altmsg, O_RDONLY)) == NOTOK) {
- adios(altmsg, "unable to open for reading");
+ adios(EX_IOERR, altmsg, "unable to open for reading");
}
fstat(in, &st2);
- distfile = getcpy(m_mktemp2(NULL, invo_name, NULL, NULL));
+ distfile = mh_xstrdup(m_mktemp2(NULL, invo_name, NULL, NULL));
if ((out = creat(distfile, (int)st2.st_mode & 0777))==NOTOK) {
- adios(distfile, "unable to open for writing");
+ adios(EX_IOERR, distfile, "unable to open for writing");
}
cpydata(in, out, altmsg, distfile);
close(in);
*/
switch (attach(drft)) {
case OK:
+ /* successfully MIMEified: use generate draft */
drft = composition_file_name;
break;
return (NOTOK);
case DONE:
+ /* already in MIME format: keep original draft */
break;
}
{
char buf[MAXPATHLEN + 6];
int c;
- int has_attachment;
- int has_body;
- int non_ascii; /* msg body contains non-ASCII chars */
- int length; /* length of attachment header field name */
+ int length = strlen(attach_hdr);
char *p;
- if (!(draft_file = fopen(draft_file_name, "r"))) {
- adios(NULL, "can't open draft file `%s'.", draft_file_name);
- }
-
- /* We'll grow the buffer as needed. */
- field = (char *)mh_xmalloc(field_size = 256);
-
- /*
- ** Scan the draft file for an attachment header field name.
- */
- length = strlen(attach_hdr);
- has_attachment = 0;
- while (get_line() != EOF && *field != '\0' && *field != '-') {
- if (strncasecmp(field, attach_hdr, length)==0 &&
- field[length] == ':') {
- has_attachment = 1;
- }
+ if(distfile) {
+ return DONE;
}
- /*
- ** Look for at least one non-blank line in the body of the
- ** message which indicates content in the body.
- ** Check if body contains at least one non-blank (= not empty)
- ** and if it contains any non-ASCII chars (= need MIME).
- */
- has_body = 0;
- non_ascii = 0;
- while (get_line() != EOF) {
- for (p = field; *p != '\0'; p++) {
- if (*p != ' ' && *p != '\t') {
- has_body = 1;
- }
- if (*p > 127 || *p < 0) {
- non_ascii = 1;
- }
- }
- if (has_body && non_ascii) {
- break; /* that's been already enough information */
- }
+ if (!(draft_file = fopen(draft_file_name, "r"))) {
+ adios(EX_IOERR, NULL, "can't open draft file `%s'.", draft_file_name);
}
- if (!has_attachment && non_ascii==0) {
- /* We don't need to convert it to MIME. */
- return DONE;
- }
+ /* We'll grow the buffer as needed. */
+ field = mh_xcalloc(field_size = 256, sizeof(char));
/*
- ** Else: mimify
+ ** MIMEify
*/
/* Make names for the temporary files. */
m_mktemp(toabsdir(invo_name), NULL, NULL),
sizeof (composition_file_name));
- if (has_body) {
- body_file = fopen(body_file_name, "w");
- }
+ body_file = fopen(body_file_name, "w");
composition_file = fopen(composition_file_name, "w");
- if ((has_body && !body_file) || !composition_file) {
+ if (!body_file || !composition_file) {
clean_up_temporary_files();
- adios(NULL, "unable to open all of the temporary files.");
+ adios(EX_IOERR, NULL, "unable to open all of the temporary files.");
}
/* Copy non-attachment header fields to the temp composition file. */
rewind(draft_file);
while (get_line() != EOF && *field && *field != '-') {
+ if (strncasecmp(field, VRSN_FIELD, strlen(VRSN_FIELD))==0 &&
+ field[strlen(VRSN_FIELD)] == ':') {
+ /*
+ ** The draft is already in MIME format, thus
+ ** back out and use the original draft file.
+ */
+ clean_up_temporary_files();
+ return DONE;
+ }
+
if (strncasecmp(field, attach_hdr, length) != 0 ||
field[length] != ':') {
fprintf(composition_file, "%s\n", field);
}
fputs("--------\n", composition_file);
- if (has_body) {
- /* Copy the message body to the temporary file. */
- while ((c = getc(draft_file)) != EOF) {
- putc(c, body_file);
- }
- fclose(body_file);
-
- /* Add a mhbuild MIME composition file line for the body */
- /* charset will be discovered/guessed by mhbuild */
- fprintf(composition_file, "#text/plain %s\n", body_file_name);
+ /* Copy the message body to the temporary file. */
+ while ((c = getc(draft_file)) != EOF) {
+ putc(c, body_file);
}
+ fclose(body_file);
+
+ /* Add a mhbuild MIME composition file line for the body */
+ /* charset will be discovered/guessed by mhbuild */
+ fprintf(composition_file, "#text/plain %s\n", body_file_name);
/*
** Now, go back to the beginning of the draft file and look for
int doenc = 0;
int ret;
+ if(distfile) {
+ return DONE;
+ }
+
if (!(draft_file = fopen(draft_file_name, "r"))) {
- adios(NULL, "can't open draft file `%s'.", draft_file_name);
+ adios(EX_IOERR, NULL, "can't open draft file `%s'.", draft_file_name);
}
/* We'll grow the buffer as needed. */
- field = (char *)mh_xmalloc(field_size = 256);
+ field = mh_xcalloc(field_size = 256, sizeof(char));
/* Scan the draft file for an attachment header field name. */
while (get_line() != EOF && *field != '\0' && *field != '-') {
break;
}
if (++n >= field_size - 1) {
- field = (char *)mh_xrealloc(field, field_size += 256);
+ field = mh_xrealloc(field, field_size += 256);
p = field + n - 1;
}
}
if (!(fp = popen(cmdbuf, "r"))) {
clean_up_temporary_files();
- adios(NULL, "unable to determine content type with `%s'",
+ adios(EX_IOERR, NULL, "unable to determine content type with `%s'",
cmdbuf);
}
if (fgets(content_type, sizeof content_type, fp) &&
/* TODO: don't use access(2) because it checks for ruid, not euid */
if (access(file_name, R_OK) != 0) {
clean_up_temporary_files();
- adios(NULL, "unable to access file `%s'", file_name);
+ adios(EX_IOERR, NULL, "unable to access file `%s'", file_name);
}
/* Check for broken file(1). See man page mh-profile(5). */
for (cp=content_type; *cp; cp++) {
if (isspace(*cp)) {
if (!semicolon) {
- adios(NULL, "Sorry, your Mime-Type-Query command (%s) is broken.\n\tThe output misses a semicolon before the whitespace.\n\tOutput was: %s", cmd, content_type);
+ adios(EX_SOFTWARE, NULL, "Sorry, your Mime-Type-Query command (%s) is broken.\n\tThe output misses a semicolon before the whitespace.\n\tOutput was: %s", cmd, content_type);
}
} else if (*cp == ';') {
semicolon = 1;
execvp(*vec, vec);
fprintf(stderr, "unable to exec ");
perror(*vec);
- _exit(-1);
+ _exit(EX_OSERR);
break; /* NOT REACHED */
default:
}
}
-
return status ? NOTOK : status;
}