Added argument parser and set all logs to STDERR
This commit is contained in:
73
main.c
73
main.c
@@ -1,6 +1,8 @@
|
||||
#include <stdbool.h>
|
||||
#include <stdio.h>
|
||||
#include <stdint.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include <errno.h>
|
||||
#include <signal.h>
|
||||
@@ -9,6 +11,7 @@
|
||||
|
||||
#include "event_loop.h"
|
||||
#include "server.h"
|
||||
#include "utils.h"
|
||||
|
||||
/*
|
||||
* Data
|
||||
@@ -20,6 +23,54 @@ static int _server_fd = -1;
|
||||
/*
|
||||
* Private API
|
||||
*/
|
||||
// Parse command line arguments and check if mandatory ones are present.
|
||||
// Parameters:
|
||||
// - argc
|
||||
// - argv
|
||||
// Returns:
|
||||
// - true on success
|
||||
// - false on failure
|
||||
bool parse_cli_args(int argc, char** argv) {
|
||||
if (argc < 2) {
|
||||
return false;
|
||||
}
|
||||
int key_length, value_length;
|
||||
int i = 1;
|
||||
char first_sym;
|
||||
while (i < argc) {
|
||||
key_length = strlen(argv[i] + 1);
|
||||
first_sym = argv[i][0];
|
||||
if (key_length != 1 || (first_sym != '+' && first_sym != '-')) {
|
||||
fprintf(stderr, "[!] Argument '%s' is discarded\n", argv[i]);
|
||||
return false;
|
||||
}
|
||||
// flag
|
||||
if (first_sym == '+') {
|
||||
cli_arg_set(argv[i] + 1, argv[i] + 1);
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
// argument
|
||||
if (i + 1 >= argc) {
|
||||
fprintf(stderr, "[!] Argument '%s' misses a value\n", argv[i]);
|
||||
return false;
|
||||
}
|
||||
value_length = strlen(argv[i + 1]);
|
||||
if (value_length < 1) {
|
||||
fprintf(stderr, "[!] Argument '%s' has empty value\n", argv[i]);
|
||||
return false;
|
||||
}
|
||||
cli_arg_set(argv[i] + 1, argv[i + 1]);
|
||||
i += 2;
|
||||
}
|
||||
bool required_args_present = true;
|
||||
required_args_present &= cli_arg_get("M") ? true : false;
|
||||
required_args_present &= cli_arg_get("A") ? true : false;
|
||||
required_args_present &= cli_arg_get("P") ? true : false;
|
||||
required_args_present &= cli_arg_get("E") ? true : false;
|
||||
return required_args_present;
|
||||
}
|
||||
|
||||
// Initialize signals.
|
||||
// Returns:
|
||||
// - true on success
|
||||
@@ -32,7 +83,7 @@ static bool signals_init() {
|
||||
sigaddset(&mask, SIGINT);
|
||||
sigaddset(&mask, SIGQUIT);
|
||||
if (sigprocmask(SIG_BLOCK, &mask, NULL) == -1) {
|
||||
printf("[!] sigprocmask failed: %d\n", errno);
|
||||
fprintf(stderr, "[!] sigprocmask failed: %d\n", errno);
|
||||
return false;
|
||||
}
|
||||
_sig_fd = signalfd(
|
||||
@@ -41,7 +92,7 @@ static bool signals_init() {
|
||||
SFD_NONBLOCK
|
||||
);
|
||||
if (_sig_fd == -1) {
|
||||
printf("[!] signalfd failed: %d\n", errno);
|
||||
fprintf(stderr, "[!] signalfd failed: %d\n", errno);
|
||||
return false;
|
||||
}
|
||||
struct epoll_event ev;
|
||||
@@ -54,7 +105,7 @@ static bool signals_init() {
|
||||
);
|
||||
if (!loop_res) {
|
||||
close(_sig_fd);
|
||||
printf("[!] loop_ctl failed\n");
|
||||
fprintf(stderr, "[!] loop_ctl failed\n");
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
@@ -69,7 +120,7 @@ static void signals_deinit() {
|
||||
// Returns:
|
||||
// - true on success
|
||||
static bool server_init() {
|
||||
_server_fd = server_open("0.0.0.0", 20070);
|
||||
_server_fd = server_open(cli_arg_get("A"), atoi(cli_arg_get("P")));
|
||||
if (_server_fd == -1) {
|
||||
return false;
|
||||
}
|
||||
@@ -83,7 +134,7 @@ static bool server_init() {
|
||||
);
|
||||
if (!loop_res) {
|
||||
server_close();
|
||||
printf("[!] loop_ctl failed\n");
|
||||
fprintf(stderr, "[!] loop_ctl failed\n");
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
@@ -106,16 +157,20 @@ static void on_fd_event(int fd, uint32_t events) {
|
||||
// Server event
|
||||
else if (fd == _server_fd) {
|
||||
if (!server_event(_server_fd)) {
|
||||
printf("[!] server_event failed\n");
|
||||
fprintf(stderr, "[!] server_event failed\n");
|
||||
_to_work = false;
|
||||
}
|
||||
}
|
||||
else {
|
||||
printf("[!] Event has happened on an unknown file descriptor\n");
|
||||
fprintf(stderr, "[!] Event has happened on an unknown file descriptor\n");
|
||||
}
|
||||
}
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
if (!parse_cli_args(argc, argv)) {
|
||||
print_usage_text();
|
||||
return 1;
|
||||
}
|
||||
if (!loop_init(on_fd_event)) {
|
||||
return 1;
|
||||
}
|
||||
@@ -131,10 +186,10 @@ int main(int argc, char **argv) {
|
||||
|
||||
while (_to_work) {
|
||||
if (!loop_wait()) {
|
||||
printf("[!] loop_wait returns false, stopping...\n");
|
||||
fprintf(stderr, "[!] loop_wait returns false, stopping...\n");
|
||||
break;
|
||||
}
|
||||
printf("--- loop ---\n");
|
||||
fprintf(stderr, "--- loop ---\n");
|
||||
}
|
||||
|
||||
server_close();
|
||||
|
||||
Reference in New Issue
Block a user