* Began (but did not finish) applying GPL3+ declarations to each source file. This...
[citadel.git] / citadel / citserver.c
index abfb31db24c5c67ebdb2ea0296c38c0cdd34145f..b6970bf0a1b5239cdfcd518c02615225ccb37110 100644 (file)
@@ -3,6 +3,21 @@
  *
  * Main source module for the Citadel server
  *
+ * 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"
@@ -58,6 +73,7 @@
 #include "policy.h"
 #include "control.h"
 #include "euidindex.h"
+#include "svn_revision.h"
 
 #ifndef HAVE_SNPRINTF
 #include "snprintf.h"
@@ -88,9 +104,9 @@ void cit_backtrace(void)
        strings = backtrace_symbols(stack_frames, size);
        for (i = 0; i < size; i++) {
                if (strings != NULL)
-                       lprintf(1, "%s\n", strings[i]);
+                       CtdlLogPrintf(1, "%s\n", strings[i]);
                else
-                       lprintf(1, "%p\n", stack_frames[i]);
+                       CtdlLogPrintf(1, "%p\n", stack_frames[i]);
        }
        free(strings);
 #endif
@@ -111,9 +127,9 @@ void cit_panic_backtrace(int SigNum)
        strings = backtrace_symbols(stack_frames, size);
        for (i = 0; i < size; i++) {
                if (strings != NULL)
-                       lprintf(1, "%s\n", strings[i]);
+                       CtdlLogPrintf(1, "%s\n", strings[i]);
                else
-                       lprintf(1, "%p\n", stack_frames[i]);
+                       CtdlLogPrintf(1, "%p\n", stack_frames[i]);
        }
        free(strings);
 #endif
@@ -129,10 +145,10 @@ void master_startup(void) {
        FILE *urandom;
        struct ctdlroom qrbuf;
        
-       lprintf(CTDL_DEBUG, "master_startup() started\n");
+       CtdlLogPrintf(CTDL_DEBUG, "master_startup() started\n");
        time(&server_startup_time);
 
-       lprintf(CTDL_INFO, "Opening databases\n");
+       CtdlLogPrintf(CTDL_INFO, "Opening databases\n");
        open_databases();
 
        ctdl_thread_internal_init_tsd();
@@ -141,7 +157,7 @@ void master_startup(void) {
        
        check_ref_counts();
 
-       lprintf(CTDL_INFO, "Creating base rooms (if necessary)\n");
+       CtdlLogPrintf(CTDL_INFO, "Creating base rooms (if necessary)\n");
        create_room(config.c_baseroom,  0, "", 0, 1, 0, VIEW_BBS);
        create_room(AIDEROOM,           3, "", 0, 1, 0, VIEW_BBS);
        create_room(SYSCONFIGROOM,      3, "", 0, 1, 0, VIEW_BBS);
@@ -159,7 +175,7 @@ void master_startup(void) {
                 lputroom(&qrbuf);
         }
 
-       lprintf(CTDL_INFO, "Seeding the pseudo-random number generator...\n");
+       CtdlLogPrintf(CTDL_INFO, "Seeding the pseudo-random number generator...\n");
        urandom = fopen("/dev/urandom", "r");
        if (urandom != NULL) {
                fread(&seed, sizeof seed, 1, urandom);
@@ -169,14 +185,15 @@ void master_startup(void) {
                gettimeofday(&tv, NULL);
                seed = tv.tv_usec;
        }
+       srand(seed);
        srandom(seed);
 
-       lprintf(CTDL_INFO, "Initializing ipgm secret\n");
+       CtdlLogPrintf(CTDL_INFO, "Initializing ipgm secret\n");
        get_config();
        config.c_ipgm_secret = rand();
        put_config();
 
-       lprintf(CTDL_DEBUG, "master_startup() finished\n");
+       CtdlLogPrintf(CTDL_DEBUG, "master_startup() finished\n");
 }
 
 
@@ -202,7 +219,7 @@ void master_cleanup(int exitcode) {
        sysdep_master_cleanup();
        
        /* Close databases */
-       lprintf(CTDL_INFO, "Closing databases\n");
+       CtdlLogPrintf(CTDL_INFO, "Closing databases\n");
        close_databases();
 
 #ifdef DEBUG_MEMORY_LEAKS
@@ -211,7 +228,7 @@ void master_cleanup(int exitcode) {
 
        /* If the operator requested a halt but not an exit, halt here. */
        if (shutdown_and_halt) {
-               lprintf(CTDL_NOTICE, "citserver: Halting server without exiting.\n");
+               CtdlLogPrintf(CTDL_NOTICE, "citserver: Halting server without exiting.\n");
                fflush(stdout); fflush(stderr);
                while(1) {
                        sleep(32767);
@@ -221,11 +238,13 @@ void master_cleanup(int exitcode) {
        release_control();
 
        /* Now go away. */
-       lprintf(CTDL_NOTICE, "citserver: Exiting with status %d\n", exitcode);
+       CtdlLogPrintf(CTDL_NOTICE, "citserver: Exiting with status %d\n", exitcode);
        fflush(stdout); fflush(stderr);
        
        if (restart_server != 0)
                exit(1);
+       if ((running_as_daemon != 0) && (exitcode == 0))
+               exitcode = CTDLEXIT_SHUTDOWN;
        exit(exitcode);
 }
 
@@ -237,31 +256,34 @@ void master_cleanup(int exitcode) {
 void RemoveContext (struct CitContext *con)
 {
        if (con==NULL) {
-               lprintf(CTDL_ERR,
+               CtdlLogPrintf(CTDL_ERR,
                        "WARNING: RemoveContext() called with NULL!\n");
                return;
        }
-       lprintf(CTDL_DEBUG, "RemoveContext() session %d\n", con->cs_pid);
+       CtdlLogPrintf(CTDL_DEBUG, "RemoveContext() session %d\n", con->cs_pid);
 
        /* Run any cleanup routines registered by loadable modules.
         * Note: We have to "become_session()" because the cleanup functions
         *       might make references to "CC" assuming it's the right one.
         */
        become_session(con);
+       logout();
        PerformSessionHooks(EVT_STOP);
        become_session(NULL);
 
-       /* Now handle all of the administrivia. */
-       lprintf(CTDL_DEBUG, "Calling logout(%d)\n", con->cs_pid);
-       logout(con);
-
-       lprintf(CTDL_NOTICE, "[%3d] Session ended.\n", con->cs_pid);
+       CtdlLogPrintf(CTDL_NOTICE, "[%3d] Session ended.\n", con->cs_pid);
 
        /* If the client is still connected, blow 'em away. */
-       lprintf(CTDL_DEBUG, "Closing socket %d\n", con->client_socket);
+       CtdlLogPrintf(CTDL_DEBUG, "Closing socket %d\n", con->client_socket);
        close(con->client_socket);
 
-       lprintf(CTDL_DEBUG, "Done with RemoveContext()\n");
+       /* If using AUTHMODE_LDAP, free the DN */
+       if (con->ldap_dn) {
+               free(con->ldap_dn);
+               con->ldap_dn = NULL;
+       }
+
+       CtdlLogPrintf(CTDL_DEBUG, "Done with RemoveContext()\n");
 }
 
 
@@ -271,7 +293,7 @@ void RemoveContext (struct CitContext *con)
 /*
  * cmd_info()  -  tell the client about this server
  */
-void cmd_info(void) {
+void cmd_info(char *cmdbuf) {
        cprintf("%d Server info:\n", LISTING_FOLLOWS);
        cprintf("%d\n", CC->cs_pid);
        cprintf("%s\n", config.c_nodename);
@@ -308,12 +330,16 @@ void cmd_info(void) {
        cprintf("%f\n", CtdlThreadWorkerAvg);
        cprintf("%d\n", CtdlThreadGetCount());
 
-       /* Does this server support Sieve mail filtering? */
-#ifdef HAVE_LIBSIEVE
-       cprintf("1\n");         /* yes */
-#else
-       cprintf("0\n");         /* no */
-#endif
+       cprintf("1\n");         /* yes, Sieve mail filtering is supported */
+       cprintf("%d\n", config.c_enable_fulltext);
+       cprintf("%s\n", svn_revision());
+
+       if (config.c_auth_mode == AUTHMODE_NATIVE) {
+               cprintf("1\n"); /* OpenID is enabled when using native auth */
+       }
+       else {
+               cprintf("0\n"); /* OpenID is disabled when using non-native auth */
+       }
        
        cprintf("000\n");
 }
@@ -332,7 +358,7 @@ char CtdlCheckExpress(void) {
        }
 }
 
-void cmd_time(void)
+void cmd_time(char *argbuf)
 {
    time_t tv;
    struct tm tmp;
@@ -384,14 +410,14 @@ int is_public_client(void)
         */
        if (stat(public_clients_file, &statbuf) != 0) {
                /* No public_clients file exists, so bail out */
-               lprintf(CTDL_WARNING, "Warning: '%s' does not exist\n", 
+               CtdlLogPrintf(CTDL_WARNING, "Warning: '%s' does not exist\n", 
                                public_clients_file);
                return(0);
        }
 
        if (statbuf.st_mtime > pc_timestamp) {
                begin_critical_section(S_PUBLIC_CLIENTS);
-               lprintf(CTDL_INFO, "Loading %s\n", public_clients_file);
+               CtdlLogPrintf(CTDL_INFO, "Loading %s\n", public_clients_file);
 
                public_clientspos = &public_clients[0];
                public_clientsend = public_clientspos + SIZ;
@@ -437,18 +463,18 @@ int is_public_client(void)
                end_critical_section(S_PUBLIC_CLIENTS);
        }
 
-       lprintf(CTDL_DEBUG, "Checking whether %s is a local or public client\n",
+       CtdlLogPrintf(CTDL_DEBUG, "Checking whether %s is a local or public client\n",
                CC->cs_addr);
        for (i=0; i<num_parms(public_clients); ++i) {
                extract_token(addrbuf, public_clients, i, '|', sizeof addrbuf);
                if (!strcasecmp(CC->cs_addr, addrbuf)) {
-                       lprintf(CTDL_DEBUG, "... yes it is.\n");
+                       CtdlLogPrintf(CTDL_DEBUG, "... yes it is.\n");
                        return(1);
                }
        }
 
        /* No hits.  This is not a public client. */
-       lprintf(CTDL_DEBUG, "... no it isn't.\n");
+       CtdlLogPrintf(CTDL_DEBUG, "... no it isn't.\n");
        return(0);
 }
 
@@ -492,7 +518,7 @@ void cmd_iden(char *argbuf)
        }
 
        if (do_lookup) {
-               lprintf(CTDL_DEBUG, "Looking up hostname '%s'\n", from_host);
+               CtdlLogPrintf(CTDL_DEBUG, "Looking up hostname '%s'\n", from_host);
                if ((addr.s_addr = inet_addr(from_host)) != -1) {
                        locate_host(CC->cs_host, sizeof CC->cs_host,
                                CC->cs_addr, sizeof CC->cs_addr,
@@ -504,7 +530,7 @@ void cmd_iden(char *argbuf)
                }
        }
 
-       lprintf(CTDL_NOTICE, "Client %d/%d/%01d.%02d (%s) from %s\n",
+       CtdlLogPrintf(CTDL_NOTICE, "Client %d/%d/%01d.%02d (%s) from %s\n",
                dev_code,
                cli_code,
                (rev_level / 100),
@@ -642,7 +668,7 @@ void cmd_emsg(char *mname)
        }
        cprintf("%d %s\n", SEND_LISTING, targ);
 
-       while (client_getln(buf, sizeof buf), strcmp(buf, "000")) {
+       while (client_getln(buf, sizeof buf) >=0 && strcmp(buf, "000")) {
                fprintf(mfp, "%s\n", buf);
        }
 
@@ -732,7 +758,7 @@ void cmd_term(char *cmdbuf)
                return;
        }
 
-       lprintf(CTDL_DEBUG, "Locating session to kill\n");
+       CtdlLogPrintf(CTDL_DEBUG, "Locating session to kill\n");
        begin_critical_section(S_SESSION_TABLE);
        for (ccptr = ContextList; ccptr != NULL; ccptr = ccptr->next) {
                if (session_num == ccptr->cs_pid) {
@@ -770,7 +796,7 @@ void cmd_term(char *cmdbuf)
 /* 
  * get the paginator prompt
  */
-void cmd_more(void) {
+void cmd_more(char *argbuf) {
        cprintf("%d %s\n", CIT_OK, config.c_moreprompt);
 }
 
@@ -811,19 +837,9 @@ void cmd_ipgm(char *argbuf)
                sleep(5);
                cprintf("%d Authentication failed.\n",
                        ERROR + PASSWORD_REQUIRED);
-               lprintf(CTDL_ERR, "Warning: ipgm authentication failed.\n");
+               CtdlLogPrintf(CTDL_ERR, "Warning: ipgm authentication failed.\n");
                CC->kill_me = 1;
        }
-
-       /* Now change the ipgm secret for the next round.
-        * (Disabled because it breaks concurrent scripts.  The fact that
-        * we no longer accept IPGM over the network should be sufficient
-        * to prevent brute-force attacks.  If you don't agree, uncomment
-        * this block.)
-       get_config();
-       config.c_ipgm_secret = rand();
-       put_config();
-       */
 }
 
 
@@ -841,18 +857,20 @@ void cmd_down(char *argbuf) {
                restart_server = extract_int(argbuf, 0);
                
                if (restart_server > 0)
-                       Reply = "%d Restarting server.  See you soon.\n";
+               {
+                       Reply = "%d citserver will now shut down and automatically restart.\n";
+               }
                if ((restart_server > 0) && !running_as_daemon)
                {
-                       lprintf(CTDL_ERR, "The user requested restart, but not running as deamon! Geronimooooooo!\n");
-                       Reply = "%d Warning, not running in deamon mode. maybe we will come up again, but don't lean on it.\n";
+                       CtdlLogPrintf(CTDL_ERR, "The user requested restart, but not running as daemon! Geronimooooooo!\n");
+                       Reply = "%d Warning: citserver is not running in daemon mode and is therefore unlikely to restart automatically.\n";
                        state = ERROR;
                }
                cprintf(Reply, state);
        }
        else
        {
-               cprintf(Reply, CIT_OK + SERVER_SHUTTING_DOWN);
+               cprintf(Reply, CIT_OK + SERVER_SHUTTING_DOWN); 
        }
        CtdlThreadStopAll();
 }
@@ -860,7 +878,7 @@ void cmd_down(char *argbuf) {
 /*
  * Halt the server without exiting the server process.
  */
-void cmd_halt(void) {
+void cmd_halt(char *argbuf) {
 
        if (CtdlAccessCheck(ac_aide)) return;
 
@@ -886,7 +904,7 @@ void cmd_scdn(char *argbuf)
                restart_server = 1;
                if (!running_as_daemon)
                {
-                       lprintf(CTDL_ERR, "The user requested restart, but not running as deamon! Geronimooooooo!\n");
+                       CtdlLogPrintf(CTDL_ERR, "The user requested restart, but not running as deamon! Geronimooooooo!\n");
                        Reply = "%d %d Warning, not running in deamon mode. maybe we will come up again, but don't lean on it.\n";
                        state = ERROR;
                }
@@ -963,6 +981,7 @@ void begin_session(struct CitContext *con)
        generate_nonce(con);
        safestrncpy(con->cs_host, config.c_fqdn, sizeof con->cs_host);
        safestrncpy(con->cs_addr, "", sizeof con->cs_addr);
+       con->cs_UDSclientUID = -1;
        con->cs_host[sizeof con->cs_host - 1] = 0;
        len = sizeof sin;
        if (!CC->is_local_socket) {
@@ -975,21 +994,49 @@ void begin_session(struct CitContext *con)
        }
        else {
                strcpy(con->cs_host, "");
+#ifdef HAVE_STRUCT_UCRED
+               {
+                       /* as http://www.wsinnovations.com/softeng/articles/uds.html told us... */
+                       struct ucred credentials;
+                       int ucred_length = sizeof(struct ucred);
+                       
+                       /*fill in the user data structure */
+                       if(getsockopt(con->client_socket, SOL_SOCKET, SO_PEERCRED, &credentials, &ucred_length)) {
+                               CtdlLogPrintf(CTDL_NOTICE, "could obtain credentials from unix domain socket");
+                               
+                       }
+                       else {          
+                               /* the process ID of the process on the other side of the socket */
+                               /* credentials.pid; */
+                               
+                               /* the effective UID of the process on the other side of the socket  */
+                               con->cs_UDSclientUID = credentials.uid;
+                               
+                               /* the effective primary GID of the process on the other side of the socket */
+                               /* credentials.gid; */
+                               
+                               /* To get supplemental groups, we will have to look them up in our account
+                                  database, after a reverse lookup on the UID to get the account name.
+                                  We can take this opportunity to check to see if this is a legit account.
+                               */
+                       }
+               }
+#endif
        }
        con->cs_flags = 0;
        con->upload_type = UPL_FILE;
        con->dl_is_net = 0;
 
        con->nologin = 0;
-       if ((config.c_maxsessions > 0)&&(num_sessions > config.c_maxsessions)) {
+       if (((config.c_maxsessions > 0)&&(num_sessions > config.c_maxsessions)) || CtdlWantSingleUser()) {
                con->nologin = 1;
        }
 
        if (!CC->is_local_socket) {
-               lprintf(CTDL_NOTICE, "Session started from %s [%s].\n", con->cs_host, con->cs_addr);
+               CtdlLogPrintf(CTDL_NOTICE, "Session started from %s [%s].\n", con->cs_host, con->cs_addr);
        }
        else {
-               lprintf(CTDL_NOTICE, "Session started via local socket.\n");
+               CtdlLogPrintf(CTDL_NOTICE, "Session started via local socket.\n");
        }
 
        /* Run any session startup routines registered by loadable modules */
@@ -1006,13 +1053,35 @@ void citproto_begin_session() {
                CC->kill_me = 1;
        }
        else {
-               cprintf("%d %s Citadel server ready.\n",
-                       CIT_OK, config.c_nodename);
+               cprintf("%d %s Citadel server ready.\n", CIT_OK, config.c_nodename);
+               CC->can_receive_im = 1;
        }
 }
 
 
 
+void cmd_noop(char *argbuf)
+{
+       cprintf("%d%cok\n", CIT_OK, CtdlCheckExpress() );
+}
+
+void cmd_qnop(char *argbuf)
+{
+       /* do nothing, this command returns no response */
+}
+
+void cmd_quit(char *argbuf)
+{
+       cprintf("%d Goodbye.\n", CIT_OK);
+       CC->kill_me = 1;
+}
+
+void cmd_lout(char *argbuf)
+{
+       if (CC->logged_in) 
+               logout();
+       cprintf("%d logged out.\n", CIT_OK);
+}
 
 /*
  * This loop recognizes all server commands.
@@ -1026,7 +1095,7 @@ void do_command_loop(void) {
        time(&CC->lastcmd);
        memset(cmdbuf, 0, sizeof cmdbuf); /* Clear it, just in case */
        if (client_getln(cmdbuf, sizeof cmdbuf) < 1) {
-               lprintf(CTDL_ERR, "Client disconnected: ending session.\n");
+               CtdlLogPrintf(CTDL_ERR, "Client disconnected: ending session.\n");
                CC->kill_me = 1;
                CtdlThreadName(old_name);
                return;
@@ -1035,10 +1104,10 @@ void do_command_loop(void) {
        /* Log the server command, but don't show passwords... */
        if ( (strncasecmp(cmdbuf, "PASS", 4))
           && (strncasecmp(cmdbuf, "SETP", 4)) ) {
-               lprintf(CTDL_INFO, "%s\n", cmdbuf);
+               CtdlLogPrintf(CTDL_INFO, "%s\n", cmdbuf);
        }
        else {
-               lprintf(CTDL_INFO, "<password command sent>\n");
+               CtdlLogPrintf(CTDL_INFO, "<password command sent>\n");
        }
 
        buffer_output();
@@ -1067,367 +1136,9 @@ void do_command_loop(void) {
           CC->cs_flags &= ~CS_POSTING;
        }
                   
-       if (!strncasecmp(cmdbuf, "NOOP", 4)) {
-               cprintf("%d%cok\n", CIT_OK, CtdlCheckExpress() );
-       }
-       
-       else if (!strncasecmp(cmdbuf, "XYZZY", 5)) {
-               cprintf("%d Nothing happens.\n", CIT_OK);
-       }
-       
-       else if (!strncasecmp(cmdbuf, "QNOP", 4)) {
-               /* do nothing, this command returns no response */
-       }
-
-       else if (!strncasecmp(cmdbuf,"QUIT",4)) {
-               cprintf("%d Goodbye.\n", CIT_OK);
-               CC->kill_me = 1;
-       }
-
-       else if (!strncasecmp(cmdbuf,"ASYN",4)) {
-               cmd_asyn(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"LOUT",4)) {
-               if (CC->logged_in) logout(CC);
-               cprintf("%d logged out.\n", CIT_OK);
-       }
-
-       else if (!strncasecmp(cmdbuf,"USER",4)) {
-               cmd_user(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"PASS",4)) {
-               cmd_pass(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"NEWU",4)) {
-               cmd_newu(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"CREU",4)) {
-               cmd_creu(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"SETP",4)) {
-               cmd_setp(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"LRMS",4)) {
-               cmd_lrms(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"LKRA",4)) {
-               cmd_lkra(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"LKRN",4)) {
-               cmd_lkrn(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"LKRO",4)) {
-               cmd_lkro(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"LZRM",4)) {
-               cmd_lzrm(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"LPRM",4)) {
-               cmd_lprm(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"GETU",4)) {
-               cmd_getu();
-       }
-
-       else if (!strncasecmp(cmdbuf,"SETU",4)) {
-               cmd_setu(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"GOTO",4)) {
-               cmd_goto(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"MSGS",4)) {
-               cmd_msgs(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"WHOK",4)) {
-               cmd_whok();
-       }
-
-       else if (!strncasecmp(cmdbuf,"RDIR",4)) {
-               cmd_rdir();
-       }
-
-       else if (!strncasecmp(cmdbuf,"EUID",4)) {
-               cmd_euid(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"MSG0",4)) {
-               cmd_msg0(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"MSG2",4)) {
-               cmd_msg2(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"MSG3",4)) {
-               cmd_msg3(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"MSG4",4)) {
-               cmd_msg4(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"MSGP",4)) {
-               cmd_msgp(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"OPNA",4)) {
-               cmd_opna(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"DLAT",4)) {
-               cmd_dlat(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"INFO",4)) {
-               cmd_info();
-       }
-
-       else if (!strncasecmp(cmdbuf,"SLRP",4)) {
-               cmd_slrp(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"INVT",4)) {
-               cmd_invt_kick(&cmdbuf[5],1);
-       }
-
-       else if (!strncasecmp(cmdbuf,"KICK",4)) {
-               cmd_invt_kick(&cmdbuf[5],0);
-       }
-
-       else if (!strncasecmp(cmdbuf,"GETR",4)) {
-               cmd_getr();
-       }
-
-       else if (!strncasecmp(cmdbuf,"SETR",4)) {
-               cmd_setr(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"GETA",4)) {
-               cmd_geta();
-       }
-
-       else if (!strncasecmp(cmdbuf,"SETA",4)) {
-               cmd_seta(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"ENT0",4)) {
-               cmd_ent0(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"RINF",4)) {
-               cmd_rinf();
-       }
-
-       else if (!strncasecmp(cmdbuf,"DELE",4)) {
-               cmd_dele(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"KILL",4)) {
-               cmd_kill(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"CRE8",4)) {
-               cmd_cre8(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"MOVE",4)) {
-               cmd_move(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"FORG",4)) {
-               cmd_forg();
-       }
-
-       else if (!strncasecmp(cmdbuf,"MESG",4)) {
-               cmd_mesg(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"EMSG",4)) {
-               cmd_emsg(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"GNUR",4)) {
-               cmd_gnur();
-       }
-
-       else if (!strncasecmp(cmdbuf,"VALI",4)) {
-               cmd_vali(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"EINF",4)) {
-               cmd_einf(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"LIST",4)) {
-               cmd_list(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"CHEK",4)) {
-               cmd_chek();
-       }
-
-       else if (!strncasecmp(cmdbuf,"DELF",4)) {
-               cmd_delf(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"MOVF",4)) {
-               cmd_movf(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"NETF",4)) {
-               cmd_netf(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"OPEN",4)) {
-               cmd_open(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"CLOS",4)) {
-               cmd_clos();
-       }
-
-       else if (!strncasecmp(cmdbuf,"UOPN",4)) {
-               cmd_uopn(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"UCLS",4)) {
-               cmd_ucls(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"READ",4)) {
-               cmd_read(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"WRIT",4)) {
-               cmd_writ(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"QUSR",4)) {
-               cmd_qusr(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"ECHO",4)) {
-               cmd_echo(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"OIMG",4)) {
-               cmd_oimg(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"MORE",4)) {
-               cmd_more();
-       }
-
-       else if (!strncasecmp(cmdbuf,"NDOP",4)) {
-               cmd_ndop(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"NUOP",4)) {
-               cmd_nuop(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"LFLR",4)) {
-               cmd_lflr();
-       }
-
-       else if (!strncasecmp(cmdbuf,"CFLR",4)) {
-               cmd_cflr(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"KFLR",4)) {
-               cmd_kflr(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"EFLR",4)) {
-               cmd_eflr(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"IDEN",4)) {
-               cmd_iden(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"IPGM",4)) {
-               cmd_ipgm(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"TERM",4)) {
-               cmd_term(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"DOWN",4)) {
-               cmd_down(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"HALT",4)) {
-               cmd_halt();
-       }
-
-       else if (!strncasecmp(cmdbuf,"SCDN",4)) {
-               cmd_scdn(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf, "UIMG", 4)) {
-               cmd_uimg(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf, "TIME", 4)) {
-               cmd_time();
-       }
-
-       else if (!strncasecmp(cmdbuf, "AGUP", 4)) {
-               cmd_agup(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf, "ASUP", 4)) {
-               cmd_asup(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf, "GPEX", 4)) {
-               cmd_gpex(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf, "SPEX", 4)) {
-               cmd_spex(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf, "CONF", 4)) {
-               cmd_conf(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf, "SEEN", 4)) {
-               cmd_seen(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf, "GTSN", 4)) {
-               cmd_gtsn(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf, "VIEW", 4)) {
-               cmd_view(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf, "ISME", 4)) {
-               cmd_isme(&cmdbuf[5]);
-       }
-
-       else if (!DLoader_Exec_Cmd(cmdbuf)) {
+       if (!DLoader_Exec_Cmd(cmdbuf)) {
                cprintf("%d Unrecognized or unsupported command.\n", ERROR + CMD_NOT_SUPPORTED);
-       }
+       }       
 
        unbuffer_output();
 
@@ -1443,3 +1154,36 @@ void do_command_loop(void) {
 void do_async_loop(void) {
        PerformSessionHooks(EVT_ASYNC);
 }
+
+
+
+
+
+
+
+/*****************************************************************************/
+/*                      MODULE INITIALIZATION STUFF                          */
+/*****************************************************************************/
+
+CTDL_MODULE_INIT(citserver)
+{
+       CtdlRegisterProtoHook(cmd_noop, "NOOP", "Autoconverted. TODO: document me.");
+       CtdlRegisterProtoHook(cmd_qnop, "QNOP", "Autoconverted. TODO: document me.");
+       CtdlRegisterProtoHook(cmd_quit, "QUIT", "Autoconverted. TODO: document me.");
+       CtdlRegisterProtoHook(cmd_lout, "LOUT", "Autoconverted. TODO: document me.");
+       CtdlRegisterProtoHook(cmd_asyn, "ASYN", "Autoconverted. TODO: document me.");
+       CtdlRegisterProtoHook(cmd_info, "INFO", "Autoconverted. TODO: document me.");
+       CtdlRegisterProtoHook(cmd_mesg, "MESG", "Autoconverted. TODO: document me.");
+       CtdlRegisterProtoHook(cmd_emsg, "EMSG", "Autoconverted. TODO: document me.");
+       CtdlRegisterProtoHook(cmd_echo, "ECHO", "Autoconverted. TODO: document me.");
+       CtdlRegisterProtoHook(cmd_more, "MORE", "Autoconverted. TODO: document me.");
+       CtdlRegisterProtoHook(cmd_iden, "IDEN", "Autoconverted. TODO: document me.");
+       CtdlRegisterProtoHook(cmd_ipgm, "IPGM", "Autoconverted. TODO: document me.");
+       CtdlRegisterProtoHook(cmd_term, "TERM", "Autoconverted. TODO: document me.");
+       CtdlRegisterProtoHook(cmd_down, "DOWN", "Autoconverted. TODO: document me.");
+       CtdlRegisterProtoHook(cmd_halt, "HALT", "Autoconverted. TODO: document me.");
+       CtdlRegisterProtoHook(cmd_scdn, "SCDN", "Autoconverted. TODO: document me.");
+       CtdlRegisterProtoHook(cmd_time, "TIME", "Autoconverted. TODO: document me.");
+        /* return our Subversion id for the Log */
+       return "$Id$";
+}