From ffe9ea29a8fd7dfeb7c89760fde32b3f53f19a50 Mon Sep 17 00:00:00 2001 From: Wilfried Goesgens Date: Sun, 20 Jan 2013 16:26:54 +0100 Subject: [PATCH] Add function to in-memory duplicate a message. --- citadel/msgbase.c | 42 ++++++++++++++++++++++++++++++++++++++++++ citadel/msgbase.h | 1 + 2 files changed, 43 insertions(+) diff --git a/citadel/msgbase.c b/citadel/msgbase.c index 6320144f4..78fda6fa2 100644 --- a/citadel/msgbase.c +++ b/citadel/msgbase.c @@ -1312,6 +1312,48 @@ void CtdlFreeMessage(struct CtdlMessage *msg) 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); + 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(NewMsg->cm_fields)); + + 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 diff --git a/citadel/msgbase.h b/citadel/msgbase.h index 888b62725..838a9792a 100644 --- a/citadel/msgbase.h +++ b/citadel/msgbase.h @@ -160,6 +160,7 @@ void CtdlWriteObject(char *req_room, /* Room to stuff it in */ unsigned int flags /* Internal save flags */ ); struct CtdlMessage *CtdlFetchMessage(long msgnum, int with_body); +struct CtdlMessage * CtdlDuplicateMessage(struct CtdlMessage *OrgMsg); void CtdlFreeMessage(struct CtdlMessage *msg); void CtdlFreeMessageContents(struct CtdlMessage *msg); void serialize_message(struct ser_ret *, struct CtdlMessage *); -- 2.30.2