EGong

An UDP Multicast messaging application
git clone git://xatko.vsos.ethz.ch/EGong.git
Log | Files | Refs

commit 6e58fb19843fbba2125cc6f05be69aa6143ee56d
parent a65525ad47984fc98be4f75440755f028a352bc5
Author: Dominik Schmidt <das1993@hotmail.com>
Date:   Sun, 14 Sep 2014 12:13:59 +0200

String_Ex type added, command engine extended.

Diffstat:
include/Packet.h | 4++--
include/Util/Command.h | 6+++++-
include/Util/Config.h | 5+++--
include/Util/Misc.h | 7+++++++
src/Interfaces/CMD.c | 22+++++++++++++++++++++-
src/Packet.c | 8++++----
src/Util/Command.c | 58++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
src/Util/Config.c | 6+++---
src/Util/Socket.c | 2+-
9 files changed, 104 insertions(+), 14 deletions(-)

diff --git a/include/Packet.h b/include/Packet.h @@ -23,10 +23,10 @@ struct EGong_packet{ }; -extern int EGong_calculate_package_hash(struct EGong_packet *packet, unsigned char *dest, char *cookie); +extern int EGong_calculate_package_hash(struct EGong_packet *packet, unsigned char *dest, String *cookie); extern int EGong_generate_packet(struct EGong_packet *packet, const String *msg); extern int EGong_send_packet(struct EGong_packet *packet, const char *dest); extern void EGong_packet_free(struct EGong_packet *packet); extern int EGong_packet_alloc(struct EGong_packet *packet, char **dest, unsigned int additional); extern int EGong_get_packet(SOCKET *sock, struct EGong_packet *packet); -extern int EGong_packet_verify(struct EGong_packet *packet, char *cookie); +extern int EGong_packet_verify(struct EGong_packet *packet, String *cookie); diff --git a/include/Util/Command.h b/include/Util/Command.h @@ -16,8 +16,9 @@ enum EGONG_COMMAND_TYPE{ EGONG_COMMAND_FUNC_VOID, EGONG_COMMAND_ARG1, EGONG_COMMAND_BOOL_SET, + EGONG_COMMAND_BIT_SET, EGONG_COMMAND_UINT_SET, - EGONG_COMMAND_STR_SET, + EGONG_COMMAND_STREX_SET, EGONG_COMMAND_FUNC_UINT, EGONG_COMMAND_FUNC_CHAR, EGONG_COMMAND_FUNC_STRING, @@ -48,3 +49,6 @@ extern struct EGong_command *EGong_command_match(struct EGong_command_array *com extern int EGong_command_exec(struct EGong_command *command, void **data); extern void EGong_command_print_help(struct EGong_command_array *commands, int destination, char *appendix); extern unsigned int EGong_command_argc(struct EGong_command *command); + +extern void *EGong_command_exec_from_char(struct EGong_command *command, char **args); +extern void *EGong_command_convert_from_char(struct EGong_command *command, char *arg); diff --git a/include/Util/Config.h b/include/Util/Config.h @@ -3,6 +3,7 @@ #include <stddef.h> #include <stdint.h> #include <EGong/Util/Config_Compiletime.h> +#include <EGong/Util/Misc.h> struct EGong_config_log{ unsigned short int level; @@ -11,14 +12,14 @@ struct EGong_config_log{ }; struct EGong_config_packet{ size_t packet_maxlen; - char *cookie; + String_Ex cookie; }; struct EGong_config_gui{ unsigned int destinations; }; struct EGong_config_server{ unsigned int port; - char *bind_ip; + String_Ex bind_ip; }; struct EGong_config{ struct EGong_config_log log; diff --git a/include/Util/Misc.h b/include/Util/Misc.h @@ -23,6 +23,13 @@ struct String{ char *data; size_t length; }; +struct String_Ex{ + struct String str; + unsigned short int allocd:1; +}; typedef struct String String; +typedef struct String_Ex String_Ex; #define STRING_STATIC(STRING, VALUE) STRING.data=VALUE; STRING.length=sizeof(VALUE); #define STRING_STATIC_INIT(VALUE){.data=VALUE, .length=sizeof(VALUE)} + +#define STRING_EX_STATIC(STRING, VALUE) STRING_STATIC(STRING.str, VALUE); STRING.allocd=0; diff --git a/src/Interfaces/CMD.c b/src/Interfaces/CMD.c @@ -68,6 +68,26 @@ struct EGong_command_if_cmd EGong_if_cmd_commands[]={ }, .execute=EGONG_IF_CMD_CYCLE }, + { + .command={ + .longname="bind-ip", + .shortname="b", + .description="Specifies IP to bind to", + .type={.type=EGONG_COMMAND_STREX_SET, .args=1}, + .pointer=&EGong_global_configuration.server.bind_ip + }, + .execute=EGONG_IF_CMD_SETUP + }, + { + .command={ + .longname="port", + .shortname="p", + .description="Port to listen on", + .type={.type=EGONG_COMMAND_UINT_SET, .args=1}, + .pointer=&EGong_global_configuration.server.port + }, + .execute=EGONG_IF_CMD_SETUP + }, #if defined(USE_GTK) || defined(USE_WINGUI) { .command={ @@ -135,7 +155,7 @@ int EGong_if_cmd_exec(unsigned int execution, struct EGong_interface *interface, continue; } if((command->execute&execution)>0){ - EGong_command_exec((struct EGong_command *)command, (void **)&EGong_global_argv[i+1]); + EGong_command_exec_from_char((struct EGong_command *)command, &EGong_global_argv[i+1]); } i+=command->command.type.args; command=NULL; diff --git a/src/Packet.c b/src/Packet.c @@ -16,15 +16,15 @@ #endif unsigned char EGong_packet_last_hash[EGONG_PACKET_HASH_LENGTH]; -int EGong_calculate_package_hash(struct EGong_packet *packet, unsigned char *dest, char *cookie){ +int EGong_calculate_package_hash(struct EGong_packet *packet, unsigned char *dest, String *cookie){ if(cookie==NULL) - cookie=EGong_global_configuration.packet.cookie; + cookie=(String *)&EGong_global_configuration.packet.cookie; SHA256_CTX sha256; SHA256_Init(&sha256); SHA256_Update(&sha256, packet->message.data, packet->message.length); SHA256_Update(&sha256, packet->rand, EGONG_PACKET_RAND_LENGTH); - SHA256_Update(&sha256, cookie, strlen(cookie)); + SHA256_Update(&sha256, cookie->data, cookie->length); SHA256_Final(dest, &sha256); return 0; @@ -109,7 +109,7 @@ int EGong_packetbuf_alloc(size_t size, char **dest, unsigned int additional){ return 0; } -int EGong_packet_verify(struct EGong_packet *packet, char *cookie){ +int EGong_packet_verify(struct EGong_packet *packet, String *cookie){ unsigned char hash[EGONG_PACKET_HASH_LENGTH]; EGong_calculate_package_hash(packet, hash, cookie); return memcmp(packet->hash,hash,EGONG_PACKET_HASH_LENGTH)==0; diff --git a/src/Util/Command.c b/src/Util/Command.c @@ -3,6 +3,7 @@ #include <EGong/Util/Misc.h> #include <EGong/Interfaces/CMD.h> #include <stdint.h> +#include <stdlib.h> #include <stdio.h> unsigned int EGong_command_argc(struct EGong_command *command){ @@ -48,8 +49,42 @@ void EGong_command_print_help(struct EGong_command_array *commands, int destinat write(destination,"\n", sizeof("\n")); } } +void *EGong_command_exec_from_char(struct EGong_command *command, char **args){ + void *argv[command->type.args]; + unsigned int i=0; + for(i=0; i<command->type.args; i++){ + argv[i]=EGong_command_convert_from_char(command, args[i]); + } + EGong_command_exec(command, argv); +} +void *EGong_command_convert_from_char(struct EGong_command *command, char *arg){ + void *ret=NULL; + switch(command->type.type){ + case EGONG_COMMAND_BOOL_SET: + ret=(void *)(uintptr_t)((*arg=='1') ? 1 : 0); + break; + case EGONG_COMMAND_BIT_SET: + case EGONG_COMMAND_UINT_SET: + case EGONG_COMMAND_FUNC_UINT: + ret=(void *)(uintptr_t)(unsigned int)atoi(arg); + break; + case EGONG_COMMAND_FUNC_POINTER: + do_log("Can't convert char* to pointer", LOG_TYPE_NORMAL, LOG_LEVEL_ERROR); + break; + case EGONG_COMMAND_FUNC_CHAR: + case EGONG_COMMAND_FUNC_2CHAR: + case EGONG_COMMAND_FUNC_STRING: + case EGONG_COMMAND_STREX_SET: + ret=(void *)arg; + break; + } + return ret; +} int EGong_command_exec(struct EGong_command *command, void **data){ String str; + String_Ex *strex; + char *charptr; + size_t len; switch(command->type.type){ case EGONG_COMMAND_BOOL_FALSE: *(unsigned int *)command->pointer=0; @@ -60,6 +95,29 @@ int EGong_command_exec(struct EGong_command *command, void **data){ case EGONG_COMMAND_BOOL_SET: *(unsigned int *)command->pointer=(**(char **)data=='1') ? 1 : 0; break; + case EGONG_COMMAND_STREX_SET: + strex=(String_Ex *)command->pointer; + charptr=((char **)data)[0]; + len=strlen(charptr); + if(strex->str.length<len){ + if(strex->allocd){ + strex->str.data=realloc(strex->str.data, len); + } + else{ + strex->str.data=malloc(len); + } + strex->allocd=1; + } + strncpy(strex->str.data, charptr, len); + break; + case EGONG_COMMAND_BIT_SET: + if(((unsigned int *)data)[1]){ + *(unsigned int *)command->pointer|=((unsigned int *)data)[0]; + } + else{ + *(unsigned int *)command->pointer&=~((unsigned int *)data)[0]; + } + break; case EGONG_COMMAND_UINT_INC: if(*(unsigned int *)command->pointer<=(unsigned int)-1) (*(unsigned int *)command->pointer)++; diff --git a/src/Util/Config.c b/src/Util/Config.c @@ -44,14 +44,14 @@ struct EGong_config_file_entry EGong_configuration_file_interface[EGONG_CONFIG_F }; void EGong_config_set_defaults(struct EGong_config *conf){ conf->log.color=0; - conf->log.level=LOG_LEVEL_INFO; + conf->log.level=LOG_LEVEL_DEBUG; conf->log.destinations=LOG_DEST_STDIO; conf->server.port=4242; - conf->server.bind_ip="0.0.0.0"; + STRING_EX_STATIC(conf->server.bind_ip, "0.0.0.0"); conf->packet.packet_maxlen=1000; - conf->packet.cookie="Derpaherp"; + STRING_EX_STATIC(conf->packet.cookie, "Derpaherp"); conf->gui.destinations=EGONG_CONFIG_GUI_DEST_NOTIFY; } diff --git a/src/Util/Socket.c b/src/Util/Socket.c @@ -105,7 +105,7 @@ int EGong_listener_init(SOCKET *sock, struct EGong_config_server *config){ do_log("Couldn't set listensocket nonblocking",LOG_TYPE_SIGNAL, LOG_LEVEL_ERROR); } #endif - if(EGong_sockaddr_init(&listen_server, config->bind_ip, config->port, AF_INET)<0){ + if(EGong_sockaddr_init(&listen_server, config->bind_ip.str.data, config->port, AF_INET)<0){ do_log("Couldn't initialize address",LOG_TYPE_NORMAL, LOG_LEVEL_ERROR); EGong_socket_close(sock); return -2;