X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=textclient%2Fcitadel.c;h=1fea75eb38842077722782d3919324e985b600e6;hb=HEAD;hp=0bab0a56630a54eb7586c970e22c94e9fba1e8d4;hpb=f7a577c3cdaeaeb831ac1a8b49564dc55cc919af;p=citadel.git diff --git a/textclient/citadel.c b/textclient/citadel.c index 0bab0a566..b5682cfb2 100644 --- a/textclient/citadel.c +++ b/textclient/citadel.c @@ -2,13 +2,7 @@ // // 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. -// -// 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. +// This program is open source software. Use, duplication, or disclosure is subject to the GNU General Public License version 3. #include "textclient.h" @@ -38,8 +32,6 @@ int uglistsize = 0; 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 */ @@ -60,58 +52,46 @@ int secure; /* Set to nonzero when wire is encrypted */ extern char instant_msgs; /* instant messages waiting! */ extern int rc_ansi_color; /* ansi color value from citadel.rc */ +extern int rc_sixel; /* sixel graphics value from citadel.rc */ extern int next_lazy_cmd; CtdlIPC *ipc_for_signal_handlers; /* KLUDGE cover your eyes */ 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 } @@ -119,8 +99,7 @@ void ctdl_logoff(char *file, int line, CtdlIPC * ipc, int code) /* * signal catching function for hangups... */ -void dropcarr(int signum) -{ +void dropcarr(int signum) { logoff(NULL, 3); /* No IPC when server's already gone! */ } @@ -130,8 +109,7 @@ void dropcarr(int signum) * 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); } @@ -140,8 +118,7 @@ void catch_sigcont(int signum) /* 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; @@ -160,7 +137,7 @@ void formout(CtdlIPC * ipc, char *name) void userlist(CtdlIPC * ipc, char *patn) { char buf[SIZ]; - char fl[26]; // a buffer this small will prevent it overrunning the column + char fl[64]; // a buffer this small will prevent it overrunning the column struct tm tmbuf; time_t lc; int r; // IPC response code @@ -172,8 +149,8 @@ void userlist(CtdlIPC * ipc, char *patn) { 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); @@ -182,12 +159,10 @@ void userlist(CtdlIPC * ipc, char *patn) { 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)); } } @@ -197,25 +172,19 @@ void userlist(CtdlIPC * ipc, char *patn) { } -/* - * 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; @@ -247,12 +216,9 @@ void remove_march(char *roomname, int floornum) { } -/* - * 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; @@ -281,14 +247,10 @@ char *pop_march(int desired_floor, struct march *_march) } -/* - * 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; @@ -307,7 +269,8 @@ void dotgoto(CtdlIPC * ipc, char *towhere, int display_name, int fromungoto) uglistlsn[lp] = uglistlsn[lp + 1]; } ugpos--; - } else { + } + else { uglistsize++; } @@ -382,16 +345,16 @@ void dotgoto(CtdlIPC * ipc, char *towhere, int display_name, int fromungoto) // Determine, based on the room's default view, whether an 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); @@ -430,29 +393,28 @@ void dotgoto(CtdlIPC * ipc, char *towhere, int display_name, int fromungoto) 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 } @@ -466,9 +428,8 @@ void gotonext(CtdlIPC * ipc) { 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); @@ -481,7 +442,8 @@ void gotonext(CtdlIPC * ipc) { strcpy(mptr->march_name, "_BASEROOM_"); if (marchptr == NULL) { marchptr = mptr; - } else { + } + else { mptr2 = marchptr; while (mptr2->next != NULL) mptr2 = mptr2->next; @@ -502,15 +464,13 @@ void gotonext(CtdlIPC * ipc) { } -/* - * 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); @@ -537,11 +497,8 @@ void forget_all_rooms_on(CtdlIPC *ipc, int 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; @@ -549,10 +506,12 @@ void gf_toroom(CtdlIPC * ipc, char *towhere, int mode) 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); @@ -560,11 +519,8 @@ void gf_toroom(CtdlIPC * ipc, char *towhere, int mode) } -/* - * 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; @@ -641,7 +597,8 @@ void gotofloor(CtdlIPC * ipc, char *towhere, int mode) } if (!IsEmptyStr(targ)) { gf_toroom(ipc, targ, mode); - } else { + } + else { scr_printf("There are no rooms on '%s'.\n", &floorlist[tofloor][0]); } } @@ -650,8 +607,7 @@ void gotofloor(CtdlIPC * ipc, char *towhere, int mode) /* * 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; @@ -695,8 +651,7 @@ void room_tree_list_query(struct ctdlroomlisting *rp, char *findrmname, int find /* * 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 */ @@ -735,20 +690,24 @@ void gotoroomstep(CtdlIPC * ipc, int direction, int mode) 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; } } @@ -770,7 +729,7 @@ void gotoroomstep(CtdlIPC * ipc, int direction, int mode) 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; @@ -821,7 +780,8 @@ void gotofloorstep(CtdlIPC * ipc, int direction, int mode) { while (!floorlist[tofloor][0]) tofloor--; - } else { /* Next floor */ + } + else { /* Next floor */ if (curr_floor < 127) tofloor = curr_floor + 1; else @@ -849,14 +809,13 @@ void gotofloorstep(CtdlIPC * ipc, int direction, int mode) { * 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; @@ -870,8 +829,6 @@ void read_config(CtdlIPC * ipc) _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; @@ -884,10 +841,8 @@ void read_config(CtdlIPC * ipc) } /* 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"); @@ -949,8 +904,7 @@ void read_config(CtdlIPC * ipc) /* * Display system statistics. */ -void system_info(CtdlIPC * ipc) -{ +void system_info(CtdlIPC * ipc) { char buf[SIZ]; char *resp = NULL; size_t bytes; @@ -990,8 +944,7 @@ void system_info(CtdlIPC * ipc) /* * 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; @@ -1011,8 +964,7 @@ void forget_this_floor(CtdlIPC * ipc) /* * 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 */ } @@ -1033,8 +985,7 @@ void set_floor_mode(CtdlIPC * ipc) /* * 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]; @@ -1042,7 +993,8 @@ int set_password(CtdlIPC * ipc) 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); @@ -1054,7 +1006,8 @@ int set_password(CtdlIPC * ipc) 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); } @@ -1064,8 +1017,7 @@ int set_password(CtdlIPC * ipc) /* * 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); @@ -1077,11 +1029,10 @@ void get_serv_info(CtdlIPC * ipc, char *supplied_hostname) /* 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); } @@ -1094,7 +1045,7 @@ void get_serv_info(CtdlIPC * ipc, char *supplied_hostname) * 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); } } @@ -1103,8 +1054,7 @@ void get_serv_info(CtdlIPC * ipc, char *supplied_hostname) /* * 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, '|'); @@ -1117,8 +1067,7 @@ int rwho_username_cmp(const void *rec1, const void *rec2) /* * 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); @@ -1140,8 +1089,7 @@ int idlecmp(const void *rec1, const void *rec2) * 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; @@ -1206,8 +1154,7 @@ char *SortOnlineUsers(char *listing, int condense) /* * 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]; @@ -1343,8 +1290,7 @@ void who_is_online(CtdlIPC * ipc, int longlist) } -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); @@ -1513,7 +1459,8 @@ int main(int argc, char **argv) { do { if (!IsEmptyStr(rc_username)) { strcpy(fullname, rc_username); - } else { + } + else { newprompt("Enter your name: ", fullname, 29); } strproc(fullname); @@ -1542,7 +1489,8 @@ int main(int argc, char **argv) { /* password authentication */ if (!IsEmptyStr(rc_password)) { strcpy(password, rc_password); - } else { + } + else { newprompt("\rPlease enter your password: ", password, -(SIZ - 1)); } @@ -1596,10 +1544,8 @@ int main(int argc, char **argv) { } 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"); @@ -1856,7 +1802,8 @@ int main(int argc, char **argv) { 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"); } }