#include <stdio.h>
#include <sys/stat.h>
#include <string.h>
-#ifdef HAVE_PTHREAD_H
-#include <pthread.h>
-#endif
#include <time.h>
#include <limits.h>
#include <errno.h>
/*
* Traverse the room file...
*/
-void ForEachRoom(void (*CallBack) (struct quickroom * EachRoom))
+void ForEachRoom(void (*CallBack) (struct quickroom *EachRoom, void *out_data),
+ void *in_data)
{
struct quickroom qrbuf;
struct cdbdata *cdbqr;
cdb_free(cdbqr);
room_sanity_check(&qrbuf);
if (qrbuf.QRflags & QR_INUSE)
- (*CallBack) (&qrbuf);
+ (*CallBack)(&qrbuf, in_data);
}
}
/*
* delete_msglist() - delete room message pointers
- * FIX - this really should check first to make sure there's actually a
+ * FIXME - this really should check first to make sure there's actually a
* msglist to delete. As things stand now, calling this function on
* a room which has never been posted in will result in a message
* like "gdbm: illegal data" (no big deal, but could use fixing).
}
-/*
- * Add a message number to a room's message list.
- *
- * This function returns the highest message number present in the room after
- * the add operation is performed - which is not necessarily the message
- * being added.
- */
-long AddMessageToRoom(struct quickroom *whichroom, long newmsgid)
-{
- struct cdbdata *cdbfr;
- int num_msgs;
- long *msglist;
- long highest_msg = 0L;
-
- lprintf(9, "AddMessageToRoom(%s, %ld)\n", whichroom->QRname, newmsgid);
- cdbfr = cdb_fetch(CDB_MSGLISTS, &whichroom->QRnumber, sizeof(long));
- if (cdbfr == NULL) {
- msglist = NULL;
- num_msgs = 0;
- } else {
- msglist = mallok(cdbfr->len);
- if (msglist == NULL)
- lprintf(3, "ERROR malloc msglist!\n");
- num_msgs = cdbfr->len / sizeof(long);
- memcpy(msglist, cdbfr->ptr, cdbfr->len);
- cdb_free(cdbfr);
- }
-
- /* Now add the new message */
- ++num_msgs;
- msglist = reallok(msglist,
- (num_msgs * sizeof(long)));
-
- if (msglist == NULL) {
- lprintf(3, "ERROR: can't realloc message list!\n");
- }
- msglist[num_msgs - 1] = newmsgid;
-
- /* Sort the message list, so all the msgid's are in order */
- num_msgs = sort_msglist(msglist, num_msgs);
-
- /* Determine the highest message number */
- highest_msg = msglist[num_msgs - 1];
-
- /* Write it back to disk. */
- cdb_store(CDB_MSGLISTS, &whichroom->QRnumber, sizeof(long),
- msglist, num_msgs * sizeof(long));
-
- /* And finally, free up the memory we used. */
- phree(msglist);
- return (highest_msg);
-}
/*
/*
* cmd_lrms() - List all accessible rooms, known or forgotten
*/
-void cmd_lrms_backend(struct quickroom *qrbuf)
+void cmd_lrms_backend(struct quickroom *qrbuf, void *data)
{
+ int FloorBeingSearched = (-1);
+ FloorBeingSearched = *(int *)data;
+
if (((CtdlRoomAccess(qrbuf, &CC->usersupp)
& (UA_KNOWN | UA_ZAPPED)))
- && ((qrbuf->QRfloor == (CC->FloorBeingSearched))
- || ((CC->FloorBeingSearched) < 0)))
+ && ((qrbuf->QRfloor == (FloorBeingSearched))
+ || ((FloorBeingSearched) < 0)))
list_roomname(qrbuf);
}
void cmd_lrms(char *argbuf)
{
- CC->FloorBeingSearched = (-1);
+ int FloorBeingSearched = (-1);
if (strlen(argbuf) > 0)
- CC->FloorBeingSearched = extract_int(argbuf, 0);
+ FloorBeingSearched = extract_int(argbuf, 0);
if (!(CC->logged_in)) {
cprintf("%d Not logged in.\n", ERROR + NOT_LOGGED_IN);
}
cprintf("%d Accessible rooms:\n", LISTING_FOLLOWS);
- ForEachRoom(cmd_lrms_backend);
+ ForEachRoom(cmd_lrms_backend, &FloorBeingSearched);
cprintf("000\n");
}
/*
* cmd_lkra() - List all known rooms
*/
-void cmd_lkra_backend(struct quickroom *qrbuf)
+void cmd_lkra_backend(struct quickroom *qrbuf, void *data)
{
+ int FloorBeingSearched = (-1);
+ FloorBeingSearched = *(int *)data;
+
if (((CtdlRoomAccess(qrbuf, &CC->usersupp)
& (UA_KNOWN)))
- && ((qrbuf->QRfloor == (CC->FloorBeingSearched))
- || ((CC->FloorBeingSearched) < 0)))
+ && ((qrbuf->QRfloor == (FloorBeingSearched))
+ || ((FloorBeingSearched) < 0)))
list_roomname(qrbuf);
}
void cmd_lkra(char *argbuf)
{
- CC->FloorBeingSearched = (-1);
+ int FloorBeingSearched = (-1);
if (strlen(argbuf) > 0)
- CC->FloorBeingSearched = extract_int(argbuf, 0);
+ FloorBeingSearched = extract_int(argbuf, 0);
if (!(CC->logged_in)) {
cprintf("%d Not logged in.\n", ERROR + NOT_LOGGED_IN);
}
cprintf("%d Known rooms:\n", LISTING_FOLLOWS);
- ForEachRoom(cmd_lkra_backend);
+ ForEachRoom(cmd_lkra_backend, &FloorBeingSearched);
cprintf("000\n");
}
/*
* cmd_lkrn() - List all known rooms with new messages
*/
-void cmd_lkrn_backend(struct quickroom *qrbuf)
+void cmd_lkrn_backend(struct quickroom *qrbuf, void *data)
{
int ra;
+ int FloorBeingSearched = (-1);
+ FloorBeingSearched = *(int *)data;
ra = CtdlRoomAccess(qrbuf, &CC->usersupp);
if ((ra & UA_KNOWN)
&& (ra & UA_HASNEWMSGS)
- && ((qrbuf->QRfloor == (CC->FloorBeingSearched))
- || ((CC->FloorBeingSearched) < 0)))
+ && ((qrbuf->QRfloor == (FloorBeingSearched))
+ || ((FloorBeingSearched) < 0)))
list_roomname(qrbuf);
}
void cmd_lkrn(char *argbuf)
{
- CC->FloorBeingSearched = (-1);
+ int FloorBeingSearched = (-1);
if (strlen(argbuf) > 0)
- CC->FloorBeingSearched = extract_int(argbuf, 0);
+ FloorBeingSearched = extract_int(argbuf, 0);
if (!(CC->logged_in)) {
cprintf("%d Not logged in.\n", ERROR + NOT_LOGGED_IN);
}
cprintf("%d Rooms w/ new msgs:\n", LISTING_FOLLOWS);
- ForEachRoom(cmd_lkrn_backend);
+ ForEachRoom(cmd_lkrn_backend, &FloorBeingSearched);
cprintf("000\n");
}
/*
* cmd_lkro() - List all known rooms
*/
-void cmd_lkro_backend(struct quickroom *qrbuf)
+void cmd_lkro_backend(struct quickroom *qrbuf, void *data)
{
int ra;
+ int FloorBeingSearched = (-1);
+ FloorBeingSearched = *(int *)data;
ra = CtdlRoomAccess(qrbuf, &CC->usersupp);
if ((ra & UA_KNOWN)
&& ((ra & UA_HASNEWMSGS) == 0)
- && ((qrbuf->QRfloor == (CC->FloorBeingSearched))
- || ((CC->FloorBeingSearched) < 0)))
+ && ((qrbuf->QRfloor == (FloorBeingSearched))
+ || ((FloorBeingSearched) < 0)))
list_roomname(qrbuf);
}
void cmd_lkro(char *argbuf)
{
- CC->FloorBeingSearched = (-1);
+ int FloorBeingSearched = (-1);
if (strlen(argbuf) > 0)
- CC->FloorBeingSearched = extract_int(argbuf, 0);
+ FloorBeingSearched = extract_int(argbuf, 0);
if (!(CC->logged_in)) {
cprintf("%d Not logged in.\n", ERROR + NOT_LOGGED_IN);
}
cprintf("%d Rooms w/o new msgs:\n", LISTING_FOLLOWS);
- ForEachRoom(cmd_lkro_backend);
+ ForEachRoom(cmd_lkro_backend, &FloorBeingSearched);
cprintf("000\n");
}
/*
* cmd_lzrm() - List all forgotten rooms
*/
-void cmd_lzrm_backend(struct quickroom *qrbuf)
+void cmd_lzrm_backend(struct quickroom *qrbuf, void *data)
{
int ra;
+ int FloorBeingSearched = (-1);
+ FloorBeingSearched = *(int *)data;
ra = CtdlRoomAccess(qrbuf, &CC->usersupp);
if ((ra & UA_GOTOALLOWED)
&& (ra & UA_ZAPPED)
- && ((qrbuf->QRfloor == (CC->FloorBeingSearched))
- || ((CC->FloorBeingSearched) < 0)))
+ && ((qrbuf->QRfloor == (FloorBeingSearched))
+ || ((FloorBeingSearched) < 0)))
list_roomname(qrbuf);
}
void cmd_lzrm(char *argbuf)
{
- CC->FloorBeingSearched = (-1);
+ int FloorBeingSearched = (-1);
if (strlen(argbuf) > 0)
- CC->FloorBeingSearched = extract_int(argbuf, 0);
+ FloorBeingSearched = extract_int(argbuf, 0);
if (!(CC->logged_in)) {
cprintf("%d Not logged in.\n", ERROR + NOT_LOGGED_IN);
}
cprintf("%d Zapped rooms:\n", LISTING_FOLLOWS);
- ForEachRoom(cmd_lzrm_backend);
+ ForEachRoom(cmd_lzrm_backend, &FloorBeingSearched);
cprintf("000\n");
}
rmailflag, raideflag, newmailcount,
CC->quickroom.QRfloor);
- set_wtmpsupp_to_current_room();
}
cprintf("%d Who knows room:\n", LISTING_FOLLOWS);
cdb_rewind(CDB_USERSUPP);
while (cdbus = cdb_next_item(CDB_USERSUPP), cdbus != NULL) {
- memset(&temp, 0, sizeof(struct usersupp));
- memcpy(&temp, cdbus->ptr, cdbus->len);
+ memset(&temp, 0, sizeof temp);
+ memcpy(&temp, cdbus->ptr, sizeof temp);
cdb_free(cdbus);
if ((CC->quickroom.QRflags & QR_INUSE)
cprintf("%d %s|%s/files/%s\n",
LISTING_FOLLOWS, config.c_fqdn, BBSDIR, CC->quickroom.QRdirname);
- sprintf(buf, "cd %s/files/%s; ls >%s 2>/dev/null",
- BBSDIR, CC->quickroom.QRdirname, CC->temp);
- system(buf);
+ sprintf(buf, "ls %s/files/%s >%s 2> /dev/null",
+ BBSDIR, CC->quickroom.QRdirname, CC->temp);
+ system(buf);
sprintf(buf, "%s/files/%s/filedir", BBSDIR, CC->quickroom.QRdirname);
fd = fopen(buf, "r");
buf[strlen(buf) - 1] = 0;
if ((!strncasecmp(buf, flnm, strlen(flnm)))
&& (buf[strlen(flnm)] == ' '))
- strncpy(comment,
- &buf[strlen(flnm) + 1], 255);
+ safestrncpy(comment,
+ &buf[strlen(flnm) + 1],
+ sizeof comment);
}
cprintf("%s|%ld|%s\n", flnm, statbuf.st_size, comment);
}
strcpy(old_name, CC->quickroom.QRname);
extract(buf, args, 0);
buf[ROOMNAMELEN] = 0;
- strncpy(CC->quickroom.QRname, buf, ROOMNAMELEN - 1);
+ safestrncpy(CC->quickroom.QRname, buf, sizeof CC->quickroom.QRname);
extract(buf, args, 1);
buf[10] = 0;
- strncpy(CC->quickroom.QRpasswd, buf, 9);
+ safestrncpy(CC->quickroom.QRpasswd, buf, sizeof CC->quickroom.QRpasswd);
extract(buf, args, 2);
buf[15] = 0;
- strncpy(CC->quickroom.QRdirname, buf, 19);
+ safestrncpy(CC->quickroom.QRdirname, buf,
+ sizeof CC->quickroom.QRdirname);
CC->quickroom.QRflags = (extract_int(args, 3) | QR_INUSE);
if (num_parms(args) >= 7)
CC->quickroom.QRorder = (char) new_order;
CC->quickroom.QRdirname);
system(buf);
}
- sprintf(buf, "%s> edited by %s", CC->quickroom.QRname, CC->curr_user);
+ sprintf(buf, "%s> edited by %s\n", CC->quickroom.QRname, CC->curr_user);
aide_message(buf);
cprintf("%d Ok\n", OK);
}
* the room table, otherwise it would deadlock!
*/
if (post_notice == 1) {
- sprintf(buf, "%s is now room aide for %s>",
+ sprintf(buf, "%s is now room aide for %s>\n",
usbuf.fullname, CC->quickroom.QRname);
aide_message(buf);
}
usergoto(BASEROOM, 0); /* Return to the Lobby */
/* tell the world what we did */
- sprintf(aaa, "%s> killed by %s",
+ sprintf(aaa, "%s> killed by %s\n",
deleted_room_name, CC->curr_user);
aide_message(aaa);
cprintf("%d '%s' deleted.\n", OK, deleted_room_name);
return (0); /* already exists */
memset(&qrbuf, 0, sizeof(struct quickroom));
- strncpy(qrbuf.QRname, new_room_name, ROOMNAMELEN);
- strncpy(qrbuf.QRpasswd, new_room_pass, 9);
+ safestrncpy(qrbuf.QRname, new_room_name, sizeof qrbuf.QRname);
+ safestrncpy(qrbuf.QRpasswd, new_room_pass, sizeof qrbuf.QRpasswd);
qrbuf.QRflags = QR_INUSE;
qrbuf.QRnumber = get_new_room_number();
if (new_room_type > 0)
new_room_type, new_room_pass, new_room_floor);
/* post a message in Aide> describing the new room */
- strncpy(aaa, new_room_name, 255);
+ safestrncpy(aaa, new_room_name, sizeof aaa);
strcat(aaa, "> created by ");
strcat(aaa, CC->usersupp.fullname);
if (newflags & QR_MAILBOX)
strcat(aaa, "\n Password: ");
strcat(aaa, new_room_pass);
}
+ strcat(aaa, "\n");
aide_message(aaa);
cprintf("%d '%s' has been created.\n", OK, qrbuf.QRname);
lgetfloor(&flbuf, free_slot);
flbuf.f_flags = F_INUSE;
flbuf.f_ref_count = 0;
- strncpy(flbuf.f_name, new_floor_name, 255);
+ safestrncpy(flbuf.f_name, new_floor_name, sizeof flbuf.f_name);
lputfloor(&flbuf, free_slot);
cprintf("%d %d\n", OK, free_slot);
}