EV: expose current event queue state to the RWHO command
[citadel.git] / citadel / internet_addressing.c
index 7a9f4b07816810967e106731f4e2781ddb675c36..3237007d60a27d6a06d8153697f972049c49490b 100644 (file)
@@ -1,6 +1,4 @@
 /*
- * $Id$
- *
  * This file contains functions which handle the mapping of Internet addresses
  * to users on the Citadel system.
  */
 #include "room_ops.h"
 #include "parsedate.h"
 #include "database.h"
-
 #include "ctdl_module.h"
-
-#ifndef HAVE_SNPRINTF
-#include "snprintf.h"
-#endif
-
-
 #ifdef HAVE_ICONV
 #include <iconv.h>
 
@@ -389,9 +380,10 @@ void unfold_rfc822_field(char **field, char **FieldEnd)
             pField++, sField++)
        {
                if ((*sField=='\r') || (*sField=='\n')) {
-                       while (isspace(*sField))
-                               sField++;
-                       *pField = *sField;
+                   sField++;
+                   if  (*sField == '\n')
+                       sField++;
+                   *pField = *sField;
                }
                else {
                        if (*sField=='\"') quote = 1 - quote;
@@ -605,11 +597,10 @@ int convert_field(struct CtdlMessage *msg, const char *beg, const char *end) {
 
        else if (!strcasecmp(key, "From")) {
                process_rfc822_addr(value, user, node, name);
-               CtdlLogPrintf(CTDL_DEBUG, "Converted to <%s@%s> (%s)\n", user, node, name);
+               syslog(LOG_DEBUG, "Converted to <%s@%s> (%s)\n", user, node, name);
                snprintf(addr, sizeof addr, "%s@%s", user, node);
                if (msg->cm_fields['A'] == NULL)
                        msg->cm_fields['A'] = strdup(name);
-               processed = 1;
                if (msg->cm_fields['F'] == NULL)
                        msg->cm_fields['F'] = strdup(addr);
                processed = 1;
@@ -641,7 +632,7 @@ int convert_field(struct CtdlMessage *msg, const char *beg, const char *end) {
 
        else if (!strcasecmp(key, "Message-ID")) {
                if (msg->cm_fields['I'] != NULL) {
-                       CtdlLogPrintf(CTDL_WARNING, "duplicate message id\n");
+                       syslog(LOG_WARNING, "duplicate message id\n");
                }
 
                if (msg->cm_fields['I'] == NULL) {
@@ -680,6 +671,14 @@ int convert_field(struct CtdlMessage *msg, const char *beg, const char *end) {
                processed = 1;
        }
 
+       else if (!strcasecmp(key, "Reply-To")) {
+               if (msg->cm_fields['K'] != NULL) {
+                       free(msg->cm_fields['K']);
+               }
+               msg->cm_fields['K'] = strndup(value, valuelen);
+               processed = 1;
+       }
+
        else if (!strcasecmp(key, "In-reply-to")) {
                if (msg->cm_fields['W'] == NULL) {              /* References: supersedes In-reply-to: */
                        msg->cm_fields['W'] = strndup(value, valuelen);
@@ -779,8 +778,7 @@ struct CtdlMessage *convert_internet_message_buf(StrBuf **rfc822)
                       (done == 0) ) 
                {
 
-                       if ((*pos=='\n') &&
-                           (!isspace(*(pos+1)))) 
+                       if ( (*pos=='\n') && ((*(pos+1))!=0x20) && ((*(pos+1))!=0x09) )
                        {
                                end = pos;
                        }
@@ -913,7 +911,7 @@ void directory_key(char *key, char *addr) {
        }
        key[keylen++] = 0;
 
-       CtdlLogPrintf(CTDL_DEBUG, "Directory key is <%s>\n", key);
+       syslog(LOG_DEBUG, "Directory key is <%s>\n", key);
 }
 
 
@@ -953,13 +951,15 @@ void CtdlDirectoryInit(void) {
 /*
  * Add an Internet e-mail address to the directory for a user
  */
-void CtdlDirectoryAddUser(char *internet_addr, char *citadel_addr) {
+int CtdlDirectoryAddUser(char *internet_addr, char *citadel_addr) {
        char key[SIZ];
 
-       if (IsDirectory(internet_addr, 0) == 0) return;
-       CtdlLogPrintf(CTDL_DEBUG, "Create directory entry: %s --> %s\n", internet_addr, citadel_addr);
+       if (IsDirectory(internet_addr, 0) == 0) 
+               return 0;
+       syslog(LOG_DEBUG, "Create directory entry: %s --> %s\n", internet_addr, citadel_addr);
        directory_key(key, internet_addr);
        cdb_store(CDB_DIRECTORY, key, strlen(key), citadel_addr, strlen(citadel_addr)+1 );
+       return 1;
 }
 
 
@@ -969,12 +969,12 @@ void CtdlDirectoryAddUser(char *internet_addr, char *citadel_addr) {
  * (NOTE: we don't actually use or need the citadel_addr variable; it's merely
  * here because the callback API expects to be able to send it.)
  */
-void CtdlDirectoryDelUser(char *internet_addr, char *citadel_addr) {
+int CtdlDirectoryDelUser(char *internet_addr, char *citadel_addr) {
        char key[SIZ];
 
-       CtdlLogPrintf(CTDL_DEBUG, "Delete directory entry: %s --> %s\n", internet_addr, citadel_addr);
+       syslog(LOG_DEBUG, "Delete directory entry: %s --> %s\n", internet_addr, citadel_addr);
        directory_key(key, internet_addr);
-       cdb_delete(CDB_DIRECTORY, key, strlen(key) );
+       return cdb_delete(CDB_DIRECTORY, key, strlen(key) ) == 0;
 }