From 4e2f824d997bae569e5418af3ee7d192ac6384ee Mon Sep 17 00:00:00 2001 From: ston1th Date: Sat, 20 May 2017 11:31:51 +0200 Subject: [PATCH] some improvements --- ddns.c | 109 +++++++++++++++++++++------------------------------------ 1 file changed, 40 insertions(+), 69 deletions(-) diff --git a/ddns.c b/ddns.c index c6107cc..705e7f4 100644 --- a/ddns.c +++ b/ddns.c @@ -6,45 +6,30 @@ #include #include -#define SEP '=' #define MAX_QUERY_LEN 255 -#define MAX_QUERY_ARGS 2 #define IP_LEN 16 #define IP_FILE "ip.txt" #define TOKEN "" -void free_arr(void *arr) { - uintptr_t *a = arr; - while(*a) { - free((void*)*a++); - } - free(arr); -} - -char **parse(const char *str) { - const char *s = str; - char *qs, *token; - char **arr = NULL; - int c = 1, argc = 0; - qs = strdup(s); - while((token = strsep(&qs, "&")) != NULL) { - if(++argc > MAX_QUERY_ARGS) +char *form_value(const char *args, const char *field) { + char *s; + char *token; + char *value; + char *ret = NULL; + size_t len; + len = strlen(field); + s = strdup(args); + while((token = strsep(&s, "&")) != NULL) { + if(strlen(token) < len) + continue; + if(strncmp(field, token, len) == 0) { + value = strchr(token, '='); + ret = strdup(value); break; - c++; - if(arr == NULL) { - arr = malloc(c*sizeof(char *)); - if(arr == NULL) - break; - } else { - arr = realloc(arr, c*sizeof(char *)); - if(arr == NULL) - break; } - arr[c-1] = NULL; - arr[c-2] = strdup(token); } - free(qs); - return(arr); + free(s); + return(ret); } void header() { @@ -73,46 +58,32 @@ int ctc(const char *a, const char *b) { return(ctb(v, 0)); } -int set_ip(char *env, int fd) { - char *ip = NULL, *token = NULL, *tmp = NULL; - int ret = -1, len = 0; - char **arg = parse(env); - char **arr = arg; - if(arg == NULL) - return(0); - for(; *arr; arr++) { - if(strncmp(*arr, "ip", 2) == 0) { - tmp = strchr(*arr, SEP); - if(++tmp == NULL) - continue; - ip = strdup(tmp); - } else if(strncmp(*arr, "token", 5) == 0) { - tmp = strchr(*arr, SEP); - if(++tmp == NULL) - continue; - token = strdup(tmp); - } - } - tmp = NULL; - free_arr(arg); - if(ctc(token, TOKEN) == 1) { - if(ip) { - len = strlen(ip); - if(len >= IP_LEN-1) - len = IP_LEN-1; - write(fd, ip, len); - } - close(fd); - } else - ret = 1; - if(ip) +int set_ip(char *env, int wfd) { + char *ip = NULL, *token = NULL; + int ret = 1; + size_t len; + ip = form_value(env, "ip"); + if(!ip) + return(ret); + token = form_value(env, "token"); + if(!token) free(ip); - if(token) - free(token); + return(ret); + if(ctc(token, TOKEN) == 1) { + len = strlen(ip); + if(len >= IP_LEN-1) + len = IP_LEN-1; + write(wfd, ip, len); + close(wfd); + ret = 0; + } else + ret = 2; + free(ip); + free(token); return(ret); } -char *err_msg[2] = {"wrong input", "wrong token"}; +char *err_msg[2] = {"invalid arguments", "wrong token"}; int main(void) { char *env = NULL; @@ -136,8 +107,8 @@ int main(void) { puts("query longer than 255 bytes"); return(EXIT_SUCCESS); } - if((errn = set_ip(env, wfd)) >= 0) - puts(err_msg[errn]); + if((errn = set_ip(env, wfd)) > 0) + puts(err_msg[errn-1]); else puts("ok"); } else {