* This module handles shared rooms, inter-Citadel mail, and outbound
* mailing list processing.
*
- * Copyright (c) 2000-2011 by the citadel.org team
+ * Copyright (c) 2000-2012 by the citadel.org team
*
* This program is open source software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* Deliver digest messages
*/
void network_deliver_digest(SpoolControl *sc) {
+ struct CitContext *CCC = CC;
char buf[SIZ];
int i;
struct CtdlMessage *msg = NULL;
recps = malloc(recps_len);
if (recps == NULL) {
- syslog(LOG_EMERG,
- "Cannot allocate %ld bytes for recps...\n",
- (long)recps_len);
+ QN_syslog(LOG_EMERG,
+ "Cannot allocate %ld bytes for recps...\n",
+ (long)recps_len);
abort();
}
/*
* Deliver list messages to everyone on the list ... efficiently
*/
-void network_deliver_list(struct CtdlMessage *msg, SpoolControl *sc) {
+void network_deliver_list(struct CtdlMessage *msg, SpoolControl *sc, const char *RoomName)
+{
+ struct CitContext *CCC = CC;
char *recps = NULL;
size_t recps_len = SIZ;
struct recptypes *valid;
recps = malloc(recps_len);
if (recps == NULL) {
- syslog(LOG_EMERG,
- "Cannot allocate %ld bytes for recps...\n",
- (long)recps_len);
+ QN_syslog(LOG_EMERG,
+ "Cannot allocate %ld bytes for recps...\n",
+ (long)recps_len);
abort();
}
if (valid != NULL) {
valid->bounce_to = strdup(bounce_to);
valid->envelope_from = strdup(bounce_to);
+ valid->sending_room = strdup(RoomName);
CtdlSubmitMsg(msg, valid, NULL, 0);
free_recipients(valid);
}
void network_spool_msg(long msgnum,
void *userdata)
{
+ struct CitContext *CCC = CC;
+ StrBuf *Buf = NULL;
SpoolControl *sc;
int i;
char *newpath = NULL;
}
/* Handle delivery */
- network_deliver_list(msg, sc);
+ network_deliver_list(msg, sc, CC->room.QRname);
CtdlFreeMessage(msg);
}
}
FreeStrBuf(&CC->redirect_buffer);
sc->num_msgs_spooled += 1;
- free(msg);
+ CtdlFreeMessage(msg);
}
}
config.c_nodename)) {
ok_to_participate = 1;
}
+
+ Buf = NewStrBufPlain(msg->cm_fields['N'], -1);
if (is_valid_node(NULL,
NULL,
- msg->cm_fields['N'],
+ Buf,
sc->working_ignetcfg,
sc->the_netmap) == 0)
{
mptr = mptr->next) {
send = 1;
-
+ if (Buf == NULL)
+ Buf = NewStrBufPlain(mptr->remote_nodename, -1);
+ else
+ StrBufPlain(Buf, mptr->remote_nodename, -1);
/* Check for valid node name */
if (is_valid_node(NULL,
NULL,
- mptr->remote_nodename,
+ Buf,
sc->working_ignetcfg,
sc->the_netmap) != 0)
{
- syslog(LOG_ERR,
- "Invalid node <%s>\n",
- mptr->remote_nodename);
+ QN_syslog(LOG_ERR,
+ "Invalid node <%s>\n",
+ mptr->remote_nodename);
send = 0;
}
/* Check for split horizon */
- syslog(LOG_DEBUG, "Path is %s\n", msg->cm_fields['P']);
+ QN_syslog(LOG_DEBUG, "Path is %s\n", msg->cm_fields['P']);
bang = num_tokens(msg->cm_fields['P'], '!');
- if (bang > 1) for (i=0; i<(bang-1); ++i) {
- extract_token(buf,
- msg->cm_fields['P'],
- i, '!',
- sizeof buf);
-
- syslog(LOG_DEBUG, "Compare <%s> to <%s>\n",
- buf, mptr->remote_nodename) ;
- if (!strcasecmp(buf, mptr->remote_nodename)) {
- send = 0;
- syslog(LOG_DEBUG, "Not sending to %s\n",
- mptr->remote_nodename);
- }
- else {
- syslog(LOG_DEBUG,
- "Sending to %s\n",
- mptr->remote_nodename);
+ if (bang > 1) {
+ for (i=0; i<(bang-1); ++i) {
+ extract_token(buf,
+ msg->cm_fields['P'],
+ i, '!',
+ sizeof buf);
+
+ QN_syslog(LOG_DEBUG, "Compare <%s> to <%s>\n",
+ buf, mptr->remote_nodename) ;
+ if (!strcasecmp(buf, mptr->remote_nodename)) {
+ send = 0;
+ break;
+ }
}
+
+ QN_syslog(LOG_INFO,
+ "%sSending to %s\n",
+ (send)?"":"Not ",
+ mptr->remote_nodename);
}
/* Send the message */
rand()
);
- syslog(LOG_DEBUG,
- "Appending to %s\n",
- filename);
+ QN_syslog(LOG_DEBUG,
+ "Appending to %s\n",
+ filename);
fp = fopen(filename, "ab");
if (fp != NULL) {
fclose(fp);
}
else {
- syslog(LOG_ERR,
- "%s: %s\n",
- filename,
- strerror(errno));
+ QN_syslog(LOG_ERR,
+ "%s: %s\n",
+ filename,
+ strerror(errno));
}
/* free the serialized version */
if (delete_after_send) {
CtdlDeleteMessages(CC->room.QRname, &msgnum, 1, "");
}
-
+ FreeStrBuf(&Buf);
}