when we fail to preserve the temporary file for mime download preparation print out...
[citadel.git] / citadel / msgbase.c
index 1bc393b26efc0c958d6655f4fc0910ea4863fef2..824b51bd337974b232da9bd2644ccaed22db1085 100644 (file)
@@ -1084,26 +1084,37 @@ void mime_download(char *name, char *filename, char *partnum, char *disp,
                   char *encoding, char *cbid, void *cbuserdata)
 {
        int rv = 0;
+       CitContext *CCC = MyContext();
 
        /* Silently go away if there's already a download open. */
-       if (CC->download_fp != NULL)
+       if (CCC->download_fp != NULL)
                return;
 
        if (
-               (!IsEmptyStr(partnum) && (!strcasecmp(CC->download_desired_section, partnum)))
-       ||      (!IsEmptyStr(cbid) && (!strcasecmp(CC->download_desired_section, cbid)))
+               (!IsEmptyStr(partnum) && (!strcasecmp(CCC->download_desired_section, partnum)))
+       ||      (!IsEmptyStr(cbid) && (!strcasecmp(CCC->download_desired_section, cbid)))
        ) {
-               CC->download_fp = tmpfile();
-               if (CC->download_fp == NULL)
+               CCC->download_fp = tmpfile();
+               if (CCC->download_fp == NULL) {
+                       syslog(LOG_EMERG, "mime_download(): Couldn't write: %s\n",
+                              strerror(errno));
+                       cprintf("%d cannot open temporary file: %s\n",
+                               ERROR + INTERNAL_ERROR, strerror(errno));
                        return;
+               }
        
                rv = fwrite(content, length, 1, CC->download_fp);
-               if (rv == -1) {
+               if (rv <= 0) {
                        syslog(LOG_EMERG, "mime_download(): Couldn't write: %s\n",
                               strerror(errno));
+                       cprintf("%d unable to write tempfile.\n",
+                               ERROR + TOO_BIG);
+                       fclose(CCC->download_fp);
+                       CCC->download_fp = NULL;
+                       return;
                }
-               fflush(CC->download_fp);
-               rewind(CC->download_fp);
+               fflush(CCC->download_fp);
+               rewind(CCC->download_fp);
        
                OpenCmdResult(filename, cbtype);
        }
@@ -1239,26 +1250,28 @@ int is_valid_message(struct CtdlMessage *msg) {
        return 1;
 }
 
+void CtdlFreeMessageContents(struct CtdlMessage *msg)
+{
+       int i;
+
+       for (i = 0; i < 256; ++i)
+               if (msg->cm_fields[i] != NULL) {
+                       free(msg->cm_fields[i]);
+               }
 
+       msg->cm_magic = 0;      /* just in case */
+}
 /*
  * 'Destructor' for struct CtdlMessage
  */
 void CtdlFreeMessage(struct CtdlMessage *msg)
 {
-       int i;
-
        if (is_valid_message(msg) == 0) 
        {
                if (msg != NULL) free (msg);
                return;
        }
-
-       for (i = 0; i < 256; ++i)
-               if (msg->cm_fields[i] != NULL) {
-                       free(msg->cm_fields[i]);
-               }
-
-       msg->cm_magic = 0;      /* just in case */
+       CtdlFreeMessageContents(msg);
        free(msg);
 }
 
@@ -2635,7 +2648,6 @@ int CtdlSaveMsgPointersInRoom(char *roomname, long newmsgidlist[], int num_newms
                "CtdlSaveMsgPointersInRoom(room=%s, num_msgs=%d, repl=%d, suppress_rca=%d)\n",
                roomname, num_newmsgs, do_repl_check, suppress_refcount_adj
        );
-       if (num_newmsgs > 0) for (i=0; i<num_newmsgs; ++i) syslog(LOG_DEBUG, "\033[33mmerge %ld\033[0m", newmsgidlist[i]);
 
        strcpy(hold_rm, CC->room.QRname);
 
@@ -2682,10 +2694,6 @@ int CtdlSaveMsgPointersInRoom(char *roomname, long newmsgidlist[], int num_newms
                }
                if (unique) {
                        msgs_to_be_merged[num_msgs_to_be_merged++] = newmsgidlist[i];
-                       syslog(LOG_DEBUG, "\033[32mmsg %ld is being merged\033[0m", newmsgidlist[i]);
-               }
-               else {
-                       syslog(LOG_DEBUG, "\033[31mmsg %ld is not unique\033[0m", newmsgidlist[i]);
                }
        }
 
@@ -3266,14 +3274,18 @@ long CtdlSubmitMsg(struct CtdlMessage *msg,     /* message to save */
                        }
                        else {
                                syslog(LOG_DEBUG, "No user <%s>\n", recipient);
-                               CtdlSaveMsgPointerInRoom(config.c_aideroom,
-                                                        newmsgid, 0, msg);
+                               CtdlSaveMsgPointerInRoom(config.c_aideroom, newmsgid, 0, msg);
                        }
                }
 
        /* Perform "after save" hooks */
        syslog(LOG_DEBUG, "Performing after-save hooks\n");
+       if (msg->cm_fields['3'] != NULL) free(msg->cm_fields['3']);
+       msg->cm_fields['3'] = malloc(20);
+       snprintf(msg->cm_fields['3'], 20, "%ld", newmsgid);
        PerformMessageHooks(msg, EVT_AFTERSAVE);
+       free(msg->cm_fields['3']);
+       msg->cm_fields['3'] = NULL;
 
        /* For IGnet mail, we have to save a new copy into the spooler for
         * each recipient, with the R and D fields set to the recipient and