]> code.citadel.org Git - citadel.git/blobdiff - citadel/citadel_ipc.c
* Replaced all "Citadel/UX" references with "Citadel"
[citadel.git] / citadel / citadel_ipc.c
index 87dbc631cd16a3de7b35d050ec13b50bf3c57345..9a07aa2cdb403c95229bd7c74667f2adc6c0a81e 100644 (file)
@@ -63,7 +63,7 @@ void CtdlIPC_SetNetworkStatusCallback(CtdlIPC *ipc, void (*hook)(int state)) {
 }
 
 
-char express_msgs = 0;
+char instant_msgs = 0;
 
 
 static void serv_read(CtdlIPC *ipc, char *buf, unsigned int bytes);
@@ -77,6 +77,8 @@ static void endtls(SSL *ssl);
 static unsigned long id_callback(void);
 #endif /* THREADED_CLIENT */
 #endif /* HAVE_OPENSSL */
+static void CtdlIPC_getline(CtdlIPC* ipc, char *buf);
+static void CtdlIPC_putline(CtdlIPC *ipc, const char *buf);
 
 
 /*
@@ -118,13 +120,23 @@ int CtdlIPCEcho(CtdlIPC *ipc, const char *arg, char *cret)
  */
 int CtdlIPCQuit(CtdlIPC *ipc)
 {
-       register int ret;
+       register int ret = 221;         /* Default to successful quit */
        char aaa[128];
 
        CtdlIPC_lock(ipc);
-       CtdlIPC_putline(ipc, "QUIT");
-       CtdlIPC_getline(ipc, aaa);
-       ret = atoi(aaa);
+       if (ipc->sock > -1) {
+               CtdlIPC_putline(ipc, "QUIT");
+               CtdlIPC_getline(ipc, aaa);
+               ret = atoi(aaa);
+       }
+#ifdef HAVE_OPENSSL
+       if (ipc->ssl)
+               SSL_shutdown(ipc->ssl);
+       ipc->ssl = NULL;
+#endif
+       if (ipc->sock)
+               shutdown(ipc->sock, 2); /* Close connection; we're dead */
+       ipc->sock = -1;
        CtdlIPC_unlock(ipc);
        return ret;
 }
@@ -764,12 +776,13 @@ int CtdlIPCSetRoomAttributes(CtdlIPC *ipc, int forget, struct ctdlroom *qret, ch
        if (!qret) return -2;
 
        aaa = (char *)malloc(strlen(qret->QRname) + strlen(qret->QRpasswd) +
-                       strlen(qret->QRdirname) + 52);
+                       strlen(qret->QRdirname) + 64);
        if (!aaa) return -1;
 
-       sprintf(aaa, "SETR %s|%s|%s|%d|%d|%d|%d",
+       sprintf(aaa, "SETR %s|%s|%s|%d|%d|%d|%d|%d|%d",
                        qret->QRname, qret->QRpasswd, qret->QRdirname,
-                       qret->QRflags, forget, qret->QRfloor, qret->QRorder);
+                       qret->QRflags, forget, qret->QRfloor, qret->QRorder,
+                       qret->QRdefaultview, qret->QRflags2);
        ret = CtdlIPCGenericCommand(ipc, aaa, NULL, 0, NULL, NULL, cret);
        free(aaa);
        return ret;
@@ -1412,7 +1425,7 @@ int CtdlIPCIdentifySoftware(CtdlIPC *ipc, int developerid, int clientid,
                developerid = 8;
                clientid = 0;
                revision = REV_LEVEL - 600;
-               software_name = "Citadel/UX (libcitadel)";
+               software_name = "Citadel (libcitadel)";
        }
        if (!hostname) return -2;
 
@@ -1828,6 +1841,31 @@ int CtdlIPCSetSystemConfigByType(CtdlIPC *ipc, const char *mimetype,
 }
 
 
+/* GNET */
+int CtdlIPCGetRoomNetworkConfig(CtdlIPC *ipc, char **listing, char *cret)
+{
+       size_t bytes;
+
+       if (!cret) return -2;
+       if (!listing) return -2;
+       if (*listing) return -2;
+
+       return CtdlIPCGenericCommand(ipc, "GNET", NULL, 0,
+                       listing, &bytes, cret);
+}
+
+
+/* SNET */
+int CtdlIPCSetRoomNetworkConfig(CtdlIPC *ipc, const char *listing, char *cret)
+{
+       if (!cret) return -2;
+       if (!listing) return -2;
+
+       return CtdlIPCGenericCommand(ipc, "SNET", listing, strlen(listing),
+                       NULL, NULL, cret);
+}
+
+
 /* REQT */
 int CtdlIPCRequestClientLogout(CtdlIPC *ipc, int session, char *cret)
 {
@@ -1873,7 +1911,7 @@ int CtdlIPCStartEncryption(CtdlIPC *ipc, char *cret)
        }
        /* Pointless flag waving */
 #if SSLEAY_VERSION_NUMBER >= 0x0922
-       SSL_set_session_id_context(temp_ssl, "Citadel/UX SID", 14);
+       SSL_set_session_id_context(temp_ssl, "Citadel SID", 14);
 #endif
 
        if (!access("/var/run/egd-pool", F_OK))
@@ -2350,7 +2388,7 @@ int CtdlIPCGenericCommand(CtdlIPC *ipc,
        while (1) {
                CtdlIPC_getline(ipc, proto_response);
                if (proto_response[3] == '*')
-                       express_msgs = 1;
+                       instant_msgs = 1;
                ret = atoi(proto_response);
                strcpy(proto_response, &proto_response[4]);
                switch (ret / 100) {
@@ -2765,7 +2803,7 @@ static unsigned long id_callback(void) {
 /*
  * input string from socket - implemented in terms of serv_read()
  */
-void CtdlIPC_getline(CtdlIPC* ipc, char *buf)
+static void CtdlIPC_getline(CtdlIPC* ipc, char *buf)
 {
        int i;
 
@@ -2786,11 +2824,15 @@ void CtdlIPC_getline(CtdlIPC* ipc, char *buf)
        if (buf[i] == 13) buf[i--] = 0;
 }
 
+void CtdlIPC_chat_recv(CtdlIPC* ipc, char* buf)
+{
+       return CtdlIPC_getline(ipc, buf);
+}
 
 /*
  * send line to server - implemented in terms of serv_write()
  */
-void CtdlIPC_putline(CtdlIPC *ipc, const char *buf)
+static void CtdlIPC_putline(CtdlIPC *ipc, const char *buf)
 {
        /* error_printf("< %s\n", buf); */
        serv_write(ipc, buf, strlen(buf));
@@ -2799,6 +2841,11 @@ void CtdlIPC_putline(CtdlIPC *ipc, const char *buf)
        ipc->last_command_sent = time(NULL);
 }
 
+void CtdlIPC_chat_send(CtdlIPC* ipc, const char* buf)
+{
+       return CtdlIPC_putline(ipc, buf);
+}
+
 
 /*
  * attach to server
@@ -2809,8 +2856,9 @@ CtdlIPC* CtdlIPC_new(int argc, char **argv, char *hostbuf, char *portbuf)
        char cithost[SIZ];
        char citport[SIZ];
        char sockpath[SIZ];
+       CtdlIPC* ipc;
 
-       CtdlIPC *ipc = ialloc(CtdlIPC);
+       ipc = ialloc(CtdlIPC);
        if (!ipc) {
                return 0;
        }
@@ -2889,6 +2937,38 @@ CtdlIPC* CtdlIPC_new(int argc, char **argv, char *hostbuf, char *portbuf)
        return ipc;
 }
 
+
+/*
+ * Disconnect and delete the IPC class (destructor)
+ */
+void CtdlIPC_delete(CtdlIPC* ipc)
+{
+#ifdef HAVE_OPENSSL
+       if (ipc->ssl) {
+               SSL_shutdown(ipc->ssl);
+               SSL_free(ipc->ssl);
+               ipc->ssl = NULL;
+       }
+#endif
+       if (ipc->sock > -1) {
+               shutdown(ipc->sock, 2); /* Close it up */
+               ipc->sock = -1;
+       }
+       ifree(ipc);
+}
+
+
+/*
+ * Disconnect and delete the IPC class (destructor)
+ * Also NULLs out the pointer
+ */
+void CtdlIPC_delete_ptr(CtdlIPC** pipc)
+{
+       CtdlIPC_delete(*pipc);
+       *pipc = NULL;
+}
+
+
 /*
  * return the file descriptor of the server socket so we can select() on it.
  *