* This module handles shared rooms, inter-Citadel mail, and outbound
* mailing list processing.
*
- * Copyright (c) 2000-2009 by the citadel.org team
+ * Copyright (c) 2000-2010 by the citadel.org team
*
* 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
#include "support.h"
#include "config.h"
#include "user_ops.h"
-#include "policy.h"
#include "database.h"
#include "msgbase.h"
#include "internet_addressing.h"
long msglen;
char *recps = NULL;
size_t recps_len = SIZ;
+ size_t siz;
struct recptypes *valid;
namelist *nptr;
char bounce_to[256];
msg->cm_fields['M'] = malloc(msglen + 1);
fseek(sc->digestfp, 0L, SEEK_SET);
- fread(msg->cm_fields['M'], (size_t)msglen, 1, sc->digestfp);
- msg->cm_fields['M'][msglen] = 0;
+ siz = fread(msg->cm_fields['M'], (size_t)msglen, 1, sc->digestfp);
+ msg->cm_fields['M'][msglen] = '\0';
fclose(sc->digestfp);
sc->digestfp = NULL;
fprintf(sc->digestfp, "Subject: %s\n", msg->cm_fields['U']);
}
- CC->redirect_buffer = malloc(SIZ);
- CC->redirect_len = 0;
- CC->redirect_alloc = SIZ;
-
+ CC->redirect_buffer = NewStrBufPlain(NULL, SIZ);
+
safestrncpy(CC->preferred_formats, "text/plain", sizeof CC->preferred_formats);
CtdlOutputPreLoadedMsg(msg, MT_CITADEL, HEADERS_NONE, 0, 0, 0);
- striplt(CC->redirect_buffer);
- fprintf(sc->digestfp, "\n%s\n", CC->redirect_buffer);
+ StrBufTrim(CC->redirect_buffer);
+ fwrite(HKEY("\n"), 1, sc->digestfp);
+ fwrite(SKEY(CC->redirect_buffer), 1, sc->digestfp);
+ fwrite(HKEY("\n"), 1, sc->digestfp);
- free(CC->redirect_buffer);
- CC->redirect_buffer = NULL;
- CC->redirect_len = 0;
- CC->redirect_alloc = 0;
+ FreeStrBuf(&CC->redirect_buffer);
sc->num_msgs_spooled += 1;
free(msg);
buf[strlen(buf)-1] = 0;
extract_token(instr, buf, 0, '|', sizeof instr);
- if (!strcasecmp(instr, "lastsent")) {
+ if (!strcasecmp(instr, strof(lastsent))) {
sc->lastsent = extract_long(buf, 1);
}
- else if (!strcasecmp(instr, "listrecp")) {
+ else if (!strcasecmp(instr, strof(listrecp))) {
nptr = (namelist *)
malloc(sizeof(namelist));
nptr->next = sc->listrecps;
extract_token(nptr->name, buf, 1, '|', sizeof nptr->name);
sc->listrecps = nptr;
}
- else if (!strcasecmp(instr, "participate")) {
+ else if (!strcasecmp(instr, strof(participate))) {
nptr = (namelist *)
malloc(sizeof(namelist));
nptr->next = sc->participates;
extract_token(nptr->name, buf, 1, '|', sizeof nptr->name);
sc->participates = nptr;
}
- else if (!strcasecmp(instr, "digestrecp")) {
+ else if (!strcasecmp(instr, strof(digestrecp))) {
nptr = (namelist *)
malloc(sizeof(namelist));
nptr->next = sc->digestrecps;
extract_token(nptr->name, buf, 1, '|', sizeof nptr->name);
sc->digestrecps = nptr;
}
- else if (!strcasecmp(instr, "ignet_push_share")) {
+ else if (!strcasecmp(instr, strof(ignet_push_share))) {
extract_token(nodename, buf, 1, '|', sizeof nodename);
extract_token(roomname, buf, 2, '|', sizeof roomname);
mptr = (maplist *) malloc(sizeof(maplist));
* timestamps.
*/
skipthisline = 0;
- if (!strncasecmp(buf, "subpending|", 11)) {
+ if (!strncasecmp(buf, strof(subpending)"|", 11)) {
if (time(NULL) - extract_long(buf, 4) > EXP) {
skipthisline = 1;
}
}
- if (!strncasecmp(buf, "unsubpending|", 13)) {
+ if (!strncasecmp(buf, strof(unsubpending)"|", 13)) {
if (time(NULL) - extract_long(buf, 3) > EXP) {
skipthisline = 1;
}
buffer = malloc(size);
if (buffer != NULL) {
fseek(fp, msgstart, SEEK_SET);
- fread(buffer, size, 1, fp);
- network_process_buffer(buffer, size);
+ if (fread(buffer, size, 1, fp) > 0) {
+ network_process_buffer(buffer, size);
+ }
free(buffer);
}
/*
* receive network spool from the remote system
*/
-void receive_spool(int sock, char *remote_nodename) {
+void receive_spool(int *sock, char *remote_nodename) {
+ size_t siz;
long download_len = 0L;
long bytes_received = 0L;
long bytes_copied = 0L;
if (plen > sizeof buf) {
plen = sizeof buf;
}
- fread(buf, plen, 1, fp);
+ siz = fread(buf, plen, 1, fp);
fwrite(buf, plen, 1, newfp);
bytes_copied += plen;
}
/*
* transmit network spool to the remote system
*/
-void transmit_spool(int sock, char *remote_nodename)
+void transmit_spool(int *sock, char *remote_nodename)
{
char buf[SIZ];
char pbuf[4096];
char buf[SIZ];
char err_buf[SIZ];
char connected_to[SIZ];
+ CitContext *CCC=CC;
if (network_talking_to(node, NTT_CHECK)) return;
network_talking_to(node, NTT_ADD);
}
CtdlLogPrintf(CTDL_DEBUG, "Connected!\n");
-
+ CCC->sReadBuf = NewStrBuf();
+ CCC->sMigrateBuf = NewStrBuf();
+ CCC->sPos = NULL;
/* Read the server greeting */
- if (sock_getln(sock, buf, sizeof buf) < 0) goto bail;
+ if (sock_getln(&sock, buf, sizeof buf) < 0) goto bail;
CtdlLogPrintf(CTDL_DEBUG, ">%s\n", buf);
/* Check that the remote is who we think it is and warn the Aide if not */
/* We're talking to the correct node. Now identify ourselves. */
snprintf(buf, sizeof buf, "NETP %s|%s", config.c_nodename, secret);
CtdlLogPrintf(CTDL_DEBUG, "<%s\n", buf);
- if (sock_puts(sock, buf) <0) goto bail;
- if (sock_getln(sock, buf, sizeof buf) < 0) goto bail;
+ if (sock_puts(&sock, buf) <0) goto bail;
+ if (sock_getln(&sock, buf, sizeof buf) < 0) goto bail;
CtdlLogPrintf(CTDL_DEBUG, ">%s\n", buf);
if (buf[0] != '2') goto bail;
/* At this point we are authenticated. */
if (!CtdlThreadCheckStop())
- receive_spool(sock, node);
+ receive_spool(&sock, node);
if (!CtdlThreadCheckStop())
- transmit_spool(sock, node);
+ transmit_spool(&sock, node);
}
- sock_puts(sock, "QUIT");
-bail: sock_close(sock);
+ sock_puts(&sock, "QUIT");
+bail:
+ FreeStrBuf(&CCC->sReadBuf);
+ FreeStrBuf(&CCC->sMigrateBuf);
+ if (sock != -1)
+ sock_close(sock);
network_talking_to(node, NTT_REMOVE);
}
* It's ok if these directories already exist. Just fail silently.
*/
void create_spool_dirs(void) {
- mkdir(ctdl_spool_dir, 0700);
- chown(ctdl_spool_dir, CTDLUID, (-1));
- mkdir(ctdl_netin_dir, 0700);
- chown(ctdl_netin_dir, CTDLUID, (-1));
- mkdir(ctdl_netout_dir, 0700);
- chown(ctdl_netout_dir, CTDLUID, (-1));
+ if ((mkdir(ctdl_spool_dir, 0700) != 0) && (errno != EEXIST))
+ CtdlLogPrintf(CTDL_EMERG, "unable to create directory [%s]: %s", ctdl_spool_dir, strerror(errno));
+ if (chown(ctdl_spool_dir, CTDLUID, (-1)) != 0)
+ CtdlLogPrintf(CTDL_EMERG, "unable to set the access rights for [%s]: %s", ctdl_spool_dir, strerror(errno));
+ if ((mkdir(ctdl_netin_dir, 0700) != 0) && (errno != EEXIST))
+ CtdlLogPrintf(CTDL_EMERG, "unable to create directory [%s]: %s", ctdl_netin_dir, strerror(errno));
+ if (chown(ctdl_netin_dir, CTDLUID, (-1)) != 0)
+ CtdlLogPrintf(CTDL_EMERG, "unable to set the access rights for [%s]: %s", ctdl_netin_dir, strerror(errno));
+ if ((mkdir(ctdl_netout_dir, 0700) != 0) && (errno != EEXIST))
+ CtdlLogPrintf(CTDL_EMERG, "unable to create directory [%s]: %s", ctdl_netout_dir, strerror(errno));
+ if (chown(ctdl_netout_dir, CTDLUID, (-1)) != 0)
+ CtdlLogPrintf(CTDL_EMERG, "unable to set the access rights for [%s]: %s", ctdl_netout_dir, strerror(errno));
}