diff --git a/src/common.c b/src/common.c index 73cf24d..52f917f 100644 --- a/src/common.c +++ b/src/common.c @@ -111,3 +111,20 @@ read_password(char *buf, size_t len) strncpy(buf, pwd, len); buf[len-1] = '\0'; } + +int +check_topdomain(char *str) +{ + int i; + + if(str[0] == '.') /* special case */ + return 1; + + for( i = 0; i < strlen(str); i++) { + if( isalpha(str[i]) || isdigit(str[i]) || str[i] == '-' || str[i] == '.' ) + continue; + else + return 1; + } + return 0; +} diff --git a/src/common.h b/src/common.h index e6100ab..eb6f719 100644 --- a/src/common.h +++ b/src/common.h @@ -46,4 +46,6 @@ void do_detach(); void read_password(char*, size_t); +int check_topdomain(char *); + #endif diff --git a/src/iodine.c b/src/iodine.c index 4dc6217..5b23c83 100644 --- a/src/iodine.c +++ b/src/iodine.c @@ -697,8 +697,13 @@ main(int argc, char **argv) set_nameserver(nameserv_addr); - if (strlen(topdomain) > 128 || topdomain[0] == '.') { - warnx("Use a topdomain max 128 chars long. Do not start it with a dot.\n"); + if(strlen(topdomain) <= 128) { + if(check_topdomain(topdomain)) { + warnx("Topdomain contains invalid characters.\n"); + usage(); + } + } else { + warnx("Use a topdomain max 128 chars long.\n"); usage(); } diff --git a/src/iodined.c b/src/iodined.c index ad70777..0d4694d 100644 --- a/src/iodined.c +++ b/src/iodined.c @@ -526,8 +526,13 @@ main(int argc, char **argv) usage(); topdomain = strdup(argv[1]); - if (strlen(topdomain) > 128 || topdomain[0] == '.') { - warnx("Use a topdomain max 128 chars long. Do not start it with a dot.\n"); + if(strlen(topdomain) <= 128) { + if(check_topdomain(topdomain)) { + warnx("Topdomain contains invalid characters.\n"); + usage(); + } + } else { + warnx("Use a topdomain max 128 chars long.\n"); usage(); }