NULL /* Z */
};
+void CtdlMsgSetCM_Fields(struct CtdlMessage *Msg, const char which, const char *buf, long length)
+{
+ if (Msg->cm_fields[which] != NULL)
+ free (Msg->cm_fields[which]);
+ Msg->cm_fields[which] = malloc(length + 1);
+ memcpy(Msg->cm_fields[which], buf, length);
+ Msg->cm_fields[which][length] = '\0';
+}
+
/*
* This function is self explanatory.
* (What can I say, I'm in a weird mood today...)
return;
}
- rv = fwrite(content, length, 1, CC->download_fp);
+ rv = fwrite(content, length, 1, CCC->download_fp);
if (rv <= 0) {
MSG_syslog(LOG_EMERG, "mime_download(): Couldn't write: %s\n",
strerror(errno));
MSG_syslog(LOG_DEBUG, "CtdlFetchMessage(%ld, %d)\n", msgnum, with_body);
dmsgtext = cdb_fetch(CDB_MSGMAIN, &msgnum, sizeof(long));
if (dmsgtext == NULL) {
+ MSG_syslog(LOG_ERR, "CtdlFetchMessage(%ld, %d) Failed!\n", msgnum, with_body);
return NULL;
}
mptr = dmsgtext->ptr;
free(msg);
}
+int DupCMField(int i, struct CtdlMessage *OrgMsg, struct CtdlMessage *NewMsg)
+{
+ long len;
+ len = strlen(OrgMsg->cm_fields[i]);
+ NewMsg->cm_fields[i] = malloc(len + 1);
+ if (NewMsg->cm_fields[i] == NULL)
+ return 0;
+ memcpy(NewMsg->cm_fields[i], OrgMsg->cm_fields[i], len);
+ NewMsg->cm_fields[i][len] = '\0';
+ return 1;
+}
+
+struct CtdlMessage * CtdlDuplicateMessage(struct CtdlMessage *OrgMsg)
+{
+ int i;
+ struct CtdlMessage *NewMsg;
+
+ if (is_valid_message(OrgMsg) == 0)
+ return NULL;
+ NewMsg = (struct CtdlMessage *)malloc(sizeof(struct CtdlMessage));
+ if (NewMsg == NULL)
+ return NULL;
+
+ memcpy(NewMsg, OrgMsg, sizeof(struct CtdlMessage));
+
+ memset(&NewMsg->cm_fields, 0, sizeof(char*) * 256);
+
+ for (i = 0; i < 256; ++i)
+ {
+ if (OrgMsg->cm_fields[i] != NULL)
+ {
+ if (!DupCMField(i, OrgMsg, NewMsg))
+ {
+ CtdlFreeMessage(NewMsg);
+ return NULL;
+ }
+ }
+ }
+
+ return NewMsg;
+}
+
+
/*
* Pre callback function for multipart/alternative
*/
void quickie_message(const char *from,
const char *fromaddr,
- char *to,
+ const char *to,
char *room,
const char *text,
int format_type,
void flood_protect_quickie_message(const char *from,
const char *fromaddr,
- char *to,
+ const char *to,
char *room,
const char *text,
int format_type,
const char *subject,
int nCriterions,
const char **CritStr,
- long *CritStrLen)
+ long *CritStrLen,
+ long ccid,
+ long ioid,
+ time_t NOW)
{
int i;
- struct UseTable ut;
u_char rawdigest[MD5_DIGEST_LEN];
struct MD5Context md5context;
StrBuf *guid;
- struct cdbdata *cdbut;
char timestamp[64];
long tslen;
- time_t ts = time(NULL);
- time_t tsday = ts / (8*60*60); /* just care for a day... */
+ time_t tsday = NOW / (8*60*60); /* just care for a day... */
tslen = snprintf(timestamp, sizeof(timestamp), "%ld", tsday);
MD5Init(&md5context);
StrBufAppendBufPlain(guid, HKEY("_fldpt"), 0);
if (StrLength(guid) > 40)
StrBufCutAt(guid, 40, NULL);
- /* Find out if we've already sent a similar message */
- memcpy(ut.ut_msgid, SKEY(guid));
- ut.ut_timestamp = ts;
- cdbut = cdb_fetch(CDB_USETABLE, SKEY(guid));
-
- if (cdbut != NULL) {
+ if (CheckIfAlreadySeen("FPAideMessage",
+ guid,
+ NOW,
+ tsday,
+ eUpdate,
+ ccid,
+ ioid)!= 0)
+ {
+ FreeStrBuf(&guid);
/* yes, we did. flood protection kicks in. */
syslog(LOG_DEBUG,
"not sending message again\n");
- cdb_free(cdbut);
+ return;
}
-
- /* rewrite the record anyway, to update the timestamp */
- cdb_store(CDB_USETABLE,
- SKEY(guid),
- &ut, sizeof(struct UseTable) );
-
FreeStrBuf(&guid);
-
- if (cdbut != NULL) return;
/* no, this message isn't sent recently; go ahead. */
quickie_message(from,
fromaddr,
regcomp(&re, content_type, 0);
need_to_free_re = 1;
}
- MSG_syslog(LOG_DEBUG, "CtdlDeleteMessages(%s, %d msgs, %s)\n",
+ MSG_syslog(LOG_DEBUG, " CtdlDeleteMessages(%s, %d msgs, %s)\n",
room_name, num_dmsgnums, content_type);
/* get room record, obtaining a lock... */
if (CtdlGetRoomLock(&qrbuf, room_name) != 0) {
- MSG_syslog(LOG_ERR, "CtdlDeleteMessages(): Room <%s> not found\n",
+ MSG_syslog(LOG_ERR, " CtdlDeleteMessages(): Room <%s> not found\n",
room_name);
if (need_to_free_re) regfree(&re);
return (0); /* room not found */
StrBuf *dbg = NewStrBuf();
for (i = 0; i < num_dmsgnums; i++)
StrBufAppendPrintf(dbg, ", %ld", dmsgnums[i]);
- MSG_syslog(LOG_DEBUG, "Deleting before: %s", ChrPtr(dbg));
+ MSG_syslog(LOG_DEBUG, " Deleting before: %s", ChrPtr(dbg));
FreeStrBuf(&dbg);
}
*/
while ((i < num_msgs) && (have_more_del)) {
delete_this = 0x00;
-
/* Set/clear a bit for each criterion */
/* 0 messages in the list or a null list means that we are
}
else {
while ((i < num_msgs) && (msglist[i] < dmsgnums[j])) i++;
+
+ if (i >= num_msgs)
+ continue;
+
if (msglist[i] == dmsgnums[j]) {
delete_this |= 0x01;
}
StrBuf *dbg = NewStrBuf();
for (i = 0; i < num_deleted; i++)
StrBufAppendPrintf(dbg, ", %ld", dellist[i]);
- MSG_syslog(LOG_DEBUG, "Deleting: %s", ChrPtr(dbg));
+ MSG_syslog(LOG_DEBUG, " Deleting: %s", ChrPtr(dbg));
FreeStrBuf(&dbg);
}
*/
/* Now free the memory we used, and go away. */
if (msglist != NULL) free(msglist);
if (dellist != NULL) free(dellist);
- MSG_syslog(LOG_DEBUG, "%d message(s) deleted.\n", num_deleted);
+ MSG_syslog(LOG_DEBUG, " %d message(s) deleted.\n", num_deleted);
if (need_to_free_re) regfree(&re);
return (num_deleted);
}