// Copyright (c) 1987-2022 by the citadel.org team
//
// This program is open source software. Use, duplication, and/or
-// disclosure are subject to the GNU General Purpose License version 3.
+// disclosure is subject to the GNU General Purpose 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
char is_mail = 0; /* nonzero when we're in a mail room */
char axlevel = AxDeleted; /* access level */
char is_room_aide = 0; /* boolean flag, 1 if room admin */
-int timescalled;
-int posted;
unsigned userflags;
long usernum = 0L; /* user number */
time_t lastcall = 0L; /* Date/time of previous login */
int enable_syslog = 0;
-/*
- * here is our 'clean up gracefully and exit' routine
- */
-void ctdl_logoff(char *file, int line, CtdlIPC * ipc, int code)
-{
+// Here is our 'clean up gracefully and exit' routine
+void ctdl_logoff(char *file, int line, CtdlIPC * ipc, int code) {
int lp;
if (editor_pid > 0) { /* kill the editor if it's running */
kill(editor_pid, SIGHUP);
}
- /* Free the ungoto list */
+ // Free the ungoto list
for (lp = 0; lp < uglistsize; lp++) {
free(uglist[lp]);
}
-/* Shut down the server connection ... but not if the logoff code is 3,
- * because that means we're exiting because we already lost the server.
- */
+ // Shut down the server connection ... but not if the logoff code is 3,
+ // because that means we're exiting because we already lost the server.
if (code != 3) {
CtdlIPCQuit(ipc);
}
-/*
- * now clean up various things
- */
+ // now clean up various things
unlink(temp);
unlink(temp2);
nukedir(tempdir);
- /* Violently kill off any child processes if Citadel is
- * the login shell.
- */
+ // Violently kill off any child processes if Citadel is the login shell.
if (getppid() == 1) {
kill(0 - getpgrp(), SIGTERM);
sleep(1);
kill(0 - getpgrp(), SIGKILL);
}
- color(ORIGINAL_PAIR); /* Restore the old color settings */
- stty_ctdl(SB_RESTORE); /* return the old terminal settings */
- /*
- * uncomment the following if you need to know why Citadel exited
- printf("*** Exit code %d at %s:%d\n", code, file, line);
- sleep(2);
- */
- exit(code); /* exit with the proper exit code */
+ color(ORIGINAL_PAIR); // Restore the old color settings
+ stty_ctdl(SB_RESTORE); // return the old terminal settings
+ exit(code); // exit with the proper exit code
}
/*
* signal catching function for hangups...
*/
-void dropcarr(int signum)
-{
+void dropcarr(int signum) {
logoff(NULL, 3); /* No IPC when server's already gone! */
}
* catch SIGCONT to reset terminal modes when were are put back into the
* foreground.
*/
-void catch_sigcont(int signum)
-{
+void catch_sigcont(int signum) {
stty_ctdl(SB_LAST);
signal(SIGCONT, catch_sigcont);
}
/* general purpose routines */
/* display a file */
-void formout(CtdlIPC * ipc, char *name)
-{
+void formout(CtdlIPC * ipc, char *name) {
int r; /* IPC return code */
char buf[SIZ];
char *text = NULL;
void userlist(CtdlIPC * ipc, char *patn) {
char buf[SIZ];
- char fl[SIZ];
+ char fl[64]; // a buffer this small will prevent it overrunning the column
struct tm tmbuf;
time_t lc;
int r; // IPC response code
return;
}
- scr_printf(" User Name Num L Last Visit Logins Messages\n");
- scr_printf("------------------------- ----- - ---------- ------ --------\n");
+ scr_printf("User Name Last Login\n");
+ scr_printf("---------------------------------------------------------------- ----------\n");
if (listing != NULL)
while (!IsEmptyStr(listing)) {
extract_token(buf, listing, 0, '\n', sizeof buf);
if (sigcaught == 0) {
extract_token(fl, buf, 0, '|', sizeof fl);
if (pattern(fl, patn) >= 0) {
- scr_printf("%-25s ", fl);
- scr_printf("%5ld %d ", extract_long(buf, 2), extract_int(buf, 1));
+ scr_printf("%-64s ", fl);
lc = extract_long(buf, 3);
localtime_r(&lc, &tmbuf);
- scr_printf("%02d/%02d/%04d ", (tmbuf.tm_mon + 1), tmbuf.tm_mday, (tmbuf.tm_year + 1900));
- scr_printf("%6ld %8ld\n", extract_long(buf, 4), extract_long(buf, 5));
+ scr_printf("%02d/%02d/%04d\n", (tmbuf.tm_mon + 1), tmbuf.tm_mday, (tmbuf.tm_year + 1900));
}
}
}
-/*
- * grab assorted info about the user...
- */
+// grab assorted info about the user...
void load_user_info(char *params) {
extract_token(fullname, params, 0, '|', sizeof fullname);
axlevel = extract_int(params, 1);
- timescalled = extract_int(params, 2);
- posted = extract_int(params, 3);
userflags = extract_int(params, 4);
usernum = extract_long(params, 5);
lastcall = extract_long(params, 6);
}
-/*
- * Remove a room from the march list. 'floornum' is ignored unless
- * 'roomname' is set to _FLOOR_, in which case all rooms on the requested
- * floor will be removed from the march list.
- */
+// Remove a room from the march list. 'floornum' is ignored unless
+// 'roomname' is set to _FLOOR_, in which case all rooms on the requested
+// floor will be removed from the march list.
void remove_march(char *roomname, int floornum) {
struct march *mptr, *mptr2;
}
-/*
- * Locate the room on the march list which we most want to go to. Each room
- * is measured given a "weight" of preference based on various factors.
- */
-char *pop_march(int desired_floor, struct march *_march)
-{
+// Locate the room on the march list which we most want to go to. Each room
+// is measured given a "weight" of preference based on various factors.
+char *pop_march(int desired_floor, struct march *_march) {
static char TheRoom[ROOMNAMELEN];
int TheWeight = 0;
int weight;
}
-/*
- * jump directly to a room
- */
-void dotgoto(CtdlIPC * ipc, char *towhere, int display_name, int fromungoto)
-{
+// jump directly to a room
+void dotgoto(CtdlIPC * ipc, char *towhere, int display_name, int fromungoto) {
char aaa[SIZ], bbb[SIZ];
static long ls = 0L;
- int newmailcount = 0;
int partial_match, best_match;
char from_floor;
int ugpos = uglistsize;
uglistlsn[lp] = uglistlsn[lp + 1];
}
ugpos--;
- } else {
+ }
+ else {
uglistsize++;
}
// Determine, based on the room's default view, whether an <E>nter message command will be valid here.
switch (room->RRdefaultview) {
- case VIEW_BBS:
- case VIEW_MAILBOX:
- entmsg_ok = ENTMSG_OK_YES;
- break;
- case VIEW_BLOG:
- entmsg_ok = ENTMSG_OK_BLOG;
- break;
- default:
- entmsg_ok = ENTMSG_OK_NO;
- break;
+ case VIEW_BBS:
+ case VIEW_MAILBOX:
+ entmsg_ok = ENTMSG_OK_YES;
+ break;
+ case VIEW_BLOG:
+ entmsg_ok = ENTMSG_OK_BLOG;
+ break;
+ default:
+ entmsg_ok = ENTMSG_OK_NO;
+ break;
}
remove_march(room_name, 0);
if (room->RRinfoupdated > 0)
readinfo(ipc);
- /* check for newly arrived mail if we can */
- newmailcount = room->RRnewmail;
- if (newmailcount > 0) {
- color(BRIGHT_RED);
- if (newmailcount == 1) {
- scr_printf("*** A new mail message has arrived.\n");
- }
- else {
- scr_printf("*** %d new mail messages have arrived.\n", newmailcount);
- }
- color(DIM_WHITE);
- if (!IsEmptyStr(rc_gotmail_cmd)) {
- rv = system(rc_gotmail_cmd);
- if (rv)
- scr_printf("*** failed to check for mail calling %s Reason %d.\n", rc_gotmail_cmd, rv);
- }
- }
+ /* check for newly arrived mail if we can FIXME use BIFF command for this
+ if (newmailcount > 0) {
+ color(BRIGHT_RED);
+ if (newmailcount == 1) {
+ scr_printf("*** A new mail message has arrived.\n");
+ }
+ else {
+ scr_printf("*** %d new mail messages have arrived.\n", newmailcount);
+ }
+ color(DIM_WHITE);
+ if (!IsEmptyStr(rc_gotmail_cmd)) {
+ rv = system(rc_gotmail_cmd);
+ if (rv)
+ scr_printf("*** failed to check for mail calling %s Reason %d.\n", rc_gotmail_cmd, rv);
+ }
+ }
+ */
+
free(room);
if (screenwidth > 5)
- snprintf(&status_line[1], screenwidth - 1, "%s | %s | %s | %s | %d new mail |",
- (secure ? "Encrypted" : "Unencrypted"),
- ipc->ServInfo.humannode, ipc->ServInfo.site_location, room_name, newmailcount);
+ snprintf(&status_line[1], screenwidth - 1, "%s | %s | %s | %s | %d new mail |", (secure ? "Encrypted" : "Unencrypted"), ipc->ServInfo.humannode, ipc->ServInfo.site_location, room_name, 0); // FIXME use BIFF
}
struct march *mptr, *mptr2;
char next_room[ROOMNAMELEN];
- /* Check to see if the march-mode list is already allocated.
- * If it is, pop the first room off the list and go there.
- */
+ // Check to see if the march-mode list is already allocated.
+ // If it is, pop the first room off the list and go there.
if (marchptr == NULL) {
CtdlIPCKnownRooms(ipc, SubscribedRoomsWithNewMessages, AllFloors, &marchptr, buf);
strcpy(mptr->march_name, "_BASEROOM_");
if (marchptr == NULL) {
marchptr = mptr;
- } else {
+ }
+ else {
mptr2 = marchptr;
while (mptr2->next != NULL)
mptr2 = mptr2->next;
}
-/*
- * forget all rooms on a given floor
- */
-void forget_all_rooms_on(CtdlIPC *ipc, int ffloor) {
+// forget all rooms on a given floor
+void forget_all_rooms_on(CtdlIPC * ipc, int ffloor) {
char buf[SIZ];
struct march *flist = NULL;
struct march *fptr = NULL;
struct ctdlipcroom *room = NULL;
- int r; /* IPC response code */
+ int r; // IPC response code
scr_printf("Forgetting all rooms on %s...\n", &floorlist[ffloor][0]);
remove_march("_FLOOR_", ffloor);
}
-/*
- * routine called by gotofloor() to move to a new room on a new floor
- */
-void gf_toroom(CtdlIPC * ipc, char *towhere, int mode)
-{
+// routine called by gotofloor() to move to a new room on a new floor
+void gf_toroom(CtdlIPC * ipc, char *towhere, int mode) {
int floor_being_left;
floor_being_left = curr_floor;
if (mode == GF_GOTO) { /* <;G>oto mode */
updatels(ipc);
dotgoto(ipc, towhere, 1, 0);
- } else if (mode == GF_SKIP) { /* <;S>kip mode */
+ }
+ else if (mode == GF_SKIP) { /* <;S>kip mode */
dotgoto(ipc, towhere, 1, 0);
remove_march("_FLOOR_", floor_being_left);
- } else if (mode == GF_ZAP) { /* <;Z>ap mode */
+ }
+ else if (mode == GF_ZAP) { /* <;Z>ap mode */
dotgoto(ipc, towhere, 1, 0);
remove_march("_FLOOR_", floor_being_left);
forget_all_rooms_on(ipc, floor_being_left);
}
-/*
- * go to a new floor
- */
-void gotofloor(CtdlIPC * ipc, char *towhere, int mode)
-{
+// go to a new floor
+void gotofloor(CtdlIPC * ipc, char *towhere, int mode) {
int a, tofloor;
int r; /* IPC response code */
struct march *mptr;
}
if (!IsEmptyStr(targ)) {
gf_toroom(ipc, targ, mode);
- } else {
+ }
+ else {
scr_printf("There are no rooms on '%s'.\n", &floorlist[tofloor][0]);
}
}
/*
* Indexing mechanism for a room list, called by gotoroomstep()
*/
-void room_tree_list_query(struct ctdlroomlisting *rp, char *findrmname, int findrmslot, char *rmname, int *rmslot, int *rmtotal)
-{
+void room_tree_list_query(struct ctdlroomlisting *rp, char *findrmname, int findrmslot, char *rmname, int *rmslot, int *rmtotal) {
char roomname[ROOMNAMELEN];
static int cur_rmslot = 0;
/*
* step through rooms on current floor
*/
-void gotoroomstep(CtdlIPC * ipc, int direction, int mode)
-{
+void gotoroomstep(CtdlIPC * ipc, int direction, int mode) {
struct march *listing = NULL;
struct march *mptr;
int r; /* IPC response code */
rs = rl;
if (rl == NULL) {
rl = rp;
- } else {
+ }
+ else {
while (rp != NULL) {
if (rordercmp(rp, rs) < 0) {
if (rs->lnext == NULL) {
rs->lnext = rp;
rp = NULL;
- } else {
+ }
+ else {
rs = rs->lnext;
}
- } else {
+ }
+ else {
if (rs->rnext == NULL) {
rs->rnext = rp;
rp = NULL;
- } else {
+ }
+ else {
rs = rs->rnext;
}
}
rmslot--;
}
}
- else { /* Next room */
+ else { /* Next room */
/* If we're at the last room, wrap to the first room */
if (rmslot == rmtotal - 1) {
rmslot = 0;
while (!floorlist[tofloor][0])
tofloor--;
- } else { /* Next floor */
+ }
+ else { /* Next floor */
if (curr_floor < 127)
tofloor = curr_floor + 1;
else
* Display user 'preferences'.
*/
extern int rc_prompt_control;
-void read_config(CtdlIPC * ipc)
-{
+void read_config(CtdlIPC * ipc) {
char buf[SIZ];
char *resp = NULL;
int r; /* IPC response code */
char _fullname[USERNAME_SIZE];
long _usernum;
- int _axlevel, _timescalled, _posted;
+ int _axlevel;
time_t _lastcall;
struct ctdluser *user = NULL;
_usernum = extract_long(buf, 2);
_axlevel = extract_int(buf, 3);
_lastcall = extract_long(buf, 4);
- _timescalled = extract_int(buf, 5);
- _posted = extract_int(buf, 6);
free(resp);
resp = NULL;
}
/* show misc user info */
- scr_printf("%s\nAccess level: %d (%s)\n"
- "User #%ld / %d Calls / %d Posts", _fullname, _axlevel, axdefs[(int) _axlevel], _usernum, _timescalled, _posted);
if (_lastcall > 0L) {
- scr_printf(" / Curr login: %s", asctime(localtime(&_lastcall)));
+ scr_printf("Last login: %s", asctime(localtime(&_lastcall)));
}
scr_printf("\n");
/*
* Display system statistics.
*/
-void system_info(CtdlIPC * ipc)
-{
+void system_info(CtdlIPC * ipc) {
char buf[SIZ];
char *resp = NULL;
size_t bytes;
/*
* forget all rooms on current floor
*/
-void forget_this_floor(CtdlIPC * ipc)
-{
+void forget_this_floor(CtdlIPC * ipc) {
if (curr_floor == 0) {
scr_printf("Can't forget this floor.\n");
return;
/*
* set floor mode depending on client, server, and user settings
*/
-void set_floor_mode(CtdlIPC * ipc)
-{
+void set_floor_mode(CtdlIPC * ipc) {
if (ipc->ServInfo.ok_floors == 0) {
floor_mode = 0; /* Don't use floors if the server */
}
/*
* Set or change the user's password
*/
-int set_password(CtdlIPC * ipc)
-{
+int set_password(CtdlIPC * ipc) {
char pass1[20];
char pass2[20];
char buf[SIZ];
if (!IsEmptyStr(rc_password)) {
strcpy(pass1, rc_password);
strcpy(pass2, rc_password);
- } else {
+ }
+ else {
IFNEXPERT formout(ipc, "changepw");
newprompt("Enter a new password: ", pass1, -19);
newprompt("Enter it again to confirm: ", pass2, -19);
scr_printf("%s\n", buf);
offer_to_remember_password(ipc, hostbuf, portbuf, fullname, pass1);
return (0);
- } else {
+ }
+ else {
scr_printf("*** They don't match... try again.\n");
return (1);
}
/*
* get info about the server we've connected to
*/
-void get_serv_info(CtdlIPC * ipc, char *supplied_hostname)
-{
+void get_serv_info(CtdlIPC * ipc, char *supplied_hostname) {
char buf[SIZ];
CtdlIPCServerInfo(ipc, buf);
/* Look up the , in the bible if you're confused */
(locate_host(ipc, buf), buf), buf);
- /* Indicate to the server that we prefer to decode Base64 and
- * quoted-printable on the client side.
- */
+ // Indicate to the server that we prefer to decode Base64 and
+ // quoted-printable on the client side.
if ((CtdlIPCSpecifyPreferredFormats(ipc, buf, "dont_decode") / 100) != 2) {
- scr_printf("ERROR: Extremely old server; MSG4 framework not supported.\n");
+ scr_printf("Error %s:%d", __FILE__, __LINE__);
logoff(ipc, 0);
}
* the plain text when we have it available.
*/
if ((CtdlIPCSpecifyPreferredFormats(ipc, buf, "text/plain|text/html|text/x-markdown") / 100) != 2) {
- scr_printf("ERROR: Extremely old server; MSG4 framework not supported.\n");
+ scr_printf("Error %s:%d", __FILE__, __LINE__);
logoff(ipc, 0);
}
}
/*
* Session username compare function for SortOnlineUsers()
*/
-int rwho_username_cmp(const void *rec1, const void *rec2)
-{
+int rwho_username_cmp(const void *rec1, const void *rec2) {
char *u1, *u2;
u1 = strchr(rec1, '|');
/*
* Idle time compare function for SortOnlineUsers()
*/
-int idlecmp(const void *rec1, const void *rec2)
-{
+int idlecmp(const void *rec1, const void *rec2) {
time_t i1, i2;
i1 = extract_long(rec1, 5);
* If 'condense' is nonzero, multiple sessions for the same user will be
* combined into one for brevity.
*/
-char *SortOnlineUsers(char *listing, int condense)
-{
+char *SortOnlineUsers(char *listing, int condense) {
int rows;
char *sortbuf;
char *retbuf;
/*
* Display list of users currently logged on to the server
*/
-void who_is_online(CtdlIPC * ipc, int longlist)
-{
+void who_is_online(CtdlIPC * ipc, int longlist) {
char buf[SIZ], username[SIZ], roomname[SIZ], fromhost[SIZ];
char flags[SIZ];
char actual_user[SIZ], actual_room[SIZ], actual_host[SIZ];
}
-void enternew(CtdlIPC * ipc, char *desc, char *buf, int maxlen)
-{
+void enternew(CtdlIPC * ipc, char *desc, char *buf, int maxlen) {
char bbb[128];
snprintf(bbb, sizeof bbb, "Enter in your new %s: ", desc);
newprompt(bbb, buf, maxlen);
do {
if (!IsEmptyStr(rc_username)) {
strcpy(fullname, rc_username);
- } else {
+ }
+ else {
newprompt("Enter your name: ", fullname, 29);
}
strproc(fullname);
/* password authentication */
if (!IsEmptyStr(rc_password)) {
strcpy(password, rc_password);
- } else {
+ }
+ else {
newprompt("\rPlease enter your password: ", password, -(SIZ - 1));
}
}
color(BRIGHT_WHITE);
- scr_printf("\n%s\nAccess level: %d (%s)\n"
- "User #%ld / Login #%d", fullname, axlevel, axdefs[(int) axlevel], usernum, timescalled);
if (lastcall > 0L) {
- scr_printf(" / Last login: %s", asctime(localtime(&lastcall)));
+ scr_printf("Last login: %s", asctime(localtime(&lastcall)));
}
scr_printf("\n");
if (atoi(aaa)) {
scr_printf
("The Citadel server will terminate when all users are logged off.\n");
- } else {
+ }
+ else {
scr_printf("The Citadel server will not terminate.\n");
}
}