some improvements

This commit is contained in:
ston1th 2017-05-20 11:31:51 +02:00
commit 4e2f824d99

109
ddns.c
View file

@ -6,45 +6,30 @@
#include <sys/file.h> #include <sys/file.h>
#include <err.h> #include <err.h>
#define SEP '='
#define MAX_QUERY_LEN 255 #define MAX_QUERY_LEN 255
#define MAX_QUERY_ARGS 2
#define IP_LEN 16 #define IP_LEN 16
#define IP_FILE "ip.txt" #define IP_FILE "ip.txt"
#define TOKEN "<empty>" #define TOKEN "<empty>"
void free_arr(void *arr) { char *form_value(const char *args, const char *field) {
uintptr_t *a = arr; char *s;
while(*a) { char *token;
free((void*)*a++); char *value;
} char *ret = NULL;
free(arr); size_t len;
} len = strlen(field);
s = strdup(args);
char **parse(const char *str) { while((token = strsep(&s, "&")) != NULL) {
const char *s = str; if(strlen(token) < len)
char *qs, *token; continue;
char **arr = NULL; if(strncmp(field, token, len) == 0) {
int c = 1, argc = 0; value = strchr(token, '=');
qs = strdup(s); ret = strdup(value);
while((token = strsep(&qs, "&")) != NULL) {
if(++argc > MAX_QUERY_ARGS)
break; 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); free(s);
return(arr); return(ret);
} }
void header() { void header() {
@ -73,46 +58,32 @@ int ctc(const char *a, const char *b) {
return(ctb(v, 0)); return(ctb(v, 0));
} }
int set_ip(char *env, int fd) { int set_ip(char *env, int wfd) {
char *ip = NULL, *token = NULL, *tmp = NULL; char *ip = NULL, *token = NULL;
int ret = -1, len = 0; int ret = 1;
char **arg = parse(env); size_t len;
char **arr = arg; ip = form_value(env, "ip");
if(arg == NULL) if(!ip)
return(0); return(ret);
for(; *arr; arr++) { token = form_value(env, "token");
if(strncmp(*arr, "ip", 2) == 0) { if(!token)
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)
free(ip); free(ip);
if(token) return(ret);
free(token); 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); return(ret);
} }
char *err_msg[2] = {"wrong input", "wrong token"}; char *err_msg[2] = {"invalid arguments", "wrong token"};
int main(void) { int main(void) {
char *env = NULL; char *env = NULL;
@ -136,8 +107,8 @@ int main(void) {
puts("query longer than 255 bytes"); puts("query longer than 255 bytes");
return(EXIT_SUCCESS); return(EXIT_SUCCESS);
} }
if((errn = set_ip(env, wfd)) >= 0) if((errn = set_ip(env, wfd)) > 0)
puts(err_msg[errn]); puts(err_msg[errn-1]);
else else
puts("ok"); puts("ok");
} else { } else {