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);
- siz = fread(msg->cm_fields['M'], (size_t)msglen, 1, sc->digestfp);
+ fread(msg->cm_fields['M'], (size_t)msglen, 1, sc->digestfp);
msg->cm_fields['M'][msglen] = '\0';
fclose(sc->digestfp);
SpoolControl *sc;
int i;
char *newpath = NULL;
- size_t instr_len = SIZ;
struct CtdlMessage *msg = NULL;
namelist *nptr;
maplist *mptr;
/*
* Process mailing list recipients
*/
- instr_len = SIZ;
if (sc->listrecps != NULL) {
/* Fetch the message. We're going to need to modify it
* in order to insert the [list name] in it, etc.
*/
msg = CtdlFetchMessage(msgnum, 1);
if (msg != NULL) {
- int len, rlen;
+ int rlen;
char *pCh;
+ StrBuf *Subject, *FlatSubject;
if (msg->cm_fields['V'] == NULL){
/* local message, no enVelope */
/* Prepend "[List name]" to the subject */
if (msg->cm_fields['U'] == NULL) {
- msg->cm_fields['U'] = strdup("(no subject)");
+ Subject = NewStrBufPlain(HKEY("(no subject)"));
}
-
- len = strlen(msg->cm_fields['U']);
+ else {
+ Subject = NewStrBufPlain(msg->cm_fields['U'], -1);
+ }
+ FlatSubject = NewStrBufPlain(NULL, StrLength(Subject));
+ StrBuf_RFC822_to_Utf8(FlatSubject, Subject, NULL, NULL);
+
rlen = strlen(CC->room.QRname);
- pCh = strstr(msg->cm_fields['U'], CC->room.QRname);
+ pCh = strstr(ChrPtr(FlatSubject), CC->room.QRname);
if ((pCh == NULL) ||
(*(pCh + rlen) != ']') ||
- (pCh == msg->cm_fields['U']) ||
+ (pCh == ChrPtr(FlatSubject)) ||
(*(pCh - 1) != '[')
)
{
- char *pBuff;
-
- rlen += len + 4;
- pBuff = malloc (rlen * sizeof(char));
-
- snprintf(pBuff, rlen, "[%s] %s", CC->room.QRname, msg->cm_fields['U']);
- free(msg->cm_fields['U']);
- msg->cm_fields['U'] = pBuff;
+ StrBuf *tmp;
+ StrBufPlain(Subject, HKEY("["));
+ StrBufAppendBufPlain(Subject, CC->room.QRname, rlen, 0);
+ StrBufAppendBufPlain(Subject, HKEY("] "), 0);
+ StrBufAppendBuf(Subject, FlatSubject, 0);
+ tmp = Subject; Subject = FlatSubject; FlatSubject = tmp; /* so we can free the right one... */
+ StrBufRFC2047encode(&Subject, FlatSubject);
}
- /* else we won't modify the buffer, since the roomname is already here. */
+
+ if (msg->cm_fields['U'] != NULL)
+ free (msg->cm_fields['U']);
+ msg->cm_fields['U'] = SmashStrBuf(&Subject);
- rlen += len + 4;
- pBuff = malloc (rlen * sizeof(char));
+ FreeStrBuf(&FlatSubject);
- snprintf(pBuff, rlen, "[%s] %s", CC->room.QRname, msg->cm_fields['U']);
- free(msg->cm_fields['U']);
- msg->cm_fields['U'] = pBuff;
- }
/* else we won't modify the buffer, since the roomname is already here. */
- /* if we don't already have a 'reply to' field, put our roomname in. */
- if (msg->cm_fields['K'] == NULL) {
- msg->cm_fields['K'] = malloc(256);
- snprintf(msg->cm_fields['K'], 256,
- "room_%s@%s", CC->room.QRname,
- config.c_fqdn);
- for (i=0; msg->cm_fields['K'][i]; ++i) {
- if (isspace(msg->cm_fields['K'][i])) {
- msg->cm_fields['K'][i] = '_';
- }
+ /* Set the recipient of the list message to the
+ * email address of the room itself.
+ * FIXME ... I want to be able to pick any address
+ */
+ if (msg->cm_fields['R'] != NULL) {
+ free(msg->cm_fields['R']);
+ }
+ msg->cm_fields['R'] = malloc(256);
+ snprintf(msg->cm_fields['R'], 256,
+ "room_%s@%s", CC->room.QRname,
+ config.c_fqdn);
+ for (i=0; msg->cm_fields['R'][i]; ++i) {
+ if (isspace(msg->cm_fields['R'][i])) {
+ msg->cm_fields['R'][i] = '_';
}
}
/*
* Process client-side list participations for this room
*/
- instr_len = SIZ;
if (sc->participates != NULL) {
msg = CtdlFetchMessage(msgnum, 1);
if (msg != NULL) {
"An unknown Citadel server called \"%s\" attempted to connect from %s [%s].\n",
node, CC->cs_host, CC->cs_addr
);
- syslog(LOG_WARNING, err_buf);
+ syslog(LOG_WARNING, "%s", err_buf);
cprintf("%d authentication failed\n", ERROR + PASSWORD_REQUIRED);
CtdlAideMessage(err_buf, "IGNet Networking.");
return;
"A Citadel server at %s [%s] failed to authenticate as network node \"%s\".\n",
CC->cs_host, CC->cs_addr, node
);
- syslog(LOG_WARNING, err_buf);
+ syslog(LOG_WARNING, "%s", err_buf);
cprintf("%d authentication failed\n", ERROR + PASSWORD_REQUIRED);
CtdlAideMessage(err_buf, "IGNet Networking.");
return;