chiark / gitweb /
Source code reorganization:
[disorder] / lib / sendmail.c
index 63daee1c11d4850cea04678787627e53223c77e5..8f753431c520ce4d41549c1d37915f789daa9cc5 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * This file is part of DisOrder
- * Copyright (C) 2007 Richard Kettlewell
+ * Copyright (C) 2007-2008 Richard Kettlewell
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * USA
  */
 
-#include <config.h>
-#include "types.h"
+#include "common.h"
 
-#include <stdio.h>
 #include <errno.h>
 #include <stdarg.h>
 #include <sys/socket.h>
@@ -29,6 +27,7 @@
 #include <unistd.h>
 #include <gcrypt.h>
 #include <time.h>
+#include <netinet/in.h>
 
 #include "syscalls.h"
 #include "log.h"
@@ -102,7 +101,7 @@ static int sendcommand(const char *tag, FILE *out, const char *fmt, ...) {
  * @param recipient Recipient address
  * @param subject Subject string
  * @param encoding Body encoding
- * @param body_type Content-type of body
+ * @param content_type Content-type of body
  * @param body Text of body (encoded, but \n for newline)
  * @return 0 on success, non-0 on error
  */
@@ -209,14 +208,10 @@ int sendmail(const char *sender,
   FILE *in, *out;
    
   static const struct addrinfo pref = {
-    0,
-    PF_INET,
-    SOCK_STREAM,
-    IPPROTO_TCP,
-    0,
-    0,
-    0,
-    0
+    .ai_flags = 0,
+    .ai_family = PF_INET,
+    .ai_socktype = SOCK_STREAM,
+    .ai_protocol = IPPROTO_TCP,
   };
 
   /* Find the SMTP server */
@@ -245,6 +240,37 @@ int sendmail(const char *sender,
   return rc;
 }
 
+/** @brief Start a subproces to send a mail message
+ * @param sender Sender address (can be "")
+ * @param pubsender Visible sender address (must not be "")
+ * @param recipient Recipient address
+ * @param subject Subject string
+ * @param encoding Body encoding
+ * @param content_type Content-type of body
+ * @param body Text of body (encoded, but \n for newline)
+ * @return Subprocess PID on success, -1 on error
+ */
+pid_t sendmail_subprocess(const char *sender,
+                          const char *pubsender,
+                          const char *recipient,
+                          const char *subject,
+                          const char *encoding,
+                          const char *content_type,
+                          const char *body) {
+  pid_t pid;
+
+  if(!(pid = fork())) {
+    exitfn = _exit;
+    if(sendmail(sender, pubsender, recipient, subject,
+                encoding, content_type, body))
+      _exit(1);
+    _exit(0);
+  }
+  if(pid < 0)
+    error(errno, "error calling fork");
+  return pid;
+}
+
 /*
 Local Variables:
 c-basic-offset:2