// Client-side IPC functions // // Copyright (c) 1987-2018 by the citadel.org team // // This program is open source software. Use, duplication, and/or // disclosure are subject to the GNU General Purpose 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); }