]> code.citadel.org Git - citadel.git/blobdiff - textclient/ipc_c_tcp.c
Ultra-simplification of the build system for the text client.
[citadel.git] / textclient / ipc_c_tcp.c
diff --git a/textclient/ipc_c_tcp.c b/textclient/ipc_c_tcp.c
new file mode 100644 (file)
index 0000000..93edebc
--- /dev/null
@@ -0,0 +1,56 @@
+/*
+ * Client-side IPC functions
+ *
+ * Copyright (c) 1987-2018 by the citadel.org team
+ *
+ * This program is open source software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3.
+ *
+ * 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.
+ */
+
+
+#include "textclient.h"
+
+
+/* Note that some of these functions may not work with multiple instances. */
+
+static void (*deathHook)(void) = NULL;
+int (*error_printf)(char *s, ...) = (int (*)(char *, ...))printf;
+
+void setIPCDeathHook(void (*hook)(void)) {
+       deathHook = hook;
+}
+
+void setIPCErrorPrintf(int (*func)(char *s, ...)) {
+       error_printf = func;
+}
+
+void connection_died(CtdlIPC* ipc, int using_ssl) {
+       if (deathHook != NULL) {
+               deathHook();
+       }
+
+       stty_ctdl(SB_RESTORE);
+       fprintf(stderr, "\r\n\n\n");
+       fprintf(stderr, "Your connection to %s is broken.\n", ipc->ServInfo.humannode);
+
+#ifdef HAVE_OPENSSL
+       if (using_ssl) {
+               fprintf(stderr, "Last error: %s\n", ERR_reason_error_string(ERR_get_error()));
+               SSL_free(ipc->ssl);
+               ipc->ssl = NULL;
+       } else
+#endif
+               fprintf(stderr, "Last error: %s\n", strerror(errno));
+
+       fprintf(stderr, "Please re-connect and log in again.\n");
+       fflush(stderr);
+       fflush(stdout);
+       shutdown(ipc->sock, 2);
+       ipc->sock = -1;
+        exit(1);
+}