Improve error handling

This commit is contained in:
Camden Dixie O'Brien 2022-10-13 13:45:01 +01:00
parent f7583f538e
commit 1a13289da9

29
main.c
View File

@ -20,6 +20,7 @@
#include <netinet/in.h> #include <netinet/in.h>
#include <signal.h> #include <signal.h>
#include <stdbool.h> #include <stdbool.h>
#include <stdlib.h>
#include <stdio.h> #include <stdio.h>
#include <sys/socket.h> #include <sys/socket.h>
#include <unistd.h> #include <unistd.h>
@ -39,6 +40,8 @@ int main(int argc, char *argv[])
(void)argc; (void)argc;
(void)argv; (void)argv;
int res = EXIT_SUCCESS;
/* /*
* Register signal handler for SIGTERM and SIGINT. * 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) { if (signal(SIGTERM, handle_exit_signal) == SIG_ERR) {
fprintf(stderr, "Failed to register SIGTERM signal handler\n"); fprintf(stderr, "Failed to register SIGTERM signal handler\n");
return 1; return EXIT_FAILURE;
} }
if (signal(SIGINT, handle_exit_signal) == SIG_ERR) { if (signal(SIGINT, handle_exit_signal) == SIG_ERR) {
fprintf(stderr, "Failed to register SIGINT signal handler\n"); 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); int sfd = socket(AF_INET6, SOCK_STREAM, 0);
if (sfd == -1) { if (sfd == -1) {
fprintf(stderr, "Failed to open socket\n"); fprintf(stderr, "Failed to open socket\n");
return 1; return EXIT_FAILURE;
} }
const struct sockaddr_in6 haddr = { const struct sockaddr_in6 haddr = {
.sin6_family = AF_INET6, .sin6_family = AF_INET6,
@ -74,11 +77,13 @@ int main(int argc, char *argv[])
}; };
if (bind(sfd, (const struct sockaddr *)&haddr, sizeof(haddr)) == -1) { if (bind(sfd, (const struct sockaddr *)&haddr, sizeof(haddr)) == -1) {
fprintf(stderr, "Error binding socket to address\n"); fprintf(stderr, "Error binding socket to address\n");
return 1; res = EXIT_FAILURE;
goto close_server_socket;
} }
if (listen(sfd, 8) == -1) { if (listen(sfd, 8) == -1) {
fprintf(stderr, "Error attempting to listen on socket\n"); fprintf(stderr, "Error attempting to listen on socket\n");
return 1; res = EXIT_FAILURE;
goto close_server_socket;
} }
struct sockaddr_in6 paddr; struct sockaddr_in6 paddr;
@ -100,10 +105,9 @@ int main(int argc, char *argv[])
*/ */
cfd = accept(sfd, (struct sockaddr *)&paddr, &paddr_size); cfd = accept(sfd, (struct sockaddr *)&paddr, &paddr_size);
if (cfd == -1) { if (cfd == -1) {
if (errno == EINTR) if (errno != EINTR)
continue;
fprintf(stderr, "Error accepting connection\n"); fprintf(stderr, "Error accepting connection\n");
return 1; continue;
} }
/* /*
@ -118,7 +122,7 @@ int main(int argc, char *argv[])
} while (errno == EINTR); } while (errno == EINTR);
if (n == -1) { if (n == -1) {
fprintf(stderr, "Error reading selector from client\n"); 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) { if (slen == n) {
fprintf(stderr, "Received invalid selector (no CRLF)\n"); fprintf(stderr, "Received invalid selector (no CRLF)\n");
return 1; goto close_client_socket;
} }
sbuf[slen] = '\0'; sbuf[slen] = '\0';
printf("Received selector: \"%s\"\n", sbuf); printf("Received selector: \"%s\"\n", sbuf);
close_client_socket:
close(cfd); close(cfd);
} }
close_server_socket:
close(sfd); close(sfd);
return res;
return 0;
} }