*
* Copyright (C) 2008 by Vladimir Dronnikov <dronnikov@gmail.com>
*
- * Licensed under GPLv2, see file LICENSE in this tarball for details.
+ * Licensed under GPLv2, see file LICENSE in this source tree.
*/
#include "libbb.h"
#include "mail.h"
...random junk added by mailing list robots and such...
*/
+/* man makemime:
+
+ * -c TYPE: create a (non-multipart) MIME section with Content-Type: TYPE
+ * makemime -c TYPE [-e ENCODING] [-o OUTFILE] [-C CHARSET] [-N NAME] [-a HEADER...] FILE
+ * The -C option sets the MIME charset attribute for text/plain content.
+ * The -N option sets the name attribute for Content-Type:
+ * Encoding must be one of the following: 7bit, 8bit, quoted-printable, or base64.
+
+ * -m multipart/TYPE: create a multipart MIME collection with Content-Type: multipart/TYPE
+ * makemime -m multipart/TYPE [-e ENCODING] [-o OUTFILE] [-a HEADER...] FILE
+ * Type must be either "multipart/mixed", "multipart/alternative", or some other MIME multipart content type.
+ * Additionally, encoding can only be "7bit" or "8bit", and will default to "8bit" if not specified.
+ * Finally, filename must be a MIME-formatted section, NOT a regular file.
+ * The -m option creates an initial multipart MIME collection, that contains only one MIME section, taken from filename.
+ * The collection is written to standard output, or the pipe or to outputfile.
+
+ * -j FILE1: add a section to a multipart MIME collection
+ * makemime -j FILE1 [-o OUTFILE] FILE2
+ * FILE1 must be a MIME collection that was previously created by the -m option.
+ * FILE2 must be a MIME section that was previously created by the -c option.
+ * The -j options adds the MIME section in FILE2 to the MIME collection in FILE1.
+ */
int makemime_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
int makemime_main(int argc UNUSED_PARAM, char **argv)
{
#define boundary opt_output
enum {
- OPT_c = 1 << 0, // Content-Type:
+ OPT_c = 1 << 0, // create (non-multipart) section
OPT_e = 1 << 1, // Content-Transfer-Encoding. Ignored. Assumed base64
OPT_o = 1 << 2, // output to
OPT_C = 1 << 3, // charset
OPT_N = 1 << 4, // COMPAT
OPT_a = 1 << 5, // additional headers
- OPT_m = 1 << 6, // COMPAT
- OPT_j = 1 << 7, // COMPAT
+ //OPT_m = 1 << 6, // create mutipart section
+ //OPT_j = 1 << 7, // join section to multipart section
};
INIT_G();
// parse options
opt_complementary = "a::";
opts = getopt32(argv,
- "c:e:o:C:N:a:m:j:",
- &G.content_type, NULL, &opt_output, &G.opt_charset, NULL, &opt_headers, NULL, NULL
+ "c:e:o:C:N:a", //:m:j:",
+ &G.content_type, NULL, &opt_output, &G.opt_charset, NULL, &opt_headers //, NULL, NULL
);
//argc -= optind;
argv += optind;
static const char *find_token(const char *const string_array[], const char *key, const char *defvalue)
{
const char *r = NULL;
- for (int i = 0; string_array[i] != 0; i++) {
+ int i;
+ for (i = 0; string_array[i] != NULL; i++) {
if (strcasecmp(string_array[i], key) == 0) {
r = (char *)string_array[i+1];
break;
// prepare unique string pattern
uniq = xasprintf("%%llu.%u.%s", (unsigned)getpid(), safe_gethostname());
-//bb_info_msg("PARSE[%s]", terminator);
+//bb_info_msg("PARSE[%s]", uniq);
while ((line = xmalloc_fgets_str(stdin, "\r\n\r\n")) != NULL) {
xsetenv("CHARSET", charset);
xsetenv("ENCODING", encoding);
xsetenv("FILENAME", filename);
- BB_EXECVP(*argv, argv);
- _exit(EXIT_FAILURE);
+ BB_EXECVP_or_die(argv);
}
// parent dumps to fd[1]
close(fd[0]);
- fp = fdopen(fd[1], "w");
+ fp = xfdopen_for_write(fd[1]);
signal(SIGPIPE, SIG_IGN); // ignore EPIPE
// or create a file for dump
} else {
// dump to fp
if (0 == strcasecmp(encoding, "base64")) {
- decode_base64(stdin, fp);
+ read_base64(stdin, fp, '-');
} else if (0 != strcasecmp(encoding, "7bit")
&& 0 != strcasecmp(encoding, "8bit")
) {
if (opts & OPT_X) {
signal(SIGPIPE, SIG_DFL);
// exit if helper exited >0
- rc = wait4pid(pid);
+ rc = (wait4pid(pid) & 0xff);
if (rc)
return rc+20;
}
}
}
next:
- free(line);
+ free(line);
}
//bb_info_msg("ENDPARSE[%s]", boundary);