HUGE PATCH. This moves all of mime_parser.c and all
[citadel.git] / citadel / citmail.c
index 58c0a61e48a6378be0fdbe4b56600431a1a2f0ad..f47d8f2ab3f43de5def3748793f3984b72acbf62 100644 (file)
@@ -22,6 +22,7 @@
 #include <errno.h>
 #include <stdarg.h>
 #include <limits.h>
+#include <libcitadel.h>
 #include "citadel.h"
 #ifndef HAVE_SNPRINTF
 #include "snprintf.h"
@@ -33,7 +34,7 @@ int debug = 0;
 
 void strip_trailing_nonprint(char *buf)
 {
-        while ( (strlen(buf)>0) && (!isprint(buf[strlen(buf) - 1])) )
+        while ( (!IsEmptyStr(buf)) && (!isprint(buf[strlen(buf) - 1])) )
                 buf[strlen(buf) - 1] = 0;
 }
 
@@ -153,7 +154,8 @@ void cleanup(int exitcode) {
        char buf[1024];
 
        if (exitcode != 0) {
-               fprintf(stderr, "Error while sending mail.  Please check your Citadel configuration.\n");
+               fprintf(stderr, "Error #%d occurred while sending mail.\n", exitcode);
+               fprintf(stderr, "Please check your Citadel configuration.\n");
        }
        serv_puts("QUIT");
        serv_gets(buf);
@@ -176,36 +178,55 @@ int main(int argc, char **argv) {
        char ctdldir[PATH_MAX]=CTDLDIR;
        char *sp, *ep;
        char hostname[256];
+       char **recipients = NULL;
+       int num_recipients = 0;
+       int to_or_cc = 0;
+       int read_recipients_from_headers = 0;
+       char *add_these_recipients = NULL;
+
+       CtdlInitBase64Table();
 
        for (i=1; i<argc; ++i) {
                if (!strcmp(argv[i], "-d")) {
                        debug = 1;
                }
+               else if (!strcmp(argv[i], "-t")) {
+                       read_recipients_from_headers = 1;
+               }
+               else if (argv[i][0] != '-') {
+                       ++num_recipients;
+                       recipients = realloc(recipients, (num_recipients * sizeof (char *)));
+                       recipients[num_recipients - 1] = strdup(argv[i]);
+               }
        }
               
        /* TODO: should we be able to calculate relative dirs? */
-       calc_dirs_n_files(relh, home, relhome, ctdldir);
+       calc_dirs_n_files(relh, home, relhome, ctdldir, 0);
 
        pw = getpwuid(getuid());
 
        fp = tmpfile();
        if (fp == NULL) return(errno);
-       serv_sock = uds_connectsock(file_lmtp_socket);
+       serv_sock = uds_connectsock(file_lmtp_socket);  /* FIXME: if called as 'sendmail' connect to file_lmtp_unfiltered_socket */
        serv_gets(buf);
-       if (buf[0]!='2') cleanup(1);
+       if (buf[0] != '2') {
+               fprintf(stderr, "%s\n", &buf[4]);
+               if (debug) fprintf(stderr, "Could not connect to LMTP socket.\n");
+               cleanup(1);
+       }
 
        sp = strchr (buf, ' ');
-       if (sp == NULL) cleanup(1);
+       if (sp == NULL) {
+               if (debug) fprintf(stderr, "Could not calculate hostname.\n");
+               cleanup(2);
+       }
        sp ++;
        ep = strchr (sp, ' ');
-       if (ep == NULL) cleanup(1);
+       if (ep == NULL) cleanup(3);
        *ep = '\0';
        strncpy(hostname, sp, sizeof hostname);
 
-       snprintf(fromline, sizeof fromline, "From: %s@%s",
-                pw->pw_name,
-                hostname
-       );
+       snprintf(fromline, sizeof fromline, "From: %s@%s", pw->pw_name, hostname);
        while (fgets(buf, 1024, stdin) != NULL) {
                if ( ( (buf[0] == 13) || (buf[0] == 10)) && (in_body == 0) ) {
                        in_body = 1;
@@ -219,6 +240,43 @@ int main(int argc, char **argv) {
                                from_header = 1;
                        }
                }
+
+               if (read_recipients_from_headers) {
+                       add_these_recipients = NULL;
+                       if ((isspace(buf[0])) && (to_or_cc)) {
+                               add_these_recipients = buf;
+                       }
+                       else {
+                               if ((!strncasecmp(buf, "To:", 3)) || (!strncasecmp(buf, "Cc:", 3))) {
+                                       to_or_cc = 1;
+                               }
+                               else {
+                                       to_or_cc = 0;
+                               }
+                               if (to_or_cc) {
+                                       add_these_recipients = &buf[3];
+                               }
+                       }
+
+                       if (add_these_recipients) {
+                               int num_recp_on_this_line;
+                               char this_recp[256];
+
+                               num_recp_on_this_line = num_tokens(add_these_recipients, ',');
+                               for (i=0; i<num_recp_on_this_line; ++i) {
+                                       extract_token(this_recp, add_these_recipients,
+                                               i, ',', sizeof this_recp);
+                                       striplt(this_recp);
+                                       if (!IsEmptyStr(this_recp)) {
+                                               ++num_recipients;
+                                               recipients = realloc(recipients,
+                                                       (num_recipients * sizeof (char *)));
+                                               recipients[num_recipients - 1] = strdup(this_recp);
+                                       }
+                               }
+                       }
+               }
+
                fprintf(fp, "%s", buf);
        }
        strip_trailing_nonprint(fromline);
@@ -229,25 +287,24 @@ int main(int argc, char **argv) {
                serv_gets(buf);
                strcat(buf, "    ");
        } while (buf[3] == '-');
-       if (buf[0] != '2') cleanup(1);
+       if (buf[0] != '2') cleanup(4);
 
        snprintf(buf, sizeof buf, "MAIL %s", fromline);
        serv_puts(buf);
        serv_gets(buf);
-       if (buf[0] != '2') cleanup(1);
+       if (buf[0] != '2') cleanup(5);
 
-       for (i=1; i<argc; ++i) {
-               if (argv[i][0] != '-') {
-                       snprintf(buf, sizeof buf, "RCPT To: %s", argv[i]);
-                       serv_puts(buf);
-                       serv_gets(buf);
-                       /* if (buf[0] != '2') cleanup(1); */
-               }
+       for (i=0; i<num_recipients; ++i) {
+               snprintf(buf, sizeof buf, "RCPT To: %s", recipients[i]);
+               serv_puts(buf);
+               serv_gets(buf);
+               free(recipients[i]);
        }
+       free(recipients);
 
        serv_puts("DATA");
        serv_gets(buf);
-       if (buf[0]!='3') cleanup(1);
+       if (buf[0]!='3') cleanup(6);
 
        rewind(fp);
        while (fgets(buf, sizeof buf, fp) != NULL) {
@@ -257,7 +314,8 @@ int main(int argc, char **argv) {
        serv_puts(".");
        serv_gets(buf);
        if (buf[0] != '2') {
-               cleanup(1);
+               fprintf(stderr, "%s\n", &buf[4]);
+               cleanup(7);
        }
        else {
                cleanup(0);