X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Fcitadel.c;h=7e5ef874a2351bf2233c80e1a4b657bdce81c01f;hb=4eb74b26380dfde31c86c685f0589e0c653aebf0;hp=4a71ccc0ee34aeb2289a369383891ed4a37724ff;hpb=1ef5a54193bd3da7cbeecc5e72eb078e218dbdac;p=citadel.git diff --git a/citadel/citadel.c b/citadel/citadel.c index 4a71ccc0e..7e5ef874a 100644 --- a/citadel/citadel.c +++ b/citadel/citadel.c @@ -2,6 +2,22 @@ * $Id$ * * Main source module for the client program. + * + * Copyright (c) 1987-2009 by the citadel.org team + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * 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. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include "sysdep.h" @@ -32,7 +48,7 @@ #include #include #include - +#include #include "citadel.h" #include "citadel_ipc.h" #include "axdefs.h" @@ -45,7 +61,6 @@ #include "client_chat.h" #include "client_passwords.h" #include "citadel_decls.h" -#include "tools.h" #include "sysdep.h" #ifndef HAVE_SNPRINTF #include "snprintf.h" @@ -63,7 +78,7 @@ int rordercmp(struct ctdlroomlisting *r1, struct ctdlroomlisting *r2); -struct march *march = NULL; +march *marchptr = NULL; /* globals associated with the client program */ char temp[PATH_MAX]; /* Name of general-purpose temp file */ @@ -114,13 +129,12 @@ int enable_syslog = 0; /* - * lprintf() ... Write logging information; + * CtdlLogPrintf() ... Write logging information; * simple here to have the same * symbols in the client. */ -enum LogLevel {CTDL_EMERG}; -void lprintf(enum LogLevel loglevel, const char *format, ...) { +void CtdlLogPrintf(enum LogLevel loglevel, const char *format, ...) { va_list arg_ptr; va_start(arg_ptr, format); @@ -240,8 +254,8 @@ void userlist(CtdlIPC *ipc, char *patn) return; } - pprintf(" User Name Num L LastCall Calls Posts\n"); - pprintf("------------------------- ----- - ---------- ----- -----\n"); + pprintf(" User Name Num L Last Visit Logins Messages\n"); + pprintf("------------------------- ----- - ---------- ------ --------\n"); if (listing != NULL) while (!IsEmptyStr(listing)) { extract_token(buf, listing, 0, '\n', sizeof buf); remove_token(listing, 0, '\n'); @@ -258,7 +272,7 @@ void userlist(CtdlIPC *ipc, char *patn) (tmbuf.tm_mon + 1), tmbuf.tm_mday, (tmbuf.tm_year + 1900)); - pprintf("%5ld %5ld\n", extract_long(buf, 4), extract_long(buf, 5)); + pprintf("%6ld %8ld\n", extract_long(buf, 4), extract_long(buf, 5)); } } @@ -292,18 +306,18 @@ void remove_march(char *roomname, int floornum) { struct march *mptr, *mptr2; - if (march == NULL) + if (marchptr == NULL) return; - if ((!strcasecmp(march->march_name, roomname)) - || ((!strcasecmp(roomname, "_FLOOR_")) && (march->march_floor == floornum))) { - mptr = march->next; - free(march); - march = mptr; + if ((!strcasecmp(marchptr->march_name, roomname)) + || ((!strcasecmp(roomname, "_FLOOR_")) && (marchptr->march_floor == floornum))) { + mptr = marchptr->next; + free(marchptr); + marchptr = mptr; return; } - mptr2 = march; - for (mptr = march; mptr != NULL; mptr = mptr->next) { + mptr2 = marchptr; + for (mptr = marchptr; mptr != NULL; mptr = mptr->next) { if ((!strcasecmp(mptr->march_name, roomname)) || ((!strcasecmp(roomname, "_FLOOR_")) @@ -370,6 +384,7 @@ void dotgoto(CtdlIPC *ipc, char *towhere, int display_name, int fromungoto) int ugpos = uglistsize; int r; /* IPC result code */ struct ctdlipcroom *room = NULL; + int rv = 0; /* store ungoto information */ if (fromungoto == 0) { @@ -504,7 +519,7 @@ void dotgoto(CtdlIPC *ipc, char *towhere, int display_name, int fromungoto) } color(DIM_WHITE); if (!IsEmptyStr(rc_gotmail_cmd)) { - system(rc_gotmail_cmd); + rv = system(rc_gotmail_cmd); } } status_line(ipc->ServInfo.humannode, ipc->ServInfo.site_location, @@ -527,9 +542,9 @@ void gotonext(CtdlIPC *ipc) /* 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 (march == NULL) { + if (marchptr == NULL) { r = CtdlIPCKnownRooms(ipc, SubscribedRoomsWithNewMessages, - AllFloors, &march, buf); + 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 @@ -539,10 +554,10 @@ void gotonext(CtdlIPC *ipc) mptr->march_order = 0; mptr->march_floor = 0; strcpy(mptr->march_name, "_BASEROOM_"); - if (march == NULL) { - march = mptr; + if (marchptr == NULL) { + marchptr = mptr; } else { - mptr2 = march; + mptr2 = marchptr; while (mptr2->next != NULL) mptr2 = mptr2->next; mptr2->next = mptr; @@ -553,8 +568,8 @@ void gotonext(CtdlIPC *ipc) */ remove_march(room_name, 0); } - if (march != NULL) { - strcpy(next_room, pop_march(curr_floor, march)); + if (marchptr != NULL) { + strcpy(next_room, pop_march(curr_floor, marchptr)); } else { strcpy(next_room, "_BASEROOM_"); } @@ -656,7 +671,7 @@ void gotofloor(CtdlIPC *ipc, char *towhere, int mode) scr_printf("No floor '%s'.\n", towhere); return; } - for (mptr = march; mptr != NULL; mptr = mptr->next) { + for (mptr = marchptr; mptr != NULL; mptr = mptr->next) { if ((mptr->march_floor) == tofloor) { gf_toroom(ipc, mptr->march_name, mode); return; @@ -770,16 +785,6 @@ void gotoroomstep(CtdlIPC *ipc, int direction, int mode) char rmname[ROOMNAMELEN]; int rmslot = 0; int rmtotal; - struct ctdlroom *attr = NULL; - - /* Fetch the existing room config */ - r = CtdlIPCGetRoomAttributes(ipc, &attr, buf); - if (r / 100 != 2) { - scr_printf("%s\n", buf); - return; - } - strcpy (room_name , attr->QRname); - free(attr); /* Ask the server for a room list */ r = CtdlIPCKnownRooms(ipc, SubscribedRooms, (-1), &listing, buf); @@ -1021,11 +1026,12 @@ void system_info(CtdlIPC *ipc) scr_printf("You are connected to %s (%s) @%s\n", ipc->ServInfo.nodename, ipc->ServInfo.humannode, ipc->ServInfo.fqdn); scr_printf("running %s with text client v%.2f,\n", ipc->ServInfo.software, (float)REV_LEVEL/100); + scr_printf("server build %s,\n", ipc->ServInfo.svn_revision, (float)REV_LEVEL/100); scr_printf("and located in %s.\n", ipc->ServInfo.site_location); scr_printf("Connected users %d / Active users %d / Highest message #%ld\n", mrtg_users, mrtg_active_users, mrtg_himessage); scr_printf("Server uptime: %s\n", mrtg_server_uptime); scr_printf("Your system administrator is %s.\n", ipc->ServInfo.sysadm); - scr_printf("Copyright (C)1987-2007 by the Citadel development team\n"); + scr_printf("Copyright (C)1987-2009 by the Citadel development team\n"); } /* @@ -1146,6 +1152,14 @@ 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. + */ + if ((CtdlIPCSpecifyPreferredFormats(ipc, buf, "dont_decode") / 100 ) != 2) { + scr_printf("ERROR: Extremely old server; MSG4 framework not supported.\n"); + logoff(ipc, 0); + } + /* * Tell the server what our preferred content formats are. * @@ -1401,6 +1415,7 @@ int main(int argc, char **argv) struct ctdluser *myself = NULL; CtdlIPC* ipc; /* Our server connection */ int r; /* IPC result code */ + int rv = 0; /* fetch but ignore syscall return value to suppress warnings */ int relh=0; int home=0; @@ -1411,8 +1426,7 @@ int main(int argc, char **argv) eCrashParameters params; // eCrashSymbolTable symbol_table; #endif - CtdlInitBase64Table(); - calc_dirs_n_files(relh, home, relhome, ctdldir); + calc_dirs_n_files(relh, home, relhome, ctdldir, 0); #ifdef HAVE_BACKTRACE bzero(¶ms, sizeof(params)); @@ -1738,7 +1752,7 @@ NEWUSR: if (IsEmptyStr(rc_password)) { scr_printf("*** You have %d new private messages in Mail>\n", b); color(DIM_WHITE); if (!IsEmptyStr(rc_gotmail_cmd)) { - system(rc_gotmail_cmd); + rv = system(rc_gotmail_cmd); } } if ((axlevel >= 6) && (chek.needvalid > 0)) { @@ -2208,10 +2222,6 @@ NEWUSR: if (IsEmptyStr(rc_password)) { deletefile(ipc); break; - case 53: - netsendfile(ipc); - break; - case 54: movefile(ipc); break; @@ -2292,6 +2302,10 @@ NEWUSR: if (IsEmptyStr(rc_password)) { do_pop3client_configuration(ipc); break; + case 128: /* Configure XML/RSS feed retrieval */ + do_rssclient_configuration(ipc); + break; + default: /* allow some math on the command */ /* commands 100... to 100+MAX_EDITORS-1 will call the appropriate editor... in other @@ -2310,8 +2324,8 @@ TERMN8: scr_printf("%s logged out.", fullname); termn8 = 0; color(ORIGINAL_PAIR); scr_printf("\n"); - while (march != NULL) { - remove_march(march->march_name, 0); + while (marchptr != NULL) { + remove_march(marchptr->march_name, 0); } if (mcmd == 30) { sln_printf("\n\nType 'off' to disconnect, or next user...\n"); @@ -2331,3 +2345,4 @@ TERMN8: scr_printf("%s logged out.", fullname); goto GSTA; } /* end main() */ +