X-Git-Url: http://git.pk910.de/?a=blobdiff_plain;f=ircd%2Fircd_string.c;h=bc4c9c4620cfefe60c4555dd0ef3606f01043ab8;hb=7a4d99a46663018958a866073c4fbb8b26f3cc86;hp=e601613ec57aa98bdedbbea0cd42ea1b03dc8574;hpb=86c7c44bf12024a47fac109fac01c7dbde88fd0d;p=ircu2.10.12-pk.git diff --git a/ircd/ircd_string.c b/ircd/ircd_string.c index e601613..bc4c9c4 100644 --- a/ircd/ircd_string.c +++ b/ircd/ircd_string.c @@ -21,13 +21,60 @@ #include "ircd_string.h" #include "ircd_defs.h" #include "ircd_chattr.h" +#include "ircd_log.h" #include #include +#include /* * include the character attribute tables here */ #include "chattr.tab.c" + +/* + * Disallow a hostname label to contain anything but a [-a-zA-Z0-9]. + * It may not start or end on a '.'. + * A label may not end on a '-', the maximum length of a label is + * 63 characters. + * On top of that (which seems to be the RFC) we demand that the + * top domain does not contain any digits. + */ +static const char* hostExpr = "^([-0-9A-Za-z]*[0-9A-Za-z]\\.)+[A-Za-z]+$"; +static regex_t hostRegex; + +static const char* addrExpr = + "^((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])\\.){1,3}(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])$"; +static regex_t addrRegex; + +int init_string(void) +{ + /* + * initialize matching expressions + * XXX - expressions MUST be correct, don't change expressions + * without testing them. Might be a good idea to exit if these fail, + * important code depends on them. + * TODO: use regerror for an error message + */ + if (regcomp(&hostRegex, hostExpr, REG_EXTENDED | REG_NOSUB)) + return 0; + + if (regcomp(&addrRegex, addrExpr, REG_EXTENDED | REG_NOSUB)) + return 0; + return 1; +} + +int string_is_hostname(const char* str) +{ + assert(0 != str); + return (strlen(str) <= HOSTLEN && 0 == regexec(&hostRegex, str, 0, 0, 0)); +} + +int string_is_address(const char* str) +{ + assert(0 != str); + return (0 == regexec(&addrRegex, str, 0, 0, 0)); +} + /* * strtoken.c *