Message Deletion: only use one memmove to remove leading empty message numbers
[citadel.git] / citadel / room_ops.c
index 15a6031e8ab4f30e20c3758e61a03d32298c95a2..010fa12766a3e617e9adbe6df7de2395e9d1bb20 100644 (file)
@@ -278,12 +278,13 @@ void room_sanity_check(struct ctdlroom *qrbuf)
 /*
  * CtdlGetRoom()  -  retrieve room data from disk
  */
-int CtdlGetRoom(struct ctdlroom *qrbuf, char *room_name)
+int CtdlGetRoom(struct ctdlroom *qrbuf, const char *room_name)
 {
        struct cdbdata *cdbqr;
        char lowercase_name[ROOMNAMELEN];
        char personal_lowercase_name[ROOMNAMELEN];
-       char *dptr, *sptr, *eptr;
+       const char *sptr;
+       char *dptr, *eptr;
 
        dptr = lowercase_name;
        sptr = room_name;
@@ -586,6 +587,40 @@ void CtdlForEachRoom(ForEachRoomCallBack CB, void *in_data)
        }
 }
 
+/* 
+ *  Traverse the room file...
+ */
+void CtdlForEachNetCfgRoom(ForEachRoomNetCfgCallBack CB,
+                          void *in_data,
+                          RoomNetCfg filter)
+{
+       struct ctdlroom qrbuf;
+       struct cdbdata *cdbqr;
+
+       cdb_rewind(CDB_ROOMS);
+
+       while (cdbqr = cdb_next_item(CDB_ROOMS), cdbqr != NULL) {
+               memset(&qrbuf, 0, sizeof(struct ctdlroom));
+               memcpy(&qrbuf, cdbqr->ptr,
+                      ((cdbqr->len > sizeof(struct ctdlroom)) ?
+                       sizeof(struct ctdlroom) : cdbqr->len)
+               );
+               cdb_free(cdbqr);
+               room_sanity_check(&qrbuf);
+               if (qrbuf.QRflags & QR_INUSE)
+               {
+                       OneRoomNetCfg* RNCfg;
+                       RNCfg = CtdlGetNetCfgForRoom(qrbuf.QRnumber);
+                       if ((RNCfg != NULL) &&
+                           ((filter == maxRoomNetCfg) ||
+                            (RNCfg->NetConfigs[filter] != NULL)))
+                       {
+                               CB(&qrbuf, in_data, RNCfg);
+                       }
+               }
+       }
+}
+
 
 /*
  * delete_msglist()  -  delete room message pointers
@@ -624,6 +659,7 @@ int sort_msglist_cmp(const void *m1, const void *m2) {
 int sort_msglist(long listptrs[], int oldcount)
 {
        int numitems;
+       int i = 0;
 
        numitems = oldcount;
        if (numitems < 2) {
@@ -634,9 +670,12 @@ int sort_msglist(long listptrs[], int oldcount)
        qsort(listptrs, numitems, sizeof(long), sort_msglist_cmp);
 
        /* and yank any nulls */
-       while ((numitems > 0) && (listptrs[0] == 0L)) {
-               memmove(&listptrs[0], &listptrs[1], (sizeof(long) * (numitems - 1)));
-               --numitems;
+       while ((i < numitems) && (listptrs[i] == 0L)) i++;
+
+       if (i > 0)
+       {
+               memmove(&listptrs[0], &listptrs[i], (sizeof(long) * (numitems - i)));
+               numitems-=i;
        }
 
        return (numitems);
@@ -1669,7 +1708,7 @@ void cmd_seta(char *new_ra)
  */
 void cmd_rinf(char *gargs)
 {
-       char filename[128];
+       char filename[PATH_MAX];
        char buf[SIZ];
        FILE *info_fp;