ctdl_tcp_server and ctdl_uds_server improved handling of error
authorArt Cancro <ajc@citadel.org>
Mon, 19 Aug 2019 19:12:50 +0000 (19:12 +0000)
committerArt Cancro <ajc@citadel.org>
Mon, 19 Aug 2019 19:12:50 +0000 (19:12 +0000)
conditions in places like getprotobyname() which normally never throw an
error, but in container universe it's a new game.

citadel/serv_extensions.c
citadel/sysdep.c
citadel/sysdep_decls.h

index f967e411be2be7c846f7002bfa9d173cff0738b3..73a1b7911094dc48858a5cf95b5d2c824c1fcee5 100644 (file)
@@ -853,9 +853,7 @@ void CtdlRegisterServiceHook(int tcp_port,
 {
        ServiceFunctionHook *newfcn;
        char *message;
-       char error[SIZ];
 
-       strcpy(error, "");
        newfcn = (ServiceFunctionHook *) malloc(sizeof(ServiceFunctionHook));
        message = (char*) malloc (SIZ + SIZ);
        
@@ -868,7 +866,7 @@ void CtdlRegisterServiceHook(int tcp_port,
        newfcn->ServiceName = ServiceName;
 
        if (sockpath != NULL) {
-               newfcn->msock = ctdl_uds_server(sockpath, CtdlGetConfigInt("c_maxsessions"), error);
+               newfcn->msock = ctdl_uds_server(sockpath, CtdlGetConfigInt("c_maxsessions"));
                snprintf(message, SIZ, "extensions: unix domain socket '%s': ", sockpath);
        }
        else if (tcp_port <= 0) {       /* port -1 to disable */
@@ -878,10 +876,7 @@ void CtdlRegisterServiceHook(int tcp_port,
                return;
        }
        else {
-               newfcn->msock = ctdl_tcp_server(CtdlGetConfigStr("c_ip_addr"),
-                                             tcp_port,
-                                             CtdlGetConfigInt("c_maxsessions"), 
-                                             error);
+               newfcn->msock = ctdl_tcp_server(CtdlGetConfigStr("c_ip_addr"), tcp_port, CtdlGetConfigInt("c_maxsessions"));
                snprintf(message, SIZ, "extensions: TCP port %s:%d: (%s) ", 
                         CtdlGetConfigStr("c_ip_addr"), tcp_port, ServiceName);
        }
@@ -892,7 +887,7 @@ void CtdlRegisterServiceHook(int tcp_port,
                syslog(LOG_INFO, "%s", message);
        }
        else {
-               AddPortError(message, error);
+               AddPortError(message, "failed");
                strcat(message, "FAILED.");
                syslog(LOG_ERR, "%s", message);
                free(newfcn);
index c547f9772be4cff4c5fee27c84291bfb8d93817a..9b1bcfa56b6ad21d430458c937ddcb825df4b32b 100644 (file)
@@ -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);
        }
 
index 89348bf37bec9f72a09906c67666ffa246ddff5d..221640fdd59e8c1fb961c9c8719944eff90f7146 100644 (file)
@@ -39,8 +39,8 @@ void cprintf (const char *format, ...);
 #endif
 
 void init_sysdep (void);
-int ctdl_tcp_server(char *ip_addr, int port_number, int queue_len, char *errormessage);
-int ctdl_uds_server(char *sockpath, int queue_len, char *errormessage);
+int ctdl_tcp_server(char *ip_addr, int port_number, int queue_len);
+int ctdl_uds_server(char *sockpath, int queue_len);
 void buffer_output(void);
 void unbuffer_output(void);
 void flush_output(void);