* 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.
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();
}
/*
* 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;
{
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);
}
}
{
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. */
}
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);
/*
* 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;
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);
}
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);
}
CtdlDestroyProtoHooks();
CtdlDestroyDeleteHooks();
CtdlDestroyXmsgHooks();
- CtdlDestroyNetprocHooks();
CtdlDestroyUserHooks();
CtdlDestroyMessageHook();
CtdlDestroyCleanupHooks();
{
/* 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;
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 */