From 1a13289da96489aeded385366389ab30efb34525 Mon Sep 17 00:00:00 2001 From: Camden Dixie O'Brien Date: Thu, 13 Oct 2022 13:45:01 +0100 Subject: [PATCH] Improve error handling --- main.c | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/main.c b/main.c index 74ce543..5a00135 100644 --- a/main.c +++ b/main.c @@ -20,6 +20,7 @@ #include #include #include +#include #include #include #include @@ -39,6 +40,8 @@ int main(int argc, char *argv[]) (void)argc; (void)argv; + int res = EXIT_SUCCESS; + /* * Register signal handler for SIGTERM and SIGINT. * @@ -48,11 +51,11 @@ int main(int argc, char *argv[]) */ if (signal(SIGTERM, handle_exit_signal) == SIG_ERR) { fprintf(stderr, "Failed to register SIGTERM signal handler\n"); - return 1; + return EXIT_FAILURE; } if (signal(SIGINT, handle_exit_signal) == SIG_ERR) { fprintf(stderr, "Failed to register SIGINT signal handler\n"); - return 1; + return EXIT_FAILURE; } /* @@ -65,7 +68,7 @@ int main(int argc, char *argv[]) int sfd = socket(AF_INET6, SOCK_STREAM, 0); if (sfd == -1) { fprintf(stderr, "Failed to open socket\n"); - return 1; + return EXIT_FAILURE; } const struct sockaddr_in6 haddr = { .sin6_family = AF_INET6, @@ -74,11 +77,13 @@ int main(int argc, char *argv[]) }; if (bind(sfd, (const struct sockaddr *)&haddr, sizeof(haddr)) == -1) { fprintf(stderr, "Error binding socket to address\n"); - return 1; + res = EXIT_FAILURE; + goto close_server_socket; } if (listen(sfd, 8) == -1) { fprintf(stderr, "Error attempting to listen on socket\n"); - return 1; + res = EXIT_FAILURE; + goto close_server_socket; } struct sockaddr_in6 paddr; @@ -100,10 +105,9 @@ int main(int argc, char *argv[]) */ cfd = accept(sfd, (struct sockaddr *)&paddr, &paddr_size); if (cfd == -1) { - if (errno == EINTR) - continue; - fprintf(stderr, "Error accepting connection\n"); - return 1; + if (errno != EINTR) + fprintf(stderr, "Error accepting connection\n"); + continue; } /* @@ -118,7 +122,7 @@ int main(int argc, char *argv[]) } while (errno == EINTR); if (n == -1) { fprintf(stderr, "Error reading selector from client\n"); - return 1; + goto close_client_socket; } /* @@ -135,16 +139,17 @@ int main(int argc, char *argv[]) } if (slen == n) { fprintf(stderr, "Received invalid selector (no CRLF)\n"); - return 1; + goto close_client_socket; } sbuf[slen] = '\0'; printf("Received selector: \"%s\"\n", sbuf); + close_client_socket: close(cfd); } +close_server_socket: close(sfd); - - return 0; + return res; }