X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Fsysdep.c;h=9b1bcfa56b6ad21d430458c937ddcb825df4b32b;hb=45fc293fa4f3071711a67c85b1337e5b1eebea23;hp=8f0a124669c0ebca9dca77e2a080c3456f0879aa;hpb=3b8d1155415cd1b45dbd3303ffc68a6c00e6b28a;p=citadel.git diff --git a/citadel/sysdep.c b/citadel/sysdep.c index 8f0a12466..9b1bcfa56 100644 --- a/citadel/sysdep.c +++ b/citadel/sysdep.c @@ -4,7 +4,7 @@ * Here's where we (hopefully) have most parts of the Citadel server that * might need tweaking when run on different operating system variants. * - * Copyright (c) 1987-2017 by the citadel.org team + * Copyright (c) 1987-2019 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. @@ -86,14 +86,14 @@ void init_sysdep(void) { init_ssl(); #endif - /* - * Set up a place to put thread-specific data. - * We only need a single pointer per thread - it points to the - * CitContext structure (in the ContextList linked list) of the - * session to which the calling thread is currently bound. - */ - if (pthread_key_create(&MyConKey, NULL) != 0) { + if (pthread_key_create(&ThreadKey, NULL) != 0) { // TSD for threads + syslog(LOG_ERR, "pthread_key_create() : %m"); + abort(); + } + + if (pthread_key_create(&MyConKey, NULL) != 0) { // TSD for sessions syslog(LOG_CRIT, "sysdep: can't create TSD key: %m"); + abort(); } /* @@ -128,7 +128,7 @@ void init_sysdep(void) { * port_number port number to bind * queue_len number of incoming connections to allow in the queue */ -int ctdl_tcp_server(char *ip_addr, int port_number, int queue_len, char *errormessage) +int ctdl_tcp_server(char *ip_addr, int port_number, int queue_len) { struct protoent *p; struct sockaddr_in6 sin6; @@ -157,8 +157,7 @@ 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, "tcpserver: %s", errormessage); + syslog(LOG_ALERT, "tcpserver: inet_pton: %m"); return (-1); } } @@ -166,26 +165,27 @@ int ctdl_tcp_server(char *ip_addr, int port_number, int queue_len, char *errorme { ip_version = 6; if (inet_pton(AF_INET6, ip_addr, &sin6.sin6_addr) <= 0) { - snprintf(errormessage, SIZ, "Error binding to [%s] : %s", ip_addr, strerror(errno)); - syslog(LOG_ALERT, "tcpserver: %s", errormessage); + syslog(LOG_ALERT, "tcpserver: inet_pton: %m"); return (-1); } } if (port_number == 0) { - snprintf(errormessage, SIZ, "Can't start: no port number specified."); - syslog(LOG_ALERT, "tcpserver: %s", errormessage); + syslog(LOG_ALERT, "tcpserver: no port number was specified"); return (-1); } sin6.sin6_port = htons((u_short) port_number); sin4.sin_port = htons((u_short) port_number); p = getprotobyname("tcp"); + if (p == NULL) { + syslog(LOG_ALERT, "tcpserver: getprotobyname: %m"); + return (-1); + } 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, "tcpserver: %s", errormessage); + syslog(LOG_ALERT, "tcpserver: socket: %m"); return (-1); } /* Set some socket options that make sense. */ @@ -200,16 +200,14 @@ 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, "tcpserver: %s", errormessage); + syslog(LOG_ALERT, "tcpserver: bind: %m"); 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, "tcpserver: %s", errormessage); + syslog(LOG_ALERT, "tcpserver: listen: %m"); return (-1); } return (s); @@ -219,7 +217,7 @@ int ctdl_tcp_server(char *ip_addr, int port_number, int queue_len, char *errorme /* * Create a Unix domain socket and listen on it */ -int ctdl_uds_server(char *sockpath, int queue_len, char *errormessage) +int ctdl_uds_server(char *sockpath, int queue_len) { struct sockaddr_un addr; int s; @@ -234,8 +232,7 @@ int ctdl_uds_server(char *sockpath, int queue_len, char *errormessage) i = unlink(sockpath); if ((i != 0) && (errno != ENOENT)) { - snprintf(errormessage, SIZ, "can't unlink %s: %s", sockpath, strerror(errno)); - syslog(LOG_ERR, "udsserver: %s", errormessage); + syslog(LOG_ERR, "udsserver: %m"); return(-1); } @@ -245,28 +242,24 @@ int ctdl_uds_server(char *sockpath, int queue_len, char *errormessage) s = socket(AF_UNIX, SOCK_STREAM, 0); if (s < 0) { - snprintf(errormessage, SIZ, "can't create a socket: %s", strerror(errno)); - syslog(LOG_ERR, "udsserver: %s", errormessage); + syslog(LOG_ERR, "udsserver: socket: %m"); return(-1); } if (bind(s, (struct sockaddr *)&addr, sizeof(addr)) < 0) { - snprintf(errormessage, SIZ, "can't bind: %s", strerror(errno)); - syslog(LOG_ERR, "udsserver: %s", errormessage); + syslog(LOG_ERR, "udsserver: bind: %m"); return(-1); } /* set to nonblock - we need this for some obscure situations */ if (fcntl(s, F_SETFL, O_NONBLOCK) < 0) { - snprintf(errormessage, SIZ, "can't set socket to non-blocking: %s", strerror(errno)); - syslog(LOG_ERR, "udsserver: %s", errormessage); + syslog(LOG_ERR, "udsserver: fcntl: %m"); close(s); return(-1); } if (listen(s, actual_queue_len) < 0) { - snprintf(errormessage, SIZ, "can't listen: %s", strerror(errno)); - syslog(LOG_ERR, "udsserver: %s", errormessage); + syslog(LOG_ERR, "udsserver: listen: %m"); return(-1); } @@ -1109,12 +1102,12 @@ void HuntBadSession(void) { /* Gotcha! */ 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, - ptr->curr_user, - ptr->cs_host,ptr->cs_addr + "sysdep: killing session CC[%d] bad FD: [%d] User[%s] Host[%s:%s]", + ptr->cs_pid, + ptr->client_socket, + ptr->curr_user, + ptr->cs_host, + ptr->cs_addr ); ptr->kill_me = 1; ptr->client_socket = -1; @@ -1292,9 +1285,9 @@ do_select: force_purge = 0; con->h_greeting_function = serviceptr->h_greeting_function; con->ServiceName = serviceptr->ServiceName; - /* Determine whether it's a local socket */ + /* Connections on a local client are always from the same host */ if (serviceptr->sockpath != NULL) { - con->is_local_socket = 1; + con->is_local_client = 1; } /* Set the SO_REUSEADDR socket option */