some improvements
This commit is contained in:
parent
781006e83b
commit
cbfca49ac6
1 changed files with 29 additions and 13 deletions
42
ddns.c
42
ddns.c
|
|
@ -7,6 +7,8 @@
|
||||||
#include <err.h>
|
#include <err.h>
|
||||||
|
|
||||||
#define SEP '='
|
#define SEP '='
|
||||||
|
#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>"
|
||||||
|
|
@ -23,9 +25,11 @@ char **parse(const char *str) {
|
||||||
const char *s = str;
|
const char *s = str;
|
||||||
char *qs, *token;
|
char *qs, *token;
|
||||||
char **arr = NULL;
|
char **arr = NULL;
|
||||||
int c = 1;
|
int c = 1, argc = 0;
|
||||||
qs = strdup(s);
|
qs = strdup(s);
|
||||||
while((token = strsep(&qs, "&")) != NULL) {
|
while((token = strsep(&qs, "&")) != NULL) {
|
||||||
|
if(++argc > MAX_QUERY_ARGS)
|
||||||
|
break;
|
||||||
c++;
|
c++;
|
||||||
if(arr == NULL) {
|
if(arr == NULL) {
|
||||||
arr = malloc(c*sizeof(char *));
|
arr = malloc(c*sizeof(char *));
|
||||||
|
|
@ -58,9 +62,10 @@ int ctb(unsigned char a, unsigned char b) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int ctc(const char *a, const char *b) {
|
int ctc(const char *a, const char *b) {
|
||||||
if(strlen(a) != strlen(b)) {
|
if(!a || !b)
|
||||||
|
return(0);
|
||||||
|
if(strlen(a) != strlen(b))
|
||||||
return(0);
|
return(0);
|
||||||
}
|
|
||||||
const char *x = a, *y = b;
|
const char *x = a, *y = b;
|
||||||
char v = 0;
|
char v = 0;
|
||||||
while(*x)
|
while(*x)
|
||||||
|
|
@ -69,7 +74,7 @@ int ctc(const char *a, const char *b) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int set_ip(char *env, int fd) {
|
int set_ip(char *env, int fd) {
|
||||||
char *ip, *token, *tmp;
|
char *ip = NULL, *token = NULL, *tmp = NULL;
|
||||||
int ret = -1, len = 0;
|
int ret = -1, len = 0;
|
||||||
char **arg = parse(env);
|
char **arg = parse(env);
|
||||||
char **arr = arg;
|
char **arr = arg;
|
||||||
|
|
@ -91,35 +96,46 @@ int set_ip(char *env, int fd) {
|
||||||
tmp = NULL;
|
tmp = NULL;
|
||||||
free_arr(arg);
|
free_arr(arg);
|
||||||
if(ctc(token, TOKEN) == 1) {
|
if(ctc(token, TOKEN) == 1) {
|
||||||
len = strlen(ip);
|
if(ip) {
|
||||||
if(len >= IP_LEN-1)
|
len = strlen(ip);
|
||||||
len = IP_LEN-1;
|
if(len >= IP_LEN-1)
|
||||||
write(fd, ip, len);
|
len = IP_LEN-1;
|
||||||
|
write(fd, ip, len);
|
||||||
|
}
|
||||||
close(fd);
|
close(fd);
|
||||||
} else
|
} else
|
||||||
ret = 1;
|
ret = 1;
|
||||||
free(token);
|
if(ip)
|
||||||
free(ip);
|
free(ip);
|
||||||
|
if(token)
|
||||||
|
free(token);
|
||||||
return(ret);
|
return(ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
char *err_msg[2] = {"wrong input", "wrong token"};
|
char *err_msg[2] = {"wrong input", "wrong token"};
|
||||||
|
|
||||||
int main(void) {
|
int main(void) {
|
||||||
char *env;
|
char *env = NULL;
|
||||||
char ip[IP_LEN];
|
char ip[IP_LEN];
|
||||||
int errn = 0, len = 0;
|
int errn = 0, len = 0;
|
||||||
int rfd = open(IP_FILE, O_RDONLY|O_SHLOCK);
|
int rfd, wfd;
|
||||||
|
if((rfd = open(IP_FILE, O_RDONLY|O_SHLOCK)) == -1)
|
||||||
|
err(EXIT_FAILURE, "read open failed");
|
||||||
if(read(rfd, &ip, IP_LEN) <= 0)
|
if(read(rfd, &ip, IP_LEN) <= 0)
|
||||||
ip[0] = '\0';
|
ip[0] = '\0';
|
||||||
close(rfd);
|
close(rfd);
|
||||||
ip[IP_LEN] = '\0';
|
ip[IP_LEN] = '\0';
|
||||||
int wfd = open(IP_FILE, O_WRONLY|O_CREAT|O_TRUNC|O_EXLOCK);
|
if((wfd = open(IP_FILE, O_WRONLY|O_CREAT|O_TRUNC|O_EXLOCK)) == -1)
|
||||||
|
err(EXIT_FAILURE, "rw open failed");
|
||||||
if(pledge("stdio", NULL) == -1)
|
if(pledge("stdio", NULL) == -1)
|
||||||
err(EXIT_FAILURE, "pledge");
|
err(EXIT_FAILURE, "pledge");
|
||||||
env = getenv("QUERY_STRING");
|
env = getenv("QUERY_STRING");
|
||||||
header();
|
header();
|
||||||
if(env != NULL) {
|
if(env != NULL) {
|
||||||
|
if(strlen(env) > MAX_QUERY_LEN) {
|
||||||
|
puts("query longer than 255 bytes");
|
||||||
|
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]);
|
||||||
else
|
else
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue