diff options
Diffstat (limited to 'libpkgconf/bsdstubs.c')
| -rw-r--r-- | libpkgconf/bsdstubs.c | 174 |
1 files changed, 42 insertions, 132 deletions
diff --git a/libpkgconf/bsdstubs.c b/libpkgconf/bsdstubs.c index a5291f7a5a93..7ef3556364c0 100644 --- a/libpkgconf/bsdstubs.c +++ b/libpkgconf/bsdstubs.c @@ -1,105 +1,7 @@ -/* $OpenBSD: strlcpy.c,v 1.10 2005/08/08 08:05:37 espie Exp $ */ -/* $OpenBSD: strlcat.c,v 1.12 2005/03/30 20:13:52 otto Exp $ */ - /* - * Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com> - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. + * SPDX-License-Identifier: pkgconf * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -#include <stdlib.h> -#include <sys/types.h> -#include <string.h> -#include <errno.h> -#ifndef _WIN32 -#include <unistd.h> -#endif - -#include <libpkgconf/bsdstubs.h> -#include <libpkgconf/config.h> - -#if !HAVE_DECL_STRLCPY -/* - * Copy src to string dst of size siz. At most siz-1 characters - * will be copied. Always NUL terminates (unless siz == 0). - * Returns strlen(src); if retval >= siz, truncation occurred. - */ -static inline 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) { - while (--n != 0) { - if ((*d++ = *s++) == '\0') - break; - } - } - - /* 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 - -#if !HAVE_DECL_STRLCAT -/* - * Appends src to string dst of size siz (unlike strncat, siz is the - * full size of dst, not space left). At most siz-1 characters - * will be copied. Always NUL terminates (unless siz <= strlen(dst)). - * Returns strlen(src) + MIN(siz, strlen(initial dst)). - * If retval >= siz, truncation occurred. - */ -static inline size_t -strlcat(char *dst, const char *src, size_t siz) -{ - char *d = dst; - const char *s = src; - size_t n = siz; - size_t dlen; - - /* Find the end of dst and adjust bytes left but don't go past end */ - 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 - -/* - * Copyright (c) 2012 William Pitcock <nenolod@dereferenced.org>. + * Copyright (c) 2012 Ariadne Conill <ariadne@dereferenced.org> * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -110,23 +12,39 @@ strlcat(char *dst, const char *src, size_t siz) * from the use of this software. */ -#if !HAVE_DECL_STRNDUP +#include <libpkgconf/stdinc.h> +#include <libpkgconf/bsdstubs.h> +#include <libpkgconf/config.h> + +#if HAVE_DECL_STRNDUP +# define pkgconf_strndup_impl strndup +#else /* * Creates a memory buffer and copies at most 'len' characters to it. * If 'len' is less than the length of the source string, truncation occured. */ static inline char * -strndup(const char *src, size_t len) +pkgconf_strndup_impl(const char *src, size_t len) { - char *out = malloc(len + 1); - pkgconf_strlcpy(out, src, len + 1); + const char *end = memchr(src, '\0', len); + size_t n = end != NULL ? (size_t)(end - src) : len; + char *out = malloc(n + 1); + + if (out == NULL) + return NULL; + + memcpy(out, src, n); + out[n] = '\0'; + return out; } #endif -#if !HAVE_DECL_PLEDGE +#if HAVE_DECL_PLEDGE +# define pkgconf_pledge_impl pledge +#else static inline int -pledge(const char *promises, const char *execpromises) +pkgconf_pledge_impl(const char *promises, const char *execpromises) { (void) promises; (void) execpromises; @@ -135,9 +53,11 @@ pledge(const char *promises, const char *execpromises) } #endif -#if !HAVE_DECL_UNVEIL +#if HAVE_DECL_UNVEIL +# define pkgconf_unveil_impl unveil +#else static inline int -unveil(const char *path, const char *permissions) +pkgconf_unveil_impl(const char *path, const char *permissions) { (void) path; (void) permissions; @@ -146,27 +66,11 @@ unveil(const char *path, const char *permissions) } #endif -size_t -pkgconf_strlcpy(char *dst, const char *src, size_t siz) -{ - return strlcpy(dst, src, siz); -} - -size_t -pkgconf_strlcat(char *dst, const char *src, size_t siz) -{ - return strlcat(dst, src, siz); -} - -char * -pkgconf_strndup(const char *src, size_t len) -{ - return strndup(src, len); -} - -#if !HAVE_DECL_REALLOCARRAY -void * -reallocarray(void *ptr, size_t m, size_t n) +#if HAVE_DECL_REALLOCARRAY +# define pkgconf_reallocarray_impl reallocarray +#else +static inline void * +pkgconf_reallocarray_impl(void *ptr, size_t m, size_t n) { if (n && m > -1 / n) { @@ -178,20 +82,26 @@ reallocarray(void *ptr, size_t m, size_t n) } #endif +char * +pkgconf_strndup(const char *src, size_t len) +{ + return pkgconf_strndup_impl(src, len); +} + void * pkgconf_reallocarray(void *ptr, size_t m, size_t n) { - return reallocarray(ptr, m, n); + return pkgconf_reallocarray_impl(ptr, m, n); } int pkgconf_pledge(const char *promises, const char *execpromises) { - return pledge(promises, execpromises); + return pkgconf_pledge_impl(promises, execpromises); } int pkgconf_unveil(const char *path, const char *permissions) { - return unveil(path, permissions); + return pkgconf_unveil_impl(path, permissions); } |
