* New MSGS subcommand 'EUID' to fetch msgnum of a message by EUID ... similar to...
authorArt Cancro <ajc@citadel.org>
Wed, 7 Oct 2009 21:12:52 +0000 (21:12 +0000)
committerArt Cancro <ajc@citadel.org>
Wed, 7 Oct 2009 21:12:52 +0000 (21:12 +0000)
citadel/file_ops.c
citadel/msgbase.c
citadel/msgbase.h

index 8fcc068bfd88bf2e1a555c839a6e9de920995603..165fd281f52c0eed0ffc79796ced2a5d8bf15b2d 100644 (file)
@@ -163,6 +163,7 @@ void cmd_movf(char *cmdbuf)
        char buf[PATH_MAX];
        int a;
        struct ctdlroom qrbuf;
+       int rv = 0;
 
        extract_token(filename, cmdbuf, 0, '|', sizeof filename);
        extract_token(newroom, cmdbuf, 1, '|', sizeof newroom);
@@ -216,7 +217,7 @@ void cmd_movf(char *cmdbuf)
        snprintf(buf, sizeof buf,
                 "cat ./files/%s/filedir |grep \"%s\" >>./files/%s/filedir",
                 CC->room.QRdirname, filename, qrbuf.QRdirname);
-       system(buf);
+       rv = system(buf);
        cprintf("%d File '%s' has been moved.\n", CIT_OK, filename);
 }
 
@@ -307,6 +308,7 @@ void cmd_oimg(char *cmdbuf)
        char which_user[USERNAME_SIZE];
        int which_floor;
        int a;
+       int rv;
 
        extract_token(filename, cmdbuf, 0, '|', sizeof filename);
 
@@ -363,7 +365,7 @@ void cmd_oimg(char *cmdbuf)
                        ERROR + FILE_NOT_FOUND, pathname, strerror(errno));
                return;
        }
-       fread(&MimeTestBuf[0], 1, 32, CC->download_fp);
+       rv = fread(&MimeTestBuf[0], 1, 32, CC->download_fp);
        rewind (CC->download_fp);
        OpenCmdResult(pathname, GuessMimeType(&MimeTestBuf[0], 32));
 }
@@ -650,6 +652,7 @@ void cmd_writ(char *cmdbuf)
 {
        int bytes;
        char *buf;
+       int rv;
 
        unbuffer_output();
 
@@ -669,7 +672,7 @@ void cmd_writ(char *cmdbuf)
        cprintf("%d %d\n", SEND_BINARY, bytes);
        buf = malloc(bytes + 1);
        client_read(buf, bytes);
-       fwrite(buf, bytes, 1, CC->upload_fp);
+       rv = fwrite(buf, bytes, 1, CC->upload_fp);
        free(buf);
 }
 
index 7b4873cee126a5ee59332e3f4c5e958416357fc7..9563223d63961eb05d222e557f24192ec96fd6de 100644 (file)
@@ -562,7 +562,9 @@ void CtdlSetSeen(long *target_msgnums, int num_target_msgnums,
  * API function to perform an operation for each qualifying message in the
  * current room.  (Returns the number of messages processed.)
  */
-int CtdlForEachMessage(int mode, long ref, char *search_string,
+int CtdlForEachMessage(int mode,
+                       long ref,
+                       char *search_string,
                        char *content_type,
                        struct CtdlMessage *compare,
                        void (*CallBack) (long, void *),
@@ -654,6 +656,30 @@ int CtdlForEachMessage(int mode, long ref, char *search_string,
                }
        }
 
+       /* If an EUID was specified, throw away all messages except the correct one. */
+       if (mode == MSGS_EUID) {
+               long correct_msgnum;
+               int found_match = 0;
+
+               if ((num_msgs > 0) && (search_string) ) {
+                       correct_msgnum = locate_message_by_euid(search_string, &CC->room);
+                       if ( (num_msgs > 0) && (correct_msgnum >= 0L) ) {
+                               for (i=0; i<num_msgs; ++i) {
+                                       if (msglist[i] == correct_msgnum) {
+                                               found_match = 1;
+                                       }
+                               }
+                       }
+               }
+               if (found_match) {
+                       msglist[0] = correct_msgnum;
+                       num_msgs = 1;
+               } else {
+                       num_msgs = 0;   /* didn't find the right one ... dump the rest */
+               }
+               mode = MSGS_ALL;        /* treat it like 'read all' from now on */
+       }
+
        /* If a search string was specified, get a message list from
         * the full text index and remove messages which aren't on both
         * lists.
@@ -780,6 +806,8 @@ void cmd_msgs(char *cmdbuf)
                mode = MSGS_GT;
        else if (!strncasecmp(which, "SEARCH", 6))
                mode = MSGS_SEARCH;
+       else if (!strncasecmp(which, "EUID", 4))
+               mode = MSGS_EUID;
        else
                mode = MSGS_ALL;
 
@@ -822,7 +850,7 @@ void cmd_msgs(char *cmdbuf)
 
        CtdlForEachMessage(mode,
                        ( (mode == MSGS_SEARCH) ? 0 : cm_ref ),
-                       ( (mode == MSGS_SEARCH) ? search_string : NULL ),
+                       ( ((mode == MSGS_SEARCH)||(mode == MSGS_EUID)) ? search_string : NULL ),
                        NULL,
                        template,
                        (with_headers ? headers_listing : simple_listing),
index 56f2488249358035514925632b27116a1a9b2737..f058527e35d2b67bfa5ade251d17f768a39147ad 100644 (file)
@@ -13,7 +13,8 @@ enum {
        MSGS_LAST,
        MSGS_GT,
        MSGS_EQ,
-       MSGS_SEARCH
+       MSGS_SEARCH,
+       MSGS_EUID
 };
 
 /*