X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Fcitmail.c;h=bd4049008f6677c5e762307cf1a3289df0acd1b7;hb=HEAD;hp=f5c8da25de62385fb8de5fcc04c85a795b1dea23;hpb=a2a06e5d6767d0e45eeccf4032153764e8a5520f;p=citadel.git diff --git a/citadel/citmail.c b/citadel/citmail.c deleted file mode 100644 index f5c8da25d..000000000 --- a/citadel/citmail.c +++ /dev/null @@ -1,324 +0,0 @@ -/* - * $Id$ - * - * This program attempts to act like a local MDA if you're using sendmail or - * some other non-Citadel MTA. It basically just contacts the Citadel LMTP - * listener on a unix domain socket and transmits the message. - * - */ - -#include "sysdep.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "citadel.h" -#include "tools.h" -#ifndef HAVE_SNPRINTF -#include "snprintf.h" -#endif -#include "citadel_dirs.h" - -int serv_sock; -int debug = 0; - -void strip_trailing_nonprint(char *buf) -{ - while ( (!IsEmptyStr(buf)) && (!isprint(buf[strlen(buf) - 1])) ) - buf[strlen(buf) - 1] = 0; -} - - -void timeout(int signum) -{ - exit(signum); -} - - -int uds_connectsock(char *sockpath) -{ - int s; - struct sockaddr_un addr; - - memset(&addr, 0, sizeof(addr)); - addr.sun_family = AF_UNIX; - strncpy(addr.sun_path, sockpath, sizeof addr.sun_path); - - s = socket(AF_UNIX, SOCK_STREAM, 0); - if (s < 0) { - fprintf(stderr, "Can't create socket: %s\n", - strerror(errno)); - exit(3); - } - - if (connect(s, (struct sockaddr *) &addr, sizeof(addr)) < 0) { - fprintf(stderr, "can't connect: %s\n", - strerror(errno)); - close(s); - exit(3); - } - - return s; -} - - -/* - * input binary data from socket - */ -void serv_read(char *buf, int bytes) -{ - int len, rlen; - - len = 0; - while (len < bytes) { - rlen = read(serv_sock, &buf[len], bytes - len); - if (rlen < 1) { - return; - } - len = len + rlen; - } -} - - -/* - * send binary to server - */ -void serv_write(char *buf, int nbytes) -{ - int bytes_written = 0; - int retval; - while (bytes_written < nbytes) { - retval = write(serv_sock, &buf[bytes_written], - nbytes - bytes_written); - if (retval < 1) { - return; - } - bytes_written = bytes_written + retval; - } -} - - - -/* - * input string from socket - implemented in terms of serv_read() - */ -void serv_gets(char *buf) -{ - int i; - - /* Read one character at a time. - */ - for (i = 0;; i++) { - serv_read(&buf[i], 1); - if (buf[i] == '\n' || i == (SIZ-1)) - break; - } - - /* If we got a long line, discard characters until the newline. - */ - if (i == (SIZ-1)) - while (buf[i] != '\n') - serv_read(&buf[i], 1); - - /* Strip all trailing nonprintables (crlf) - */ - buf[i] = 0; - strip_trailing_nonprint(buf); - if (debug) fprintf(stderr, "> %s\n", buf); -} - - -/* - * send line to server - implemented in terms of serv_write() - */ -void serv_puts(char *buf) -{ - if (debug) fprintf(stderr, "< %s\n", buf); - serv_write(buf, strlen(buf)); - serv_write("\n", 1); -} - - - -void cleanup(int exitcode) { - char buf[1024]; - - if (exitcode != 0) { - fprintf(stderr, "Error while sending mail. Please check your Citadel configuration.\n"); - } - serv_puts("QUIT"); - serv_gets(buf); - exit(exitcode); -} - - - -int main(int argc, char **argv) { - char buf[1024]; - char fromline[1024]; - FILE *fp; - int i; - struct passwd *pw; - int from_header = 0; - int in_body = 0; - int relh=0; - int home=0; - char relhome[PATH_MAX]=""; - 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; - - for (i=1; ipw_name, hostname); - while (fgets(buf, 1024, stdin) != NULL) { - if ( ( (buf[0] == 13) || (buf[0] == 10)) && (in_body == 0) ) { - in_body = 1; - if (from_header == 0) { - fprintf(fp, "%s%s", fromline, buf); - } - } - if (!strncasecmp(buf, "From:", 5)) { - strcpy(fromline, buf); - if (in_body == 0) { - 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