X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Fsysdep.c;h=67c7a7b9eaf143a50f8bd9c4d8695dc78c627352;hb=e704ad0e3d1ecb2f5e0c46984cc8902fcdc0ec36;hp=0dda5bd55425d676a375b931635a416d6e6d361a;hpb=9571de81331e169c042c630800bff1bde499c8a9;p=citadel.git diff --git a/citadel/sysdep.c b/citadel/sysdep.c index 0dda5bd55..67c7a7b9e 100644 --- a/citadel/sysdep.c +++ b/citadel/sysdep.c @@ -2,12 +2,9 @@ * Citadel "system dependent" stuff. * * Here's where we (hopefully) have most parts of the Citadel server that - * would need to be altered to run the server in a non-POSIX environment. - * - * If we ever port to a different platform and either have multiple - * variants of this file or simply load it up with #ifdefs. + * might need tweaking when run on different operating system variants. * - * Copyright (c) 1987-2015 by the citadel.org team + * Copyright (c) 1987-2017 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. @@ -19,14 +16,15 @@ */ #include "sysdep.h" - +#include +#include +#include #include #include #include #include #include - - +#include #include #include #include @@ -34,17 +32,13 @@ #include #include #include - #define SHOW_ME_VAPPEND_PRINTF #include - #include "citserver.h" #include "config.h" #include "ctdl_module.h" - #include "sysdep_decls.h" #include "modules/crypto/serv_crypto.h" /* Needed for init_ssl, client_write_ssl, client_read_ssl, destruct_ssl */ - #include "housekeeping.h" #include "context.h" /* @@ -57,7 +51,7 @@ volatile int restart_server = 0; volatile int running_as_daemon = 0; static RETSIGTYPE signal_cleanup(int signum) { - syslog(LOG_DEBUG, "Caught signal %d; shutting down.", signum); + syslog(LOG_DEBUG, "sysdep: caught signal %d; shutting down.", signum); exit_signal = signum; server_shutting_down = 1; } @@ -97,7 +91,7 @@ void init_sysdep(void) { * session to which the calling thread is currently bound. */ if (pthread_key_create(&MyConKey, NULL) != 0) { - syslog(LOG_CRIT, "Can't create TSD key: %s", strerror(errno)); + syslog(LOG_CRIT, "sysdep: can't create TSD key: %s", strerror(errno)); } /* @@ -161,10 +155,8 @@ int ctdl_tcp_server(char *ip_addr, int port_number, int queue_len, char *errorme { ip_version = 4; if (inet_pton(AF_INET, ip_addr, &sin4.sin_addr) <= 0) { - snprintf(errormessage, SIZ, - "Error binding to [%s] : %s", ip_addr, strerror(errno) - ); - syslog(LOG_ALERT, "%s", errormessage); + snprintf(errormessage, SIZ, "Error binding to [%s] : %s", ip_addr, strerror(errno)); + syslog(LOG_ALERT, "tcpserver: %s", errormessage); return (-1); } } @@ -175,14 +167,14 @@ int ctdl_tcp_server(char *ip_addr, int port_number, int queue_len, char *errorme snprintf(errormessage, SIZ, "Error binding to [%s] : %s", ip_addr, strerror(errno) ); - syslog(LOG_ALERT, "%s", errormessage); + syslog(LOG_ALERT, "tcpserver: %s", errormessage); return (-1); } } if (port_number == 0) { snprintf(errormessage, SIZ, "Can't start: no port number specified."); - syslog(LOG_ALERT, "%s", errormessage); + syslog(LOG_ALERT, "tcpserver: %s", errormessage); return (-1); } sin6.sin6_port = htons((u_short) port_number); @@ -192,10 +184,8 @@ int ctdl_tcp_server(char *ip_addr, int port_number, int queue_len, char *errorme s = socket( ((ip_version == 6) ? PF_INET6 : PF_INET), SOCK_STREAM, (p->p_proto)); if (s < 0) { - snprintf(errormessage, SIZ, - "Can't create a listening socket: %s", strerror(errno) - ); - syslog(LOG_ALERT, "%s", errormessage); + snprintf(errormessage, SIZ, "Can't create a listening socket: %s", strerror(errno)); + syslog(LOG_ALERT, "tcpserver: %s", errormessage); return (-1); } /* Set some socket options that make sense. */ @@ -210,29 +200,22 @@ int ctdl_tcp_server(char *ip_addr, int port_number, int queue_len, char *errorme } if (b < 0) { - snprintf(errormessage, SIZ, - "Can't bind: %s", strerror(errno) - ); - syslog(LOG_ALERT, "%s", errormessage); + snprintf(errormessage, SIZ, "Can't bind: %s", strerror(errno)); + syslog(LOG_ALERT, "tcpserver: %s", errormessage); return (-1); } fcntl(s, F_SETFL, O_NONBLOCK); if (listen(s, ((queue_len >= 5) ? queue_len : 5) ) < 0) { - snprintf(errormessage, SIZ, - "Can't listen: %s", strerror(errno) - ); - syslog(LOG_ALERT, "%s", errormessage); + snprintf(errormessage, SIZ, "Can't listen: %s", strerror(errno)); + syslog(LOG_ALERT, "tcpserver: %s", errormessage); return (-1); } return (s); } - - - /* * Create a Unix domain socket and listen on it */ @@ -251,10 +234,8 @@ int ctdl_uds_server(char *sockpath, int queue_len, char *errormessage) i = unlink(sockpath); if ((i != 0) && (errno != ENOENT)) { - snprintf(errormessage, SIZ, "citserver: can't unlink %s: %s", - sockpath, strerror(errno) - ); - syslog(LOG_EMERG, "%s", errormessage); + snprintf(errormessage, SIZ, "can't unlink %s: %s", sockpath, strerror(errno)); + syslog(LOG_EMERG, "udsserver: %s", errormessage); return(-1); } @@ -264,36 +245,28 @@ int ctdl_uds_server(char *sockpath, int queue_len, char *errormessage) s = socket(AF_UNIX, SOCK_STREAM, 0); if (s < 0) { - snprintf(errormessage, SIZ, - "citserver: Can't create a socket: %s", - strerror(errno)); - syslog(LOG_EMERG, "%s", errormessage); + snprintf(errormessage, SIZ, "can't create a socket: %s", strerror(errno)); + syslog(LOG_EMERG, "udsserver: %s", errormessage); return(-1); } if (bind(s, (struct sockaddr *)&addr, sizeof(addr)) < 0) { - snprintf(errormessage, SIZ, - "citserver: Can't bind: %s", - strerror(errno)); - syslog(LOG_EMERG, "%s", errormessage); + snprintf(errormessage, SIZ, "can't bind: %s", strerror(errno)); + syslog(LOG_EMERG, "udsserver: %s", errormessage); return(-1); } /* set to nonblock - we need this for some obscure situations */ if (fcntl(s, F_SETFL, O_NONBLOCK) < 0) { - snprintf(errormessage, SIZ, - "citserver: Can't set socket to non-blocking: %s", - strerror(errno)); - syslog(LOG_EMERG, "%s", errormessage); + snprintf(errormessage, SIZ, "can't set socket to non-blocking: %s", strerror(errno)); + syslog(LOG_EMERG, "udsserver: %s", errormessage); close(s); return(-1); } if (listen(s, actual_queue_len) < 0) { - snprintf(errormessage, SIZ, - "citserver: Can't listen: %s", - strerror(errno)); - syslog(LOG_EMERG, "%s", errormessage); + snprintf(errormessage, SIZ, "can't listen: %s", strerror(errno)); + syslog(LOG_EMERG, "udsserver: %s", errormessage); return(-1); } @@ -306,7 +279,6 @@ int ctdl_uds_server(char *sockpath, int queue_len, char *errormessage) } - /* * The following functions implement output buffering on operating systems which * support it (such as Linux and various BSD flavors). @@ -370,15 +342,12 @@ void client_close(void) { if (!CCC) return; if (CCC->client_socket <= 0) return; - syslog(LOG_DEBUG, "Closing socket %d", CCC->client_socket); - + syslog(LOG_DEBUG, "sysdep: closing socket %d", CCC->client_socket); close(CCC->client_socket); CCC->client_socket = -1 ; } - - /* * client_write() ... Send binary data to the client. */ @@ -407,12 +376,11 @@ int client_write(const char *buf, int nbytes) fd = fopen(fn, "a+"); if (fd == NULL) { - syslog(LOG_EMERG, "failed to open file %s: %s", fn, strerror(errno)); + syslog(LOG_ERR, "%s: %s", fn, strerror(errno)); cit_backtrace(); exit(1); } - fprintf(fd, "Sending: BufSize: %d BufContent: [", - nbytes); + fprintf(fd, "Sending: BufSize: %d BufContent: [", nbytes); rv = fwrite(buf, nbytes, 1, fd); fprintf(fd, "]\n"); fclose(fd); @@ -442,9 +410,7 @@ int client_write(const char *buf, int nbytes) if (select(1, NULL, &wset, NULL, NULL) == -1) { if (errno == EINTR) { - syslog(LOG_DEBUG, "client_write(%d bytes) select() interrupted.", - nbytes-bytes_written - ); + syslog(LOG_DEBUG, "sysdep: client_write(%d bytes) select() interrupted.", nbytes-bytes_written); if (server_shutting_down) { CC->kill_me = KILLME_SELECT_INTERRUPTED; return (-1); @@ -454,7 +420,7 @@ int client_write(const char *buf, int nbytes) } } else { syslog(LOG_ERR, - "client_write(%d bytes) select failed: %s (%d)", + "sysdep: client_write(%d bytes) select failed: %s (%d)", nbytes - bytes_written, strerror(errno), errno ); @@ -469,7 +435,7 @@ int client_write(const char *buf, int nbytes) retval = write(Ctx->client_socket, &buf[bytes_written], nbytes - bytes_written); if (retval < 1) { syslog(LOG_ERR, - "client_write(%d bytes) failed: %s (%d)", + "sysdep: client_write(%d bytes) failed: %s (%d)", nbytes - bytes_written, strerror(errno), errno ); @@ -534,12 +500,11 @@ int client_read_blob(StrBuf *Target, int bytes, int timeout) fd = fopen(fn, "a+"); if (fd == NULL) { - syslog(LOG_EMERG, "failed to open file %s: %s", fn, strerror(errno)); + syslog(LOG_ERR, "%s: %s", fn, strerror(errno)); cit_backtrace(); exit(1); } - fprintf(fd, "Reading BLOB: BufSize: %d ", - bytes); + fprintf(fd, "Reading BLOB: BufSize: %d ", bytes); rv = fwrite(ChrPtr(Target), StrLength(Target), 1, fd); fprintf(fd, "]\n"); @@ -548,23 +513,20 @@ int client_read_blob(StrBuf *Target, int bytes, int timeout) #endif retval = client_read_sslblob(Target, bytes, timeout); if (retval < 0) { - syslog(LOG_CRIT, "client_read_blob() failed"); + syslog(LOG_ERR, "sysdep: client_read_blob() failed"); } #ifdef BIGBAD_IODBG snprintf(fn, SIZ, "/tmp/foolog_%s.%d", CCC->ServiceName, CCC->cs_pid); fd = fopen(fn, "a+"); if (fd == NULL) { - syslog(LOG_EMERG, "failed to open file %s: %s", fn, strerror(errno)); + syslog(LOG_ERR, "%s: %s", fn, strerror(errno)); cit_backtrace(); exit(1); } - fprintf(fd, "Read: %d BufContent: [", - StrLength(Target)); + fprintf(fd, "Read: %d BufContent: [", StrLength(Target)); rv = fwrite(ChrPtr(Target), StrLength(Target), 1, fd); fprintf(fd, "]\n"); - - fclose(fd); #endif } @@ -580,7 +542,7 @@ int client_read_blob(StrBuf *Target, int bytes, int timeout) fd = fopen(fn, "a+"); if (fd == NULL) { - syslog(LOG_EMERG, "failed to open file %s: %s", fn, strerror(errno)); + syslog(LOG_ERR, "%s: %s", fn, strerror(errno)); cit_backtrace(); exit(1); } @@ -588,8 +550,6 @@ int client_read_blob(StrBuf *Target, int bytes, int timeout) bytes); rv = fwrite(ChrPtr(Target), StrLength(Target), 1, fd); fprintf(fd, "]\n"); - - fclose(fd); #endif retval = StrBufReadBLOBBuffered(Target, @@ -599,9 +559,10 @@ int client_read_blob(StrBuf *Target, int bytes, int timeout) 1, bytes, O_TERM, - &Error); + &Error + ); if (retval < 0) { - syslog(LOG_CRIT, "client_read_blob() failed: %s", Error); + syslog(LOG_ERR, "sysdep: client_read_blob() failed: %s", Error); client_close(); return retval; } @@ -610,7 +571,7 @@ int client_read_blob(StrBuf *Target, int bytes, int timeout) fd = fopen(fn, "a+"); if (fd == NULL) { - syslog(LOG_EMERG, "failed to open file %s: %s", fn, strerror(errno)); + syslog(LOG_ERR, "%s: %s", fn, strerror(errno)); cit_backtrace(); exit(1); } @@ -669,7 +630,7 @@ int client_read_random_blob(StrBuf *Target, int timeout) fd = fopen(fn, "a+"); if (fd == NULL) { - syslog(LOG_EMERG, "failed to open file %s: %s", fn, strerror(errno)); + syslog(LOG_ERR, "%s: %s", fn, strerror(errno)); cit_backtrace(); exit(1); } @@ -677,12 +638,9 @@ int client_read_random_blob(StrBuf *Target, int timeout) StrLength(Target)); rv = fwrite(ChrPtr(Target), StrLength(Target), 1, fd); fprintf(fd, "]\n"); - - fclose(fd); } #endif - return StrLength(Target); } return rc; @@ -757,7 +715,7 @@ int CtdlClientGetLine(StrBuf *Target) fd = fopen(fn, "a+"); if (fd == NULL) { - syslog(LOG_EMERG, "failed to open file %s: %s", fn, strerror(errno)); + syslog(LOG_ERR, "%s: %s", fn, strerror(errno)); cit_backtrace(); exit(1); } @@ -797,7 +755,7 @@ int CtdlClientGetLine(StrBuf *Target) fclose(fd); if (rc < 0) { - syslog(LOG_CRIT, "CtdlClientGetLine() failed"); + syslog(LOG_ERR, "sysdep: CtdlClientGetLine() failed"); } #endif return rc; @@ -815,7 +773,7 @@ int CtdlClientGetLine(StrBuf *Target) fd = fopen(fn, "a+"); if (fd == NULL) { - syslog(LOG_EMERG, "failed to open file %s: %s", fn, strerror(errno)); + syslog(LOG_ERR, "%s: %s", fn, strerror(errno)); cit_backtrace(); exit(1); } @@ -838,7 +796,8 @@ int CtdlClientGetLine(StrBuf *Target) &CCC->client_socket, 5, 1, - &Error); + &Error + ); #ifdef BIGBAD_IODBG pch = ChrPtr(CCC->RecvBuf.Buf); @@ -859,7 +818,7 @@ int CtdlClientGetLine(StrBuf *Target) fclose(fd); if ((rc < 0) && (Error != NULL)) { - syslog(LOG_CRIT, "CtdlClientGetLine() failed: %s", Error); + syslog(LOG_ERR, "sysdep: CtdlClientGetLine() failed: %s", Error); } #endif return rc; @@ -923,29 +882,33 @@ void close_masters (void) if (serviceptr->tcp_port > 0) { - if (serviceptr->msock == -1) + if (serviceptr->msock == -1) { Text = "not closing again"; - else + } + else { Text = "Closing"; - - syslog(LOG_INFO, "%s %d listener on port %d\n", + } + syslog(LOG_INFO, "sysdep: %s %d listener on port %d", Text, serviceptr->msock, - serviceptr->tcp_port); + serviceptr->tcp_port + ); serviceptr->tcp_port = 0; } if (serviceptr->sockpath != NULL) { - if (serviceptr->msock == -1) + if (serviceptr->msock == -1) { Text = "not closing again"; - else + } + else { Text = "Closing"; - - syslog(LOG_INFO, "%s %d listener on '%s'\n", + } + syslog(LOG_INFO, "sysdep: %s %d listener on '%s'", Text, serviceptr->msock, - serviceptr->sockpath); + serviceptr->sockpath + ); } if (serviceptr->msock != -1) @@ -984,7 +947,6 @@ void sysdep_master_cleanup(void) { CtdlDestroyCleanupHooks(); CtdlDestroyFixedOutputHooks(); CtdlDestroySessionHooks(); - CtdlDestroyTDAPVetoHooks(); CtdlDestroyServiceHook(); CtdlDestroyRoomHooks(); CtdlDestroySearchHooks(); @@ -1022,10 +984,9 @@ void start_daemon(int unused) { * We don't just call close() because we don't want these fd's * to be reused for other files. */ - if (chdir(ctdl_run_dir) != 0) - syslog(LOG_EMERG, - "unable to change into directory [%s]: %s", - ctdl_run_dir, strerror(errno)); + if (chdir(ctdl_run_dir) != 0) { + syslog(LOG_ERR, "%s: %s", ctdl_run_dir, strerror(errno)); + } child = fork(); if (child != 0) { @@ -1038,28 +999,23 @@ void start_daemon(int unused) { setsid(); umask(0); - if ((freopen("/dev/null", "r", stdin) != stdin) || - (freopen("/dev/null", "w", stdout) != stdout) || - (freopen("/dev/null", "w", stderr) != stderr)) - syslog(LOG_EMERG, - "unable to reopen stdin/out/err %s", - strerror(errno)); - + if ( (freopen("/dev/null", "r", stdin) != stdin) || + (freopen("/dev/null", "w", stdout) != stdout) || + (freopen("/dev/null", "w", stderr) != stderr) + ) { + syslog(LOG_ERR, "sysdep: unable to reopen stdio: %s", strerror(errno)); + } do { current_child = fork(); - signal(SIGTERM, graceful_shutdown); - if (current_child < 0) { perror("fork"); exit(errno); } - else if (current_child == 0) { return; /* continue starting citadel. */ } - else { fp = fopen(file_pid_file, "w"); if (fp != NULL) { @@ -1068,7 +1024,6 @@ void start_daemon(int unused) { } waitpid(current_child, &status, 0); } - nFireUpsNonRestart = nFireUps; /* Exit code 0 means the watcher should exit */ @@ -1101,10 +1056,8 @@ void checkcrash(void) if (nFireUpsNonRestart != nFireUps) { StrBuf *CrashMail; - const char *msgs[1] = {"crash"}; - const long lens[1] = {sizeof("crash") - 1}; CrashMail = NewStrBuf(); - syslog(LOG_ALERT, "Posting crash message\n"); + syslog(LOG_ALERT, "sysdep: posting crash message"); StrBufPrintf(CrashMail, " \n" " The Citadel server process (citserver) terminated unexpectedly." @@ -1119,11 +1072,7 @@ void checkcrash(void) " If you have already done this, the core dump is likely to be found at %score.%d\n" , ctdl_run_dir, ForkedPid); - CtdlAideFPMessage(ChrPtr(CrashMail), - "Citadel server process terminated unexpectedly", - 1, msgs, lens, - 0, 0, - time(NULL)); + CtdlAideMessage(ChrPtr(CrashMail), "Citadel server process terminated unexpectedly"); FreeStrBuf(&CrashMail); } } @@ -1186,8 +1135,8 @@ void HuntBadSession(void) (errno == EBADF)) { /* Gotcha! */ - syslog(LOG_EMERG, - "Killing Session CC[%d] bad FD: [%d:%d] User[%s] Host[%s:%s]\n", + syslog(LOG_ERR, + "sysdep: killing session CC[%d] bad FD: [%d:%d] User[%s] Host[%s:%s]", ptr->cs_pid, ptr->client_socket, ptr->is_local_socket, @@ -1220,10 +1169,7 @@ void HuntBadSession(void) (errno == EBADF)) { /* Gotcha! server socket dead? commit suicide! */ - syslog(LOG_EMERG, - "Found bad FD: %d and its a server socket! Shutting Down!\n", - serviceptr->msock); - + syslog(LOG_ERR, "sysdep: found bad FD: %d and its a server socket! Shutting Down!", serviceptr->msock); server_shutting_down = 1; break; } @@ -1253,8 +1199,6 @@ void *worker_thread(void *blah) { ++num_workers; pthread_mutex_unlock(&ThreadCountMutex); - pthread_setspecific(evConKey, WorkerLogStr); - while (!server_shutting_down) { /* make doubly sure we're not holding any stale db handles @@ -1328,18 +1272,15 @@ do_select: force_purge = 0; */ if (retval < 0) { if (errno == EBADF) { - syslog(LOG_EMERG, "select() failed: (%s)\n", strerror(errno)); - HuntBadSession (); + syslog(LOG_ERR, "sysdep: select() failed: (%s)", strerror(errno)); + HuntBadSession(); goto do_select; } if (errno != EINTR) { - syslog(LOG_EMERG, "Exiting (%s)\n", strerror(errno)); + syslog(LOG_ERR, "sysdep: exiting (%s)", strerror(errno)); server_shutting_down = 1; continue; } else { -#if 0 - syslog(LOG_DEBUG, "Interrupted select()\n"); -#endif if (server_shutting_down) { --num_workers; return(NULL); @@ -1361,16 +1302,14 @@ do_select: force_purge = 0; if (FD_ISSET(serviceptr->msock, &readfds)) { ssock = accept(serviceptr->msock, NULL, 0); if (ssock >= 0) { - syslog(LOG_DEBUG, "New client socket %d", ssock); + syslog(LOG_DEBUG, "sysdep: new client socket %d", ssock); /* The master socket is non-blocking but the client * sockets need to be blocking, otherwise certain * operations barf on FreeBSD. Not a fatal error. */ if (fcntl(ssock, F_SETFL, 0) < 0) { - syslog(LOG_EMERG, - "citserver: Can't set socket to blocking: %s\n", - strerror(errno)); + syslog(LOG_ERR, "sysdep: Can't set socket to blocking: %s", strerror(errno)); } /* New context will be created already