#include <ctype.h>
#include <string.h>
-#include <syslog.h>
#include <limits.h>
#include <errno.h>
#include <stdarg.h>
strcpy(name, aaa);
}
- lprintf(7, "Mail is being forwarded to %s\n", name);
+ lprintf(CTDL_INFO, "Mail is being forwarded to %s\n", name);
/* Change "user @ xxx" to "user" if xxx is an alias for this host */
for (a=0; a<strlen(name); ++a) {
if (name[a] == '@') {
if (CtdlHostAlias(&name[a+1]) == hostalias_localhost) {
name[a] = 0;
- lprintf(7, "Changed to <%s>\n", name);
+ lprintf(CTDL_INFO, "Changed to <%s>\n", name);
}
}
}
extract_token(buf, ignetcfg, i, '\n');
extract_token(testnode, buf, 0, '|');
if (!strcasecmp(node, testnode)) {
- phree(ignetcfg);
+ free(ignetcfg);
return(MES_IGNET);
}
}
- phree(ignetcfg);
+ free(ignetcfg);
/*
* Then try nodes that are two or more hops away.
extract_token(buf, ignetmap, i, '\n');
extract_token(testnode, buf, 0, '|');
if (!strcasecmp(node, testnode)) {
- phree(ignetmap);
+ free(ignetmap);
return(MES_IGNET);
}
}
- phree(ignetmap);
+ free(ignetmap);
/* If we get to this point it's an invalid node name */
return (MES_ERROR);
FILE *fp;
fp = fopen("citadel.control", "r");
+ if (fp == NULL) {
+ lprintf(CTDL_CRIT, "Cannot open citadel.control: %s\n",
+ strerror(errno));
+ exit(errno);
+ }
fread((char *) &CitControl, sizeof(struct CitControl), 1, fp);
fclose(fp);
}
/*
* Retrieve the "seen" message list for the current room.
*/
-void CtdlGetSeen(char *buf) {
+void CtdlGetSeen(char *buf, int which_set) {
struct visit vbuf;
/* Learn about the user and room in question */
CtdlGetRelationship(&vbuf, &CC->user, &CC->room);
- safestrncpy(buf, vbuf.v_seen, SIZ);
+ if (which_set == ctdlsetseen_seen)
+ safestrncpy(buf, vbuf.v_seen, SIZ);
+ if (which_set == ctdlsetseen_answered)
+ safestrncpy(buf, vbuf.v_answered, SIZ);
}
/*
- * Manipulate the "seen msgs" string.
+ * Manipulate the "seen msgs" string (or other message set strings)
*/
-void CtdlSetSeen(long target_msgnum, int target_setting) {
+void CtdlSetSeen(long target_msgnum, int target_setting, int which_set) {
char newseen[SIZ];
struct cdbdata *cdbfr;
int i;
struct visit vbuf;
long *msglist;
int num_msgs = 0;
+ char vset[SIZ];
+
+ lprintf(CTDL_DEBUG, "CtdlSetSeen(%ld, %d, %d)\n",
+ target_msgnum, target_setting, which_set);
/* Learn about the user and room in question */
CtdlGetRelationship(&vbuf, &CC->user, &CC->room);
/* Load the message list */
cdbfr = cdb_fetch(CDB_MSGLISTS, &CC->room.QRnumber, sizeof(long));
if (cdbfr != NULL) {
- msglist = mallok(cdbfr->len);
+ msglist = malloc(cdbfr->len);
memcpy(msglist, cdbfr->ptr, cdbfr->len);
num_msgs = cdbfr->len / sizeof(long);
cdb_free(cdbfr);
return; /* No messages at all? No further action. */
}
- lprintf(9, "before optimize: %s\n", vbuf.v_seen);
+ /* Decide which message set we're manipulating */
+ if (which_set == ctdlsetseen_seen) strcpy(vset, vbuf.v_seen);
+ if (which_set == ctdlsetseen_answered) strcpy(vset, vbuf.v_answered);
+
+ lprintf(CTDL_DEBUG, "before optimize: %s\n", vset);
strcpy(newseen, "");
for (i=0; i<num_msgs; ++i) {
is_seen = target_setting;
}
else {
- if (is_msg_in_mset(vbuf.v_seen, msglist[i])) {
+ if (is_msg_in_mset(vset, msglist[i])) {
is_seen = 1;
}
}
was_seen = is_seen;
}
- safestrncpy(vbuf.v_seen, newseen, SIZ);
- lprintf(9, " after optimize: %s\n", vbuf.v_seen);
- phree(msglist);
+ /* Decide which message set we're manipulating */
+ if (which_set == ctdlsetseen_seen) strcpy(vbuf.v_seen, newseen);
+ if (which_set == ctdlsetseen_answered) strcpy(vbuf.v_answered, newseen);
+
+ lprintf(CTDL_DEBUG, " after optimize: %s\n", newseen);
+ free(msglist);
CtdlSetRelationship(&vbuf, &CC->user, &CC->room);
}
/* Load the message list */
cdbfr = cdb_fetch(CDB_MSGLISTS, &CC->room.QRnumber, sizeof(long));
if (cdbfr != NULL) {
- msglist = mallok(cdbfr->len);
+ msglist = malloc(cdbfr->len);
memcpy(msglist, cdbfr->ptr, cdbfr->len);
num_msgs = cdbfr->len / sizeof(long);
cdb_free(cdbfr);
if (num_msgs > 0) {
if (compare != NULL) {
for (a = 0; a < num_msgs; ++a) {
- msg = CtdlFetchMessage(msglist[a]);
+ msg = CtdlFetchMessage(msglist[a], 1);
if (msg != NULL) {
if (CtdlMsgCmp(msg, compare)) {
msglist[a] = 0L;
++num_processed;
}
}
- phree(msglist); /* Clean up */
+ free(msglist); /* Clean up */
return num_processed;
}
cprintf("%d Send template then receive message list\n",
START_CHAT_MODE);
template = (struct CtdlMessage *)
- mallok(sizeof(struct CtdlMessage));
+ malloc(sizeof(struct CtdlMessage));
memset(template, 0, sizeof(struct CtdlMessage));
while(client_gets(buf), strcmp(buf,"000")) {
extract(tfield, buf, 0);
for (i='A'; i<='Z'; ++i) if (msgkeys[i]!=NULL) {
if (!strcasecmp(tfield, msgkeys[i])) {
template->cm_fields[i] =
- strdoop(tvalue);
+ strdup(tvalue);
}
}
}
* NOTE: Caller is responsible for freeing the returned CtdlMessage struct
* using the CtdlMessageFree() function.
*/
-struct CtdlMessage *CtdlFetchMessage(long msgnum)
+struct CtdlMessage *CtdlFetchMessage(long msgnum, int with_body)
{
struct cdbdata *dmsgtext;
+ struct cdbdata *dbigmsg;
struct CtdlMessage *ret = NULL;
char *mptr;
cit_uint8_t ch;
*/
ch = *mptr++;
if (ch != 255) {
- lprintf(5, "Message %ld appears to be corrupted.\n", msgnum);
+ lprintf(CTDL_ERR, "Message %ld appears to be corrupted.\n", msgnum);
cdb_free(dmsgtext);
return NULL;
}
- ret = (struct CtdlMessage *) mallok(sizeof(struct CtdlMessage));
+ ret = (struct CtdlMessage *) malloc(sizeof(struct CtdlMessage));
memset(ret, 0, sizeof(struct CtdlMessage));
ret->cm_magic = CTDLMESSAGE_MAGIC;
if (field_length == 0)
break;
field_header = *mptr++;
- ret->cm_fields[field_header] = mallok(field_length);
+ ret->cm_fields[field_header] = malloc(field_length);
strcpy(ret->cm_fields[field_header], mptr);
while (*mptr++ != 0); /* advance to next field */
cdb_free(dmsgtext);
- /* Always make sure there's something in the msg text field */
- if (ret->cm_fields['M'] == NULL)
- ret->cm_fields['M'] = strdoop("<no text>\n");
+ /* Always make sure there's something in the msg text field. If
+ * it's NULL, the message text is most likely stored separately,
+ * so go ahead and fetch that. Failing that, just set a dummy
+ * body so other code doesn't barf.
+ */
+ if (ret->cm_fields['M'] == NULL) {
+
+ dbigmsg = cdb_fetch(CDB_BIGMSGS, &msgnum, sizeof(long));
+ if (dmsgtext == NULL) {
+ ret->cm_fields['M'] = strdup("<no text>\n");
+ }
+ else {
+ ret->cm_fields['M'] = strdup(dbigmsg->ptr);
+ cdb_free(dbigmsg);
+ }
+ }
/* Perform "before read" hooks (aborting if any return nonzero) */
if (PerformMessageHooks(ret, EVT_BEFOREREAD) > 0) {
if (msg == NULL)
return 0;
if ((msg->cm_magic) != CTDLMESSAGE_MAGIC) {
- lprintf(3, "is_valid_message() -- self-check failed\n");
+ lprintf(CTDL_WARNING, "is_valid_message() -- self-check failed\n");
return 0;
}
return 1;
for (i = 0; i < 256; ++i)
if (msg->cm_fields[i] != NULL) {
- phree(msg->cm_fields[i]);
+ free(msg->cm_fields[i]);
}
msg->cm_magic = 0; /* just in case */
- phree(msg);
+ free(msg);
}
void *content, char *cbtype, size_t length, char *encoding,
void *cbuserdata)
{
- lprintf(9, "fixed_output_pre() type=<%s>\n", cbtype);
+ lprintf(CTDL_DEBUG, "fixed_output_pre() type=<%s>\n", cbtype);
if (!strcasecmp(cbtype, "multipart/alternative")) {
++ma->is_ma;
ma->did_print = 0;
void *content, char *cbtype, size_t length, char *encoding,
void *cbuserdata)
{
- lprintf(9, "fixed_output_post() type=<%s>\n", cbtype);
+ lprintf(CTDL_DEBUG, "fixed_output_post() type=<%s>\n", cbtype);
if (!strcasecmp(cbtype, "multipart/alternative")) {
--ma->is_ma;
ma->did_print = 0;
char *wptr;
size_t wlen;
- lprintf(9, "fixed_output() type=<%s>\n", cbtype);
+ lprintf(CTDL_DEBUG, "fixed_output() type=<%s>\n", cbtype);
/*
* If we're in the middle of a multipart/alternative scope and
* we've already printed another section, skip this one.
*/
if ( (ma->is_ma == 1) && (ma->did_print == 1) ) {
- lprintf(9, "Skipping part %s (%s)\n", partnum, cbtype);
+ lprintf(CTDL_DEBUG, "Skipping part %s (%s)\n", partnum, cbtype);
return;
}
ma->did_print = 1;
if (ptr[wlen-1] != '\n') {
cprintf("\n");
}
- phree(ptr);
+ free(ptr);
}
else if (strncasecmp(cbtype, "multipart/", 10)) {
cprintf("Part %s: %s (%s) (%ld bytes)\r\n",
struct CtdlMessage *TheMessage;
int retcode;
- lprintf(7, "CtdlOutputMsg() msgnum=%ld, mode=%d\n",
+ lprintf(CTDL_DEBUG, "CtdlOutputMsg() msgnum=%ld, mode=%d\n",
msg_num, mode);
TheMessage = NULL;
return(om_not_logged_in);
}
- /* FIXME ... small security issue
- * We need to check to make sure the requested message is actually
- * in the current room, and set msg_ok to 1 only if it is. This
- * functionality is currently missing because I'm in a hurry to replace
- * broken production code with nonbroken pre-beta code. :( -- ajc
- *
- if (!msg_ok) {
- if (do_proto) cprintf("%d Message %ld is not in this room.\n",
- ERROR, msg_num);
- return(om_no_such_msg);
- }
- */
+ /* FIXME: check message id against msglist for this room */
/*
- * Fetch the message from disk.
+ * Fetch the message from disk. If we're in sooper-fast headers
+ * only mode, request that we don't even bother loading the body
+ * into memory.
*/
- TheMessage = CtdlFetchMessage(msg_num);
+ if (headers_only == HEADERS_FAST) {
+ TheMessage = CtdlFetchMessage(msg_num, 0);
+ }
+ else {
+ TheMessage = CtdlFetchMessage(msg_num, 1);
+ }
if (TheMessage == NULL) {
if (do_proto) cprintf("%d Can't locate msg %ld on disk\n",
- ERROR, msg_num);
+ ERROR + MESSAGE_NOT_FOUND, msg_num);
return(om_no_such_msg);
}
nl = (crlf ? "\r\n" : "\n");
if (!is_valid_message(TheMessage)) {
- lprintf(1, "ERROR: invalid preloaded message for output\n");
+ lprintf(CTDL_ERR, "ERROR: invalid preloaded message for output\n");
return(om_no_such_msg);
}
if (TheMessage->cm_format_type != FMT_RFC822) {
if (do_proto)
cprintf("%d This is not a MIME message.\n",
- ERROR);
+ ERROR + ILLEGAL_VALUE);
} else if (CC->download_fp != NULL) {
if (do_proto) cprintf(
"%d You already have a download open.\n",
- ERROR);
+ ERROR + RESOURCE_BUSY);
} else {
/* Parse the message text component */
mptr = TheMessage->cm_fields['M'];
strcpy(display_name, "<unknown>");
if (TheMessage->cm_fields['A']) {
strcpy(buf, TheMessage->cm_fields['A']);
- PerformUserHooks(buf, (-1L), EVT_OUTPUTMSG);
if (TheMessage->cm_anon_type == MES_ANONONLY) {
strcpy(display_name, "****");
}
}
cprintf(">%s", nl);
- PerformUserHooks(luser, (-1L), EVT_OUTPUTMSG);
-
- if (strlen(fuser) > 0) {
+ if (!is_room_aide() && (TheMessage->cm_anon_type == MES_ANONONLY)) {
+ cprintf("From: x@x.org (----)%s", nl);
+ }
+ else if (!is_room_aide() && (TheMessage->cm_anon_type == MES_ANONOPT)) {
+ cprintf("From: x@x.org (anonymous)%s", nl);
+ }
+ else if (strlen(fuser) > 0) {
cprintf("From: %s (%s)%s", fuser, luser, nl);
}
else {
/* end header processing loop ... at this point, we're in the text */
START_TEXT:
+ if (headers_only == HEADERS_FAST) goto DONE;
mptr = TheMessage->cm_fields['M'];
/* Tell the client about the MIME parts in this message */
if (CC->internal_pgm == 0) {
cprintf("%d This command is for internal programs only.\n",
- ERROR);
+ ERROR + HIGHER_ACCESS_REQUIRED);
return;
}
msgnum = extract_long(cmdbuf, 0);
- msg = CtdlFetchMessage(msgnum);
+ msg = CtdlFetchMessage(msgnum, 1);
if (msg == NULL) {
cprintf("%d Message %ld not found.\n",
- ERROR, msgnum);
+ ERROR + MESSAGE_NOT_FOUND, msgnum);
return;
}
if (smr.len == 0) {
cprintf("%d Unable to serialize message\n",
- ERROR+INTERNAL_ERROR);
+ ERROR + INTERNAL_ERROR);
return;
}
cprintf("%d %ld\n", BINARY_FOLLOWS, (long)smr.len);
client_write(smr.ser, smr.len);
- phree(smr.ser);
+ free(smr.ser);
}
long highest_msg = 0L;
struct CtdlMessage *msg = NULL;
- lprintf(9, "CtdlSaveMsgPointerInRoom(%s, %ld, %d)\n",
+ lprintf(CTDL_DEBUG, "CtdlSaveMsgPointerInRoom(%s, %ld, %d)\n",
roomname, msgid, flags);
strcpy(hold_rm, CC->room.QRname);
if ( (flags & SM_VERIFY_GOODNESS)
|| (flags & SM_DO_REPL_CHECK)
) {
- msg = CtdlFetchMessage(msgid);
+ msg = CtdlFetchMessage(msgid, 1);
if (msg == NULL) return(ERROR + ILLEGAL_VALUE);
}
if (getroom(&CC->room,
((roomname != NULL) ? roomname : CC->room.QRname) )
!= 0) {
- lprintf(9, "No such room <%s>\n", roomname);
+ lprintf(CTDL_ERR, "No such room <%s>\n", roomname);
if (msg != NULL) CtdlFreeMessage(msg);
return(ERROR + ROOM_NOT_FOUND);
}
if (ReplicationChecks(msg) != 0) {
getroom(&CC->room, hold_rm);
if (msg != NULL) CtdlFreeMessage(msg);
- lprintf(9, "Did replication, and newer exists\n");
+ lprintf(CTDL_DEBUG, "Did replication, and newer exists\n");
return(0);
}
}
if (lgetroom(&CC->room,
((roomname != NULL) ? roomname : CC->room.QRname) )
!= 0) {
- lprintf(9, "No such room <%s>\n", roomname);
+ lprintf(CTDL_ERR, "No such room <%s>\n", roomname);
if (msg != NULL) CtdlFreeMessage(msg);
return(ERROR + ROOM_NOT_FOUND);
}
msglist = NULL;
num_msgs = 0;
} else {
- msglist = mallok(cdbfr->len);
+ msglist = malloc(cdbfr->len);
if (msglist == NULL)
- lprintf(3, "ERROR malloc msglist!\n");
+ lprintf(CTDL_ALERT, "ERROR malloc msglist!\n");
num_msgs = cdbfr->len / sizeof(long);
memcpy(msglist, cdbfr->ptr, cdbfr->len);
cdb_free(cdbfr);
lputroom(&CC->room); /* unlock the room */
getroom(&CC->room, hold_rm);
if (msg != NULL) CtdlFreeMessage(msg);
+ free(msglist);
return(ERROR + ALREADY_EXISTS);
}
}
/* Now add the new message */
++num_msgs;
- msglist = reallok(msglist,
+ msglist = realloc(msglist,
(num_msgs * sizeof(long)));
if (msglist == NULL) {
- lprintf(3, "ERROR: can't realloc message list!\n");
+ lprintf(CTDL_ALERT, "ERROR: can't realloc message list!\n");
}
msglist[num_msgs - 1] = msgid;
msglist, num_msgs * sizeof(long));
/* Free up the memory we used. */
- phree(msglist);
+ free(msglist);
/* Update the highest-message pointer and unlock the room. */
CC->room.QRhighest = highest_msg;
* called by server-side modules.
*
*/
-long send_message(struct CtdlMessage *msg, /* pointer to buffer */
- FILE *save_a_copy) /* save a copy to disk? */
-{
+long send_message(struct CtdlMessage *msg) {
long newmsgid;
long retval;
char msgidbuf[SIZ];
struct ser_ret smr;
+ int is_bigmsg = 0;
+ char *holdM = NULL;
/* Get a new message number */
newmsgid = get_new_message_number();
/* Generate an ID if we don't have one already */
if (msg->cm_fields['I']==NULL) {
- msg->cm_fields['I'] = strdoop(msgidbuf);
+ msg->cm_fields['I'] = strdup(msgidbuf);
}
-
+
+ /* If the message is big, set its body aside for storage elsewhere */
+ if (msg->cm_fields['M'] != NULL) {
+ if (strlen(msg->cm_fields['M']) > BIGMSG) {
+ is_bigmsg = 1;
+ holdM = msg->cm_fields['M'];
+ msg->cm_fields['M'] = NULL;
+ }
+ }
+
+ /* Serialize our data structure for storage in the database */
serialize_message(&smr, msg);
+ if (is_bigmsg) {
+ msg->cm_fields['M'] = holdM;
+ }
+
if (smr.len == 0) {
cprintf("%d Unable to serialize message\n",
- ERROR+INTERNAL_ERROR);
+ ERROR + INTERNAL_ERROR);
return (-1L);
}
/* Write our little bundle of joy into the message base */
if (cdb_store(CDB_MSGMAIN, &newmsgid, sizeof(long),
smr.ser, smr.len) < 0) {
- lprintf(2, "Can't store message\n");
+ lprintf(CTDL_ERR, "Can't store message\n");
retval = 0L;
} else {
+ if (is_bigmsg) {
+ cdb_store(CDB_BIGMSGS,
+ &newmsgid,
+ sizeof(long),
+ holdM,
+ (strlen(holdM) + 1)
+ );
+ }
retval = newmsgid;
}
- /* If the caller specified that a copy should be saved to a particular
- * file handle, do that now too.
- */
- if (save_a_copy != NULL) {
- fwrite(smr.ser, smr.len, 1, save_a_copy);
- }
-
/* Free the memory we used for the serialized message */
- phree(smr.ser);
+ free(smr.ser);
/* Return the *local* message ID to the caller
* (even if we're storing an incoming network message)
ret->len = ret->len +
strlen(msg->cm_fields[(int)forder[i]]) + 2;
- lprintf(9, "serialize_message() calling malloc(%ld)\n", (long)ret->len);
- ret->ser = mallok(ret->len);
+ lprintf(CTDL_DEBUG, "serialize_message() calling malloc(%ld)\n", (long)ret->len);
+ ret->ser = malloc(ret->len);
if (ret->ser == NULL) {
ret->len = 0;
return;
strcpy(&ret->ser[wlen], msg->cm_fields[(int)forder[i]]);
wlen = wlen + strlen(msg->cm_fields[(int)forder[i]]) + 1;
}
- if (ret->len != wlen) lprintf(3, "ERROR: len=%ld wlen=%ld\n",
+ if (ret->len != wlen) lprintf(CTDL_ERR, "ERROR: len=%ld wlen=%ld\n",
(long)ret->len, (long)wlen);
return;
struct CtdlMessage *msg;
time_t timestamp = (-1L);
- lprintf(9, "check_repl() found message %ld\n", msgnum);
- msg = CtdlFetchMessage(msgnum);
+ lprintf(CTDL_DEBUG, "check_repl() found message %ld\n", msgnum);
+ msg = CtdlFetchMessage(msgnum, 1);
if (msg == NULL) return;
if (msg->cm_fields['T'] != NULL) {
timestamp = atol(msg->cm_fields['T']);
if (timestamp > msg_repl->highest) {
msg_repl->highest = timestamp; /* newer! */
- lprintf(9, "newer!\n");
+ lprintf(CTDL_DEBUG, "newer!\n");
return;
}
- lprintf(9, "older!\n");
+ lprintf(CTDL_DEBUG, "older!\n");
/* Existing isn't newer? Then delete the old one(s). */
CtdlDeleteMessages(CC->room.QRname, msgnum, "");
struct CtdlMessage *template;
int abort_this = 0;
- lprintf(9, "ReplicationChecks() started\n");
+ lprintf(CTDL_DEBUG, "ReplicationChecks() started\n");
/* No extended id? Don't do anything. */
if (msg->cm_fields['E'] == NULL) return 0;
if (strlen(msg->cm_fields['E']) == 0) return 0;
- lprintf(9, "Extended ID: <%s>\n", msg->cm_fields['E']);
+ lprintf(CTDL_DEBUG, "Extended ID: <%s>\n", msg->cm_fields['E']);
CtdlAllocUserData(SYM_REPL, sizeof(struct repl));
strcpy(msg_repl->extended_id, msg->cm_fields['E']);
template = (struct CtdlMessage *) malloc(sizeof(struct CtdlMessage));
memset(template, 0, sizeof(struct CtdlMessage));
- template->cm_fields['E'] = strdoop(msg->cm_fields['E']);
+ template->cm_fields['E'] = strdup(msg->cm_fields['E']);
CtdlForEachMessage(MSGS_ALL, 0L, NULL, template, check_repl, NULL);
}
CtdlFreeMessage(template);
- lprintf(9, "ReplicationChecks() returning %d\n", abort_this);
+ lprintf(CTDL_DEBUG, "ReplicationChecks() returning %d\n", abort_this);
return(abort_this);
}
char recipient[SIZ];
long newmsgid;
char *mptr = NULL;
- struct user userbuf;
+ struct ctdluser userbuf;
int a, i;
struct MetaData smi;
FILE *network_fp = NULL;
struct ser_ret smr;
char *hold_R, *hold_D;
- lprintf(9, "CtdlSubmitMsg() called\n");
+ lprintf(CTDL_DEBUG, "CtdlSubmitMsg() called\n");
if (is_valid_message(msg) == 0) return(-1); /* self check */
/* If this message has no timestamp, we take the liberty of
* giving it one, right now.
*/
if (msg->cm_fields['T'] == NULL) {
- lprintf(9, "Generating timestamp\n");
+ lprintf(CTDL_DEBUG, "Generating timestamp\n");
snprintf(aaa, sizeof aaa, "%ld", (long)time(NULL));
- msg->cm_fields['T'] = strdoop(aaa);
+ msg->cm_fields['T'] = strdup(aaa);
}
/* If this message has no path, we generate one.
*/
if (msg->cm_fields['P'] == NULL) {
- lprintf(9, "Generating path\n");
+ lprintf(CTDL_DEBUG, "Generating path\n");
if (msg->cm_fields['A'] != NULL) {
- msg->cm_fields['P'] = strdoop(msg->cm_fields['A']);
+ msg->cm_fields['P'] = strdup(msg->cm_fields['A']);
for (a=0; a<strlen(msg->cm_fields['P']); ++a) {
if (isspace(msg->cm_fields['P'][a])) {
msg->cm_fields['P'][a] = ' ';
}
}
else {
- msg->cm_fields['P'] = strdoop("unknown");
+ msg->cm_fields['P'] = strdup("unknown");
}
}
}
/* Learn about what's inside, because it's what's inside that counts */
- lprintf(9, "Learning what's inside\n");
+ lprintf(CTDL_DEBUG, "Learning what's inside\n");
if (msg->cm_fields['M'] == NULL) {
- lprintf(1, "ERROR: attempt to save message with NULL body\n");
+ lprintf(CTDL_ERR, "ERROR: attempt to save message with NULL body\n");
+ return(-1);
}
switch (msg->cm_format_type) {
}
/* Goto the correct room */
- lprintf(9, "Switching rooms\n");
+ lprintf(CTDL_DEBUG, "Selected room %s\n", (recps) ? CC->room.QRname : SENTITEMS);
strcpy(hold_rm, CC->room.QRname);
strcpy(actual_rm, CC->room.QRname);
if (recps != NULL) {
}
/* If the user is a twit, move to the twit room for posting */
- lprintf(9, "Handling twit stuff\n");
+ lprintf(CTDL_DEBUG, "Handling twit stuff: %s\n",
+ (CC->user.axlevel == 2) ? config.c_twitroom : "OK");
if (TWITDETECT) {
if (CC->user.axlevel == 2) {
strcpy(hold_rm, actual_rm);
strcpy(actual_rm, force_room);
}
- lprintf(9, "Possibly relocating\n");
+ lprintf(CTDL_DEBUG, "Final selection: %s\n", actual_rm);
if (strcasecmp(actual_rm, CC->room.QRname)) {
getroom(&CC->room, actual_rm);
}
* If this message has no O (room) field, generate one.
*/
if (msg->cm_fields['O'] == NULL) {
- msg->cm_fields['O'] = strdoop(CC->room.QRname);
+ msg->cm_fields['O'] = strdup(CC->room.QRname);
}
/* Perform "before save" hooks (aborting if any return nonzero) */
- lprintf(9, "Performing before-save hooks\n");
+ lprintf(CTDL_DEBUG, "Performing before-save hooks\n");
if (PerformMessageHooks(msg, EVT_BEFORESAVE) > 0) return(-1);
/* If this message has an Extended ID, perform replication checks */
- lprintf(9, "Performing replication checks\n");
+ lprintf(CTDL_DEBUG, "Performing replication checks\n");
if (ReplicationChecks(msg) > 0) return(-1);
/* Save it to disk */
- lprintf(9, "Saving to disk\n");
- newmsgid = send_message(msg, NULL);
+ lprintf(CTDL_DEBUG, "Saving to disk\n");
+ newmsgid = send_message(msg);
if (newmsgid <= 0L) return(-1);
/* Write a supplemental message info record. This doesn't have to
* be a critical section because nobody else knows about this message
* yet.
*/
- lprintf(9, "Creating MetaData record\n");
+ lprintf(CTDL_DEBUG, "Creating MetaData record\n");
memset(&smi, 0, sizeof(struct MetaData));
smi.meta_msgnum = newmsgid;
smi.meta_refcount = 0;
PutMetaData(&smi);
/* Now figure out where to store the pointers */
- lprintf(9, "Storing pointers\n");
+ lprintf(CTDL_DEBUG, "Storing pointers\n");
/* If this is being done by the networker delivering a private
* message, we want to BYPASS saving the sender's copy (because there
*/
if ((!CC->internal_pgm) || (recps == NULL)) {
if (CtdlSaveMsgPointerInRoom(actual_rm, newmsgid, 0) != 0) {
- lprintf(3, "ERROR saving message pointer!\n");
+ lprintf(CTDL_ERR, "ERROR saving message pointer!\n");
CtdlSaveMsgPointerInRoom(config.c_aideroom, newmsgid, 0);
}
}
if (recps->num_room > 0)
for (i=0; i<num_tokens(recps->recp_room, '|'); ++i) {
extract(recipient, recps->recp_room, i);
- lprintf(9, "Delivering to local room <%s>\n", recipient);
+ lprintf(CTDL_DEBUG, "Delivering to local room <%s>\n", recipient);
CtdlSaveMsgPointerInRoom(recipient, newmsgid, 0);
}
/* Bump this user's messages posted counter. */
- lprintf(9, "Updating user\n");
+ lprintf(CTDL_DEBUG, "Updating user\n");
lgetuser(&CC->user, CC->curr_user);
CC->user.posted = CC->user.posted + 1;
lputuser(&CC->user);
if (recps->num_local > 0)
for (i=0; i<num_tokens(recps->recp_local, '|'); ++i) {
extract(recipient, recps->recp_local, i);
- lprintf(9, "Delivering private local mail to <%s>\n",
+ lprintf(CTDL_DEBUG, "Delivering private local mail to <%s>\n",
recipient);
if (getuser(&userbuf, recipient) == 0) {
MailboxName(actual_rm, sizeof actual_rm, &userbuf, MAILROOM);
BumpNewMailCounter(userbuf.usernum);
}
else {
- lprintf(9, "No user <%s>\n", recipient);
+ lprintf(CTDL_DEBUG, "No user <%s>\n", recipient);
CtdlSaveMsgPointerInRoom(config.c_aideroom, newmsgid, 0);
}
}
/* Perform "after save" hooks */
- lprintf(9, "Performing after-save hooks\n");
+ lprintf(CTDL_DEBUG, "Performing after-save hooks\n");
PerformMessageHooks(msg, EVT_AFTERSAVE);
/* For IGnet mail, we have to save a new copy into the spooler for
hold_R = msg->cm_fields['R'];
hold_D = msg->cm_fields['D'];
- msg->cm_fields['R'] = mallok(SIZ);
- msg->cm_fields['D'] = mallok(SIZ);
+ msg->cm_fields['R'] = malloc(SIZ);
+ msg->cm_fields['D'] = malloc(SIZ);
extract_token(msg->cm_fields['R'], recipient, 0, '@');
extract_token(msg->cm_fields['D'], recipient, 1, '@');
fwrite(smr.ser, smr.len, 1, network_fp);
fclose(network_fp);
}
- phree(smr.ser);
+ free(smr.ser);
}
- phree(msg->cm_fields['R']);
- phree(msg->cm_fields['D']);
+ free(msg->cm_fields['R']);
+ free(msg->cm_fields['D']);
msg->cm_fields['R'] = hold_R;
msg->cm_fields['D'] = hold_D;
}
/* Go back to the room we started from */
- lprintf(9, "Returning to original room\n");
+ lprintf(CTDL_DEBUG, "Returning to original room %s\n", hold_rm);
if (strcasecmp(hold_rm, CC->room.QRname))
getroom(&CC->room, hold_rm);
*/
if (recps != NULL)
if (recps->num_internet > 0) {
- lprintf(9, "Generating delivery instructions\n");
- instr = mallok(SIZ * 2);
+ lprintf(CTDL_DEBUG, "Generating delivery instructions\n");
+ instr = malloc(SIZ * 2);
snprintf(instr, SIZ * 2,
"Content-type: %s\n\nmsgid|%ld\nsubmitted|%ld\n"
"bounceto|%s@%s\n",
"remote|%s|0||\n", recipient);
}
- imsg = mallok(sizeof(struct CtdlMessage));
+ imsg = malloc(sizeof(struct CtdlMessage));
memset(imsg, 0, sizeof(struct CtdlMessage));
imsg->cm_magic = CTDLMESSAGE_MAGIC;
imsg->cm_anon_type = MES_NORMAL;
imsg->cm_format_type = FMT_RFC822;
- imsg->cm_fields['A'] = strdoop("Citadel");
+ imsg->cm_fields['A'] = strdup("Citadel");
imsg->cm_fields['M'] = instr;
CtdlSubmitMsg(imsg, NULL, SMTP_SPOOLOUT_ROOM);
CtdlFreeMessage(imsg);
struct CtdlMessage *msg;
struct recptypes *recp = NULL;
- msg = mallok(sizeof(struct CtdlMessage));
+ msg = malloc(sizeof(struct CtdlMessage));
memset(msg, 0, sizeof(struct CtdlMessage));
msg->cm_magic = CTDLMESSAGE_MAGIC;
msg->cm_anon_type = MES_NORMAL;
msg->cm_format_type = format_type;
- msg->cm_fields['A'] = strdoop(from);
- if (room != NULL) msg->cm_fields['O'] = strdoop(room);
- msg->cm_fields['N'] = strdoop(NODENAME);
+ msg->cm_fields['A'] = strdup(from);
+ if (room != NULL) msg->cm_fields['O'] = strdup(room);
+ msg->cm_fields['N'] = strdup(NODENAME);
if (to != NULL) {
- msg->cm_fields['R'] = strdoop(to);
+ msg->cm_fields['R'] = strdup(to);
recp = validate_recipients(to);
}
if (subject != NULL) {
- msg->cm_fields['U'] = strdoop(subject);
+ msg->cm_fields['U'] = strdup(subject);
}
- msg->cm_fields['M'] = strdoop(text);
+ msg->cm_fields['M'] = strdup(text);
CtdlSubmitMsg(msg, recp, room);
CtdlFreeMessage(msg);
- if (recp != NULL) phree(recp);
+ if (recp != NULL) free(recp);
}
int finished = 0;
if (exist == NULL) {
- m = mallok(4096);
+ m = malloc(4096);
m[0] = 0;
buffer_len = 4096;
message_len = 0;
else {
message_len = strlen(exist);
buffer_len = message_len + 4096;
- m = reallok(exist, buffer_len);
+ m = realloc(exist, buffer_len);
if (m == NULL) {
- phree(exist);
+ free(exist);
return m;
}
}
/* augment the buffer if we have to */
if ((message_len + linelen) >= buffer_len) {
- ptr = reallok(m, (buffer_len * 2) );
+ ptr = realloc(m, (buffer_len * 2) );
if (ptr == NULL) { /* flush if can't allocate */
flushing = 1;
} else {
buffer_len = (buffer_len * 2);
m = ptr;
- lprintf(9, "buffer_len is now %ld\n", (long)buffer_len);
+ lprintf(CTDL_DEBUG, "buffer_len is now %ld\n", (long)buffer_len);
}
}
*/
struct CtdlMessage *CtdlMakeMessage(
- struct user *author, /* author's user structure */
+ struct ctdluser *author, /* author's user structure */
char *recipient, /* NULL if it's not mail */
char *room, /* room where it's going */
int type, /* see MES_ types in header file */
char buf[SIZ];
struct CtdlMessage *msg;
- msg = mallok(sizeof(struct CtdlMessage));
+ msg = malloc(sizeof(struct CtdlMessage));
memset(msg, 0, sizeof(struct CtdlMessage));
msg->cm_magic = CTDLMESSAGE_MAGIC;
msg->cm_anon_type = type;
striplt(recipient);
snprintf(buf, sizeof buf, "cit%ld", author->usernum); /* Path */
- msg->cm_fields['P'] = strdoop(buf);
+ msg->cm_fields['P'] = strdup(buf);
snprintf(buf, sizeof buf, "%ld", (long)time(NULL)); /* timestamp */
- msg->cm_fields['T'] = strdoop(buf);
+ msg->cm_fields['T'] = strdup(buf);
if (fake_name[0]) /* author */
- msg->cm_fields['A'] = strdoop(fake_name);
+ msg->cm_fields['A'] = strdup(fake_name);
else
- msg->cm_fields['A'] = strdoop(author->fullname);
+ msg->cm_fields['A'] = strdup(author->fullname);
if (CC->room.QRflags & QR_MAILBOX) { /* room */
- msg->cm_fields['O'] = strdoop(&CC->room.QRname[11]);
+ msg->cm_fields['O'] = strdup(&CC->room.QRname[11]);
}
else {
- msg->cm_fields['O'] = strdoop(CC->room.QRname);
+ msg->cm_fields['O'] = strdup(CC->room.QRname);
}
- msg->cm_fields['N'] = strdoop(NODENAME); /* nodename */
- msg->cm_fields['H'] = strdoop(HUMANNODE); /* hnodename */
+ msg->cm_fields['N'] = strdup(NODENAME); /* nodename */
+ msg->cm_fields['H'] = strdup(HUMANNODE); /* hnodename */
if (recipient[0] != 0) {
- msg->cm_fields['R'] = strdoop(recipient);
+ msg->cm_fields['R'] = strdup(recipient);
}
if (dest_node[0] != 0) {
- msg->cm_fields['D'] = strdoop(dest_node);
+ msg->cm_fields['D'] = strdup(dest_node);
}
if ( (author == &CC->user) && (strlen(CC->cs_inet_email) > 0) ) {
- msg->cm_fields['F'] = strdoop(CC->cs_inet_email);
+ msg->cm_fields['F'] = strdup(CC->cs_inet_email);
}
if (subject != NULL) {
striplt(subject);
if (strlen(subject) > 0) {
- msg->cm_fields['U'] = strdoop(subject);
+ msg->cm_fields['U'] = strdup(subject);
}
}
* Check to see if the specified user has Internet mail permission
* (returns nonzero if permission is granted)
*/
-int CtdlCheckInternetMailPermission(struct user *who) {
+int CtdlCheckInternetMailPermission(struct ctdluser *who) {
+
+ /* Do not allow twits to send Internet mail */
+ if (who->axlevel <= 2) return(0);
/* Globally enabled? */
if (config.c_restrict == 0) return(1);
int i, j;
int mailtype;
int invalid;
- struct user tempUS;
- struct room tempQR;
+ struct ctdluser tempUS;
+ struct ctdlroom tempQR;
/* Initialize */
ret = (struct recptypes *) malloc(sizeof(struct recptypes));
if (num_recps > 0) for (i=0; i<num_recps; ++i) {
extract_token(this_recp, recipients, i, ',');
striplt(this_recp);
- lprintf(9, "Evaluating recipient #%d <%s>\n", i, this_recp);
+ lprintf(CTDL_DEBUG, "Evaluating recipient #%d <%s>\n", i, this_recp);
mailtype = alias(this_recp);
mailtype = alias(this_recp);
mailtype = alias(this_recp);
strcpy(ret->errormsg, "No recipients specified.");
}
- lprintf(9, "validate_recipients()\n");
- lprintf(9, " local: %d <%s>\n", ret->num_local, ret->recp_local);
- lprintf(9, " room: %d <%s>\n", ret->num_room, ret->recp_room);
- lprintf(9, " inet: %d <%s>\n", ret->num_internet, ret->recp_internet);
- lprintf(9, " ignet: %d <%s>\n", ret->num_ignet, ret->recp_ignet);
- lprintf(9, " error: %d <%s>\n", ret->num_error, ret->errormsg);
+ lprintf(CTDL_DEBUG, "validate_recipients()\n");
+ lprintf(CTDL_DEBUG, " local: %d <%s>\n", ret->num_local, ret->recp_local);
+ lprintf(CTDL_DEBUG, " room: %d <%s>\n", ret->num_room, ret->recp_room);
+ lprintf(CTDL_DEBUG, " inet: %d <%s>\n", ret->num_internet, ret->recp_internet);
+ lprintf(CTDL_DEBUG, " ignet: %d <%s>\n", ret->num_ignet, ret->recp_ignet);
+ lprintf(CTDL_DEBUG, " error: %d <%s>\n", ret->num_error, ret->errormsg);
return(ret);
}
if (valid->num_error > 0) {
cprintf("%d %s\n",
ERROR + NO_SUCH_USER, valid->errormsg);
- phree(valid);
+ free(valid);
return;
}
if (valid->num_internet > 0) {
cprintf("%d You do not have permission "
"to send Internet mail.\n",
ERROR + HIGHER_ACCESS_REQUIRED);
- phree(valid);
+ free(valid);
return;
}
}
&& (CC->user.axlevel < 4) ) {
cprintf("%d Higher access required for network mail.\n",
ERROR + HIGHER_ACCESS_REQUIRED);
- phree(valid);
+ free(valid);
return;
}
&& (!CC->internal_pgm)) {
cprintf("%d You don't have access to Internet mail.\n",
ERROR + HIGHER_ACCESS_REQUIRED);
- phree(valid);
+ free(valid);
return;
}
if (post == 0) {
cprintf("%d %s\n", CIT_OK,
((valid != NULL) ? valid->display_recp : "") );
- phree(valid);
+ free(valid);
return;
}
/* Read in the message from the client. */
cprintf("%d send message\n", SEND_LISTING);
+ flush_output();
msg = CtdlMakeMessage(&CC->user, recp,
CC->room.QRname, anonymous, format_type,
masquerade_as, subject, NULL);
CtdlFreeMessage(msg);
}
CC->fake_postname[0] = '\0';
- phree(valid);
+ free(valid);
return;
}
)
{
- struct room qrbuf;
+ struct ctdlroom qrbuf;
struct cdbdata *cdbfr;
long *msglist = NULL;
long *dellist = NULL;
int delete_this;
struct MetaData smi;
- lprintf(9, "CtdlDeleteMessages(%s, %ld, %s)\n",
+ lprintf(CTDL_DEBUG, "CtdlDeleteMessages(%s, %ld, %s)\n",
room_name, dmsgnum, content_type);
/* get room record, obtaining a lock... */
if (lgetroom(&qrbuf, room_name) != 0) {
- lprintf(7, "CtdlDeleteMessages(): Room <%s> not found\n",
+ lprintf(CTDL_ERR, "CtdlDeleteMessages(): Room <%s> not found\n",
room_name);
return (0); /* room not found */
}
cdbfr = cdb_fetch(CDB_MSGLISTS, &qrbuf.QRnumber, sizeof(long));
if (cdbfr != NULL) {
- msglist = mallok(cdbfr->len);
- dellist = mallok(cdbfr->len);
+ msglist = malloc(cdbfr->len);
+ dellist = malloc(cdbfr->len);
memcpy(msglist, cdbfr->ptr, cdbfr->len);
num_msgs = cdbfr->len / sizeof(long);
cdb_free(cdbfr);
* was in, the reference count will reach zero and the message will
* automatically be deleted from the database. We do this in a
* separate pass because there might be plug-in hooks getting called,
- * and we don't want that happening during an S_QUICKROOM critical
+ * and we don't want that happening during an S_ROOMS critical
* section.
*/
if (num_deleted) for (i=0; i<num_deleted; ++i) {
}
/* Now free the memory we used, and go away. */
- if (msglist != NULL) phree(msglist);
- if (dellist != NULL) phree(dellist);
- lprintf(9, "%d message(s) deleted.\n", num_deleted);
+ if (msglist != NULL) free(msglist);
+ if (dellist != NULL) free(dellist);
+ lprintf(CTDL_DEBUG, "%d message(s) deleted.\n", num_deleted);
return (num_deleted);
}
cprintf("%d %d message%s deleted.\n", CIT_OK,
num_deleted, ((num_deleted != 1) ? "s" : ""));
} else {
- cprintf("%d Message %ld not found.\n", ERROR, delnum);
+ cprintf("%d Message %ld not found.\n", ERROR + MESSAGE_NOT_FOUND, delnum);
}
}
{
long num;
char targ[SIZ];
- struct room qtemp;
+ struct ctdlroom qtemp;
int err;
int is_copy = 0;
+ int ra;
+ int permit = 0;
num = extract_long(args, 0);
extract(targ, args, 1);
is_copy = extract_int(args, 2);
if (getroom(&qtemp, targ) != 0) {
- cprintf("%d '%s' does not exist.\n", ERROR, targ);
+ cprintf("%d '%s' does not exist.\n",
+ ERROR + ROOM_NOT_FOUND, targ);
return;
}
getuser(&CC->user, CC->curr_user);
+ ra = CtdlRoomAccess(&qtemp, &CC->user);
+
+ /* Check for permission to perform this operation.
+ * Remember: "CC->room" is source, "qtemp" is target.
+ */
+ permit = 0;
+
/* Aides can move/copy */
- if ((CC->user.axlevel < 6)
- /* Roomaides can move/copy */
- && (CC->user.usernum != CC->room.QRroomaide)
- /* Permit move/copy to/from personal rooms */
- && (!((CC->room.QRflags & QR_MAILBOX)
- && (qtemp.QRflags & QR_MAILBOX)))
- /* Permit only copy from public to personal room */
- && (!(is_copy && !(CC->room.QRflags & QR_MAILBOX)
- && (qtemp.QRflags & QR_MAILBOX)))) {
+ if (CC->user.axlevel >= 6) permit = 1;
+
+ /* Room aides can move/copy */
+ if (CC->user.usernum == CC->room.QRroomaide) permit = 1;
+
+ /* Permit move/copy from personal rooms */
+ if ((CC->room.QRflags & QR_MAILBOX)
+ && (qtemp.QRflags & QR_MAILBOX)) permit = 1;
+
+ /* Permit only copy from public to personal room */
+ if ( (is_copy)
+ && (!(CC->room.QRflags & QR_MAILBOX))
+ && (qtemp.QRflags & QR_MAILBOX)) permit = 1;
+
+ /* User must have access to target room */
+ if (!(ra & UA_KNOWN)) permit = 0;
+
+ if (!permit) {
cprintf("%d Higher access required.\n",
ERROR + HIGHER_ACCESS_REQUIRED);
return;
/* Use the negative of the message number for the metadata db index */
TheIndex = (0L - smibuf->meta_msgnum);
- lprintf(9, "PutMetaData(%ld) - ref count is %d\n",
+ lprintf(CTDL_DEBUG, "PutMetaData(%ld) - ref count is %d\n",
smibuf->meta_msgnum, smibuf->meta_refcount);
cdb_store(CDB_MSGMAIN,
*/
begin_critical_section(S_SUPPMSGMAIN);
GetMetaData(&smi, msgnum);
- lprintf(9, "Ref count for message <%ld> before write is <%d>\n",
+ lprintf(CTDL_DEBUG, "Ref count for message <%ld> before write is <%d>\n",
msgnum, smi.meta_refcount);
smi.meta_refcount += incr;
PutMetaData(&smi);
end_critical_section(S_SUPPMSGMAIN);
- lprintf(9, "Ref count for message <%ld> after write is <%d>\n",
+ lprintf(CTDL_DEBUG, "Ref count for message <%ld> after write is <%d>\n",
msgnum, smi.meta_refcount);
/* If the reference count is now zero, delete the message
* (and its supplementary record as well).
*/
if (smi.meta_refcount == 0) {
- lprintf(9, "Deleting message <%ld>\n", msgnum);
+ lprintf(CTDL_DEBUG, "Deleting message <%ld>\n", msgnum);
delnum = msgnum;
cdb_delete(CDB_MSGMAIN, &delnum, sizeof(long));
+ cdb_delete(CDB_BIGMSGS, &delnum, sizeof(long));
/* We have to delete the metadata record too! */
delnum = (0L - msgnum);
void CtdlWriteObject(char *req_room, /* Room to stuff it in */
char *content_type, /* MIME type of this object */
char *tempfilename, /* Where to fetch it from */
- struct user *is_mailbox, /* Mailbox room? */
+ struct ctdluser *is_mailbox, /* Mailbox room? */
int is_binary, /* Is encoding necessary? */
int is_unique, /* Del others of this type? */
unsigned int flags /* Internal save flags */
{
FILE *fp;
- struct room qrbuf;
+ struct ctdlroom qrbuf;
char roomname[ROOMNAMELEN];
struct CtdlMessage *msg;
MailboxName(roomname, sizeof roomname, is_mailbox, req_room);
else
safestrncpy(roomname, req_room, sizeof(roomname));
- lprintf(9, "CtdlWriteObject() to <%s> (flags=%d)\n", roomname, flags);
+ lprintf(CTDL_DEBUG, "CtdlWriteObject() to <%s> (flags=%d)\n", roomname, flags);
fp = fopen(tempfilename, "rb");
if (fp == NULL) {
- lprintf(5, "Cannot open %s: %s\n",
+ lprintf(CTDL_CRIT, "Cannot open %s: %s\n",
tempfilename, strerror(errno));
return;
}
fseek(fp, 0L, SEEK_END);
raw_length = ftell(fp);
rewind(fp);
- lprintf(9, "Raw length is %ld\n", (long)raw_length);
+ lprintf(CTDL_DEBUG, "Raw length is %ld\n", (long)raw_length);
- raw_message = mallok((size_t)raw_length + 2);
+ raw_message = malloc((size_t)raw_length + 2);
fread(raw_message, (size_t)raw_length, 1, fp);
fclose(fp);
if (is_binary) {
- encoded_message = mallok((size_t)
+ encoded_message = malloc((size_t)
(((raw_length * 134) / 100) + 4096 ) );
}
else {
- encoded_message = mallok((size_t)(raw_length + 4096));
+ encoded_message = malloc((size_t)(raw_length + 4096));
}
sprintf(encoded_message, "Content-type: %s\n", content_type);
);
}
- phree(raw_message);
+ free(raw_message);
- lprintf(9, "Allocating\n");
- msg = mallok(sizeof(struct CtdlMessage));
+ lprintf(CTDL_DEBUG, "Allocating\n");
+ msg = malloc(sizeof(struct CtdlMessage));
memset(msg, 0, sizeof(struct CtdlMessage));
msg->cm_magic = CTDLMESSAGE_MAGIC;
msg->cm_anon_type = MES_NORMAL;
msg->cm_format_type = 4;
- msg->cm_fields['A'] = strdoop(CC->user.fullname);
- msg->cm_fields['O'] = strdoop(req_room);
- msg->cm_fields['N'] = strdoop(config.c_nodename);
- msg->cm_fields['H'] = strdoop(config.c_humannode);
+ msg->cm_fields['A'] = strdup(CC->user.fullname);
+ msg->cm_fields['O'] = strdup(req_room);
+ msg->cm_fields['N'] = strdup(config.c_nodename);
+ msg->cm_fields['H'] = strdup(config.c_humannode);
msg->cm_flags = flags;
msg->cm_fields['M'] = encoded_message;
* other objects of this type that are currently in the room.
*/
if (is_unique) {
- lprintf(9, "Deleted %d other msgs of this type\n",
+ lprintf(CTDL_DEBUG, "Deleted %d other msgs of this type\n",
CtdlDeleteMessages(roomname, 0L, content_type));
}
/* Now write the data */
conf = NULL;
}
else {
- msg = CtdlFetchMessage(msgnum);
+ msg = CtdlFetchMessage(msgnum, 1);
if (msg != NULL) {
- conf = strdoop(msg->cm_fields['M']);
+ conf = strdup(msg->cm_fields['M']);
CtdlFreeMessage(msg);
}
else {
if (recp == NULL) return(0);
if (recp->num_local == 0) {
- phree(recp);
+ free(recp);
return(0);
}
for (i=0; i<recp->num_local; ++i) {
extract(addr, recp->recp_local, i);
if (!strcasecmp(addr, CC->user.fullname)) {
- phree(recp);
+ free(recp);
return(1);
}
}
- phree(recp);
+ free(recp);
return(0);
}
cprintf("%d %s\n", CIT_OK, addr);
}
else {
- cprintf("%d Not you.\n", ERROR);
+ cprintf("%d Not you.\n", ERROR + ILLEGAL_VALUE);
}
}