/*
* Server functions which perform operations on room objects.
*
- * Copyright (c) 1987-2016 by the citadel.org team
+ * Copyright (c) 1987-2017 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.
return(om_ok);
}
+
/*
* 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
}
+
/*
* Check whether the current user has permission to delete messages from
* the current room (returns 1 for yes, 0 for no)
return(0);
}
+
/*
* Retrieve access control information for any user/room pair.
* Yes, it has a couple of gotos. If you don't like that, go die in a car fire.
/*
- * Traverse the room file...
+ * Iterate through the room table, performing a callback for each room.
*/
void CtdlForEachRoom(ForEachRoomCallBack CB, void *in_data)
{
}
/*
- * Traverse the room file...
+ * Iterate through the room table, performing a callback for each room that has a netconfig entry.
*/
-void CtdlForEachNetCfgRoom(ForEachRoomNetCfgCallBack CB, void *in_data, RoomNetCfg filter)
+void CtdlForEachNetCfgRoom(ForEachRoomNetCfgCallBack CB, void *in_data)
{
struct ctdlroom qrbuf;
struct cdbdata *cdbqr;
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)
- );
+ 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;
+ OneRoomNetCfg *RNCfg;
RNCfg = CtdlGetNetCfgForRoom(qrbuf.QRnumber);
- if ((RNCfg != NULL) && ((filter == maxRoomNetCfg) || (RNCfg->NetConfigs[filter] != NULL)))
+ if (RNCfg != NULL)
{
CB(&qrbuf, in_data, RNCfg);
+ FreeRoomNetworkStruct(&RNCfg);
}
- // FIXME free RNCfg
}
}
}
/* 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(CCC->room.QRname, CtdlGetConfigStr("c_logpages"))) && (transiently == 0))
- {
+ int add_room_to_known_list = 1;
+ if (transiently == 1) {
+ add_room_to_known_list = 0;
+ }
+ char *c_logpages = CtdlGetConfigStr("c_logpages");
+ if ( (c_logpages != NULL) && (!strcasecmp(CCC->room.QRname, c_logpages)) ) {
+ add_room_to_known_list = 0;
+ }
+ if (add_room_to_known_list) {
vbuf.v_flags = vbuf.v_flags & ~V_FORGET & ~V_LOCKOUT;
vbuf.v_flags = vbuf.v_flags | V_ACCESS;
}
/* Check for new mail */
newmailcount = NewMailCount();
- /* set info to 1 if the user needs to read the room's info file */
- if (CCC->room.QRinfo > vbuf.v_lastseen) {
+ /* 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 (CCC->room.msgnum_info > vbuf.v_lastseen) {
info = 1;
}
if (retnew != NULL) *retnew = new_messages;
if (retoldest != NULL) *retoldest = oldest_message;
if (retnewest != NULL) *retnewest = newest_message;
- MSG_syslog(LOG_INFO, "<%s> %d new of %d total messages, oldest=%ld, newest=%ld",
+ syslog(LOG_DEBUG, "room_ops: %s : %d new of %d total messages, oldest=%ld, newest=%ld",
CCC->room.QRname, new_messages, total_messages, oldest_message, newest_message
);
* in *at least* the old name!
*/
int CtdlRenameRoom(char *old_name, char *new_name, int new_floor) {
+ struct CitContext *CCC = CC;
int old_floor = 0;
struct ctdlroom qrbuf;
struct ctdlroom qrtmp;
long owner = 0L;
char actual_old_name[ROOMNAMELEN];
- syslog(LOG_DEBUG, "CtdlRenameRoom(%s, %s, %d)", old_name, new_name, new_floor);
+ syslog(LOG_DEBUG, "room_ops: CtdlRenameRoom(%s, %s, %d)", old_name, new_name, new_floor);
if (new_floor >= 0) {
fl = CtdlGetCachedFloor(new_floor);
ret = crr_room_not_found;
}
- 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))) ) {
+ else if ( (CCC->user.axlevel < AxAideU) && (!CCC->internal_pgm)
+ && (CCC->user.usernum != qrbuf.QRroomaide)
+ && ( (((qrbuf.QRflags & QR_MAILBOX) == 0) || (atol(qrbuf.QRname) != CCC->user.usernum))) ) {
ret = crr_access_denied;
}
lgetfloor(&flbuf, old_floor);
--flbuf.f_ref_count;
lputfloor(&flbuf, old_floor);
- syslog(LOG_DEBUG, "Reference count for floor %d is now %d", old_floor, flbuf.f_ref_count);
+ syslog(LOG_DEBUG, "room_ops: reference count for floor %d is now %d", old_floor, flbuf.f_ref_count);
lgetfloor(&flbuf, new_floor);
++flbuf.f_ref_count;
lputfloor(&flbuf, new_floor);
- syslog(LOG_DEBUG, "Reference count for floor %d is now %d", new_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!" */
char old_name[ROOMNAMELEN];
static int seq = 0;
- syslog(LOG_NOTICE, "Scheduling room <%s> for deletion", qrbuf->QRname);
+ syslog(LOG_NOTICE, "room_ops: scheduling room <%s> for deletion", qrbuf->QRname);
safestrncpy(old_name, qrbuf->QRname, sizeof old_name);
CtdlGetRoom(qrbuf, qrbuf->QRname);
void CtdlDeleteRoom(struct ctdlroom *qrbuf)
{
struct floor flbuf;
- char filename[PATH_MAX];
char configdbkeyname[25];
- syslog(LOG_NOTICE, "Deleting room <%s>", qrbuf->QRname);
-
- /* Delete the info file */
- assoc_file_name(filename, sizeof filename, qrbuf, ctdl_info_dir);
- unlink(filename);
-
- /* Delete the image file */
- assoc_file_name(filename, sizeof filename, qrbuf, ctdl_image_dir);
- unlink(filename);
+ syslog(LOG_NOTICE, "room_ops: deleting room <%s>", qrbuf->QRname);
/* Delete the room's network configdb entry */
netcfg_keyname(configdbkeyname, qrbuf->QRnumber);
struct floor flbuf;
visit vbuf;
- syslog(LOG_DEBUG, "CtdlCreateRoom(name=%s, type=%d, view=%d)", new_room_name, new_room_type, new_room_view);
+ syslog(LOG_DEBUG, "room_ops: CtdlCreateRoom(name=%s, type=%d, view=%d)", new_room_name, new_room_type, new_room_view);
if (CtdlGetRoom(&qrbuf, new_room_name) == 0) {
- syslog(LOG_DEBUG, "Cannot create room <%s> - already exists", new_room_name);
+ syslog(LOG_DEBUG, "room_ops: cannot create room <%s> - already exists", new_room_name);
return(0);
}