poking around in the ctdlsh source because citadel proper is in deep freeze :)
[citadel] / ctdlsh / src / main.c
index 2658b73..e37a3d1 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * (c) 2009 by Art Cancro and citadel.org
+ * (c) 2009-2011 by Art Cancro and citadel.org
  * This program is released under the terms of the GNU General Public License v3.
  */
 
 #include <readline/readline.h>
 #include "ctdlsh.h"
 
-#define CTDLDIR        "/root/ctdl/trunk/citadel"
+#define CTDLDIR        "/appl/citadel"
 
 
-int discover_ipgm_secret(void) {
+
+int com_quit(char *cmdbuf) {
+       abort();
+}
+
+
+
+
+/*
+ * Commands understood by ctdlsh
+ */
+typedef struct {
+       char *name;
+       rl_icpfunc_t *func;
+       char *doc;
+} COMMAND;
+
+COMMAND commands[] = {
+       {       "quit",         com_quit,       "Quit using ctdlsh"     },
+       {       "exit",         com_quit,       "Quit using ctdlsh"     },
+       {       NULL,           NULL,           NULL                    }
+};
+
+
+int discover_ipgm_secret(char *dirname) {
        int fd;
        struct partial_config ccc;
+       char configfile[1024];
 
-       fd = open(CTDLDIR "/citadel.config", O_RDONLY);
+       sprintf(configfile, "%s/citadel.config", dirname);
+       fd = open(configfile, O_RDONLY);
        if (fd < 0) {
-               fprintf(stderr, "citadel.config: %s\n", strerror(errno));
+               fprintf(stderr, "%s: %s\n", configfile, strerror(errno));
                return(-1);
        }
 
        if (read(fd, &ccc, sizeof(struct partial_config)) != sizeof(struct partial_config)) {
-               fprintf(stderr, "citadel.config: %s\n", strerror(errno));
+               fprintf(stderr, "%s: %s\n", configfile, strerror(errno));
                return(-1);
        }
        if (close(fd) != 0) {
-               fprintf(stderr, "citadel.config: %s\n", strerror(errno));
+               fprintf(stderr, "%s: %s\n", configfile, strerror(errno));
                return(-1);
        }
        return(ccc.c_ipgm_secret);
@@ -70,7 +96,8 @@ void do_main_loop(int server_socket) {
                        printf("%s\n", server_reply);
 
                        if ((server_reply[0] == '4') || (server_reply[0] == '8')) {
-                               // FIXME
+                               /* we might consider putting something here */
+                               sock_puts(server_socket, "000");
                        }
 
                        if ((server_reply[0] == '1') || (server_reply[0] == '8')) {
@@ -90,22 +117,41 @@ int main(int argc, char **argv)
        int server_socket = 0;
        char buf[1024];
        int ipgm_secret = (-1);
+       int c;
+       char *ctdldir = CTDLDIR;
 
        printf("\nCitadel administration shell v" PACKAGE_VERSION "\n");
-       printf("(c) 2009 citadel.org GPLv3\n");
+       printf("(c) 2009-2011 citadel.org GPLv3\n");
+
+       opterr = 0;
+       while ((c = getopt (argc, argv, "h:")) != -1) {
+               switch(c) {
+               case 'h':
+                       ctdldir = optarg;
+                       break;
+               case '?':
+                       if (optopt == 'h') {
+                               fprintf(stderr, "Option -%c requires an argument\n", optopt);
+                       }
+                       else {
+                               fprintf(stderr, "Unknown option '-%c'\n", optopt);
+                               fprintf(stderr, "usage: %s [-h citadel_dir]\n", argv[0]);
+                       }
+                       exit(1);
+               }
+       }
 
-       ipgm_secret = discover_ipgm_secret();
+       ipgm_secret = discover_ipgm_secret(ctdldir);
        if (ipgm_secret < 0) {
                exit(1);
        }
 
-       printf("Attaching to server...\r");
-       fflush(stdout);
-       server_socket = uds_connectsock(CTDLDIR "/citadel.socket");
+       printf("Trying %s...\n", ctdldir);
+       sprintf(buf, "%s/citadel.socket", ctdldir);
+       server_socket = uds_connectsock(buf);
        if (server_socket < 0) {
                exit(1);
        }
-       printf("                      \r");
 
        sock_getln(server_socket, buf, sizeof buf);
        printf("%s\n", buf);