Include QRmtime in the list of values returned by GOTO
[citadel.git] / citadel / room_ops.c
index c9e651b155ab9d2f8a81a9f49caba3e07cdef84a..4fb1501cdf66f3ec77345144146f61a4dddd7ee6 100644 (file)
@@ -1,21 +1,15 @@
 /* 
  * Server functions which perform operations on room objects.
  *
- * Copyright (c) 1987-2011 by the citadel.org team
+ * Copyright (c) 1987-2012 by the citadel.org team
  *
  * This program is open source software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
+ * it under the terms of the GNU General Public License, version 3.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  */
 
 #include "sysdep.h"
@@ -261,6 +255,7 @@ SKIP_EVERYTHING:
        if (view != NULL) *view = vbuf.v_view;
 }
 
+
 /*
  * Self-checking stuff for a room record read into memory
  */
@@ -362,13 +357,10 @@ void b_putroom(struct ctdlroom *qrbuf, char *room_name)
 
        len = bptr - lowercase_name;
        if (qrbuf == NULL) {
-               cdb_delete(CDB_ROOMS,
-                          lowercase_name, len);
+               cdb_delete(CDB_ROOMS, lowercase_name, len);
        } else {
                time(&qrbuf->QRmtime);
-               cdb_store(CDB_ROOMS,
-                         lowercase_name, len,
-                         qrbuf, sizeof(struct ctdlroom));
+               cdb_store(CDB_ROOMS, lowercase_name, len, qrbuf, sizeof(struct ctdlroom));
        }
 }
 
@@ -389,7 +381,6 @@ void b_deleteroom(char *room_name) {
 }
 
 
-
 /*
  * CtdlPutRoomLock()  -  same as CtdlPutRoom() but unlocks the record (if supported)
  */
@@ -401,8 +392,6 @@ void CtdlPutRoomLock(struct ctdlroom *qrbuf)
 
 }
 
-/****************************************************************************/
-
 
 /*
  * CtdlGetFloorByName()  -  retrieve the number of the named floor
@@ -426,7 +415,6 @@ int CtdlGetFloorByName(const char *floor_name)
 }
 
 
-
 /*
  * CtdlGetFloorByNameLock()  -  retrieve floor number for given floor and lock the floor list.
  */
@@ -484,6 +472,7 @@ void CtdlGetFloor(struct floor *flbuf, int floor_num)
 
 }
 
+
 /*
  * lgetfloor()  -  same as CtdlGetFloor() but locks the record (if supported)
  */
@@ -533,7 +522,6 @@ struct floor *CtdlGetCachedFloor(int floor_num) {
 }
 
 
-
 /*
  * CtdlPutFloor()  -  store floor data on disk
  */
@@ -553,7 +541,6 @@ void CtdlPutFloor(struct floor *flbuf, int floor_num)
 }
 
 
-
 /*
  * CtdlPutFloorLock()  -  same as CtdlPutFloor() but unlocks the record (if supported)
  */
@@ -566,7 +553,6 @@ void CtdlPutFloorLock(struct floor *flbuf, int floor_num)
 }
 
 
-
 /*
  * lputfloor()  -  same as CtdlPutFloor() but unlocks the record (if supported)
  */
@@ -591,11 +577,13 @@ void CtdlForEachRoom(void (*CallBack) (struct ctdlroom *EachRoom, void *out_data
                memset(&qrbuf, 0, sizeof(struct ctdlroom));
                memcpy(&qrbuf, cdbqr->ptr,
                       ((cdbqr->len > sizeof(struct ctdlroom)) ?
-                       sizeof(struct ctdlroom) : cdbqr->len));
+                       sizeof(struct ctdlroom) : cdbqr->len)
+               );
                cdb_free(cdbqr);
                room_sanity_check(&qrbuf);
-               if (qrbuf.QRflags & QR_INUSE)
+               if (qrbuf.QRflags & QR_INUSE) {
                        (*CallBack)(&qrbuf, in_data);
+               }
        }
 }
 
@@ -608,7 +596,7 @@ void delete_msglist(struct ctdlroom *whichroom)
         struct cdbdata *cdbml;
 
        /* Make sure the msglist we're deleting actually exists, otherwise
-        * gdbm will complain when we try to delete an invalid record
+        * libdb will complain when we try to delete an invalid record
         */
         cdbml = cdb_fetch(CDB_MSGLISTS, &whichroom->QRnumber, sizeof(long));
         if (cdbml != NULL) {
@@ -620,7 +608,6 @@ void delete_msglist(struct ctdlroom *whichroom)
 }
 
 
-
 /*
  * Message pointer compare function for sort_msglist()
  */
@@ -649,8 +636,7 @@ int sort_msglist(long listptrs[], int oldcount)
 
        /* and yank any nulls */
        while ((numitems > 0) && (listptrs[0] == 0L)) {
-               memmove(&listptrs[0], &listptrs[1],
-                      (sizeof(long) * (numitems - 1)));
+               memmove(&listptrs[0], &listptrs[1], (sizeof(long) * (numitems - 1)));
                --numitems;
        }
 
@@ -674,7 +660,6 @@ int CtdlIsNonEditable(struct ctdlroom *qrbuf)
 }
 
 
-
 /*
  * Back-back-end for all room listing commands
  */
@@ -923,6 +908,7 @@ void cmd_lzrm(char *argbuf)
 void CtdlUserGoto(char *where, int display_result, int transiently,
                int *retmsgs, int *retnew)
 {
+       struct CitContext *CCC = CC;
        int a;
        int new_messages = 0;
        int old_messages = 0;
@@ -948,20 +934,20 @@ void CtdlUserGoto(char *where, int display_result, int transiently,
         * we can skip the extra database fetch.
         */
        if (where != NULL) {
-               safestrncpy(CC->room.QRname, where, sizeof CC->room.QRname);
-               CtdlGetRoom(&CC->room, where);
+               safestrncpy(CCC->room.QRname, where, sizeof CCC->room.QRname);
+               CtdlGetRoom(&CCC->room, where);
        }
 
        /* Take care of all the formalities. */
 
        begin_critical_section(S_USERS);
-       CtdlGetRelationship(&vbuf, &CC->user, &CC->room);
+       CtdlGetRelationship(&vbuf, &CCC->user, &CCC->room);
        original_v_flags = vbuf.v_flags;
 
        /* Know the room ... but not if it's the page log room, or if the
         * caller specified that we're only entering this room transiently.
         */
-       if ((strcasecmp(CC->room.QRname, config.c_logpages))
+       if ((strcasecmp(CCC->room.QRname, config.c_logpages))
           && (transiently == 0) ) {
                vbuf.v_flags = vbuf.v_flags & ~V_FORGET & ~V_LOCKOUT;
                vbuf.v_flags = vbuf.v_flags | V_ACCESS;
@@ -969,7 +955,7 @@ void CtdlUserGoto(char *where, int display_result, int transiently,
        
        /* Only rewrite the database record if we changed something */
        if (vbuf.v_flags != original_v_flags) {
-               CtdlSetRelationship(&vbuf, &CC->user, &CC->room);
+               CtdlSetRelationship(&vbuf, &CCC->user, &CCC->room);
        }
        end_critical_section(S_USERS);
 
@@ -977,11 +963,11 @@ void CtdlUserGoto(char *where, int display_result, int transiently,
        newmailcount = NewMailCount();
 
        /* set info to 1 if the user needs to read the room's info file */
-       if (CC->room.QRinfo > vbuf.v_lastseen) {
+       if (CCC->room.QRinfo > vbuf.v_lastseen) {
                info = 1;
        }
 
-        cdbfr = cdb_fetch(CDB_MSGLISTS, &CC->room.QRnumber, sizeof(long));
+        cdbfr = cdb_fetch(CDB_MSGLISTS, &CCC->room.QRnumber, sizeof(long));
         if (cdbfr != NULL) {
                msglist = (long *) cdbfr->ptr;
                cdbfr->ptr = NULL;      /* CtdlUserGoto() now owns this memory */
@@ -993,7 +979,7 @@ void CtdlUserGoto(char *where, int display_result, int transiently,
        for (a=0; a<num_msgs; ++a) {
                if (msglist[a] > 0L) ++total_messages;
        }
-       new_messages = num_msgs;
+
        num_sets = num_tokens(vbuf.v_seen, ',');
        for (s=0; s<num_sets; ++s) {
                extract_token(setstr, vbuf.v_seen, s, ',', sizeof setstr);
@@ -1022,20 +1008,20 @@ void CtdlUserGoto(char *where, int display_result, int transiently,
 
        if (msglist != NULL) free(msglist);
 
-       if (CC->room.QRflags & QR_MAILBOX)
+       if (CCC->room.QRflags & QR_MAILBOX)
                rmailflag = 1;
        else
                rmailflag = 0;
 
-       if ((CC->room.QRroomaide == CC->user.usernum)
-           || (CC->user.axlevel >= AxAideU))
+       if ((CCC->room.QRroomaide == CCC->user.usernum)
+           || (CCC->user.axlevel >= AxAideU))
                raideflag = 1;
        else
                raideflag = 0;
 
-       safestrncpy(truncated_roomname, CC->room.QRname, sizeof truncated_roomname);
-       if ( (CC->room.QRflags & QR_MAILBOX)
-          && (atol(CC->room.QRname) == CC->user.usernum) ) {
+       safestrncpy(truncated_roomname, CCC->room.QRname, sizeof truncated_roomname);
+       if ( (CCC->room.QRflags & QR_MAILBOX)
+          && (atol(CCC->room.QRname) == CCC->user.usernum) ) {
                safestrncpy(truncated_roomname, &truncated_roomname[11], sizeof truncated_roomname);
        }
 
@@ -1045,31 +1031,32 @@ void CtdlUserGoto(char *where, int display_result, int transiently,
 
        if (retmsgs != NULL) *retmsgs = total_messages;
        if (retnew != NULL) *retnew = new_messages;
-       syslog(LOG_DEBUG, "<%s> %d new of %d total messages\n",
-               CC->room.QRname,
-               new_messages, total_messages
-       );
+       MSG_syslog(LOG_INFO, "<%s> %d new of %d total messages\n",
+                  CCC->room.QRname,
+                  new_messages, total_messages
+               );
 
-       CC->curr_view = (int)vbuf.v_view;
+       CCC->curr_view = (int)vbuf.v_view;
 
        if (display_result) {
-               cprintf("%d%c%s|%d|%d|%d|%d|%ld|%ld|%d|%d|%d|%d|%d|%d|%d|%d|\n",
+               cprintf("%d%c%s|%d|%d|%d|%d|%ld|%ld|%d|%d|%d|%d|%d|%d|%d|%d|%ld|\n",
                        CIT_OK, CtdlCheckExpress(),
                        truncated_roomname,
                        (int)new_messages,
                        (int)total_messages,
                        (int)info,
-                       (int)CC->room.QRflags,
-                       (long)CC->room.QRhighest,
+                       (int)CCC->room.QRflags,
+                       (long)CCC->room.QRhighest,
                        (long)vbuf.v_lastseen,
                        (int)rmailflag,
                        (int)raideflag,
                        (int)newmailcount,
-                       (int)CC->room.QRfloor,
+                       (int)CCC->room.QRfloor,
                        (int)vbuf.v_view,
-                       (int)CC->room.QRdefaultview,
+                       (int)CCC->room.QRdefaultview,
                        (int)is_trash,
-                       (int)CC->room.QRflags2
+                       (int)CCC->room.QRflags2,
+                       (long)CCC->room.QRmtime
                );
        }
 }