]> code.citadel.org Git - citadel.git/blobdiff - citadel/room_ops.c
fix dnamlen, they missed the e, so we need to follow.
[citadel.git] / citadel / room_ops.c
index 4fb1501cdf66f3ec77345144146f61a4dddd7ee6..5a4d5503d05bb9315c61b3d9021c440e87b2fabf 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;
@@ -565,8 +566,7 @@ void lputfloor(struct floor *flbuf, int floor_num)
 /* 
  *  Traverse the room file...
  */
-void CtdlForEachRoom(void (*CallBack) (struct ctdlroom *EachRoom, void *out_data),
-               void *in_data)
+void CtdlForEachRoom(ForEachRoomCallBack CB, void *in_data)
 {
        struct ctdlroom qrbuf;
        struct cdbdata *cdbqr;
@@ -582,7 +582,41 @@ void CtdlForEachRoom(void (*CallBack) (struct ctdlroom *EachRoom, void *out_data
                cdb_free(cdbqr);
                room_sanity_check(&qrbuf);
                if (qrbuf.QRflags & QR_INUSE) {
-                       (*CallBack)(&qrbuf, in_data);
+                       CB(&qrbuf, 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);
+                       }
                }
        }
 }
@@ -625,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) {
@@ -635,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);
@@ -1263,7 +1301,7 @@ void cmd_rdir(char *cmdbuf)
                if (strcasecmp(filedir_entry->d_name, "filedir") && filedir_entry->d_name[0] != '.')
                {
 #ifdef _DIRENT_HAVE_D_NAMELEN
-                       d_namelen = filedir_entry->d_namelen;
+                       d_namelen = filedir_entry->d_namlen;
 #else
                        d_namelen = strlen(filedir_entry->d_name);
 #endif
@@ -1307,7 +1345,7 @@ void cmd_rdir(char *cmdbuf)
 }
 
 /*
- * get room parameters (aide or room aide command)
+ * get room parameters (admin or room admin command)
  */
 void cmd_getr(char *cmdbuf)
 {
@@ -1459,7 +1497,7 @@ int CtdlRenameRoom(char *old_name, char *new_name, int new_floor) {
 
 
 /*
- * set room parameters (aide or room aide command)
+ * set room parameters (admin or room admin command)
  */
 void cmd_setr(char *args)
 {
@@ -1605,7 +1643,7 @@ void cmd_setr(char *args)
 
 
 /* 
- * get the name of the room aide for this room
+ * get the name of the room admin for this room
  */
 void cmd_geta(char *cmdbuf)
 {
@@ -1622,7 +1660,7 @@ void cmd_geta(char *cmdbuf)
 
 
 /* 
- * set the room aide for this room
+ * set the room admin for this room
  */
 void cmd_seta(char *new_ra)
 {
@@ -1654,13 +1692,13 @@ void cmd_seta(char *new_ra)
        if (post_notice == 1) {
                if (!IsEmptyStr(usbuf.fullname))
                        snprintf(buf, sizeof buf,
-                               "%s is now the room aide for \"%s\".\n",
+                               "%s is now the room admin for \"%s\".\n",
                                usbuf.fullname, CC->room.QRname);
                else
                        snprintf(buf, sizeof buf,
-                               "There is now no room aide for \"%s\".\n",
+                               "There is now no room admin for \"%s\".\n",
                                CC->room.QRname);
-               CtdlAideMessage(buf, "Aide Room Modification");
+               CtdlAideMessage(buf, "Admin Room Modification");
        }
        cprintf("%d Ok\n", CIT_OK);
 }
@@ -1670,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;
 
@@ -1806,13 +1844,13 @@ int CtdlDoIHavePermissionToDeleteThisRoom(struct ctdlroom *qr) {
        }
 
        /*
-        * For normal rooms, just check for aide or room aide status.
+        * For normal rooms, just check for admin or room admin status.
         */
        return(is_room_aide());
 }
 
 /*
- * aide command: kill the current room
+ * admin command: kill the current room
  */
 void cmd_kill(char *argbuf)
 {
@@ -1905,18 +1943,18 @@ unsigned CtdlCreateRoom(char *new_room_name,
        }
 
        /* If the room is private, and the system administrator has elected
-        * to automatically grant room aide privileges, do so now.
+        * to automatically grant room admin privileges, do so now.
         */
        if ((qrbuf.QRflags & QR_PRIVATE) && (CREATAIDE == 1)) {
                qrbuf.QRroomaide = CC->user.usernum;
        }
-       /* Blog owners automatically become room aides of their blogs.
+       /* Blog owners automatically become room admins of their blogs.
         * (In the future we will offer a site-wide configuration setting to suppress this behavior.)
         */
        else if (new_room_view == VIEW_BLOG) {
                qrbuf.QRroomaide = CC->user.usernum;
        }
-       /* Otherwise, set the room aide to undefined.
+       /* Otherwise, set the room admin to undefined.
         */
        else {
                qrbuf.QRroomaide = (-1L);
@@ -2278,6 +2316,19 @@ void cmd_eflr(char *argbuf)
 }
 
 
+
+/* 
+ * cmd_stat()  -  return the modification time of the current room (maybe other things in the future)
+ */
+void cmd_stat(char *gargs)
+{
+       if (CtdlAccessCheck(ac_logged_in_or_guest)) return;
+       CtdlGetRoom(&CC->room, CC->room.QRname);
+       cprintf("%d %s|%ld|\n", CIT_OK, CC->room.QRname, CC->room.QRmtime);
+}
+
+
+
 /*****************************************************************************/
 /*                      MODULE INITIALIZATION STUFF                          */
 /*****************************************************************************/
@@ -2292,12 +2343,13 @@ CTDL_MODULE_INIT(room_ops)
                CtdlRegisterProtoHook(cmd_lzrm, "LZRM", "List zapped rooms");
                CtdlRegisterProtoHook(cmd_lprm, "LPRM", "List public rooms");
                CtdlRegisterProtoHook(cmd_goto, "GOTO", "Goto a named room");
+               CtdlRegisterProtoHook(cmd_stat, "STAT", "Get mtime of the current room");
                CtdlRegisterProtoHook(cmd_whok, "WHOK", "List users who know this room");
                CtdlRegisterProtoHook(cmd_rdir, "RDIR", "List files in room directory");
                CtdlRegisterProtoHook(cmd_getr, "GETR", "Get room parameters");
                CtdlRegisterProtoHook(cmd_setr, "SETR", "Set room parameters");
-               CtdlRegisterProtoHook(cmd_geta, "GETA", "Get the room aide name");
-               CtdlRegisterProtoHook(cmd_seta, "SETA", "Set the room aide for this room");
+               CtdlRegisterProtoHook(cmd_geta, "GETA", "Get the room admin name");
+               CtdlRegisterProtoHook(cmd_seta, "SETA", "Set the room admin for this room");
                CtdlRegisterProtoHook(cmd_rinf, "RINF", "Fetch room info file");
                CtdlRegisterProtoHook(cmd_kill, "KILL", "Kill (delete) the current room");
                CtdlRegisterProtoHook(cmd_cre8, "CRE8", "Create a new room");