Revision bump
[mmondor.git] / mmsoftware / mmmail / src / mmsmtpd / mmsmtpd.h
index 0c6f2af..4d21fa2 100644 (file)
@@ -1,7 +1,7 @@
-/* $Id: mmsmtpd.h,v 1.40 2007/04/03 10:49:53 mmondor Exp $ */
+/* $Id: mmsmtpd.h,v 1.49 2009/01/17 03:48:20 mmondor Exp $ */
 
 /*
- * Copyright (C) 2001-2007, Matthew Mondor
+ * Copyright (C) 2001-2008, Matthew Mondor
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -18,6 +18,8 @@
  * 4. The name of Matthew Mondor may not be used to endorse or promote
  *    products derived from this software without specific prior written
  *    permission.
+ * 5. Redistribution of source code may not be released under the terms of
+ *    any GNU Public License derivate.
  *
  * THIS SOFTWARE IS PROVIDED BY MATTHEW MONDOR ``AS IS'' AND ANY EXPRESS OR
  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
@@ -43,6 +45,8 @@
 /* HEADERS */
 
 #include <sys/types.h>
+#include <stdbool.h>
+#include <stdint.h>
 #include <time.h>
 
 #include <pthread.h>
@@ -64,7 +68,7 @@
 
 /* DEFINITIONS */
 #define DAEMON_NAME    "mmsmtpd"
-#define DAEMON_VERSION "mmmail-0.2.2/mmondor"
+#define DAEMON_VERSION "mmmail-0.3.2/mmondor"
 
 /* Negative states are used by the state swapper, others are real states */
 #define STATE_ERROR    -3
@@ -93,7 +97,9 @@ enum data_reason {
     DATA_SUBMIT = 0,
     DATA_OK,
     DATA_OVERFLOW,
+    DATA_TIMEOUT,
     DATA_HOPS,
+    DATA_HEADER,
     DATA_INTERNAL,
     DATA_MAX
 };
@@ -105,6 +111,7 @@ enum data_reason {
 
 /* Custom fdbreadbuf() return result */
 #define CFDBRB_HOPS    -1
+#define CFDBRB_HEADER  -2
 
 /* Asynchroneous functions we attach */
 #define ASYNC_RESQUERY 1
@@ -137,9 +144,10 @@ typedef struct config {
        MAX_DATA_LINES, MAX_DATA_SIZE, MAX_HOPS, FLOOD_MESSAGES,
        FLOOD_EXPIRES, FLOOD_CACHE, ASYNC_PROCESSES;
     bool RESOLVE_HOSTS, RESOLVE_HELO, RESOLVE_MX_MAIL, RESOLVE_MX_RCPT,
-       REQUIRE_HELO, FLOOD_PROTECTION, STATFAIL_ADDRESS, STATFAIL_RELAY,
-       STATFAIL_FLOOD, STATFAIL_FULL, STATFAIL_TIMEOUT, STATFAIL_EOF,
-       STATFAIL_FILTER, DELAY_ON_ERROR, RELAYING;
+       REQUIRE_HELO, FLOOD_PROTECTION, STATFAIL_HELO, STATFAIL_NOHELO,
+       STATFAIL_NOFROM, STATFAIL_ADDRESS, STATFAIL_RELAY, STATFAIL_FLOOD,
+       STATFAIL_FULL, STATFAIL_TIMEOUT, STATFAIL_EOF, STATFAIL_FILTER,
+       DELAY_ON_ERROR, RELAYING;
 } CONFIG;
 
 
@@ -170,7 +178,7 @@ typedef struct clientenv {
 typedef struct rcptnode {
     pnode_t node;
     char address[64], foraddress[64];
-    u_int64_t hash;
+    uint64_t hash;
     bool relay;                /* Non-local */
 } rcptnode;
 
@@ -209,14 +217,14 @@ typedef struct command {
 
 /* Information for a mailbox */
 struct box_info {
-    long       max_size, size, max_msgs, msgs;
-    bool       filter, filter_type;
+    long max_size, size, max_msgs, msgs;
+    bool filter, filter_type;
 };
 
 /* For fast command lookup */
 struct commandnode {
     hashnode_t node;
-    u_int32_t hash;
+    uint32_t hash;
     struct command *command;
     int index;
 };
@@ -274,7 +282,7 @@ static int all_data(clientenv *);
 static int all_beer(clientenv *);
 
 static bool hash_commands(struct command *, size_t);
-static u_int32_t commandnode_keyhash(const void *, size_t);
+static uint32_t commandnode_keyhash(const void *, size_t);
 static int commandnode_keycmp(const void *, const void *, size_t);
 static bool reply(fdbuf *, int, bool, const char *, ...);
 
@@ -295,7 +303,7 @@ static bool box_filter_allow(clientenv *, const char *, const char *, bool);
 static void rfc_time(char *);
 static bool valid_address(clientenv *, char *, size_t, char *, int);
 static bool valid_host(clientenv *, char *, int, bool, bool);
-static bool valid_ipaddress(const char *);
+static bool valid_ipaddress(clientenv *, const char *);
 
 static int validate_msg_line(char *, ssize_t *, int *, void *);
 static bool do_data(clientenv *);
@@ -326,7 +334,7 @@ static void thread_mutex_unlock(void *);
 static bool thread_eintr(void);
 
 static void async_resquery(struct async_msg *);
-static int a_res_query(clientenv *, const char *, int, int, u_char *, int);
+static int a_res_query(clientenv *, const char *, int, int, char *, int);
 
 static void *hosts_expire_thread(void *);
 static bool hosts_expire_thread_iterator(hashnode_t *, void *);