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:
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;