Began removing $Id$ tags. This will be an ongoing process.
[citadel.git] / citadel / room_ops.c
index f0c5cc98ea81f106f8bde29d7664df1457107ace..83d68a3475afe609a1aab40e2bbe9107e8d2fabf 100644 (file)
@@ -1,6 +1,4 @@
 /* 
- * $Id$
- * 
  * Server functions which perform operations on room objects.
  *
  */
@@ -35,7 +33,6 @@
 #include "room_ops.h"
 #include "sysdep_decls.h"
 #include "support.h"
-#include "user_ops.h"
 #include "msgbase.h"
 #include "citserver.h"
 #include "control.h"
@@ -43,6 +40,7 @@
 #include "threads.h"
 
 #include "ctdl_module.h"
+#include "user_ops.h"
 
 struct floor *floorcache[MAXFLOORS];
 
@@ -53,7 +51,7 @@ void CtdlRoomAccess(struct ctdlroom *roombuf, struct ctdluser *userbuf,
                int *result, int *view)
 {
        int retval = 0;
-       struct visit vbuf;
+       visit vbuf;
 
        /* for internal programs, always do everything */
        if (((CC->internal_pgm)) && (roombuf->QRflags & QR_INUSE)) {
@@ -67,7 +65,7 @@ void CtdlRoomAccess(struct ctdlroom *roombuf, struct ctdluser *userbuf,
 
        /* Force the properties of the Aide room */
        if (!strcasecmp(roombuf->QRname, config.c_aideroom)) {
-               if (userbuf->axlevel >= 6) {
+               if (userbuf->axlevel >= AxAideU) {
                        retval = UA_KNOWN | UA_GOTOALLOWED | UA_POSTALLOWED | UA_DELETEALLOWED;
                } else {
                        retval = 0;
@@ -83,7 +81,7 @@ void CtdlRoomAccess(struct ctdlroom *roombuf, struct ctdluser *userbuf,
 
        /* If this is a preferred users only room, check access level */
        if (roombuf->QRflags & QR_PREFONLY) {
-               if (userbuf->axlevel < 5) {
+               if (userbuf->axlevel < AxPrefU) {
                        retval = retval & ~UA_KNOWN & ~UA_GOTOALLOWED;
                }
        }
@@ -127,8 +125,8 @@ void CtdlRoomAccess(struct ctdlroom *roombuf, struct ctdluser *userbuf,
                 * - It is a read-only room
                 */
                int post_allowed = 1;
-               if (CC->user.axlevel < 2) post_allowed = 0;
-               if ((CC->user.axlevel < 4) && (CC->room.QRflags & QR_NETWORK)) post_allowed = 0;
+               if (CC->user.axlevel < AxProbU) post_allowed = 0;
+               if ((CC->user.axlevel < AxNetU) && (CC->room.QRflags & QR_NETWORK)) post_allowed = 0;
                if (roombuf->QRflags & QR_READONLY) post_allowed = 0;
                if (post_allowed) {
                        retval = retval | UA_POSTALLOWED;
@@ -161,7 +159,7 @@ void CtdlRoomAccess(struct ctdlroom *roombuf, struct ctdluser *userbuf,
        }
 
        /* Aides get access to all private rooms */
-       if ( (userbuf->axlevel >= 6)
+       if ( (userbuf->axlevel >= AxAideU)
           && ((roombuf->QRflags & QR_MAILBOX) == 0) ) {
                if (vbuf.v_flags & V_FORGET) {
                        retval = retval | UA_GOTOALLOWED | UA_POSTALLOWED;
@@ -174,13 +172,13 @@ void CtdlRoomAccess(struct ctdlroom *roombuf, struct ctdluser *userbuf,
        /* Aides can gain access to mailboxes as well, but they don't show
         * by default.
         */
-       if ( (userbuf->axlevel >= 6)
+       if ( (userbuf->axlevel >= AxAideU)
           && (roombuf->QRflags & QR_MAILBOX) ) {
                retval = retval | UA_GOTOALLOWED | UA_POSTALLOWED;
        }
 
        /* Aides and Room Aides have admin privileges */
-       if ( (userbuf->axlevel >= 6)
+       if ( (userbuf->axlevel >= AxAideU)
           || (userbuf->usernum == roombuf->QRroomaide)
           ) {
                retval = retval | UA_ADMINALLOWED | UA_DELETEALLOWED | UA_POSTALLOWED;
@@ -344,6 +342,62 @@ void CtdlPutRoomLock(struct ctdlroom *qrbuf)
 
 /****************************************************************************/
 
+
+/*
+ * CtdlGetFloorByName()  -  retrieve the number of the named floor
+ * return < 0 if not found else return floor number
+ */
+int CtdlGetFloorByName(const char *floor_name)
+{
+       int a;
+       struct floor *flbuf = NULL;
+
+       for (a = 0; a < MAXFLOORS; ++a) {
+               flbuf = CtdlGetCachedFloor(a);
+
+               /* check to see if it already exists */
+               if ((!strcasecmp(flbuf->f_name, floor_name))
+                   && (flbuf->f_flags & F_INUSE)) {
+                       return a;
+               }
+       }
+       return -1;
+}
+
+
+
+/*
+ * CtdlGetFloorByNameLock()  -  retrieve floor number for given floor and lock the floor list.
+ */
+int CtdlGetFloorByNameLock(const char *floor_name)
+{
+       begin_critical_section(S_FLOORTAB);
+       return CtdlGetFloorByName(floor_name);
+}
+
+
+
+/*
+ * CtdlGetAvailableFloor()  -  Return number of first unused floor
+ * return < 0 if none available
+ */
+int CtdlGetAvailableFloor(void)
+{
+       int a;
+       struct floor *flbuf = NULL;
+
+       for (a = 0; a < MAXFLOORS; a++) {
+               flbuf = CtdlGetCachedFloor(a);
+
+               /* check to see if it already exists */
+               if ((flbuf->f_flags & F_INUSE) == 0) {
+                       return a;
+               }
+       }
+       return -1;
+}
+
+
 /*
  * CtdlGetFloor()  -  retrieve floor data from disk
  */
@@ -438,10 +492,11 @@ void CtdlPutFloor(struct floor *flbuf, int floor_num)
 }
 
 
+
 /*
- * lputfloor()  -  same as CtdlPutFloor() but unlocks the record (if supported)
+ * CtdlPutFloorLock()  -  same as CtdlPutFloor() but unlocks the record (if supported)
  */
-void lputfloor(struct floor *flbuf, int floor_num)
+void CtdlPutFloorLock(struct floor *flbuf, int floor_num)
 {
 
        CtdlPutFloor(flbuf, floor_num);
@@ -450,6 +505,16 @@ void lputfloor(struct floor *flbuf, int floor_num)
 }
 
 
+
+/*
+ * lputfloor()  -  same as CtdlPutFloor() but unlocks the record (if supported)
+ */
+void lputfloor(struct floor *flbuf, int floor_num)
+{
+       CtdlPutFloorLock(flbuf, floor_num);
+}
+
+
 /* 
  *  Traverse the room file...
  */
@@ -820,7 +885,7 @@ void CtdlUserGoto(char *where, int display_result, int transiently,
        int rmailflag;
        int raideflag;
        int newmailcount = 0;
-       struct visit vbuf;
+       visit vbuf;
        char truncated_roomname[ROOMNAMELEN];
         struct cdbdata *cdbfr;
        long *msglist = NULL;
@@ -917,7 +982,7 @@ void CtdlUserGoto(char *where, int display_result, int transiently,
                rmailflag = 0;
 
        if ((CC->room.QRroomaide == CC->user.usernum)
-           || (CC->user.axlevel >= 6))
+           || (CC->user.axlevel >= AxAideU))
                raideflag = 1;
        else
                raideflag = 0;
@@ -1030,7 +1095,7 @@ void cmd_goto(char *gargs)
 
        /* Then try a mailbox name match */
        if (c != 0) {
-               MailboxName(augmented_roomname, sizeof augmented_roomname,
+               CtdlMailboxName(augmented_roomname, sizeof augmented_roomname,
                            &CC->user, towhere);
                c = CtdlGetRoom(&QRscratch, augmented_roomname);
                if (c == 0)
@@ -1066,7 +1131,7 @@ void cmd_goto(char *gargs)
                        } else if ((QRscratch.QRflags & QR_PASSWORDED) &&
                            ((ra & UA_KNOWN) == 0) &&
                            (strcasecmp(QRscratch.QRpasswd, password)) &&
-                           (CC->user.axlevel < 6)
+                           (CC->user.axlevel < AxAideU)
                            ) {
                                cprintf("%d wrong or missing passwd\n",
                                        ERROR + PASSWORD_REQUIRED);
@@ -1075,7 +1140,7 @@ void cmd_goto(char *gargs)
                                   ((QRscratch.QRflags & QR_PASSWORDED) == 0) &&
                                   ((QRscratch.QRflags & QR_GUESSNAME) == 0) &&
                                   ((ra & UA_KNOWN) == 0) &&
-                                  (CC->user.axlevel < 6)
+                                  (CC->user.axlevel < AxAideU)
                                   ) {
                                CtdlLogPrintf(CTDL_DEBUG, "Failed to acquire private room\n");
                        } else {
@@ -1140,7 +1205,7 @@ void cmd_rdir(char *cmdbuf)
                return;
        }
        if (((CC->room.QRflags & QR_VISDIR) == 0)
-           && (CC->user.axlevel < 6)
+           && (CC->user.axlevel < AxAideU)
            && (CC->user.usernum != CC->room.QRroomaide)) {
                cprintf("%d not here.\n", ERROR + HIGHER_ACCESS_REQUIRED);
                return;
@@ -1277,7 +1342,7 @@ int CtdlRenameRoom(char *old_name, char *new_name, int new_floor) {
                ret = crr_room_not_found;
        }
 
-       else if ( (CC->user.axlevel < 6) && (!CC->internal_pgm)
+       else if ( (CC->user.axlevel < AxAideU) && (!CC->internal_pgm)
                  && (CC->user.usernum != qrbuf.QRroomaide)
                  && ( (((qrbuf.QRflags & QR_MAILBOX) == 0) || (atol(qrbuf.QRname) != CC->user.usernum))) )  {
                ret = crr_access_denied;
@@ -1512,7 +1577,7 @@ void cmd_geta(char *cmdbuf)
 
        if (CtdlAccessCheck(ac_logged_in)) return;
 
-       if (getuserbynumber(&usbuf, CC->room.QRroomaide) == 0) {
+       if (CtdlGetUserByNumber(&usbuf, CC->room.QRroomaide) == 0) {
                cprintf("%d %s\n", CIT_OK, usbuf.fullname);
        } else {
                cprintf("%d \n", CIT_OK);
@@ -1753,7 +1818,7 @@ void cmd_kill(char *argbuf)
 /*
  * Internal code to create a new room (returns room flags)
  *
- * Room types:  0=public, 1=guessname, 2=passworded, 3=inv-only,
+ * Room types:  0=public, 1=hidden, 2=passworded, 3=invitation-only,
  *              4=mailbox, 5=mailbox, but caller supplies namespace
  */
 unsigned CtdlCreateRoom(char *new_room_name,
@@ -1767,7 +1832,7 @@ unsigned CtdlCreateRoom(char *new_room_name,
 
        struct ctdlroom qrbuf;
        struct floor flbuf;
-       struct visit vbuf;
+       visit vbuf;
 
        CtdlLogPrintf(CTDL_DEBUG, "CtdlCreateRoom(name=%s, type=%d, view=%d)\n",
                new_room_name, new_room_type, new_room_view);
@@ -1795,7 +1860,7 @@ unsigned CtdlCreateRoom(char *new_room_name,
         * name accordingly (prepend the user number)
         */
        if (new_room_type == 4) {
-               MailboxName(qrbuf.QRname, sizeof qrbuf.QRname, &CC->user, new_room_name);
+               CtdlMailboxName(qrbuf.QRname, sizeof qrbuf.QRname, &CC->user, new_room_name);
        }
        else {
                safestrncpy(qrbuf.QRname, new_room_name, sizeof qrbuf.QRname);
@@ -1918,7 +1983,7 @@ void cmd_cre8(char *args)
        }
 
        if (new_room_type == 5) {
-               if (CC->user.axlevel < 6) {
+               if (CC->user.axlevel < AxAideU) {
                        cprintf("%d Higher access required\n", 
                                ERROR + HIGHER_ACCESS_REQUIRED);
                        return;
@@ -2173,27 +2238,29 @@ void cmd_eflr(char *argbuf)
 
 CTDL_MODULE_INIT(room_ops)
 {
-       CtdlRegisterProtoHook(cmd_lrms, "LRMS", "Autoconverted. TODO: document me.");
-       CtdlRegisterProtoHook(cmd_lkra, "LKRA", "Autoconverted. TODO: document me.");
-       CtdlRegisterProtoHook(cmd_lkrn, "LKRN", "Autoconverted. TODO: document me.");
-       CtdlRegisterProtoHook(cmd_lkro, "LKRO", "Autoconverted. TODO: document me.");
-       CtdlRegisterProtoHook(cmd_lzrm, "LZRM", "Autoconverted. TODO: document me.");
-       CtdlRegisterProtoHook(cmd_lprm, "LPRM", "Autoconverted. TODO: document me.");
-       CtdlRegisterProtoHook(cmd_goto, "GOTO", "Autoconverted. TODO: document me.");
-       CtdlRegisterProtoHook(cmd_whok, "WHOK", "Autoconverted. TODO: document me.");
-       CtdlRegisterProtoHook(cmd_rdir, "RDIR", "Autoconverted. TODO: document me.");
-       CtdlRegisterProtoHook(cmd_getr, "GETR", "Autoconverted. TODO: document me.");
-       CtdlRegisterProtoHook(cmd_setr, "SETR", "Autoconverted. TODO: document me.");
-       CtdlRegisterProtoHook(cmd_geta, "GETA", "Autoconverted. TODO: document me.");
-       CtdlRegisterProtoHook(cmd_seta, "SETA", "Autoconverted. TODO: document me.");
-       CtdlRegisterProtoHook(cmd_rinf, "RINF", "Autoconverted. TODO: document me.");
-       CtdlRegisterProtoHook(cmd_kill, "KILL", "Autoconverted. TODO: document me.");
-       CtdlRegisterProtoHook(cmd_cre8, "CRE8", "Autoconverted. TODO: document me.");
-       CtdlRegisterProtoHook(cmd_einf, "EINF", "Autoconverted. TODO: document me.");
-       CtdlRegisterProtoHook(cmd_lflr, "LFLR", "Autoconverted. TODO: document me.");
-       CtdlRegisterProtoHook(cmd_cflr, "CFLR", "Autoconverted. TODO: document me.");
-       CtdlRegisterProtoHook(cmd_kflr, "KFLR", "Autoconverted. TODO: document me.");
-       CtdlRegisterProtoHook(cmd_eflr, "EFLR", "Autoconverted. TODO: document me.");
+       if (!threading) {
+               CtdlRegisterProtoHook(cmd_lrms, "LRMS", "Autoconverted. TODO: document me.");
+               CtdlRegisterProtoHook(cmd_lkra, "LKRA", "Autoconverted. TODO: document me.");
+               CtdlRegisterProtoHook(cmd_lkrn, "LKRN", "Autoconverted. TODO: document me.");
+               CtdlRegisterProtoHook(cmd_lkro, "LKRO", "Autoconverted. TODO: document me.");
+               CtdlRegisterProtoHook(cmd_lzrm, "LZRM", "Autoconverted. TODO: document me.");
+               CtdlRegisterProtoHook(cmd_lprm, "LPRM", "Autoconverted. TODO: document me.");
+               CtdlRegisterProtoHook(cmd_goto, "GOTO", "Autoconverted. TODO: document me.");
+               CtdlRegisterProtoHook(cmd_whok, "WHOK", "Autoconverted. TODO: document me.");
+               CtdlRegisterProtoHook(cmd_rdir, "RDIR", "Autoconverted. TODO: document me.");
+               CtdlRegisterProtoHook(cmd_getr, "GETR", "Autoconverted. TODO: document me.");
+               CtdlRegisterProtoHook(cmd_setr, "SETR", "Autoconverted. TODO: document me.");
+               CtdlRegisterProtoHook(cmd_geta, "GETA", "Autoconverted. TODO: document me.");
+               CtdlRegisterProtoHook(cmd_seta, "SETA", "Autoconverted. TODO: document me.");
+               CtdlRegisterProtoHook(cmd_rinf, "RINF", "Autoconverted. TODO: document me.");
+               CtdlRegisterProtoHook(cmd_kill, "KILL", "Autoconverted. TODO: document me.");
+               CtdlRegisterProtoHook(cmd_cre8, "CRE8", "Autoconverted. TODO: document me.");
+               CtdlRegisterProtoHook(cmd_einf, "EINF", "Autoconverted. TODO: document me.");
+               CtdlRegisterProtoHook(cmd_lflr, "LFLR", "Autoconverted. TODO: document me.");
+               CtdlRegisterProtoHook(cmd_cflr, "CFLR", "Autoconverted. TODO: document me.");
+               CtdlRegisterProtoHook(cmd_kflr, "KFLR", "Autoconverted. TODO: document me.");
+               CtdlRegisterProtoHook(cmd_eflr, "EFLR", "Autoconverted. TODO: document me.");
+       }
         /* return our Subversion id for the Log */
-       return "$Id$";
+       return "room_ops";
 }