some improvements

This commit is contained in:
ston1th 2017-01-10 22:44:06 +01:00
commit cbfca49ac6

42
ddns.c
View file

@ -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