#include <sys/wait.h>
#include <string.h>
#include <limits.h>
+#include <libcitadel.h>
#include "citadel.h"
#include "server.h"
#include "sysdep_decls.h"
#include "citserver.h"
#include "support.h"
#include "config.h"
-#include "tools.h"
#include "msgbase.h"
#include "internet_addressing.h"
#include "user_ops.h"
else if (!strcasecmp(key, "From")) {
process_rfc822_addr(value, user, node, name);
- lprintf(CTDL_DEBUG, "Converted to <%s@%s> (%s)\n", user, node, name);
+ CtdlLogPrintf(CTDL_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);
else if (!strcasecmp(key, "Message-ID")) {
if (msg->cm_fields['I'] != NULL) {
- lprintf(CTDL_WARNING, "duplicate message id\n");
+ CtdlLogPrintf(CTDL_WARNING, "duplicate message id\n");
}
if (msg->cm_fields['I'] == NULL) {
processed = 1;
}
+ else if (!strcasecmp(key, "References")) {
+ if (msg->cm_fields['W'] != NULL) {
+ free(msg->cm_fields['W']);
+ }
+ msg->cm_fields['W'] = strdup(value);
+ processed = 1;
+ }
+
+ else if (!strcasecmp(key, "In-reply-to")) {
+ if (msg->cm_fields['W'] == NULL) { /* References: supersedes In-reply-to: */
+ msg->cm_fields['W'] = strdup(value);
+ }
+ processed = 1;
+ }
+
+
+
/* Clean up and move on. */
free(key); /* Don't free 'value', it's actually the same buffer */
return(processed);
}
+/*
+ * Convert RFC822 references format (References) to Citadel references format (Weferences)
+ */
+void convert_references_to_wefewences(char *str) {
+ int bracket_nesting = 0;
+ char *ptr = str;
+ char *moveptr = NULL;
+ char ch;
+
+ while(*ptr) {
+ ch = *ptr;
+ if (ch == '>') {
+ --bracket_nesting;
+ if (bracket_nesting < 0) bracket_nesting = 0;
+ }
+ if ((ch == '>') && (bracket_nesting == 0) && (*(ptr+1)) && (ptr>str) ) {
+ *ptr = '|';
+ ++ptr;
+ }
+ else if (bracket_nesting > 0) {
+ ++ptr;
+ }
+ else {
+ moveptr = ptr;
+ while (*moveptr) {
+ *moveptr = *(moveptr+1);
+ ++moveptr;
+ }
+ }
+ if (ch == '<') ++bracket_nesting;
+ }
+
+}
+
+
/*
* Convert an RFC822 message (headers + body) to a CtdlMessage structure.
* NOTE: the supplied buffer becomes part of the CtdlMessage structure, and
msg->cm_fields['T'] = strdup(buf);
}
+ /* If a W (references, or rather, Wefewences) field is present, we
+ * have to convert it from RFC822 format to Citadel format.
+ */
+ if (msg->cm_fields['W'] != NULL) {
+ convert_references_to_wefewences(msg->cm_fields['W']);
+ }
+
return msg;
}
}
key[keylen++] = 0;
- lprintf(CTDL_DEBUG, "Directory key is <%s>\n", key);
+ CtdlLogPrintf(CTDL_DEBUG, "Directory key is <%s>\n", key);
}
void CtdlDirectoryAddUser(char *internet_addr, char *citadel_addr) {
char key[SIZ];
- lprintf(CTDL_DEBUG, "Dir: %s --> %s\n",
+ CtdlLogPrintf(CTDL_DEBUG, "Dir: %s --> %s\n",
internet_addr, citadel_addr);
if (IsDirectory(internet_addr, 0) == 0) return;