// called by server-side modules.
long CtdlSaveThisMessage(struct CtdlMessage *msg, long msgid, int Reply) {
long retval;
- struct ser_ret smr;
int is_bigmsg = 0;
char *holdM = NULL;
long holdMLen = 0;
}
// Serialize our data structure for storage in the database
- CtdlSerializeMessage(&smr, msg);
+ struct ser_ret smr = CtdlSerializeMessage(msg);
if (is_bigmsg) {
// put the message body back into the message
// Serialize a struct CtdlMessage into the format used on disk.
//
-// This function loads up a "struct ser_ret" (defined in server.h) which
+// This function returns a "struct ser_ret" (defined in server.h) which
// contains the length of the serialized message and a pointer to the
// serialized message in memory. THE LATTER MUST BE FREED BY THE CALLER.
-void CtdlSerializeMessage(struct ser_ret *ret, // return values
- struct CtdlMessage *msg) // unserialized msg
-{
+struct ser_ret CtdlSerializeMessage(struct CtdlMessage *msg) {
+ struct ser_ret ret;
size_t wlen;
int i;
// Check for valid message format
if (CM_IsValidMsg(msg) == 0) {
syslog(LOG_ERR, "msgbase: CtdlSerializeMessage() aborting due to invalid message");
- ret->len = 0;
- ret->ser = NULL;
- return;
+ ret.len = 0;
+ ret.ser = NULL;
+ return(ret);
}
- ret->len = 3;
- for (i=0; i < NDiskFields; ++i)
- if (msg->cm_fields[FieldOrder[i]] != NULL)
- ret->len += msg->cm_lengths[FieldOrder[i]] + 2;
+ ret.len = 3;
+ for (i=0; i < NDiskFields; ++i) {
+ if (msg->cm_fields[FieldOrder[i]] != NULL) {
+ ret.len += msg->cm_lengths[FieldOrder[i]] + 2;
+ }
+ }
- ret->ser = malloc(ret->len);
- if (ret->ser == NULL) {
- syslog(LOG_ERR, "msgbase: CtdlSerializeMessage() malloc(%ld) failed: %m", (long)ret->len);
- ret->len = 0;
- ret->ser = NULL;
- return;
+ ret.ser = malloc(ret.len);
+ if (ret.ser == NULL) {
+ syslog(LOG_ERR, "msgbase: CtdlSerializeMessage() malloc(%ld) failed: %m", (long)ret.len);
+ ret.len = 0;
+ ret.ser = NULL;
+ return(ret);
}
- ret->ser[0] = 0xFF;
- ret->ser[1] = msg->cm_anon_type;
- ret->ser[2] = msg->cm_format_type;
+ ret.ser[0] = 0xFF;
+ ret.ser[1] = msg->cm_anon_type;
+ ret.ser[2] = msg->cm_format_type;
wlen = 3;
for (i=0; i < NDiskFields; ++i) {
if (msg->cm_fields[FieldOrder[i]] != NULL) {
- ret->ser[wlen++] = (char)FieldOrder[i];
-
- memcpy(&ret->ser[wlen],
- msg->cm_fields[FieldOrder[i]],
- msg->cm_lengths[FieldOrder[i]] + 1);
-
+ ret.ser[wlen++] = (char)FieldOrder[i];
+ memcpy(&ret.ser[wlen], msg->cm_fields[FieldOrder[i]], msg->cm_lengths[FieldOrder[i]] + 1);
wlen = wlen + msg->cm_lengths[FieldOrder[i]] + 1;
}
}
- if (ret->len != wlen) {
- syslog(LOG_ERR, "msgbase: ERROR; len=%ld wlen=%ld", (long)ret->len, (long)wlen);
+ if (ret.len != wlen) {
+ syslog(LOG_ERR, "msgbase: ERROR; len=%ld wlen=%ld", (long)ret.len, (long)wlen);
}
- return;
+ return(ret);
}