// Server functions which perform operations on room objects.
//
-// Copyright (c) 1987-2022 by the citadel.org team
+// Copyright (c) 1987-2024 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, 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.
#include <stdio.h>
#include <libcitadel.h>
// Check to see whether we have permission to post a message in the current
// room. Returns a *CITADEL ERROR CODE* and puts a message in errmsgbuf, or
// returns 0 on success.
-int CtdlDoIHavePermissionToPostInThisRoom(
- char *errmsgbuf,
- size_t n,
- PostType PostPublic,
- int is_reply
-) {
+int CtdlDoIHavePermissionToPostInThisRoom(char *errmsgbuf, size_t n, PostType PostPublic, int is_reply) {
int ra;
if (!(CC->logged_in) && (PostPublic == POST_LOGGED_IN)) {
}
-// Retrieve access control information for any user/room pair.
+// This is the main access control function for any user/room pair.
// Yes, it has a couple of gotos. If you don't like that, go die in a car fire.
void CtdlRoomAccess(struct ctdlroom *roombuf, struct ctdluser *userbuf, int *result, int *view) {
int retval = 0;
- visit vbuf;
+ struct visit vbuf;
int is_me = 0;
int is_guest = 0;
if (!strcasecmp(roombuf->QRname, CtdlGetConfigStr("c_aideroom"))) {
if (userbuf->axlevel >= AxAideU) {
retval = UA_KNOWN | UA_GOTOALLOWED | UA_POSTALLOWED | UA_DELETEALLOWED | UA_REPLYALLOWED;
- } else {
+ }
+ else {
retval = 0;
}
goto NEWMSG;
else {
// User is allowed to post in the room unless:
// - User is not validated
- // - User has no net privileges and it is a shared network room
// - It is a read-only room
// - It is a blog room (in which case we only allow replies to existing messages)
int post_allowed = 1;
post_allowed = 0;
reply_allowed = 0;
}
- if ((userbuf->axlevel < AxNetU) && (roombuf->QRflags & QR_NETWORK)) {
- post_allowed = 0;
- reply_allowed = 0;
- }
if (roombuf->QRflags & QR_READONLY) {
post_allowed = 0;
reply_allowed = 0;
retval = retval | UA_REPLYALLOWED;
}
- // If "collaborative deletion" is active for this room, any user who can post
- // is also allowed to delete
+ // If "collaborative deletion" is active for this room, any user who can post is also allowed to delete
if (roombuf->QRflags2 & QR2_COLLABDEL) {
if (retval & UA_POSTALLOWED) {
retval = retval | UA_DELETEALLOWED;
}
}
-
}
// Check to see if the user has forgotten this room
// CtdlGetRoom() - retrieve room data from disk
int CtdlGetRoom(struct ctdlroom *qrbuf, const char *room_name) {
- struct cdbdata *cdbqr;
+ struct cdbdata cdbqr;
char lowercase_name[ROOMNAMELEN];
char personal_lowercase_name[ROOMNAMELEN];
- const char *sptr;
- char *dptr, *eptr;
+ long len;
- dptr = lowercase_name;
- sptr = room_name;
- eptr = (dptr + (sizeof lowercase_name - 1));
- while (!IsEmptyStr(sptr) && (dptr < eptr)) {
- *dptr = tolower(*sptr);
- sptr++; dptr++;
+ len = strlen(room_name);
+ for (int i=0; i<=len; ++i) {
+ lowercase_name[i] = tolower(room_name[i]);
}
- *dptr = '\0';
memset(qrbuf, 0, sizeof(struct ctdlroom));
cdbqr = cdb_fetch(CDB_ROOMS, lowercase_name, strlen(lowercase_name));
// If that didn't work, try the user's personal namespace
- if (cdbqr == NULL) {
+ if (cdbqr.ptr == NULL) {
snprintf(personal_lowercase_name, sizeof personal_lowercase_name, "%010ld.%s", CC->user.usernum, lowercase_name);
cdbqr = cdb_fetch(CDB_ROOMS, personal_lowercase_name, strlen(personal_lowercase_name));
}
- if (cdbqr != NULL) {
- memcpy(qrbuf, cdbqr->ptr, ((cdbqr->len > sizeof(struct ctdlroom)) ? sizeof(struct ctdlroom) : cdbqr->len));
- cdb_free(cdbqr);
+ if (cdbqr.ptr != NULL) {
+ memcpy(qrbuf, cdbqr.ptr, ((cdbqr.len > sizeof(struct ctdlroom)) ? sizeof(struct ctdlroom) : cdbqr.len));
room_sanity_check(qrbuf);
return (0);
}
int CtdlGetRoomLock(struct ctdlroom *qrbuf, const char *room_name) {
register int retval;
retval = CtdlGetRoom(qrbuf, room_name);
- if (retval == 0) begin_critical_section(S_ROOMS);
+ if (retval == 0) {
+ begin_critical_section(S_ROOMS);
+ }
return(retval);
}
// (if the supplied buffer is NULL, delete the room record)
void b_putroom(struct ctdlroom *qrbuf, char *room_name) {
char lowercase_name[ROOMNAMELEN];
- char *aptr, *bptr;
long len;
- aptr = room_name;
- bptr = lowercase_name;
- while (!IsEmptyStr(aptr)) {
- *bptr = tolower(*aptr);
- aptr++;
- bptr++;
+ len = strlen(room_name);
+ for (int i=0; i<=len; ++i) {
+ lowercase_name[i] = tolower(room_name[i]);
}
- *bptr='\0';
- len = bptr - lowercase_name;
if (qrbuf == NULL) {
cdb_delete(CDB_ROOMS, lowercase_name, len);
}
void CtdlPutRoomLock(struct ctdlroom *qrbuf) {
CtdlPutRoom(qrbuf);
end_critical_section(S_ROOMS);
+ //syslog(LOG_ERR, "\033[32mCtdlGetRoomLock(%p) released\033[0m", CC);
}
}
-/*
- * CtdlGetAvailableFloor() - Return number of first unused floor
- * return < 0 if none available
- */
+// 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 */
+ // check to see if it already exists
if ((flbuf->f_flags & F_INUSE) == 0) {
return a;
}
}
-/*
- * CtdlGetFloor() - retrieve floor data from disk
- */
+// CtdlGetFloor() - retrieve floor data from disk
void CtdlGetFloor(struct floor *flbuf, int floor_num) {
- struct cdbdata *cdbfl;
+ struct cdbdata cdbfl;
memset(flbuf, 0, sizeof(struct floor));
cdbfl = cdb_fetch(CDB_FLOORTAB, &floor_num, sizeof(int));
- if (cdbfl != NULL) {
- memcpy(flbuf, cdbfl->ptr, ((cdbfl->len > sizeof(struct floor)) ? sizeof(struct floor) : cdbfl->len));
- cdb_free(cdbfl);
- } else {
+ if (cdbfl.ptr != NULL) {
+ memcpy(flbuf, cdbfl.ptr, ((cdbfl.len > sizeof(struct floor)) ? sizeof(struct floor) : cdbfl.len));
+ }
+ else {
if (floor_num == 0) {
safestrncpy(flbuf->f_name, "Main Floor", sizeof flbuf->f_name);
flbuf->f_flags = F_INUSE;
}
-/*
- * lgetfloor() - same as CtdlGetFloor() but locks the record (if supported)
- */
+// lgetfloor() - same as CtdlGetFloor() but locks the record (if supported)
void lgetfloor(struct floor *flbuf, int floor_num) {
begin_critical_section(S_FLOORTAB);
CtdlGetFloor(flbuf, floor_num);
}
-/*
- * CtdlGetCachedFloor() - Get floor record from *cache* (loads from disk if needed)
- *
- * This is strictly a performance hack.
- */
+// CtdlGetCachedFloor() - Get floor record from *cache* (loads from disk if needed)
+// This is strictly a performance hack.
struct floor *CtdlGetCachedFloor(int floor_num) {
static int initialized = 0;
int i;
for (i=0; i<MAXFLOORS; ++i) {
floorcache[floor_num] = NULL;
}
- initialized = 1;
+ initialized = 1;
}
if (floorcache[floor_num] == NULL) {
fetch_new = 1;
}
-/*
- * CtdlPutFloor() - store floor data on disk
- */
+// CtdlPutFloor() - store floor data on disk
void CtdlPutFloor(struct floor *flbuf, int floor_num) {
- /* If we've cached this, clear it out, 'cuz it's WRONG now! */
+ // If we've cached this, clear it out, 'cuz it's WRONG now!
begin_critical_section(S_FLOORCACHE);
if (floorcache[floor_num] != NULL) {
free(floorcache[floor_num]);
memcpy(floorcache[floor_num], flbuf, sizeof(struct floor));
}
end_critical_section(S_FLOORCACHE);
-
- cdb_store(CDB_FLOORTAB, &floor_num, sizeof(int),
- flbuf, sizeof(struct floor));
+ cdb_store(CDB_FLOORTAB, &floor_num, sizeof(int), flbuf, sizeof(struct floor));
}
-/*
- * CtdlPutFloorLock() - same as CtdlPutFloor() but unlocks the record (if supported)
- */
+// CtdlPutFloorLock() - same as CtdlPutFloor() but unlocks the record (if supported)
void CtdlPutFloorLock(struct floor *flbuf, int floor_num) {
CtdlPutFloor(flbuf, floor_num);
end_critical_section(S_FLOORTAB);
}
-/*
- * lputfloor() - same as CtdlPutFloor() but unlocks the record (if supported)
- */
+// lputfloor() - same as CtdlPutFloor() but unlocks the record (if supported)
void lputfloor(struct floor *flbuf, int floor_num) {
CtdlPutFloorLock(flbuf, floor_num);
}
-/*
- * Iterate through the room table, performing a callback for each room.
- */
+// Iterate through the room table, performing a callback for each room.
void CtdlForEachRoom(ForEachRoomCallBack callback_func, void *in_data) {
struct ctdlroom qrbuf;
- struct cdbdata *cdbqr;
+ struct cdbkeyval cdbqr;
cdb_rewind(CDB_ROOMS);
-
- while (cdbqr = cdb_next_item(CDB_ROOMS), cdbqr != NULL) {
+ while (cdbqr = cdb_next_item(CDB_ROOMS), cdbqr.val.ptr!=NULL) { // always read through to the end
memset(&qrbuf, 0, sizeof(struct ctdlroom));
- memcpy(&qrbuf, cdbqr->ptr, ((cdbqr->len > sizeof(struct ctdlroom)) ? sizeof(struct ctdlroom) : cdbqr->len) );
- cdb_free(cdbqr);
+ memcpy(&qrbuf, cdbqr.val.ptr, ((cdbqr.val.len > sizeof(struct ctdlroom)) ? sizeof(struct ctdlroom) : cdbqr.val.len) );
room_sanity_check(&qrbuf);
if (qrbuf.QRflags & QR_INUSE) {
callback_func(&qrbuf, in_data);
}
-/*
- * delete_msglist() - delete room message pointers
- */
+// delete_msglist() - delete room message pointers
void delete_msglist(struct ctdlroom *whichroom) {
- struct cdbdata *cdbml;
+ struct cdbdata cdbml;
- /* Make sure the msglist we're deleting actually exists, otherwise
- * libdb will complain when we try to delete an invalid record
- */
+ // Make sure the msglist we're deleting actually exists; don't try to delete an invalid record
cdbml = cdb_fetch(CDB_MSGLISTS, &whichroom->QRnumber, sizeof(long));
- if (cdbml != NULL) {
- cdb_free(cdbml);
-
- /* Go ahead and delete it */
+ if (cdbml.ptr != NULL) {
+ // ok it exists, go ahead and delete it
cdb_delete(CDB_MSGLISTS, &whichroom->QRnumber, sizeof(long));
}
}
-/*
- * Message pointer compare function for sort_msglist()
- */
+// Message pointer compare function for sort_msglist()
int sort_msglist_cmp(const void *m1, const void *m2) {
if ((*(const long *)m1) > (*(const long *)m2)) return(1);
if ((*(const long *)m1) < (*(const long *)m2)) return(-1);
}
-/*
- * sort message pointers
- * (returns new msg count)
- */
+// sort message pointers
+// (returns new msg count)
int sort_msglist(long listptrs[], int oldcount) {
int numitems;
int i = 0;
numitems = oldcount;
- if (numitems < 2) {
+ if (numitems < 2) { // an empty or 1-item list needs no sorting
return (oldcount);
}
- /* do the sort */
- qsort(listptrs, numitems, sizeof(long), sort_msglist_cmp);
-
- /* and yank any nulls */
- while ((i < numitems) && (listptrs[i] == 0L)) i++;
+ qsort(listptrs, numitems, sizeof(long), sort_msglist_cmp); // do the sort
+ while ((i < numitems) && (listptrs[i] == 0L)) i++; // yank out any nulls
if (i > 0) {
memmove(&listptrs[0], &listptrs[i], (sizeof(long) * (numitems - i)));
numitems-=i;
}
-/*
- * Determine whether a given room is non-editable.
- */
+// Determine whether a given room is non-editable.
int CtdlIsNonEditable(struct ctdlroom *qrbuf) {
- /* Mail> rooms are non-editable */
+ // The inbox cannot be edited
if ( (qrbuf->QRflags & QR_MAILBOX) && (!strcasecmp(&qrbuf->QRname[11], MAILROOM)) ) {
return (1);
}
- /* Everything else is editable */
+ // Everything else is editable
return (0);
}
-/*
- * Make the specified room the current room for this session. No validation
- * or access control is done here -- the caller should make sure that the
- * specified room exists and is ok to access.
- */
-void CtdlUserGoto(char *where, int display_result, int transiently,
- int *retmsgs, int *retnew, long *retoldest, long *retnewest)
-{
+// Retrieve a list of all messages (message numbers) in the specified room.
+// Returns the number of messages in the room, allocates a pointer to the array and stuffs it in the supplied location.
+// Caller must free that memory.
+// If no messages in room, returns 0 and msgs is set to NULL.
+int CtdlFetchMsgList(long roomnum, long **msgs) {
+ int num_msgs = 0;
+ struct cdbdata cdbfr;
+
+ cdbfr = cdb_fetch(CDB_MSGLISTS, &roomnum, sizeof(long));
+ if (cdbfr.ptr == NULL) {
+ *msgs = malloc(sizeof(long)); // dummy buffer
+ *msgs[0] = 0;
+ return (0);
+ }
+
+ num_msgs = cdbfr.len / sizeof(long);
+ if (num_msgs > 0) {
+ *msgs = malloc(cdbfr.len);
+ memcpy(*msgs, cdbfr.ptr, cdbfr.len);
+ }
+ else {
+ *msgs = NULL;
+ }
+ return(num_msgs);
+}
+
+
+// Make the specified room the current room for this session. No validation
+// or access control is done here -- the caller should make sure that the
+// specified room exists and is ok to access.
+void CtdlUserGoto(char *where, int display_result, int transiently, int *retmsgs, int *retnew, long *retoldest, long *retnewest) {
int a;
int new_messages = 0;
int old_messages = 0;
int info = 0;
int rmailflag;
int raideflag;
- int newmailcount = 0;
- visit vbuf;
+ struct visit vbuf;
char truncated_roomname[ROOMNAMELEN];
- struct cdbdata *cdbfr;
long *msglist = NULL;
int num_msgs = 0;
unsigned int original_v_flags;
long lo, hi;
int is_trash = 0;
- /* If the supplied room name is NULL, the caller wants us to know that
- * it has already copied the room record into CC->room, so
- * we can skip the extra database fetch.
- */
+ // If the supplied room name is NULL, the caller wants us to know that
+ // it has already copied the room record into CC->room, so
+ // we can skip the extra database fetch.
if (where != NULL) {
safestrncpy(CC->room.QRname, where, sizeof CC->room.QRname);
CtdlGetRoom(&CC->room, where);
}
- /* Take care of all the formalities. */
+ // Take care of all the formalities.
begin_critical_section(S_USERS);
CtdlGetRelationship(&vbuf, &CC->user, &CC->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.
- */
+ // 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.
int add_room_to_known_list = 1;
if (transiently == 1) {
add_room_to_known_list = 0;
vbuf.v_flags = vbuf.v_flags | V_ACCESS;
}
- /* Only rewrite the database record if we changed something */
+ // Only rewrite the database record if we changed something
if (vbuf.v_flags != original_v_flags) {
CtdlSetRelationship(&vbuf, &CC->user, &CC->room);
}
end_critical_section(S_USERS);
- /* Check for new mail */
- newmailcount = NewMailCount();
-
- /* Set info to 1 if the room banner is new since our last visit.
- * Some clients only want to display it when it changes.
- */
+ // Set info to 1 if the room banner is new since our last visit.
+ // Some clients only want to display it when it changes.
if (CC->room.msgnum_info > vbuf.v_lastseen) {
info = 1;
}
- cdbfr = cdb_fetch(CDB_MSGLISTS, &CC->room.QRnumber, sizeof(long));
- if (cdbfr != NULL) {
- msglist = (long *) cdbfr->ptr;
- cdbfr->ptr = NULL; /* CtdlUserGoto() now owns this memory */
- num_msgs = cdbfr->len / sizeof(long);
- cdb_free(cdbfr);
- }
+ num_msgs = CtdlFetchMsgList(CC->room.QRnumber, &msglist);
total_messages = 0;
for (a=0; a<num_msgs; ++a) {
if (display_result) {
cprintf("%d%c%s|%d|%d|%d|%d|%ld|%ld|%d|%d|%d|%d|%d|%d|%d|%d|%ld|\n",
- CIT_OK, CtdlCheckExpress(),
+ CIT_OK, CtdlCheckExpress(CC),
truncated_roomname,
(int)new_messages,
(int)total_messages,
(long)vbuf.v_lastseen,
(int)rmailflag,
(int)raideflag,
- (int)newmailcount,
+ 0, // new mail is no longer counted here
(int)CC->room.QRfloor,
(int)vbuf.v_view,
(int)CC->room.QRdefaultview,
}
-/*
- * Handle some of the macro named rooms
- */
+// Handle some of the macro named rooms
void convert_room_name_macros(char *towhere, size_t maxlen) {
if (!strcasecmp(towhere, "_BASEROOM_")) {
safestrncpy(towhere, CtdlGetConfigStr("c_baseroom"), maxlen);
}
-/*
- * Back end function to rename a room.
- * You can also specify which floor to move the room to, or specify -1 to
- * keep the room on the same floor it was on.
- *
- * If you are renaming a mailbox room, you must supply the namespace prefix
- * in *at least* the old name!
- */
+// Back end function to rename a room.
+// You can also specify which floor to move the room to, or specify -1 to
+// keep the room on the same floor it was on.
+//
+// If you are renaming a mailbox room, you must supply the namespace prefix
+// in *at least* the old name!
int CtdlRenameRoom(char *old_name, char *new_name, int new_floor) {
int old_floor = 0;
struct ctdlroom qrbuf;
}
else {
- /* Rename it */
+ // Rename it
safestrncpy(actual_old_name, qrbuf.QRname, sizeof actual_old_name);
if (qrbuf.QRflags & QR_MAILBOX) {
owner = atol(qrbuf.QRname);
sizeof(qrbuf.QRname));
}
- /* Reject change of floor for baseroom/aideroom */
+ // Reject change of floor for baseroom/aideroom
if (!strncasecmp(old_name, CtdlGetConfigStr("c_baseroom"), ROOMNAMELEN) ||
!strncasecmp(old_name, CtdlGetConfigStr("c_aideroom"), ROOMNAMELEN))
{
new_floor = 0;
}
- /* Take care of floor stuff */
+ // Take care of floor stuff
old_floor = qrbuf.QRfloor;
if (new_floor < 0) {
new_floor = old_floor;
qrbuf.QRfloor = new_floor;
CtdlPutRoom(&qrbuf);
- begin_critical_section(S_CONFIG);
- /* If baseroom/aideroom name changes, update config */
- if (!strncasecmp(old_name, CtdlGetConfigStr("c_baseroom"), ROOMNAMELEN)) {
- CtdlSetConfigStr("c_baseroom", new_name);
- }
- if (!strncasecmp(old_name, CtdlGetConfigStr("c_aideroom"), ROOMNAMELEN)) {
- CtdlSetConfigStr("c_aideroom", new_name);
- }
-
- end_critical_section(S_CONFIG);
-
- /* If the room name changed, then there are now two room
- * records, so we have to delete the old one.
- */
+ // If the room name changed, then there are now two room
+ // records, so we have to delete the old one.
if (strcasecmp(new_name, old_name)) {
b_deleteroom(actual_old_name);
}
end_critical_section(S_ROOMS);
- /* Adjust the floor reference counts if necessary */
+ // If baseroom/aideroom name changes, update config
+ begin_critical_section(S_CONFIG);
+ if (!strncasecmp(old_name, CtdlGetConfigStr("c_baseroom"), ROOMNAMELEN)) {
+ CtdlSetConfigStr("c_baseroom", new_name);
+ }
+ if (!strncasecmp(old_name, CtdlGetConfigStr("c_aideroom"), ROOMNAMELEN)) {
+ CtdlSetConfigStr("c_aideroom", new_name);
+ }
+ end_critical_section(S_CONFIG);
+
+ // Adjust the floor reference counts if necessary
if (new_floor != old_floor) {
lgetfloor(&flbuf, old_floor);
--flbuf.f_ref_count;
syslog(LOG_DEBUG, "room_ops: reference count for floor %d is now %d", new_floor, flbuf.f_ref_count);
}
- /* ...and everybody say "YATTA!" */
+ // ...and everybody say "YATTA!"
return(ret);
}
-/*
- * Asynchronously schedule a room for deletion. By placing the room into an invalid private namespace,
- * the room will appear deleted to the user(s), but the session doesn't need to block while waiting for
- * database operations to complete. Instead, the room gets purged when THE DREADED AUTO-PURGER makes
- * its next run. Aren't we so clever?!!
- */
+// Asynchronously schedule a room for deletion. By placing the room into an invalid private namespace,
+// the room will appear deleted to the user(s), but the session doesn't need to block while waiting for
+// database operations to complete. Instead, the room gets purged when THE DREADED AUTO-PURGER makes
+// its next run. Aren't we so clever?!!
void CtdlScheduleRoomForDeletion(struct ctdlroom *qrbuf) {
char old_name[ROOMNAMELEN];
static int seq = 0;
safestrncpy(old_name, qrbuf->QRname, sizeof old_name);
CtdlGetRoom(qrbuf, qrbuf->QRname);
- /* Turn the room into a private mailbox owned by a user who doesn't
- * exist. This will immediately make the room invisible to everyone,
- * and qualify the room for purging.
- */
+ // Move the room into a hidden namespace owned by a non-existent user.
+ // This will make the room invisible to everyone.
+ // It will also qualify it for removal during the next purge cycle.
snprintf(qrbuf->QRname, sizeof qrbuf->QRname, "9999999999.%08lx.%04d.%s",
time(NULL),
++seq,
old_name
);
qrbuf->QRflags |= QR_MAILBOX;
- time(&qrbuf->QRgen); /* Use a timestamp as the new generation number */
+ time(&qrbuf->QRgen); // Use a timestamp as the new generation number
CtdlPutRoom(qrbuf);
b_deleteroom(old_name);
}
-/*
- * Back end processing to delete a room and everything associated with it
- * (This one is synchronous and should only get called by THE DREADED
- * AUTO-PURGER in serv_expire.c. All user-facing code should call
- * the asynchronous schedule_room_for_deletion() instead.)
- */
+// Back end processing to delete a room and everything associated with it
+// (This one is synchronous and should only get called by THE DREADED
+// AUTO-PURGER in serv_expire.c. All user-facing code should call
+// the asynchronous schedule_room_for_deletion() instead.)
void CtdlDeleteRoom(struct ctdlroom *qrbuf) {
struct floor flbuf;
char configdbkeyname[25];
}
-/*
- * Check access control for deleting a room
- */
+// Check access control for deleting a room
int CtdlDoIHavePermissionToDeleteThisRoom(struct ctdlroom *qr) {
if ((!(CC->logged_in)) && (!(CC->internal_pgm))) {
return(0);
}
- /*
- * For mailboxes, check stuff
- */
+ // For mailboxes, check stuff
if (qr->QRflags & QR_MAILBOX) {
- if (strlen(qr->QRname) < 12) return(0); /* bad name */
+ if (strlen(qr->QRname) < 12) return(0); // bad name
if (atol(qr->QRname) != CC->user.usernum) {
- return(0); /* not my room */
+ return(0); // not my room
}
- /* Can't delete your Mail> room */
+ // Can't delete your own inbox
if (!strcasecmp(&qr->QRname[11], MAILROOM)) return(0);
- /* Otherwise it's ok */
+ // Otherwise it's ok
return(1);
}
- /*
- * For normal rooms, just check for admin or room admin status.
- */
+ // For normal rooms, just check for admin or room admin status.
return(is_room_aide());
}
-/*
- * Internal code to create a new room (returns room flags)
- *
- * Room types: 0=public, 1=hidden, 2=passworded, 3=invitation-only,
- * 4=mailbox, 5=mailbox, but caller supplies namespace
- */
+// Internal code to create a new room (returns room flags)
+//
+// 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,
int new_room_type,
char *new_room_pass,
{
struct ctdlroom qrbuf;
struct floor flbuf;
- visit vbuf;
+ struct visit vbuf;
syslog(LOG_DEBUG, "room_ops: CtdlCreateRoom(name=%s, type=%d, view=%d)", new_room_name, new_room_type, new_room_view);
qrbuf.QRflags = (qrbuf.QRflags | QR_PASSWORDED);
if ( (new_room_type == 4) || (new_room_type == 5) ) {
qrbuf.QRflags = (qrbuf.QRflags | QR_MAILBOX);
- /* qrbuf.QRflags2 |= QR2_SUBJECTREQ; */
+ // qrbuf.QRflags2 |= QR2_SUBJECTREQ;
}
- /* If the user is requesting a personal room, set up the room
- * name accordingly (prepend the user number)
- */
+ // If the user is requesting a personal room, set up the room
+ // name accordingly (prepend the user number)
if (new_room_type == 4) {
CtdlMailboxName(qrbuf.QRname, sizeof qrbuf.QRname, &CC->user, new_room_name);
}
safestrncpy(qrbuf.QRname, new_room_name, sizeof qrbuf.QRname);
}
- /* If the room is private, and the system administrator has elected
- * to automatically grant room admin privileges, do so now.
- */
+ // If the room is private, and the system administrator has elected
+ // 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 admins of their blogs.
- * (In the future we will offer a site-wide configuration setting to suppress this behavior.)
- */
+
+ // 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 admin to undefined.
- */
+
+ // Otherwise, set the room admin to undefined.
else {
qrbuf.QRroomaide = (-1L);
}
- /*
- * If the caller is only interested in testing whether this will work,
- * return now without creating the room.
- */
+ // If the caller is only interested in testing whether this will work,
+ // return now without creating the room.
if (!really_create) return (qrbuf.QRflags);
qrbuf.QRnumber = get_new_room_number();
- qrbuf.QRhighest = 0L; /* No messages in this room yet */
- time(&qrbuf.QRgen); /* Use a timestamp as the generation number */
+ qrbuf.QRhighest = 0L; // No messages in this room yet
+ time(&qrbuf.QRgen); // Use a timestamp as the generation number
qrbuf.QRfloor = new_room_floor;
qrbuf.QRdefaultview = new_room_view;
- /* save what we just did... */
+ // save what we just did...
CtdlPutRoom(&qrbuf);
- /* bump the reference count on whatever floor the room is on */
+ // bump the reference count on whatever floor the room is on
lgetfloor(&flbuf, (int) qrbuf.QRfloor);
flbuf.f_ref_count = flbuf.f_ref_count + 1;
lputfloor(&flbuf, (int) qrbuf.QRfloor);
- /* Grant the creator access to the room unless the avoid_access
- * parameter was specified.
- */
+ // Grant the creator access to the room unless the avoid_access
+ // parameter was specified.
if ( (CC->logged_in) && (avoid_access == 0) ) {
CtdlGetRelationship(&vbuf, &CC->user, &qrbuf);
vbuf.v_flags = vbuf.v_flags & ~V_FORGET & ~V_LOCKOUT;
CtdlSetRelationship(&vbuf, &CC->user, &qrbuf);
}
- /* resume our happy day */
- return (qrbuf.QRflags);
+ // resume our happy day
+ return(qrbuf.QRflags);
}