Improve error handling
This commit is contained in:
parent
f7583f538e
commit
1a13289da9
31
main.c
31
main.c
@ -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");
|
continue;
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -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;
|
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user