Patch for ipurge

Patrick Boutilier boutilpj at ednet.ns.ca
Tue Mar 11 15:28:38 EST 2003


I altered ipurce.c a bit to include a -o option. The -o option will only 
purge messages with the deleted flag set. Attached is the diff.
-------------- next part --------------
--- ipurge.c.orig	2002-11-14 11:47:52.000000000 -0400
+++ ipurge.c	2003-03-11 15:55:35.000000000 -0400
@@ -82,6 +82,7 @@
 int exact = -1;
 int pattern = -1;
 int skipflagged = 0;
+int onlydeleted = 0;
 
 /* for statistical purposes */
 typedef struct mbox_stats_s {
@@ -115,7 +116,7 @@
     usage(argv[0]);
   }
 
-  while ((option = getopt(argc, argv, "C:hxd:b:k:m:fs")) != EOF) {
+  while ((option = getopt(argc, argv, "C:hxd:b:k:m:fso")) != EOF) {
     switch (option) {
     case 'C': /* alt config file */
       alt_config = optarg;
@@ -153,6 +154,9 @@
     case 's' : {
       skipflagged = 1;
     } break;
+    case 'o' : {
+      onlydeleted = 1;
+    } break;
     case 'h':
     default: usage(argv[0]);
     }
@@ -196,12 +200,13 @@
 
 int
 usage(char *name) {
-  printf("usage: %s [-f] [-s] [-C <alt_config>] [-x] {-d days &| -b bytes|-k Kbytes|-m Mbytes}\n\t[mboxpattern1 ... [mboxpatternN]]\n", name);
+  printf("usage: %s [-f] [-s] [-o] [-C <alt_config>] [-x] {-d days &| -b bytes|-k Kbytes|-m Mbytes}\n\t[mboxpattern1 ... [mboxpatternN]]\n", name);
   printf("\tthere are no defaults and at least one of -d, -b, -k, -m\n\tmust be specified\n");
   printf("\tif no mboxpattern is given %s works on all mailboxes\n", name);
   printf("\t -x specifies an exact match for days or size\n");
   printf("\t -f force also to delete mail below user.* and INBOX.*\n");
   printf("\t -s skip over messages that are flagged.\n");
+  printf("\t -o only process messages that are deleted.\n");
   exit(0);
 }
 
@@ -270,10 +275,12 @@
   bit32 senttime;
   bit32 msgsize;
   bit32 flagged;
+  bit32 delete_flagged;
 
   senttime = ntohl(*((bit32 *)(buf + OFFSET_SENTDATE)));
   msgsize = ntohl(*((bit32 *)(buf + OFFSET_SIZE)));
   flagged = ntohl(*((bit32 *)(buf + OFFSET_SYSTEM_FLAGS))) & FLAG_FLAGGED;
+  delete_flagged = ntohl(*((bit32 *)(buf + OFFSET_SYSTEM_FLAGS))) & FLAG_DELETED;
 
   stats->total++;
   stats->total_bytes += msgsize;
@@ -281,6 +288,9 @@
   if (skipflagged && flagged)
     return 0;
 
+  if (onlydeleted && !delete_flagged)
+    return 0;
+
   if (exact == 1) {
     if (days >= 0) {
       my_time = time(0);


More information about the Info-cyrus mailing list