From: michael Date: Mon, 22 Dec 2014 14:21:48 +0000 (+0000) Subject: - Add strlcpy() and strlcat() for system that don't have these X-Git-Tag: 1.0.0beta1~74 X-Git-Url: http://git.serene-ircd.net/?a=commitdiff_plain;h=cd296bc0a506b0be1a1253f06b9129fd876a4a09;p=hopm.git - Add strlcpy() and strlcat() for system that don't have these git-svn-id: svn://svn.ircd-hybrid.org/svnroot/hopm/trunk@5064 82007160-df01-0410-b94d-b575c5fd34c7 --- diff --git a/configure b/configure index 39cbc33..d815b85 100755 --- a/configure +++ b/configure @@ -13112,7 +13112,7 @@ fi fi -for ac_func in inet_aton inet_pton socket strdup strstr +for ac_func in strlcpy strlcat inet_aton inet_pton socket strdup strstr do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" diff --git a/configure.ac b/configure.ac index b85b635..9aa6a20 100644 --- a/configure.ac +++ b/configure.ac @@ -62,7 +62,7 @@ AC_SEARCH_LIBS([socket],[socket],,[AC_MSG_ERROR([socket library not found])]) AC_CHECK_FUNC(getaddrinfo, [], AC_SEARCH_LIBS(getaddrinfo, nsl)) AC_CHECK_FUNC(getnameinfo, [], AC_SEARCH_LIBS(getnameinfo, nsl)) -AC_CHECK_FUNCS(inet_aton inet_pton socket strdup strstr) +AC_CHECK_FUNCS(strlcpy strlcat inet_aton inet_pton socket strdup strstr) dnl Check if we can use gethostbyname2 for ipv6 AC_CHECK_FUNCS(gethostbyname gethostbyname2) diff --git a/src/compat.c b/src/compat.c index 2dac373..3686f82 100644 --- a/src/compat.c +++ b/src/compat.c @@ -62,3 +62,98 @@ int bopm_inet_aton(const char *cp, struct in_addr *inp) return 1; } #endif + +/* + * strlcat and strlcpy were ripped from openssh 2.5.1p2 + * They had the following Copyright info: + * + * + * Copyright (c) 1998 Todd C. Miller + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED `AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL + * THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef HAVE_STRLCAT +size_t +strlcat(char *dst, const char *src, size_t siz) +{ + char *d = dst; + const char *s = src; + size_t n = siz, dlen; + + while (n-- != 0 && *d != '\0') + d++; + + dlen = d - dst; + n = siz - dlen; + + if (n == 0) + return dlen + strlen(s); + + while (*s != '\0') + { + if (n != 1) + { + *d++ = *s; + n--; + } + + s++; + } + + *d = '\0'; + return dlen + (s - src); /* count does not include NUL */ +} +#endif + +#ifndef HAVE_STRLCPY +size_t +strlcpy(char *dst, const char *src, size_t siz) +{ + char *d = dst; + const char *s = src; + size_t n = siz; + + /* Copy as many bytes as will fit */ + if (n != 0 && --n != 0) + { + do + { + if ((*d++ = *s++) == 0) + break; + } while (--n != 0); + } + + /* Not enough room in dst, add NUL and traverse rest of src */ + if (n == 0) + { + if (siz != 0) + *d = '\0'; /* NUL-terminate dst */ + while (*s++) + ; + } + + return s - src - 1; /* count does not include NUL */ +} +#endif diff --git a/src/compat.h b/src/compat.h index 8ce2760..781b571 100644 --- a/src/compat.h +++ b/src/compat.h @@ -16,4 +16,12 @@ extern int bopm_inet_aton(const char *cp, struct in_addr *inp); #define inet_pton bopm_inet_pton #endif +#ifndef HAVE_STRLCPY +extern size_t strlcpy(char *, const char *, size_t); +#endif + +#ifndef HAVE_STRLCAT +extern size_t strlcat(char *, const char *, size_t); +#endif + #endif diff --git a/src/dnsbl.c b/src/dnsbl.c index 2ab95d1..8a36a0c 100644 --- a/src/dnsbl.c +++ b/src/dnsbl.c @@ -136,7 +136,7 @@ static void dnsbl_positive(struct scan_struct *ss, struct BlacklistConf *bl, item = p->data; if(item->number == type) { - strncpy(text_type, item->type, sizeof(text_type)); + strlcpy(text_type, item->type, sizeof(text_type)); break; } } diff --git a/src/irc.c b/src/irc.c index 293d8c4..8fcccad 100644 --- a/src/irc.c +++ b/src/irc.c @@ -309,14 +309,11 @@ static void irc_init(void) LIST_FOREACH(node, IRCItem->channels->head) { chan = (struct ChannelConf *) node->data; - strncat(IRC_CHANNELS, chan->name, MSGLENMAX); + strlcat(IRC_CHANNELS, chan->name, sizeof(IRC_CHANNELS)); if(node->next) - strncat(IRC_CHANNELS, ",", MSGLENMAX); + strlcat(IRC_CHANNELS, ",", sizeof(IRC_CHANNELS)); } - IRC_CHANNELS[MSGLENMAX] = '\0'; - - } diff --git a/src/setup.h.in b/src/setup.h.in index bfb18bd..6b190f1 100644 --- a/src/setup.h.in +++ b/src/setup.h.in @@ -48,6 +48,12 @@ /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H +/* Define to 1 if you have the `strlcat' function. */ +#undef HAVE_STRLCAT + +/* Define to 1 if you have the `strlcpy' function. */ +#undef HAVE_STRLCPY + /* Define to 1 if you have the `strstr' function. */ #undef HAVE_STRSTR