From cadaf66caeb6fc510ea5e3131644f51bfadaa2df Mon Sep 17 00:00:00 2001 From: Stephen Seo Date: Thu, 29 Aug 2024 15:38:44 +0900 Subject: [PATCH] Cleanup Separate out functions/structs/constants/globals to properly named files. --- Makefile | 8 ++- src/arg_parse.c | 42 +++++++++++ src/arg_parse.h | 15 ++++ src/big_endian.c | 20 ++++++ src/big_endian.h | 10 +++ src/globals.c | 5 ++ src/globals.h | 8 +++ src/main.c | 157 ++---------------------------------------- src/signal_handling.c | 21 ++++++ src/signal_handling.h | 8 +++ src/tcp_socket.c | 94 +++++++++++++++++++++++++ src/tcp_socket.h | 12 ++++ 12 files changed, 249 insertions(+), 151 deletions(-) create mode 100644 src/arg_parse.c create mode 100644 src/arg_parse.h create mode 100644 src/big_endian.c create mode 100644 src/big_endian.h create mode 100644 src/globals.c create mode 100644 src/globals.h create mode 100644 src/signal_handling.c create mode 100644 src/signal_handling.h create mode 100644 src/tcp_socket.c create mode 100644 src/tcp_socket.h diff --git a/Makefile b/Makefile index 2ea666c..7bdf199 100644 --- a/Makefile +++ b/Makefile @@ -9,7 +9,13 @@ else endif SOURCES = \ - src/main.c + src/main.c \ + src/arg_parse.c \ + src/big_endian.c \ + src/tcp_socket.c \ + src/signal_handling.c \ + src/globals.c + OBJECT_DIR = objs OBJECTS = $(addprefix ${OBJECT_DIR}/,$(patsubst %.c,%.c.o,${SOURCES})) diff --git a/src/arg_parse.c b/src/arg_parse.c new file mode 100644 index 0000000..ecdbed5 --- /dev/null +++ b/src/arg_parse.c @@ -0,0 +1,42 @@ +#include "arg_parse.h" + +// Standard library includes. +#include +#include +#include + +void print_usage(void) { + puts("Usage:"); + puts(" -p | --port "); +} + +Args parse_args(int argc, char **argv) { + --argc; + ++argv; + + Args args; + memset(&args, 0, sizeof(Args)); + + while (argc > 0) { + if ((strcmp(argv[0], "-p") == 0 || strcmp(argv[0], "--port") == 0) + && argc > 1) { + int value = atoi(argv[1]); + if (value >= 0 && value <= 0xFFFF) { + args.port = (unsigned short) value; + } + --argc; + ++argv; + } else { + puts("ERROR: Invalid args!\n"); + print_usage(); + exit(1); + } + + --argc; + ++argv; + } + + return args; +} + +// vim: ts=2 sts=2 sw=2 diff --git a/src/arg_parse.h b/src/arg_parse.h new file mode 100644 index 0000000..7073ea7 --- /dev/null +++ b/src/arg_parse.h @@ -0,0 +1,15 @@ +#ifndef SEODISPARATE_COM_C_SIMPLE_HTTP_ARG_PARSE_H_ +#define SEODISPARATE_COM_C_SIMPLE_HTTP_ARG_PARSE_H_ + +typedef struct Args { + unsigned short flags; + unsigned short port; +} Args; + +void print_usage(void); + +Args parse_args(int argc, char **argv); + +#endif + +// vim: ts=2 sts=2 sw=2 diff --git a/src/big_endian.c b/src/big_endian.c new file mode 100644 index 0000000..ca89847 --- /dev/null +++ b/src/big_endian.c @@ -0,0 +1,20 @@ +#include "big_endian.h" + +int is_big_endian(void) { + union { + int i; + char c[4]; + } bint = {0x01020304}; + + return bint.c[0] == 1 ? 1 : 0; +} + +unsigned short u16_be_swap(unsigned short value) { + if (is_big_endian()) { + return value; + } else { + return ((value >> 8) & 0xFF) | ((value << 8) & 0xFF00); + } +} + +// vim: ts=2 sts=2 sw=2 diff --git a/src/big_endian.h b/src/big_endian.h new file mode 100644 index 0000000..6c7a872 --- /dev/null +++ b/src/big_endian.h @@ -0,0 +1,10 @@ +#ifndef SEODISPARATE_COM_C_SIMPLE_HTTP_BIG_ENDIAN_H_ +#define SEODISPARATE_COM_C_SIMPLE_HTTP_BIG_ENDIAN_H_ + +int is_big_endian(void); + +unsigned short u16_be_swap(unsigned short value); + +#endif + +// vim: ts=2 sts=2 sw=2 diff --git a/src/globals.c b/src/globals.c new file mode 100644 index 0000000..8c865d6 --- /dev/null +++ b/src/globals.c @@ -0,0 +1,5 @@ +#include "globals.h" + +int C_SIMPLE_HTTP_KEEP_RUNNING = 1; + +// vim: ts=2 sts=2 sw=2 diff --git a/src/globals.h b/src/globals.h new file mode 100644 index 0000000..07d5739 --- /dev/null +++ b/src/globals.h @@ -0,0 +1,8 @@ +#ifndef SEODISPARATE_COM_C_SIMPLE_HTTP_GLOBALS_H_ +#define SEODISPARATE_COM_C_SIMPLE_HTTP_GLOBALS_H_ + +extern int C_SIMPLE_HTTP_KEEP_RUNNING; + +#endif + +// vim: ts=2 sts=2 sw=2 diff --git a/src/main.c b/src/main.c index 640eed9..6c99773 100644 --- a/src/main.c +++ b/src/main.c @@ -4,161 +4,18 @@ #include // Unix includes. -#include -#include -#include -#include -#include #include #include -#define C_SIMPLE_HTTP_TCP_SOCKET_BACKLOG 64 +// Local includes. +#include "arg_parse.h" +#include "big_endian.h" +#include "tcp_socket.h" +#include "signal_handling.h" +#include "globals.h" + #define C_SIMPLE_HTTP_SLEEP_NANOS 1000000 -static int C_SIMPLE_HTTP_KEEP_RUNNING = 1; - -void C_SIMPLE_HTTP_handle_sigint(int signal) { - if (signal == SIGINT) { -#ifndef NDEBUG - puts("Handling SIGINT"); -#endif - C_SIMPLE_HTTP_KEEP_RUNNING = 0; - } -} - -typedef struct Args { - unsigned short flags; - unsigned short port; -} Args; - -int is_big_endian(void) { - union { - int i; - char c[4]; - } bint = {0x01020304}; - - return bint.c[0] == 1 ? 1 : 0; -} - -unsigned short u16_be_swap(unsigned short value) { - if (is_big_endian()) { - return value; - } else { - return ((value >> 8) & 0xFF) | ((value << 8) & 0xFF00); - } -} - -int create_tcp_socket(unsigned short port) { - struct sockaddr_in6 ipv6_addr; - memset(&ipv6_addr, 0, sizeof(struct sockaddr_in6)); - ipv6_addr.sin6_family = AF_INET6; - ipv6_addr.sin6_port = u16_be_swap(port); - ipv6_addr.sin6_addr = in6addr_any; - - int tcp_socket = socket(AF_INET6, SOCK_STREAM | SOCK_NONBLOCK, 6); - - if (tcp_socket == -1) { - switch (errno) { - case EACCES: - puts("ERROR: Socket creation: EACCES"); - break; - case EAFNOSUPPORT: - puts("ERROR: Socket creation: EAFNOSUPPORT"); - break; - case EINVAL: - puts("ERROR: Socket creation: EINVAL"); - break; - case EMFILE: - puts("ERROR: Socket creation: EMFILE"); - break; - case ENOBUFS: - puts("ERROR: Socket creation: ENOBUFS"); - break; - case ENOMEM: - puts("ERROR: Socket creation: ENOMEM"); - break; - case EPROTONOSUPPORT: - puts("ERROR: Socket creation: EPROTONOSUPPORT"); - break; - default: - puts("ERROR: Socket creation: Unknown Error"); - break; - } - return -1; - } - - int ret = bind(tcp_socket, (const struct sockaddr *)&ipv6_addr, sizeof(struct sockaddr_in6)); - if (ret != 0) { - close(tcp_socket); - puts("ERROR: Failed to bind socket!"); - return -1; - } - - ret = listen(tcp_socket, C_SIMPLE_HTTP_TCP_SOCKET_BACKLOG); - - if (ret == 0) { - return tcp_socket; - } else { - switch (errno) { - case EADDRINUSE: - puts("ERROR: Socket listen: EADDRINUSE"); - break; - case EBADF: - puts("ERROR: Socket listen: EBADF"); - break; - case ENOTSOCK: - puts("ERROR: Socket listen: ENOTSOCK"); - break; - default: - puts("ERROR: Socket listen: Unknown Error"); - break; - } - - return -1; - } -} - -void cleanup_tcp_socket(int *tcp_socket) { - if (tcp_socket && *tcp_socket != -1) { - close(*tcp_socket); - *tcp_socket = -1; - } -} - -void print_usage(void) { - puts("Usage:"); - puts(" -p | --port "); -} - -Args parse_args(int argc, char **argv) { - --argc; - ++argv; - - Args args; - memset(&args, 0, sizeof(Args)); - - while (argc > 0) { - if ((strcmp(argv[0], "-p") == 0 || strcmp(argv[0], "--port") == 0) - && argc > 1) { - int value = atoi(argv[1]); - if (value >= 0 && value <= 0xFFFF) { - args.port = (unsigned short) value; - } - --argc; - ++argv; - } else { - puts("ERROR: Invalid args!\n"); - print_usage(); - exit(1); - } - - --argc; - ++argv; - } - - return args; -} - int main(int argc, char **argv) { Args args = parse_args(argc, argv); diff --git a/src/signal_handling.c b/src/signal_handling.c new file mode 100644 index 0000000..69e9ba9 --- /dev/null +++ b/src/signal_handling.c @@ -0,0 +1,21 @@ +#include "signal_handling.h" + +// Standard library includes. +#include + +// Unix includes. +#include + +// Local includes +#include "globals.h" + +void C_SIMPLE_HTTP_handle_sigint(int signal) { + if (signal == SIGINT) { +#ifndef NDEBUG + puts("Handling SIGINT"); +#endif + C_SIMPLE_HTTP_KEEP_RUNNING = 0; + } +} + +// vim: ts=2 sts=2 sw=2 diff --git a/src/signal_handling.h b/src/signal_handling.h new file mode 100644 index 0000000..f9a576d --- /dev/null +++ b/src/signal_handling.h @@ -0,0 +1,8 @@ +#ifndef SEODISPARATE_COM_C_SIMPLE_HTTP_SIGNAL_HANDLING_H_ +#define SEODISPARATE_COM_C_SIMPLE_HTTP_SIGNAL_HANDLING_H_ + +void C_SIMPLE_HTTP_handle_sigint(int signal); + +#endif + +// vim: ts=2 sts=2 sw=2 diff --git a/src/tcp_socket.c b/src/tcp_socket.c new file mode 100644 index 0000000..6a7c2e2 --- /dev/null +++ b/src/tcp_socket.c @@ -0,0 +1,94 @@ +#include "tcp_socket.h" + +// Standard library includes. +#include +#include + +// Unix includes. +#include +#include +#include +#include +#include + +// Local includes. +#include "big_endian.h" + +int create_tcp_socket(unsigned short port) { + struct sockaddr_in6 ipv6_addr; + memset(&ipv6_addr, 0, sizeof(struct sockaddr_in6)); + ipv6_addr.sin6_family = AF_INET6; + ipv6_addr.sin6_port = u16_be_swap(port); + ipv6_addr.sin6_addr = in6addr_any; + + int tcp_socket = socket(AF_INET6, SOCK_STREAM | SOCK_NONBLOCK, 6); + + if (tcp_socket == -1) { + switch (errno) { + case EACCES: + puts("ERROR: Socket creation: EACCES"); + break; + case EAFNOSUPPORT: + puts("ERROR: Socket creation: EAFNOSUPPORT"); + break; + case EINVAL: + puts("ERROR: Socket creation: EINVAL"); + break; + case EMFILE: + puts("ERROR: Socket creation: EMFILE"); + break; + case ENOBUFS: + puts("ERROR: Socket creation: ENOBUFS"); + break; + case ENOMEM: + puts("ERROR: Socket creation: ENOMEM"); + break; + case EPROTONOSUPPORT: + puts("ERROR: Socket creation: EPROTONOSUPPORT"); + break; + default: + puts("ERROR: Socket creation: Unknown Error"); + break; + } + return -1; + } + + int ret = bind(tcp_socket, (const struct sockaddr *)&ipv6_addr, sizeof(struct sockaddr_in6)); + if (ret != 0) { + close(tcp_socket); + puts("ERROR: Failed to bind socket!"); + return -1; + } + + ret = listen(tcp_socket, C_SIMPLE_HTTP_TCP_SOCKET_BACKLOG); + + if (ret == 0) { + return tcp_socket; + } else { + switch (errno) { + case EADDRINUSE: + puts("ERROR: Socket listen: EADDRINUSE"); + break; + case EBADF: + puts("ERROR: Socket listen: EBADF"); + break; + case ENOTSOCK: + puts("ERROR: Socket listen: ENOTSOCK"); + break; + default: + puts("ERROR: Socket listen: Unknown Error"); + break; + } + + return -1; + } +} + +void cleanup_tcp_socket(int *tcp_socket) { + if (tcp_socket && *tcp_socket != -1) { + close(*tcp_socket); + *tcp_socket = -1; + } +} + +// vim: ts=2 sts=2 sw=2 diff --git a/src/tcp_socket.h b/src/tcp_socket.h new file mode 100644 index 0000000..d7ae93e --- /dev/null +++ b/src/tcp_socket.h @@ -0,0 +1,12 @@ +#ifndef SEODISPARATE_COM_C_SIMPLE_HTTP_TCP_SOCKET_H_ +#define SEODISPARATE_COM_C_SIMPLE_HTTP_TCP_SOCKET_H_ + +#define C_SIMPLE_HTTP_TCP_SOCKET_BACKLOG 64 + +int create_tcp_socket(unsigned short port); + +void cleanup_tcp_socket(int *tcp_socket); + +#endif + +// vim: ts=2 sts=2 sw=2