some improvements
This commit is contained in:
parent
cbfca49ac6
commit
4e2f824d99
1 changed files with 39 additions and 68 deletions
109
ddns.c
109
ddns.c
|
|
@ -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 {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue