* Began (but did not finish) applying GPL3+ declarations to each source file. This...
[citadel.git] / citadel / citadel.c
index 4a71ccc0ee34aeb2289a369383891ed4a37724ff..7e5ef874a2351bf2233c80e1a4b657bdce81c01f 100644 (file)
@@ -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 <pwd.h>
 #include <stdarg.h>
 #include <errno.h>
-
+#include <libcitadel.h>
 #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(&params, 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() */
+