X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Ftextclient%2Fcitadel.c;h=622bed1c874142ce43107281eaabcf955bbd38c2;hb=d6517e02c044dec3c209ccb1f1ac79ae96e5b5e0;hp=407b47ae9469bfeb27f5a9b56ea8264d2d84bac0;hpb=65144aef7aa6c8be98c74420a5b384ee8f239a06;p=citadel.git diff --git a/citadel/textclient/citadel.c b/citadel/textclient/citadel.c index 407b47ae9..622bed1c8 100644 --- a/citadel/textclient/citadel.c +++ b/citadel/textclient/citadel.c @@ -1,6 +1,4 @@ /* - * $Id$ - * * Main source module for the client program. * * Copyright (c) 1987-2009 by the citadel.org team @@ -77,8 +75,8 @@ #define IFNAIDE if (axlevel= 0) { - pprintf("%-25s ", fl); - pprintf("%5ld %d ", extract_long(buf, 2), + scr_printf("%-25s ", fl); + scr_printf("%5ld %d ", extract_long(buf, 2), extract_int(buf, 1)); lc = extract_long(buf, 3); localtime_r(&lc, &tmbuf); - pprintf("%02d/%02d/%04d ", + scr_printf("%02d/%02d/%04d ", (tmbuf.tm_mon + 1), tmbuf.tm_mday, (tmbuf.tm_year + 1900)); - pprintf("%6ld %8ld\n", extract_long(buf, 4), extract_long(buf, 5)); + scr_printf("%6ld %8ld\n", extract_long(buf, 4), extract_long(buf, 5)); } } } free(listing); - pprintf("\n"); + scr_printf("\n"); } @@ -341,8 +320,6 @@ void remove_march(char *roomname, int floornum) char *pop_march(int desired_floor, struct march *_march) { static char TheRoom[ROOMNAMELEN]; - int TheFloor = 0; - int TheOrder = 32767; int TheWeight = 0; int weight; struct march *mptr = NULL; @@ -364,8 +341,6 @@ char *pop_march(int desired_floor, struct march *_march) if (weight > TheWeight) { TheWeight = weight; strcpy(TheRoom, mptr->march_name); - TheFloor = mptr->march_floor; - TheOrder = mptr->march_order; } } return (TheRoom); @@ -477,6 +452,7 @@ void dotgoto(CtdlIPC *ipc, char *towhere, int display_name, int fromungoto) switch(room->RRdefaultview) { case VIEW_BBS: case VIEW_MAILBOX: + case VIEW_BLOG: entmsg_ok = 1; break; default: @@ -534,11 +510,20 @@ void dotgoto(CtdlIPC *ipc, char *towhere, int display_name, int fromungoto) 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); } } - status_line(ipc->ServInfo.humannode, ipc->ServInfo.site_location, - room_name, secure, newmailcount); 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 + ); } /* Goto next room having unread messages. @@ -551,14 +536,13 @@ void gotonext(CtdlIPC *ipc) char buf[SIZ]; struct march *mptr, *mptr2; char next_room[ROOMNAMELEN]; - int r; /* IPC response code */ /* 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) { - r = CtdlIPCKnownRooms(ipc, SubscribedRoomsWithNewMessages, - AllFloors, &marchptr, buf); + CtdlIPCKnownRooms(ipc, SubscribedRoomsWithNewMessages, + AllFloors, &marchptr, buf); /* add _BASEROOM_ to the end of the march list, so the user will end up * in the system base room (usually the Lobby>) at the end of the loop @@ -603,7 +587,6 @@ void forget_all_rooms_on(CtdlIPC *ipc, int ffloor) int r; /* IPC response code */ scr_printf("Forgetting all rooms on %s...\n", &floorlist[ffloor][0]); - scr_flush(); remove_march("_FLOOR_", ffloor); r = CtdlIPCKnownRooms(ipc, AllAccessibleRooms, ffloor, &flist, buf); if (r / 100 != 1) { @@ -949,7 +932,7 @@ void read_config(CtdlIPC *ipc) /* get misc user info */ r = CtdlIPCGetBio(ipc, fullname, &resp, buf); if (r / 100 != 1) { - pprintf("%s\n", buf); + scr_printf("%s\n", buf); return; } extract_token(_fullname, buf, 1, '|', sizeof fullname); @@ -981,8 +964,6 @@ void read_config(CtdlIPC *ipc) scr_printf("\n"); /* show preferences */ - scr_printf("Your screen width: "); color(BRIGHT_CYAN); scr_printf("%d", /*user->USscreenwidth*/ screenwidth); color(DIM_WHITE); - scr_printf(", height: "); color(BRIGHT_CYAN); scr_printf("%d\n", /*user->USscreenheight*/ screenheight); color(DIM_WHITE); scr_printf("Are you an experienced Citadel user: "); color(BRIGHT_CYAN); scr_printf("%s\n", (user->flags & US_EXPERT) ? "Yes" : "No"); color(DIM_WHITE); scr_printf("Print last old message on New message request: "); color(BRIGHT_CYAN); scr_printf("%s\n", (user->flags & US_LASTOLD)? "Yes" : "No"); color(DIM_WHITE); scr_printf("Prompt after each message: "); color(BRIGHT_CYAN); scr_printf("%s\n", (!(user->flags & US_NOPROMPT))? "Yes" : "No"); color(DIM_WHITE); @@ -1017,20 +998,19 @@ void system_info(CtdlIPC *ipc) int mrtg_users, mrtg_active_users; char mrtg_server_uptime[40]; long mrtg_himessage; - int ret; /* IPC response code */ /* get #users, #active & server uptime */ - ret = CtdlIPCGenericCommand(ipc, "MRTG|users", NULL, 0, &resp, &bytes, buf); + CtdlIPCGenericCommand(ipc, "MRTG|users", NULL, 0, &resp, &bytes, buf); mrtg_users = extract_int(resp, 0); remove_token(resp, 0, '\n'); mrtg_active_users = extract_int(resp, 0); remove_token(resp, 0, '\n'); extract_token(mrtg_server_uptime, resp, 0, '\n', sizeof mrtg_server_uptime); - free(resp); + free(resp); resp = NULL; /* get high message# */ - ret = CtdlIPCGenericCommand(ipc, "MRTG|messages", NULL, 0, &resp, &bytes, buf); + CtdlIPCGenericCommand(ipc, "MRTG|messages", NULL, 0, &resp, &bytes, buf); mrtg_himessage = extract_long(resp, 0); free(resp); resp = NULL; @@ -1087,7 +1067,7 @@ void check_screen_dims(void) if (have_xterm) { /* dynamically size screen if on an xterm */ if (ioctl(0, TIOCGWINSZ, &xwinsz) == 0) { if (xwinsz.height) - screenheight = is_curses_enabled() ? (int)xwinsz.height - 1 : (int) xwinsz.height; + screenheight = (int) xwinsz.height; if (xwinsz.width) screenwidth = (int) xwinsz.width; } @@ -1158,6 +1138,7 @@ void get_serv_info(CtdlIPC *ipc, char *supplied_hostname) char buf[SIZ]; CtdlIPCServerInfo(ipc, buf); + moreprompt = ipc->ServInfo.moreprompt; /* be nice and identify ourself to the server */ CtdlIPCIdentifySoftware(ipc, SERVER_TYPE, 0, REV_LEVEL, @@ -1191,7 +1172,20 @@ void get_serv_info(CtdlIPC *ipc, char *supplied_hostname) /* - * Record compare function for SortOnlineUsers() + * Session username compare function for SortOnlineUsers() + */ +int rwho_username_cmp(const void *rec1, const void *rec2) { + char *u1, *u2; + + u1 = strchr(rec1, '|'); + u2 = strchr(rec2, '|'); + + return strcasecmp( (u1?++u1:"") , (u2?++u2:"") ); +} + + +/* + * Idle time compare function for SortOnlineUsers() */ int idlecmp(const void *rec1, const void *rec2) { time_t i1, i2; @@ -1209,8 +1203,11 @@ int idlecmp(const void *rec1, const void *rec2) { * Sort the list of online users by idle time. * This function frees the supplied buffer, and returns a new one * to the caller. The caller is responsible for freeing the returned buffer. + * + * If 'condense' is nonzero, multiple sessions for the same user will be + * combined into one for brevity. */ -char *SortOnlineUsers(char *listing) { +char *SortOnlineUsers(char *listing, int condense) { int rows; char *sortbuf; char *retbuf; @@ -1233,17 +1230,37 @@ char *SortOnlineUsers(char *listing) { memcpy(&sortbuf[i*SIZ], buf, (size_t)SIZ); } - /* Do the sort */ + /* Sort by idle time */ qsort(sortbuf, rows, SIZ, idlecmp); + /* Combine multiple sessions for the same user */ + if (condense) { + qsort(sortbuf, rows, SIZ, rwho_username_cmp); + if (rows > 1) for (i=1; i0) { + char u1[USERNAME_SIZE]; + char u2[USERNAME_SIZE]; + extract_token(u1, &sortbuf[(i-1)*SIZ], 1, '|', sizeof u1); + extract_token(u2, &sortbuf[i*SIZ], 1, '|', sizeof u2); + if (!strcasecmp(u1, u2)) { + memcpy(&sortbuf[i*SIZ], &sortbuf[(i+1)*SIZ], (rows-i-1)*SIZ); + --rows; + --i; + } + } + + qsort(sortbuf, rows, SIZ, idlecmp); /* idle sort again */ + } + /* Copy back to a \n delimited list */ strcpy(retbuf, ""); for (i=0; i= 80) pprintf(" Idle From host"); - pprintf("\n"); + scr_printf(" User Name Room "); + if (screenwidth >= 80) scr_printf(" Idle From host"); + scr_printf("\n"); color(DIM_WHITE); - pprintf(" ------------------------- --------------------"); - if (screenwidth >= 80) pprintf(" ---- ------------------------"); - pprintf("\n"); + scr_printf(" ------------------------- --------------------"); + if (screenwidth >= 80) scr_printf(" ---- ------------------------"); + scr_printf("\n"); } r = CtdlIPCOnlineUsers(ipc, &listing, &timenow, buf); - listing = SortOnlineUsers(listing); + listing = SortOnlineUsers(listing, (!longlist)); if (r / 100 == 1) { while (!IsEmptyStr(listing)) { int isidle = 0; @@ -1312,13 +1329,13 @@ void who_is_online(CtdlIPC *ipc, int longlist) extract_token(actual_room, buf, 9, '|', sizeof actual_room); extract_token(actual_host, buf, 10, '|', sizeof actual_host); - pprintf(" Flags: %s\n", flags); - pprintf("Session: %d\n", extract_int(buf, 0)); - pprintf(" Name: %s\n", username); - pprintf("In room: %s\n", roomname); - pprintf(" Host: %s\n", fromhost); - pprintf(" Client: %s\n", clientsoft); - pprintf(" Idle: %ld:%02ld:%02ld\n", + scr_printf(" Flags: %s\n", flags); + scr_printf("Session: %d\n", extract_int(buf, 0)); + scr_printf(" Name: %s\n", username); + scr_printf("In room: %s\n", roomname); + scr_printf(" Host: %s\n", fromhost); + scr_printf(" Client: %s\n", clientsoft); + scr_printf(" Idle: %ld:%02ld:%02ld\n", (long) idlehours, (long) idlemins, (long) idlesecs); @@ -1326,59 +1343,59 @@ void who_is_online(CtdlIPC *ipc, int longlist) if ( (!IsEmptyStr(actual_user)&& !IsEmptyStr(actual_room)&& !IsEmptyStr(actual_host))) { - pprintf("(really "); - if (!IsEmptyStr(actual_user)) pprintf("<%s> ", actual_user); - if (!IsEmptyStr(actual_room)) pprintf("in <%s> ", actual_room); - if (!IsEmptyStr(actual_host)) pprintf("from <%s> ", actual_host); - pprintf(")\n"); + scr_printf("(really "); + if (!IsEmptyStr(actual_user)) scr_printf("<%s> ", actual_user); + if (!IsEmptyStr(actual_room)) scr_printf("in <%s> ", actual_room); + if (!IsEmptyStr(actual_host)) scr_printf("from <%s> ", actual_host); + scr_printf(")\n"); } - pprintf("\n"); + scr_printf("\n"); } else { if (isidle == 0) { if (extract_int(buf, 0) == last_session) { - pprintf(" "); + scr_printf(" "); } else { color(BRIGHT_MAGENTA); - pprintf("%-3s", flags); + scr_printf("%-3s", flags); } last_session = extract_int(buf, 0); color(BRIGHT_CYAN); - pprintf("%-25s ", username); + scr_printf("%-25s ", username); color(BRIGHT_MAGENTA); roomname[20] = 0; - pprintf("%-20s", roomname); + scr_printf("%-20s", roomname); if (screenwidth >= 80) { - pprintf(" "); + scr_printf(" "); if (idletime > rc_idle_threshold) { /* over 1000d, must be gone fishing */ if (idlehours > 23999) { - pprintf("fish"); + scr_printf("fish"); /* over 10 days */ } else if (idlehours > 239) { - pprintf("%3ldd", idlehours / 24); + scr_printf("%3ldd", idlehours / 24); /* over 10 hours */ } else if (idlehours > 9) { - pprintf("%1ldd%02ld", + scr_printf("%1ldd%02ld", idlehours / 24, idlehours % 24); /* less than 10 hours */ } else { - pprintf("%1ld:%02ld", idlehours, idlemins); + scr_printf("%1ld:%02ld", idlehours, idlemins); } } else { - pprintf(" "); + scr_printf(" "); } - pprintf(" "); + scr_printf(" "); color(BRIGHT_CYAN); fromhost[24] = '\0'; - pprintf("%-24s", fromhost); + scr_printf("%-24s", fromhost); } - pprintf("\n"); + scr_printf("\n"); color(DIM_WHITE); } } @@ -1407,8 +1424,7 @@ int shift(int argc, char **argv, int start, int count) { } static void statusHook(char *s) { - sln_printf(s); - sln_flush(); + scr_printf(s); } /* @@ -1423,7 +1439,6 @@ int main(int argc, char **argv) char *telnet_client_host = NULL; char *sptr, *sptr2; /* USed to extract the nonce */ char hexstring[MD5_HEXSTRING_SIZE]; - int stored_password = 0; char password[SIZ]; struct ctdlipcmisc chek; struct ctdluser *myself = NULL; @@ -1459,16 +1474,15 @@ int main(int argc, char **argv) eCrash_Init(¶ms); #endif - setIPCDeathHook(screen_delete); - setIPCErrorPrintf(err_printf); + setIPCErrorPrintf(scr_printf); setCryptoStatusHook(statusHook); /* Permissions sanity check - don't run citadel setuid/setgid */ if (getuid() != geteuid()) { - err_printf("Please do not run citadel setuid!\n"); + scr_printf("Please do not run citadel setuid!\n"); logoff(NULL, 3); } else if (getgid() != getegid()) { - err_printf("Please do not run citadel setgid!\n"); + scr_printf("Please do not run citadel setgid!\n"); logoff(NULL, 3); } @@ -1486,9 +1500,6 @@ int main(int argc, char **argv) #ifdef HAVE_OPENSSL arg_encrypt = RC_DEFAULT; #endif -#if defined(HAVE_CURSES_H) && !defined(DISABLE_CURSES) - arg_screen = RC_DEFAULT; -#endif /* * Handle command line options as if we were called like /bin/login @@ -1514,18 +1525,6 @@ int main(int argc, char **argv) return 1; #endif } - if (!strcmp(argv[a], "-s")) { -#if defined(HAVE_CURSES_H) && !defined(DISABLE_CURSES) - arg_screen = RC_NO; -#endif - argc = shift(argc, argv, a, 1); - } - if (!strcmp(argv[a], "-S")) { -#if defined(HAVE_CURSES_H) && !defined(DISABLE_CURSES) - arg_screen = RC_YES; -#endif - argc = shift(argc, argv, a, 1); - } if (!strcmp(argv[a], "-p")) { struct stat st; @@ -1568,22 +1567,19 @@ int main(int argc, char **argv) newprompt("Connect to (return for local server): ", hostbuf, 64); #endif - sln_printf("Attaching to server... \r"); - sln_flush(); + scr_printf("Attaching to server...\n"); ipc = CtdlIPC_new(argc, argv, hostbuf, portbuf); if (!ipc) { - screen_delete(); error_printf("Can't connect: %s\n", strerror(errno)); logoff(NULL, 3); } + CtdlIPC_SetNetworkStatusCallback(ipc, scr_wait_indicator); + if (!(ipc->isLocal)) { - sln_printf("Connected to %s [%s].\n", ipc->ip_hostname, ipc->ip_address); + scr_printf("Connected to %s [%s].\n", ipc->ip_hostname, ipc->ip_address); } -#if defined(HAVE_CURSES_H) && !defined(DISABLE_CURSES) - CtdlIPC_SetNetworkStatusCallback(ipc, wait_indicator); -#endif ipc_for_signal_handlers = ipc; /* KLUDGE cover your eyes */ CtdlIPC_chat_recv(ipc, aaa); @@ -1628,10 +1624,6 @@ int main(int argc, char **argv) get_serv_info(ipc, telnet_client_host); scr_printf("%-24s\n%s\n%s\n", ipc->ServInfo.software, ipc->ServInfo.humannode, ipc->ServInfo.site_location); - scr_flush(); - - status_line(ipc->ServInfo.humannode, ipc->ServInfo.site_location, NULL, - secure, -1); screenwidth = 80; /* default screen dimensions */ screenheight = 24; @@ -1656,7 +1648,6 @@ int main(int argc, char **argv) if (r / 100 == 2) { load_user_info(aaa); - stored_password = 1; goto PWOK; } else { set_stored_password(hostbuf, portbuf, "", ""); @@ -1685,6 +1676,12 @@ int main(int argc, char **argv) mcmd = 29; goto TERMN8; } + + /* FIXME this is a stupid way to do guest mode but it's a reasonable test harness FIXME */ + if ( (ipc->ServInfo.guest_logins) && (!strcasecmp(fullname, "guest")) ) { + goto PWOK; + } + /* sign on to the server */ r = CtdlIPCTryLogin(ipc, fullname, aaa); if (r / 100 != 3) @@ -1694,7 +1691,7 @@ int main(int argc, char **argv) if (!IsEmptyStr(rc_password)) { strcpy(password, rc_password); } else { - newprompt("\rPlease enter your password: ", password, -19); + newprompt("\rPlease enter your password: ", password, -(SIZ-1)); } if (*nonce) { @@ -1779,6 +1776,10 @@ NEWUSR: if (IsEmptyStr(rc_password)) { 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); + } } if ((axlevel >= AxAideU) && (chek.needvalid > 0)) { @@ -1807,17 +1808,11 @@ NEWUSR: if (IsEmptyStr(rc_password)) { screenwidth = 80; screenheight = 24; r = CtdlIPCGetConfig(ipc, &myself, aaa); - if (r == 2) { - screenwidth = myself->USscreenwidth; - screenheight = myself->USscreenheight; - } if (getenv("TERM") != NULL) if (!strcmp(getenv("TERM"), "xterm")) { have_xterm = 1; } -#ifdef TIOCGWINSZ check_screen_dims(); -#endif set_floor_mode(ipc); @@ -2120,21 +2115,6 @@ NEWUSR: if (IsEmptyStr(rc_password)) { chatmode(ipc); break; - case 2: - if (ipc->isLocal) { - screen_reset(); - stty_ctdl(SB_RESTORE); - snprintf(aaa, sizeof aaa, "USERNAME=\042%s\042; export USERNAME;" - "exec ./subsystem %ld %d %d", fullname, - usernum, screenwidth, axlevel); - ka_system(aaa); - stty_ctdl(SB_NO_INTR); - screen_set(); - } else { - scr_printf("*** Can't run doors when server is not local.\n"); - } - break; - case 17: who_is_online(ipc, 0); break; @@ -2354,11 +2334,10 @@ TERMN8: scr_printf("%s logged out.", fullname); remove_march(marchptr->march_name, 0); } if (mcmd == 30) { - sln_printf("\n\nType 'off' to disconnect, or next user...\n"); + scr_printf("\n\nType 'off' to disconnect, or next user...\n"); } CtdlIPCLogout(ipc); if ((mcmd == 29) || (mcmd == 15)) { - screen_delete(); stty_ctdl(SB_RESTORE); formout(ipc, "goodbye"); logoff(ipc, 0);