X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=libs%2Fshttpd%2Fstring.c;fp=libs%2Fshttpd%2Fstring.c;h=44f0094387ba11060995630acb1c713f47525e30;hb=d8ccfe2b3944adf07d35534459cdda19d15217c8;hp=0000000000000000000000000000000000000000;hpb=21f835f30b4e092c847bf4569a00995774f7330e;p=fms.git diff --git a/libs/shttpd/string.c b/libs/shttpd/string.c new file mode 100644 index 0000000..44f0094 --- /dev/null +++ b/libs/shttpd/string.c @@ -0,0 +1,95 @@ +/* + * Copyright (c) 2004-2005 Sergey Lyubka + * All rights reserved + * + * "THE BEER-WARE LICENSE" (Revision 42): + * Sergey Lyubka wrote this file. As long as you retain this notice you + * can do whatever you want with this stuff. If we meet some day, and you think + * this stuff is worth it, you can buy me a beer in return. + */ + +#include "defs.h" + +void +my_strlcpy(register char *dst, register const char *src, size_t n) +{ + for (; *src != '\0' && n > 1; n--) + *dst++ = *src++; + *dst = '\0'; +} + +int +my_strncasecmp(const char *str1, const char *str2, size_t len) +{ + register const unsigned char *s1 = (unsigned char *) str1, + *s2 = (unsigned char *) str2, *e; + int ret; + + for (e = s1 + len - 1; s1 < e && *s1 != '\0' && *s2 != '\0' && + tolower(*s1) == tolower(*s2); s1++, s2++) ; + ret = tolower(*s1) - tolower(*s2); + + return (ret); +} + +char * +my_strndup(const char *ptr, size_t len) +{ + char *p; + + if ((p = malloc(len + 1)) != NULL) + my_strlcpy(p, ptr, len + 1); + + return (p); + +} + +char * +my_strdup(const char *str) +{ + return (my_strndup(str, strlen(str))); +} + +/* + * Sane snprintf(). Acts like snprintf(), but never return -1 or the + * value bigger than supplied buffer. + * Thanks Adam Zeldis to pointing snprintf()-caused vulnerability + * in his audit report. + */ +int +my_snprintf(char *buf, size_t buflen, const char *fmt, ...) +{ + va_list ap; + int n; + + if (buflen == 0) + return (0); + + va_start(ap, fmt); + n = vsnprintf(buf, buflen, fmt, ap); + va_end(ap); + + if (n < 0 || (size_t) n >= buflen) + n = buflen - 1; + buf[n] = '\0'; + + return (n); +} + +/* + * Verify that given file has certain extension + */ +int +match_extension(const char *path, const char *ext_list) +{ + size_t len, path_len; + + path_len = strlen(path); + + FOR_EACH_WORD_IN_LIST(ext_list, len) + if (len < path_len && + !my_strncasecmp(path + path_len - len, ext_list, len)) + return (1); + + return (0); +}