]> code.citadel.org Git - citadel.git/blobdiff - citadel/sendcommand.c
* dump message headers on artv dump
[citadel.git] / citadel / sendcommand.c
index cc47df4af80cff048d7fc0dfd761412858ee9898..9b331cc2456d44df78ab9ad3932d367a80608c19 100644 (file)
@@ -77,12 +77,40 @@ void nq_cleanup(int e)
        exit(e);
 }
 
+/*
+ * send binary to server
+ */
+void serv_write(CtdlIPC *ipc, const char *buf, unsigned int nbytes)
+{
+       unsigned int bytes_written = 0;
+       int retval;
+/*
+#if defined(HAVE_OPENSSL)
+       if (ipc->ssl) {
+               serv_write_ssl(ipc, buf, nbytes);
+               return;
+       }
+#endif
+*/
+       while (bytes_written < nbytes) {
+               retval = write(ipc->sock, &buf[bytes_written],
+                              nbytes - bytes_written);
+               if (retval < 1) {
+                       connection_died(ipc, 0);
+                       return;
+               }
+               bytes_written += retval;
+       }
+}
+
+
 void cleanup(int e)
 {
        static int nested = 0;
 
        alarm(30);
        signal(SIGALRM, nq_cleanup);
+       serv_write(ipc, "\n", 1);
        if (nested++ < 1)
                CtdlIPCQuit(ipc);
        nq_cleanup(e);
@@ -150,6 +178,8 @@ int main(int argc, char **argv)
        struct timeval tv;
        int ret, err;
 
+       CtdlInitBase64Table();
+
        strcpy(ctdl_home_directory, DEFAULT_PORT);
 
        strcpy(cmd, "");
@@ -167,7 +197,7 @@ int main(int argc, char **argv)
                        home_specified = 1;
                        home=1;
                } else {
-                       if (strlen(cmd) > 0)
+                       if (!IsEmptyStr(cmd))
                                strcat(cmd, " ");
                        strcat(cmd, argv[a]);
                }
@@ -186,6 +216,10 @@ int main(int argc, char **argv)
                        (int) getpid(),
                        ctdl_home_directory);
        fflush(stderr);
+
+       alarm(5);
+       signal(SIGALRM, nq_cleanup); /* Set up a watchdog type timer in case we hang */
+       
        np_attach_to_server(UDS, ctdl_home_directory);
        fflush(stderr);
        setIPCDeathHook(sendcommand_die);
@@ -201,15 +235,16 @@ int main(int argc, char **argv)
        if (buf[0] == '1') {
                while (CtdlIPC_chat_recv(ipc, buf), strcmp(buf, "000")) {
                        printf("%s\n", buf);
+                       alarm(5); /* Kick the watchdog timer */
                }
        } else if (buf[0] == '4') {
                do {
                        if (fgets(buf, sizeof buf, stdin) == NULL)
                                strcpy(buf, "000");
-                       if (strlen(buf) > 0)
+                       if (!IsEmptyStr(buf))
                                if (buf[strlen(buf) - 1] == '\n')
                                        buf[strlen(buf) - 1] = 0;
-                       if (strlen(buf) > 0)
+                       if (!IsEmptyStr(buf))
                                if (buf[strlen(buf) - 1] == '\r')
                                        buf[strlen(buf) - 1] = 0;
                        if (strcmp(buf, "000"))
@@ -236,14 +271,20 @@ int main(int argc, char **argv)
                                n = read(ipc->sock, rbuf, SIZ);
                                if (n>0) {
                                        rbuf[n]='\0';
-                                       printf (rbuf);
+                                       fprintf (stderr, rbuf);
+                                       fflush (stdout);
                                }
                        }
+                       alarm(5); /* Kick the watchdog timer */
                } while (strcmp(buf, "000"));
                CtdlIPC_chat_send(ipc, "\n");
                CtdlIPC_chat_send(ipc, "000");
        }
+       alarm(0);       /* Shutdown the watchdog timer */
        fprintf(stderr, "sendcommand: processing ended.\n");
-       cleanup(0);
+       if (strcasecmp(cmd, "DOWN"))
+               cleanup(0);
+       else    /* If we downed the server we can't to do CtdlIPCQuit in cleanup()*/
+               nq_cleanup(0);
        return 0;
 }