init rewrite
This commit is contained in:
		
							parent
							
								
									9a44bc494e
								
							
						
					
					
						commit
						6d828fcffc
					
				
					 100 changed files with 50541 additions and 2707 deletions
				
			
		
							
								
								
									
										52
									
								
								helpers/bind_server.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								helpers/bind_server.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,52 @@
 | 
			
		|||
#include <stdio.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <netdb.h>
 | 
			
		||||
#include <sys/socket.h>
 | 
			
		||||
#include <sys/types.h>
 | 
			
		||||
#include <errno.h>
 | 
			
		||||
 | 
			
		||||
#include <logger.h>
 | 
			
		||||
#include <helpers.h>
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
helper_bind_tcp_server(char* addr, uint16_t port, int max_client_backlog)
 | 
			
		||||
{
 | 
			
		||||
    char port_str[6];
 | 
			
		||||
    sprintf(port_str, "%d", port);
 | 
			
		||||
 | 
			
		||||
    struct addrinfo hints, *res;
 | 
			
		||||
    int fd;
 | 
			
		||||
    int status;
 | 
			
		||||
 | 
			
		||||
    memset(&hints, 0, sizeof hints);
 | 
			
		||||
    hints.ai_family = AF_UNSPEC;
 | 
			
		||||
    hints.ai_socktype = SOCK_STREAM;
 | 
			
		||||
    hints.ai_flags = AI_PASSIVE;
 | 
			
		||||
 | 
			
		||||
    if ((status = getaddrinfo(addr, port_str, &hints, &res)) != 0)
 | 
			
		||||
    {
 | 
			
		||||
        LOG_ERROR("getaddrinfo: %s\n", gai_strerror(status));
 | 
			
		||||
        return -1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fd = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
 | 
			
		||||
 | 
			
		||||
    if ((status = bind(fd, res->ai_addr, res->ai_addrlen)) == -1)
 | 
			
		||||
    {
 | 
			
		||||
        LOG_ERROR("error binding socket: %s\n", strerror(errno));
 | 
			
		||||
        freeaddrinfo(res);
 | 
			
		||||
        return -1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if ((status = listen(fd, max_client_backlog)) == -1)
 | 
			
		||||
    {
 | 
			
		||||
        LOG_ERROR("error setting up listener: %s\n", strerror(errno));
 | 
			
		||||
        freeaddrinfo(res);
 | 
			
		||||
        return -1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    freeaddrinfo(res);
 | 
			
		||||
 | 
			
		||||
    return fd;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1,43 +0,0 @@
 | 
			
		|||
#include <netdb.h>
 | 
			
		||||
#include <trantor/utils/Logger.h>
 | 
			
		||||
#include <helpers.h>
 | 
			
		||||
 | 
			
		||||
#include "config.h"
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
helpers::bind_tcp_server(const char *addr, const char *port, int max_client_backlog)
 | 
			
		||||
{
 | 
			
		||||
    struct addrinfo hints{}, *res;
 | 
			
		||||
    int fd;
 | 
			
		||||
    int status;
 | 
			
		||||
 | 
			
		||||
    memset(&hints, 0, sizeof hints);
 | 
			
		||||
    hints.ai_family = AF_UNSPEC;
 | 
			
		||||
    hints.ai_socktype = SOCK_STREAM;
 | 
			
		||||
    hints.ai_flags = AI_PASSIVE;
 | 
			
		||||
 | 
			
		||||
    if ((status = getaddrinfo(addr, port, &hints, &res)) != 0)
 | 
			
		||||
    {
 | 
			
		||||
        LOG_ERROR << "Error getting address info: " << gai_strerror(status);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fd = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
 | 
			
		||||
 | 
			
		||||
    if ((status = bind(fd, res->ai_addr, res->ai_addrlen)) == -1)
 | 
			
		||||
    {
 | 
			
		||||
        LOG_ERROR << "Error binding socket. " << status;
 | 
			
		||||
        freeaddrinfo(res);
 | 
			
		||||
        return -1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if ((status = listen(fd, max_client_backlog)) == -1)
 | 
			
		||||
    {
 | 
			
		||||
        LOG_ERROR << "Error setting up listener. " << status;
 | 
			
		||||
        freeaddrinfo(res);
 | 
			
		||||
        return -1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    freeaddrinfo(res);
 | 
			
		||||
 | 
			
		||||
    return fd;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										39
									
								
								helpers/connect_server.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								helpers/connect_server.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,39 @@
 | 
			
		|||
#include <stdio.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <netdb.h>
 | 
			
		||||
#include <sys/socket.h>
 | 
			
		||||
 | 
			
		||||
#include <logger.h>
 | 
			
		||||
#include <helpers.h>
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
helper_connect_tcp_server(char* host, uint16_t port)
 | 
			
		||||
{
 | 
			
		||||
    char port_str[6];
 | 
			
		||||
    sprintf(port_str, "%d", port);
 | 
			
		||||
 | 
			
		||||
    int s, status;
 | 
			
		||||
    struct addrinfo hints, *res;
 | 
			
		||||
    memset(&hints, 0, sizeof hints);
 | 
			
		||||
    hints.ai_family = AF_INET; //set IP Protocol flag (IPv4 or IPv6 - we don't care)
 | 
			
		||||
    hints.ai_socktype = SOCK_STREAM; //set socket flag
 | 
			
		||||
 | 
			
		||||
    if ((status = getaddrinfo(host, port_str, &hints, &res)) != 0) { //getaddrinfo() will evaluate the given address, using the hints-flags and port, and return an IP address and other server infos
 | 
			
		||||
        LOG_ERROR("getaddrinfo: %s\n", gai_strerror(status));
 | 
			
		||||
        return -1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    //res got filled out by getaddrinfo() for us
 | 
			
		||||
    s = socket(res->ai_family, res->ai_socktype, res->ai_protocol); //creating Socket
 | 
			
		||||
 | 
			
		||||
    if ((status = connect(s, res->ai_addr, res->ai_addrlen)) != 0) {
 | 
			
		||||
        LOG_ERROR("connect() failed\n");
 | 
			
		||||
        freeaddrinfo(res);
 | 
			
		||||
        return -1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    freeaddrinfo(res);
 | 
			
		||||
 | 
			
		||||
    return s;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1,58 +0,0 @@
 | 
			
		|||
#include <helpers.h>
 | 
			
		||||
#include <drogon/drogon.h>
 | 
			
		||||
#include <globals.h>
 | 
			
		||||
 | 
			
		||||
sqlite3_stmt*
 | 
			
		||||
helpers::create_sql_filtered_query(const char *sql, sql_filter_builder **filters)
 | 
			
		||||
{
 | 
			
		||||
    char *old_query = (char*)sql;
 | 
			
		||||
    char *new_query;
 | 
			
		||||
 | 
			
		||||
    sql_filter_builder *filter;
 | 
			
		||||
    int filter_count = 0;
 | 
			
		||||
 | 
			
		||||
    do
 | 
			
		||||
    {
 | 
			
		||||
        filter = filters[filter_count];
 | 
			
		||||
 | 
			
		||||
        filter_count++;
 | 
			
		||||
        asprintf(&new_query, " %s %s=?%d %s", old_query, filter->col_name, filter_count, filter->logic);
 | 
			
		||||
 | 
			
		||||
        if(old_query != sql)
 | 
			
		||||
        {
 | 
			
		||||
            free(old_query);
 | 
			
		||||
        }
 | 
			
		||||
        old_query = new_query;
 | 
			
		||||
    } while(filter->logic[0] != ';');
 | 
			
		||||
 | 
			
		||||
    sqlite3_stmt *stmt;
 | 
			
		||||
 | 
			
		||||
    sqlite3_prepare_v2(globals::db, new_query, -1, &stmt, nullptr);
 | 
			
		||||
 | 
			
		||||
    free(new_query);
 | 
			
		||||
 | 
			
		||||
    for(int i = 0; i < filter_count; i++)
 | 
			
		||||
    {
 | 
			
		||||
        filter = filters[i];
 | 
			
		||||
 | 
			
		||||
        if(filter->bind_func == (intptr_t)&sqlite3_bind_int)
 | 
			
		||||
        {
 | 
			
		||||
            sqlite3_bind_int(stmt, i + 1, (int)(intptr_t)filter->value);
 | 
			
		||||
        }
 | 
			
		||||
        if(filter->bind_func == (intptr_t)&sqlite3_bind_text)
 | 
			
		||||
        {
 | 
			
		||||
            sqlite3_bind_text(stmt, i + 1, (char*)filter->value, -1, SQLITE_STATIC);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return stmt;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
helpers::sql_filter_builder::sql_filter_builder(const char *col_name, const void *value, intptr_t bind_func,
 | 
			
		||||
                                                const char *logic)
 | 
			
		||||
{
 | 
			
		||||
    this->col_name = col_name;
 | 
			
		||||
    this->value = value;
 | 
			
		||||
    this->bind_func = bind_func;
 | 
			
		||||
    this->logic = logic;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										12
									
								
								helpers/get_day_of_week.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								helpers/get_day_of_week.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,12 @@
 | 
			
		|||
#include <time.h>
 | 
			
		||||
 | 
			
		||||
#include <helpers.h>
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
helper_get_weekday(const time_t timestamp_now)
 | 
			
		||||
{
 | 
			
		||||
    struct tm *now = localtime(×tamp_now);
 | 
			
		||||
    int wday_sun_sat = now->tm_wday;
 | 
			
		||||
    int wday_mon_sun = (wday_sun_sat + 6) % 7;
 | 
			
		||||
    return wday_mon_sun;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										24
									
								
								helpers/get_port.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								helpers/get_port.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,24 @@
 | 
			
		|||
#include <sys/socket.h>
 | 
			
		||||
#include <arpa/inet.h>
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
#include <errno.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
 | 
			
		||||
#include <helpers.h>
 | 
			
		||||
#include <logger.h>
 | 
			
		||||
 | 
			
		||||
uint16_t
 | 
			
		||||
helper_get_port(int sock)
 | 
			
		||||
{
 | 
			
		||||
    struct sockaddr_in sin;
 | 
			
		||||
    socklen_t len = sizeof(sin);
 | 
			
		||||
    if (getsockname(sock, (struct sockaddr *)&sin, &len) == -1)
 | 
			
		||||
    {
 | 
			
		||||
        LOG_ERROR("could not get socket name for port: %s\n", strerror(errno));
 | 
			
		||||
        return 0;
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
        return ntohs(sin.sin_port);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1,18 +0,0 @@
 | 
			
		|||
#include <netdb.h>
 | 
			
		||||
#include <helpers.h>
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
helpers::get_server_port(int fd)
 | 
			
		||||
{
 | 
			
		||||
    if(fd == -1)
 | 
			
		||||
    {
 | 
			
		||||
        return -1;
 | 
			
		||||
    }
 | 
			
		||||
    struct sockaddr_in sin{};
 | 
			
		||||
    socklen_t addr_len = sizeof(sin);
 | 
			
		||||
    if(getsockname(fd, (struct sockaddr *)&sin, &addr_len) == 0)
 | 
			
		||||
    {
 | 
			
		||||
        return ntohs(sin.sin_port);
 | 
			
		||||
    }
 | 
			
		||||
    return -1;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1,63 +0,0 @@
 | 
			
		|||
#include <helpers.h>
 | 
			
		||||
#include <globals.h>
 | 
			
		||||
#include <drogon/trantor/trantor/utils/Logger.h>
 | 
			
		||||
 | 
			
		||||
#include <config.h>
 | 
			
		||||
 | 
			
		||||
#include <sql/migration_0.h>
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
helpers::migrate_sql()
 | 
			
		||||
{
 | 
			
		||||
    uint16_t version_num = 0;
 | 
			
		||||
    int s, rc;
 | 
			
		||||
    sqlite3_stmt *stmt;
 | 
			
		||||
    sqlite3_prepare_v2(globals::db, "SELECT version_num FROM meta LIMIT 1;", -1, &stmt, nullptr);
 | 
			
		||||
    s = sqlite3_step(stmt);
 | 
			
		||||
    if (s == SQLITE_ROW)
 | 
			
		||||
    {
 | 
			
		||||
        version_num = sqlite3_column_int(stmt, 0);
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
        version_num = 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    uint16_t new_version_num = version_num;
 | 
			
		||||
    char* err_msg;
 | 
			
		||||
    char* sql;
 | 
			
		||||
 | 
			
		||||
    sqlite3_finalize(stmt);
 | 
			
		||||
 | 
			
		||||
    switch(version_num)
 | 
			
		||||
    {
 | 
			
		||||
        case 0:
 | 
			
		||||
            rc = sqlite3_exec(globals::db, (const char *)sql_migration_0_sql, nullptr, nullptr, &err_msg);
 | 
			
		||||
            if(rc != 0)
 | 
			
		||||
            {
 | 
			
		||||
                LOG_FATAL << "Couldn't migrate LEVEL 0 (" << err_msg << ")";
 | 
			
		||||
                break;
 | 
			
		||||
            }
 | 
			
		||||
            new_version_num = 1;
 | 
			
		||||
        default:
 | 
			
		||||
            break;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if(version_num == 0)
 | 
			
		||||
    {
 | 
			
		||||
        sqlite3_prepare_v2(globals::db, "INSERT INTO meta (version_num) VALUES (?1);", -1, &stmt, nullptr);
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
        sqlite3_prepare_v2(globals::db, "UPDATE meta SET version_num=?1;", -1, &stmt, nullptr);
 | 
			
		||||
    }
 | 
			
		||||
    sqlite3_bind_int(stmt, 1, new_version_num);
 | 
			
		||||
 | 
			
		||||
    rc = sqlite3_step(stmt);
 | 
			
		||||
    if (rc != SQLITE_DONE)
 | 
			
		||||
    {
 | 
			
		||||
        LOG_FATAL << "Couldn't write new Schema Version";
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return rc == SQLITE_DONE;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										57
									
								
								helpers/open_discovery_socket.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										57
									
								
								helpers/open_discovery_socket.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,57 @@
 | 
			
		|||
#include <stdio.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <errno.h>
 | 
			
		||||
#include <netdb.h>
 | 
			
		||||
#include <sys/socket.h>
 | 
			
		||||
 | 
			
		||||
#include <logger.h>
 | 
			
		||||
#include <helpers.h>
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
helper_open_discovery_socket(uint16_t discovery_port)
 | 
			
		||||
{
 | 
			
		||||
    struct addrinfo hints, *res;
 | 
			
		||||
    int fd, status;
 | 
			
		||||
 | 
			
		||||
    memset(&hints, 0, sizeof hints);
 | 
			
		||||
    hints.ai_family = AF_INET; // use ipv4
 | 
			
		||||
    hints.ai_socktype = SOCK_DGRAM; //set socket flag
 | 
			
		||||
    hints.ai_flags = AI_PASSIVE; // get my IP
 | 
			
		||||
 | 
			
		||||
    char discovery_port_str[6];
 | 
			
		||||
    sprintf(discovery_port_str, "%u", discovery_port);
 | 
			
		||||
 | 
			
		||||
    //get connection info for our computer
 | 
			
		||||
    if ((status = getaddrinfo(NULL, discovery_port_str, &hints, &res)) != 0)
 | 
			
		||||
    {
 | 
			
		||||
        LOG_FATAL("getaddrinfo: %s\n", gai_strerror(status));
 | 
			
		||||
        freeaddrinfo(res);
 | 
			
		||||
        exit(EXIT_FAILURE);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    //creating socket
 | 
			
		||||
    fd = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
 | 
			
		||||
    int yes = 1;
 | 
			
		||||
 | 
			
		||||
    // lose the pesky "Address already in use" error message
 | 
			
		||||
    if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes)) == -1)
 | 
			
		||||
    {
 | 
			
		||||
        LOG_FATAL("setsockopt: %s\n", strerror(errno));
 | 
			
		||||
        freeaddrinfo(res);
 | 
			
		||||
        exit(EXIT_FAILURE);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (bind(fd, res->ai_addr, res->ai_addrlen) == -1)
 | 
			
		||||
    {
 | 
			
		||||
        LOG_FATAL("bind: %s\n", strerror(errno));
 | 
			
		||||
        freeaddrinfo(res);
 | 
			
		||||
        exit(EXIT_FAILURE);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    freeaddrinfo(res);
 | 
			
		||||
 | 
			
		||||
    LOG_INFO("opened discovery socket on port %u\n", discovery_port);
 | 
			
		||||
 | 
			
		||||
    return fd;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1,33 +0,0 @@
 | 
			
		|||
#include <helpers.h>
 | 
			
		||||
#include <netdb.h>
 | 
			
		||||
#include <trantor/utils/Logger.h>
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
helpers::open_tcp_connection(char *host, char *port)
 | 
			
		||||
{
 | 
			
		||||
    int s, status;
 | 
			
		||||
    struct addrinfo hints{}, *res;
 | 
			
		||||
    memset(&hints, 0, sizeof hints);
 | 
			
		||||
    hints.ai_family = AF_INET;
 | 
			
		||||
    hints.ai_socktype = SOCK_STREAM;
 | 
			
		||||
 | 
			
		||||
    if ((status = getaddrinfo(host, port, &hints, &res)) != 0)
 | 
			
		||||
    {
 | 
			
		||||
        LOG_ERROR << "Error getting address info: " << gai_strerror(status);
 | 
			
		||||
        freeaddrinfo(res);
 | 
			
		||||
        return 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    s = socket(res->ai_family, res->ai_socktype, res->ai_protocol); //creating Socket
 | 
			
		||||
 | 
			
		||||
    if ((status = connect(s, res->ai_addr, res->ai_addrlen)) != 0)
 | 
			
		||||
    {
 | 
			
		||||
        LOG_ERROR << "Error opening connection " << status;
 | 
			
		||||
        freeaddrinfo(res);
 | 
			
		||||
        return 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    freeaddrinfo(res);
 | 
			
		||||
 | 
			
		||||
    return s;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										62
									
								
								helpers/parse_cli.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										62
									
								
								helpers/parse_cli.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,62 @@
 | 
			
		|||
#include <stdlib.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
 | 
			
		||||
#include <argparse.h>
 | 
			
		||||
#include <config.h>
 | 
			
		||||
#include <logger.h>
 | 
			
		||||
#include <helpers.h>
 | 
			
		||||
 | 
			
		||||
static const char *const usage[] = {
 | 
			
		||||
    "controller [options] [[--] args]",
 | 
			
		||||
    "controller [options]",
 | 
			
		||||
    NULL,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#define PERM_READ  (1<<0)
 | 
			
		||||
#define PERM_WRITE (1<<1)
 | 
			
		||||
#define PERM_EXEC  (1<<2)
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
helper_parse_cli(int argc, const char **argv, config_t *config)
 | 
			
		||||
{
 | 
			
		||||
    struct argparse_option options[] =
 | 
			
		||||
    {
 | 
			
		||||
        OPT_HELP(),
 | 
			
		||||
        OPT_GROUP("Basic options"),
 | 
			
		||||
        OPT_STRING('c', "config", &config->file, "path to config file", NULL, 0, OPT_NONEG),
 | 
			
		||||
 | 
			
		||||
        OPT_END(),
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    struct argparse argparse;
 | 
			
		||||
    argparse_init(&argparse, options, usage, 0);
 | 
			
		||||
    argparse_describe(
 | 
			
		||||
            &argparse,
 | 
			
		||||
            "\nA brief description of what the program does and how it works.",
 | 
			
		||||
            "\nAdditional description of the program after the description of the arguments."
 | 
			
		||||
    );
 | 
			
		||||
    argc = argparse_parse(&argparse, argc, argv);
 | 
			
		||||
 | 
			
		||||
    if(argc == 1)
 | 
			
		||||
    {
 | 
			
		||||
        if(strcmp(argv[0], "start") == 0)
 | 
			
		||||
        {
 | 
			
		||||
            config->run_type = RUN_TYPE_START;
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
        if(strcmp(argv[0], "test") == 0)
 | 
			
		||||
        {
 | 
			
		||||
            config->run_type = RUN_TYPE_TEST;
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
        LOG_FATAL("bad action '%s' given ('start', 'test')\n", argv[0]);
 | 
			
		||||
        exit(1);
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
        LOG_FATAL("no action given ('start', 'test')\n");
 | 
			
		||||
        exit(1);
 | 
			
		||||
    }
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1,68 +0,0 @@
 | 
			
		|||
#include <helpers.h>
 | 
			
		||||
#include <drogon/drogon.h>
 | 
			
		||||
#include <models/period_list.h>
 | 
			
		||||
 | 
			
		||||
static int
 | 
			
		||||
parse_HHMM(const char *begin, uint16_t *h, uint16_t *m)
 | 
			
		||||
{
 | 
			
		||||
    uint16_t tmp_h, tmp_m;
 | 
			
		||||
    char *check = nullptr;
 | 
			
		||||
 | 
			
		||||
    tmp_h = (uint16_t)strtol(begin, &check, 10);
 | 
			
		||||
    if(begin == check)
 | 
			
		||||
    {
 | 
			
		||||
        return 1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    begin = check + 1;
 | 
			
		||||
    tmp_m = (uint16_t)strtol(begin, &check, 10);
 | 
			
		||||
    if(begin == check)
 | 
			
		||||
    {
 | 
			
		||||
        return 1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    *h = tmp_h;
 | 
			
		||||
    *m = tmp_m;
 | 
			
		||||
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
period_list*
 | 
			
		||||
helpers::parse_periods(Json::Value periods_json)
 | 
			
		||||
{
 | 
			
		||||
    auto result = new period_list();
 | 
			
		||||
 | 
			
		||||
    for (Json::Value::ArrayIndex i = 0; i != periods_json.size(); i++)
 | 
			
		||||
    {
 | 
			
		||||
        Json::Value p = periods_json[i];
 | 
			
		||||
        if(!(p.isMember("start") && p.isMember("end")))
 | 
			
		||||
        {
 | 
			
		||||
            continue;
 | 
			
		||||
        }
 | 
			
		||||
        const char *start_str = p["start"].asCString();
 | 
			
		||||
        const char *end_str = p["end"].asCString();
 | 
			
		||||
 | 
			
		||||
        uint16_t h, m, start, end;
 | 
			
		||||
 | 
			
		||||
        if(parse_HHMM(start_str, &h, &m))
 | 
			
		||||
        {
 | 
			
		||||
            continue;
 | 
			
		||||
        }
 | 
			
		||||
        start = (uint16_t)((h * 60) + m);
 | 
			
		||||
 | 
			
		||||
        if(parse_HHMM(end_str, &h, &m))
 | 
			
		||||
        {
 | 
			
		||||
            continue;
 | 
			
		||||
        }
 | 
			
		||||
        end = (uint16_t)((h * 60) + m);
 | 
			
		||||
 | 
			
		||||
        if(start < 0 || start > 24 * 60 || end < 0 || end > 24 * 60)
 | 
			
		||||
        {
 | 
			
		||||
            continue;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        result->add_period(start, end);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return result;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1,39 +0,0 @@
 | 
			
		|||
#include <arpa/inet.h>
 | 
			
		||||
#include <trantor/utils/Logger.h>
 | 
			
		||||
#include "config.h"
 | 
			
		||||
#include <unistd.h>
 | 
			
		||||
#include <helpers.h>
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
helpers::send_udp_broadcast(const char *addr, uint16_t port, const char* message)
 | 
			
		||||
{
 | 
			
		||||
    struct sockaddr_in their_addr{};
 | 
			
		||||
    int fd;
 | 
			
		||||
 | 
			
		||||
    if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
 | 
			
		||||
    {
 | 
			
		||||
        LOG_ERROR << "Error creating socket";
 | 
			
		||||
        return -1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    int broadcast = 1;
 | 
			
		||||
    if (setsockopt(fd, SOL_SOCKET, SO_BROADCAST, &broadcast, sizeof broadcast) < 0)
 | 
			
		||||
    {
 | 
			
		||||
        LOG_ERROR << "Error setting broadcast";
 | 
			
		||||
        return -1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    memset(&their_addr, 0, sizeof(their_addr));
 | 
			
		||||
    their_addr.sin_family = AF_INET;
 | 
			
		||||
    their_addr.sin_port = htons(port);
 | 
			
		||||
    their_addr.sin_addr.s_addr = inet_addr(addr);
 | 
			
		||||
 | 
			
		||||
    if(sendto(fd, message, strlen(message), 0, (struct sockaddr *)&their_addr, sizeof(their_addr)) < 0)
 | 
			
		||||
    {
 | 
			
		||||
        LOG_ERROR << "Error sending broadcast " << errno << " " << strerror(errno);
 | 
			
		||||
        return -1;
 | 
			
		||||
    }
 | 
			
		||||
    close(fd);
 | 
			
		||||
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue