* control.c: create citadel.control if it doesn't exist (yikes!)
authorArt Cancro <ajc@citadel.org>
Thu, 8 Jul 1999 03:48:20 +0000 (03:48 +0000)
committerArt Cancro <ajc@citadel.org>
Thu, 8 Jul 1999 03:48:20 +0000 (03:48 +0000)
        * serv_expire.c: purge mailbox rooms belonging to non-existent users
        * user_ops.c: don't delete user's mailbox at user-delete time

citadel/ChangeLog
citadel/control.c
citadel/serv_expire.c
citadel/user_ops.c

index 4a1501c6aba86aeaa7e9da82901685a4b9a047a8..cb8e122d8cda8780d106349e5e1676d9a81540b9 100644 (file)
@@ -1,3 +1,8 @@
+Wed Jul  7 23:25:09 EDT 1999 Art Cancro <ajc@uncnsrd.mt-kisco.ny.us>
+       * control.c: create citadel.control if it doesn't exist (yikes!)
+       * serv_expire.c: purge mailbox rooms belonging to non-existent users
+       * user_ops.c: don't delete user's mailbox at user-delete time
+
 Mon Jul  5 17:01:29 EDT 1999 Art Cancro <ajc@uncnsrd.mt-kisco.ny.us>
        * utilsmenu: removed menu items for defunct utilities
 
index c4868210a01ab6559352b01b6f916d2c69dfac3f..e6e85a971e29e0c236d37d60e106a5ef8ac067a6 100644 (file)
@@ -48,7 +48,20 @@ void get_control(void) {
        memset(&CitControl, 0, sizeof(struct CitControl));
        if (control_fp == NULL)
                control_fp = fopen("citadel.control", "rb+");
-       if (control_fp == NULL) return;
+       if (control_fp == NULL) {
+               control_fp = fopen("citadel.control", "wb+");
+               if (control_fp != NULL) {
+                       memset(&CitControl, 0, sizeof(struct CitControl));
+                       fwrite(&CitControl, sizeof(struct CitControl),
+                               1, control_fp);
+                       rewind(control_fp);
+               }
+       }
+       if (control_fp == NULL) {
+               lprintf(1, "ERROR opening citadel.control: %s\n",
+                       strerror(errno));
+               return;
+       }
 
        rewind(control_fp);
        fread(&CitControl, sizeof(struct CitControl), 1, control_fp);
index 4b9aaae4677c83a026b29c56119de3e833895a3d..3a191652751de1bdb4cf9f431345438cca71cb5b 100644 (file)
@@ -175,51 +175,105 @@ void PurgeMessages(void) {
        lprintf(5, "PurgeMessages() called\n");
        messages_purged = 0;
        ForEachRoom(DoPurgeMessages);
+}
+
+
+void AddValidUser(struct usersupp *usbuf) {
+       struct ValidUser *vuptr;
+
+       vuptr = (struct ValidUser *)mallok(sizeof(struct ValidUser));
+       vuptr->next = ValidUserList;
+       vuptr->vu_usernum = usbuf->usernum;
+       ValidUserList = vuptr;
        }
 
+void AddValidRoom(struct quickroom *qrbuf) {
+       struct ValidRoom *vrptr;
+
+       vrptr = (struct ValidRoom *)mallok(sizeof(struct ValidRoom));
+       vrptr->next = ValidRoomList;
+       vrptr->vr_roomnum = qrbuf->QRnumber;
+       vrptr->vr_roomgen = qrbuf->QRgen;
+       ValidRoomList = vrptr;
+       }
 
 void DoPurgeRooms(struct quickroom *qrbuf) {
        time_t age, purge_secs;
        struct PurgeList *pptr;
+       struct ValidUser *vuptr;
+       int do_purge = 0;
+
+       /* For mailbox rooms, there's only one purging rule: if the user who
+        * owns the room still exists, we keep the room; otherwise, we purge
+        * it.  Bypass any other rules.
+        */
+       if (qrbuf->QRflags & QR_MAILBOX) {
+               for (vuptr=ValidUserList; vuptr!=NULL; vuptr=vuptr->next) {
+                       if (vuptr->vu_usernum == atol(qrbuf->QRname)) {
+                               do_purge = 0;
+                               goto BYPASS;
+                       }
+               }
+               /* user not found */
+               do_purge = 1;
+               goto BYPASS;
+       }
 
        /* Any of these attributes render a room non-purgable */
        if (qrbuf->QRflags & QR_PERMANENT) return;
        if (qrbuf->QRflags & QR_DIRECTORY) return;
        if (qrbuf->QRflags & QR_NETWORK) return;
-       if (qrbuf->QRflags & QR_MAILBOX) return;
        if (is_noneditable(qrbuf)) return;
 
        /* If we don't know the modification date, be safe and don't purge */
        if (qrbuf->QRmtime <= (time_t)0) return;
 
+       /* If no room purge time is set, be safe and don't purge */
+       if (config.c_roompurge < 0) return;
+
        /* Otherwise, check the date of last modification */
        age = time(NULL) - (qrbuf->QRmtime);
        purge_secs = (time_t)config.c_roompurge * (time_t)86400;
        if (purge_secs <= (time_t)0) return;
        lprintf(9, "<%s> is <%ld> seconds old\n", qrbuf->QRname, age);
+       if (age > purge_secs) do_purge = 1;
 
-       if (age > purge_secs) {
-               
+BYPASS:        if (do_purge) {
                pptr = (struct PurgeList *) mallok(sizeof(struct PurgeList));
                pptr->next = RoomPurgeList;
                strcpy(pptr->name, qrbuf->QRname);
                RoomPurgeList = pptr;
-
-               }
        }
 
+}
+       
+
 
 int PurgeRooms(void) {
        struct PurgeList *pptr;
        int num_rooms_purged = 0;
        struct quickroom qrbuf;
+       struct ValidUser *vuptr;
        char *transcript = NULL;
 
        lprintf(5, "PurgeRooms() called\n");
-       if (config.c_roompurge > 0) {
-               ForEachRoom(DoPurgeRooms);
+
+
+       /* Load up a table full of valid user numbers so we can delete
+        * user-owned rooms for users who no longer exist */
+       ForEachUser(AddValidUser);
+
+       /* Then cycle through the room file */
+       ForEachRoom(DoPurgeRooms);
+
+       /* Free the valid user list */
+       while (ValidUserList != NULL) {
+               vuptr = ValidUserList->next;
+               phree(ValidUserList);
+               ValidUserList = vuptr;
                }
 
+
        transcript = mallok(256);
        strcpy(transcript, "The following rooms have been auto-purged:\n");
 
@@ -329,25 +383,6 @@ int PurgeUsers(void) {
        return(num_users_purged);
        }
 
-void AddValidUser(struct usersupp *usbuf) {
-       struct ValidUser *vuptr;
-
-       vuptr = (struct ValidUser *)mallok(sizeof(struct ValidUser));
-       vuptr->next = ValidUserList;
-       vuptr->vu_usernum = usbuf->usernum;
-       ValidUserList = vuptr;
-       }
-
-void AddValidRoom(struct quickroom *qrbuf) {
-       struct ValidRoom *vrptr;
-
-       vrptr = (struct ValidRoom *)mallok(sizeof(struct ValidRoom));
-       vrptr->next = ValidRoomList;
-       vrptr->vr_roomnum = qrbuf->QRnumber;
-       vrptr->vr_roomgen = qrbuf->QRgen;
-       ValidRoomList = vrptr;
-       }
-
 
 /*
  * Purge visits
index 46a647f8beae8d9e6cea895e0573b59a32409f8c..b29c6aecc408010ee9caa8866875a352631c8e93 100644 (file)
@@ -501,11 +501,16 @@ int purge_user(char pname[]) {
        /* delete any existing user/room relationships */
        cdb_delete(CDB_VISIT, &usbuf.usernum, sizeof(long));
 
-       /* Delete the user's mailbox and its contents */
-       MailboxName(mailboxname, &usbuf, MAILROOM);
-       if (getroom(&qrbuf, mailboxname)==0) {
-               delete_room(&qrbuf);
-               }
+       /* Delete the user's mailbox and its contents 
+        * (This is commented out because we don't do it here anymore.  Since
+        * the user may have any number of mailboxes, we now purge them the
+        * next time an "EXPI rooms" command is executed.)
+        * 
+        * MailboxName(mailboxname, &usbuf, MAILROOM);
+        * if (getroom(&qrbuf, mailboxname)==0) {
+        *      delete_room(&qrbuf);
+        *      }
+        */
 
        /* delete the userlog entry */
        cdb_delete(CDB_USERSUPP, lowercase_name, strlen(lowercase_name));