mirror of
https://gitlab.freedesktop.org/libbsd/libbsd.git
synced 2025-10-19 21:16:55 +02:00
Compare commits
65 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
2462cd8888 | ||
![]() |
d54ceb37ce | ||
![]() |
847e682f8d | ||
![]() |
68f980c90d | ||
![]() |
37a9b56c05 | ||
![]() |
45dd5229ea | ||
![]() |
01f0d1ea1e | ||
![]() |
9c85d828a1 | ||
![]() |
eac4ce0c67 | ||
![]() |
5ecff0c903 | ||
![]() |
8c5a83d678 | ||
![]() |
d5b04ab19c | ||
![]() |
cfeafeabad | ||
![]() |
3d6b6ead64 | ||
![]() |
eb445425ff | ||
![]() |
59f6a95609 | ||
![]() |
3548c5f6bf | ||
![]() |
a11c98a6b5 | ||
![]() |
5745ca0362 | ||
![]() |
9628798d7d | ||
![]() |
f34a5f71d9 | ||
![]() |
72c68868c8 | ||
![]() |
a4323f2b16 | ||
![]() |
4997efa59a | ||
![]() |
96202c6c14 | ||
![]() |
61d378f5e9 | ||
![]() |
9d917aad37 | ||
![]() |
18662cadfc | ||
![]() |
ce53f7c25f | ||
![]() |
24d1f4dd34 | ||
![]() |
e9529d9b4a | ||
![]() |
3aaedb1208 | ||
![]() |
2c754f435b | ||
![]() |
ee4d24970a | ||
![]() |
8d2afa3a9f | ||
![]() |
e9f6faf3aa | ||
![]() |
99320b9168 | ||
![]() |
71c710e9a8 | ||
![]() |
21f4052c5b | ||
![]() |
1899e2c5ab | ||
![]() |
4803340802 | ||
![]() |
f99b8ea527 | ||
![]() |
4bed48398f | ||
![]() |
2e071c3cc1 | ||
![]() |
890699a78b | ||
![]() |
b0ebb0d4c2 | ||
![]() |
73aea4f808 | ||
![]() |
7cfa2d4530 | ||
![]() |
574c7a1365 | ||
![]() |
c2d9d84088 | ||
![]() |
2ebe6d5a02 | ||
![]() |
aeea1f4083 | ||
![]() |
0500a1bd08 | ||
![]() |
3d9c6c08ed | ||
![]() |
b9dee9f69a | ||
![]() |
81c3c3e405 | ||
![]() |
5e0998fa4f | ||
![]() |
8e2d55047c | ||
![]() |
13c32916b4 | ||
![]() |
8e834cd068 | ||
![]() |
e354f9b1d0 | ||
![]() |
4c5e9b478e | ||
![]() |
005b509061 | ||
![]() |
a8531ad051 | ||
![]() |
c4b0fd2c9f |
9
.gitlab-ci.yml
Normal file
9
.gitlab-ci.yml
Normal file
@@ -0,0 +1,9 @@
|
||||
image: debian:stretch
|
||||
|
||||
test:
|
||||
before_script:
|
||||
- apt update -qq
|
||||
- apt install -qq -y --no-install-recommends git gcc make autoconf automake libtool
|
||||
script:
|
||||
- ./autogen && ./configure
|
||||
- make check
|
28
COPYING
28
COPYING
@@ -3,7 +3,7 @@ Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
|
||||
Files:
|
||||
*
|
||||
Copyright:
|
||||
Copyright © 2004-2006, 2008-2018 Guillem Jover <guillem@hadrons.org>
|
||||
Copyright © 2004-2006, 2008-2021 Guillem Jover <guillem@hadrons.org>
|
||||
License: BSD-3-clause
|
||||
|
||||
Files:
|
||||
@@ -74,16 +74,18 @@ License: BSD-4-clause-Christopher-G-Demetriou
|
||||
Files:
|
||||
include/bsd/err.h
|
||||
include/bsd/stdlib.h
|
||||
include/bsd/sys/param.h
|
||||
include/bsd/unistd.h
|
||||
src/bsd_getopt.c
|
||||
src/err.c
|
||||
src/fgetln.c
|
||||
src/progname.c
|
||||
Copyright:
|
||||
Copyright © 2005, 2008-2012 Guillem Jover <guillem@hadrons.org>
|
||||
Copyright © 2005, 2008-2012, 2019 Guillem Jover <guillem@hadrons.org>
|
||||
Copyright © 2005 Hector Garcia Alvarez
|
||||
Copyright © 2005 Aurelien Jarno
|
||||
Copyright © 2006 Robert Millan
|
||||
Copyright © 2018 Facebook, Inc.
|
||||
License: BSD-3-clause
|
||||
|
||||
Files:
|
||||
@@ -103,6 +105,7 @@ Files:
|
||||
man/getbsize.3bsd
|
||||
man/heapsort.3bsd
|
||||
man/nlist.3bsd
|
||||
man/pwcache.3bsd
|
||||
man/queue.3bsd
|
||||
man/radixsort.3bsd
|
||||
man/reallocarray.3bsd
|
||||
@@ -119,6 +122,7 @@ Files:
|
||||
src/heapsort.c
|
||||
src/merge.c
|
||||
src/nlist.c
|
||||
src/pwcache.c
|
||||
src/radixsort.c
|
||||
src/setmode.c
|
||||
src/strmode.c
|
||||
@@ -129,6 +133,7 @@ Files:
|
||||
Copyright:
|
||||
Copyright © 1980, 1982, 1986, 1989-1994
|
||||
The Regents of the University of California. All rights reserved.
|
||||
Copyright © 1992 Keith Muller.
|
||||
Copyright © 2001 Mike Barcroft <mike@FreeBSD.org>
|
||||
.
|
||||
Some code is derived from software contributed to Berkeley by
|
||||
@@ -273,8 +278,6 @@ Files:
|
||||
man/getpeereid.3bsd
|
||||
man/pidfile.3bsd
|
||||
src/expand_number.c
|
||||
src/hash/sha512.h
|
||||
src/hash/sha512c.c
|
||||
src/pidfile.c
|
||||
src/reallocf.c
|
||||
src/timeconv.c
|
||||
@@ -366,6 +369,7 @@ Files:
|
||||
src/arc4random_unix.h
|
||||
src/arc4random_win.h
|
||||
src/closefrom.c
|
||||
src/freezero.c
|
||||
src/getentropy_aix.c
|
||||
src/getentropy_bsd.c
|
||||
src/getentropy_hpux.c
|
||||
@@ -376,6 +380,7 @@ Files:
|
||||
src/getentropy_win.c
|
||||
src/readpassphrase.c
|
||||
src/reallocarray.c
|
||||
src/recallocarray.c
|
||||
src/strlcat.c
|
||||
src/strlcpy.c
|
||||
Copyright:
|
||||
@@ -387,7 +392,7 @@ Copyright:
|
||||
Todd C. Miller <Todd.Miller@courtesan.com>
|
||||
Copyright © 2004 Ted Unangst
|
||||
Copyright © 2008 Damien Miller <djm@openbsd.org>
|
||||
Copyright © 2008 Otto Moerbeek <otto@drijf.net>
|
||||
Copyright © 2008, 2010-2011, 2016-2017 Otto Moerbeek <otto@drijf.net>
|
||||
Copyright © 2013 Markus Friedl <markus@openbsd.org>
|
||||
Copyright © 2014 Bob Beck <beck@obtuse.com>
|
||||
Copyright © 2014 Brent Cook <bcook@openbsd.org>
|
||||
@@ -451,17 +456,6 @@ License: Expat
|
||||
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
||||
USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
Files:
|
||||
include/bsd/md5.h
|
||||
src/hash/md5.c
|
||||
Copyright:
|
||||
None
|
||||
License: public-domain-Colin-Plumb
|
||||
This code implements the MD5 message-digest algorithm.
|
||||
The algorithm is due to Ron Rivest. This code was
|
||||
written by Colin Plumb in 1993, no copyright is claimed.
|
||||
This code is in the public domain; do with it what you wish.
|
||||
|
||||
Files:
|
||||
src/explicit_bzero.c
|
||||
src/chacha_private.h
|
||||
@@ -472,8 +466,6 @@ License: public-domain
|
||||
|
||||
Files:
|
||||
man/mdX.3bsd
|
||||
src/hash/md5hl.c
|
||||
src/hash/helper.c
|
||||
Copyright:
|
||||
None
|
||||
License: Beerware
|
||||
|
3
README
3
README
@@ -5,6 +5,9 @@ and lacking on others like GNU systems, thus making it easier to port
|
||||
projects with strong BSD origins, without needing to embed the same
|
||||
code over and over again on each project.
|
||||
|
||||
A BSD compatible message-digest library is required, on systems where
|
||||
this is not provided by its libc or libmd libraries, the canonical
|
||||
implementation to use is <https://www.hadrons.org/software/libmd/>.
|
||||
|
||||
Releases
|
||||
--------
|
||||
|
2
TODO
2
TODO
@@ -1,3 +1,4 @@
|
||||
* Migrate portable functions from GNU/kFreeBSD's libfreebsd.
|
||||
* Add more functions used by ported packages (check openssh).
|
||||
* Add more unit tests.
|
||||
* Add missing man pages.
|
||||
@@ -5,7 +6,6 @@
|
||||
- timeconv?
|
||||
* Add a README.import file.
|
||||
* Update man pages:
|
||||
- Fix references to a.out(5) and inline needed struct definitions.
|
||||
- Document when each interface was added on every BSD, and libbsd.
|
||||
* Handle LFS properly. By default the library emits LFS objects, but might
|
||||
be used by non-LFS objects. We should either provide foo and foo64
|
||||
|
66
configure.ac
66
configure.ac
@@ -12,8 +12,8 @@ m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])],
|
||||
[AC_SUBST([AM_DEFAULT_VERBOSITY], [1])])
|
||||
|
||||
LIBBSD_ABI_MAJOR=0
|
||||
LIBBSD_ABI_MINOR=9
|
||||
LIBBSD_ABI_PATCH=1
|
||||
LIBBSD_ABI_MINOR=11
|
||||
LIBBSD_ABI_PATCH=0
|
||||
|
||||
LIBBSD_ABI="$LIBBSD_ABI_MAJOR:$LIBBSD_ABI_MINOR:$LIBBSD_ABI_PATCH"
|
||||
AC_SUBST([LIBBSD_ABI])
|
||||
@@ -27,6 +27,25 @@ AC_SYS_LARGEFILE
|
||||
|
||||
LT_INIT
|
||||
|
||||
AC_CACHE_CHECK([if ld supports --version-script flag],
|
||||
[libbsd_cv_version_script], [
|
||||
echo "{ global: symbol; local: *; };" >conftest.map
|
||||
save_LDFLAGS=$LDFLAGS
|
||||
LDFLAGS="$LDFLAGS -Wl,--version-script=conftest.map"
|
||||
AC_LINK_IFELSE([
|
||||
AC_LANG_PROGRAM([], [])
|
||||
], [
|
||||
libbsd_cv_version_script=yes
|
||||
], [
|
||||
libbsd_cv_version_script=no
|
||||
])
|
||||
LDFLAGS="$save_LDFLAGS"
|
||||
rm -f conftest.map
|
||||
]
|
||||
)
|
||||
AM_CONDITIONAL([HAVE_LINKER_VERSION_SCRIPT],
|
||||
[test "x$libbsd_cv_version_script" = "xyes"])
|
||||
|
||||
# Checks for programs.
|
||||
AC_PROG_CC
|
||||
AC_PROG_INSTALL
|
||||
@@ -44,11 +63,27 @@ AC_SUBST([TESTU01_LIBS])
|
||||
AM_CONDITIONAL([HAVE_LIBTESTU01],
|
||||
[test "x$ac_cv_lib_testu01_unif01_CreateExternGenBits" = "xyes"])
|
||||
|
||||
saved_LIBS="$LIBS"
|
||||
AC_SEARCH_LIBS([MD5Update], [md], [
|
||||
AC_SEARCH_LIBS([SHA512Update], [md], [
|
||||
MD_LIBS="-lmd"
|
||||
])
|
||||
], [
|
||||
AC_MSG_ERROR([cannot find required message digest functions in libc or libmd])
|
||||
])
|
||||
AC_SUBST([MD_LIBS])
|
||||
LIBS="$saved_LIBS"
|
||||
|
||||
is_windows=no
|
||||
AS_CASE([$host_os],
|
||||
[*-gnu*], [
|
||||
# In old glibc versions (< 2.17) clock_gettime() is in librt.
|
||||
saved_LIBS="$LIBS"
|
||||
AC_SEARCH_LIBS([clock_gettime], [rt], [CLOCK_GETTIME_LIBS="-lrt"])
|
||||
AC_SEARCH_LIBS([clock_gettime], [rt], [
|
||||
AS_IF([test "x$ac_cv_search_clock_gettime" != "xnone required"], [
|
||||
CLOCK_GETTIME_LIBS="$ac_cv_search_clock_gettime"
|
||||
])
|
||||
])
|
||||
AC_SUBST([CLOCK_GETTIME_LIBS])
|
||||
LIBS="$saved_LIBS"
|
||||
],
|
||||
@@ -56,10 +91,14 @@ AS_CASE([$host_os],
|
||||
# Upstream refuses to define this, we will do it ourselves then.
|
||||
AC_DEFINE([__MUSL__], [1], [Define to 1 if we are building for musl])
|
||||
],
|
||||
[mingw*], [
|
||||
is_windows=yes
|
||||
],
|
||||
)
|
||||
AM_CONDITIONAL([OS_WINDOWS], [test "x$is_windows" = "xyes"])
|
||||
|
||||
# Checks for header files.
|
||||
AC_CHECK_HEADERS([sys/ndir.h sys/dir.h ndir.h dirent.h])
|
||||
AC_CHECK_HEADERS([sys/ndir.h sys/dir.h ndir.h dirent.h pwd.h grp.h])
|
||||
|
||||
# Checks for typedefs, structures, and compiler characteristics.
|
||||
AC_C_INLINE
|
||||
@@ -87,7 +126,7 @@ AC_CACHE_CHECK(
|
||||
[[
|
||||
static int rc = 1;
|
||||
static void init(int argc) { if (argc == 1) rc = 0; }
|
||||
void (*init_func)(int argc) __attribute__((section(".init_array"))) = init;
|
||||
void (*init_func)(int argc) __attribute__((__section__(".init_array"))) = init;
|
||||
int main() { return rc; }
|
||||
]]
|
||||
)],
|
||||
@@ -141,6 +180,23 @@ AC_LINK_IFELSE(
|
||||
AC_MSG_RESULT([yes])],
|
||||
[AC_MSG_RESULT([no])])
|
||||
|
||||
AC_MSG_CHECKING([for __register_atfork])
|
||||
AC_LINK_IFELSE(
|
||||
[AC_LANG_PROGRAM([[
|
||||
#include <stddef.h>
|
||||
extern void *__dso_handle;
|
||||
extern int __register_atfork(void (*)(void), void(*)(void), void (*)(void), void *);
|
||||
]], [[
|
||||
__register_atfork(NULL, NULL, NULL, __dso_handle);
|
||||
]])],
|
||||
[AC_DEFINE([HAVE___REGISTER_ATFORK], [1],
|
||||
[Define to 1 if you have __register_atfork])
|
||||
AC_MSG_RESULT([yes])],
|
||||
[ARC4RANDOM_ATFORK_LIBS="-pthread"
|
||||
AC_SUBST([ARC4RANDOM_ATFORK_LIBS])
|
||||
AC_MSG_RESULT([no])
|
||||
])
|
||||
|
||||
AC_CHECK_FUNCS([clearenv dirfd fopencookie __fpurge \
|
||||
getauxval getentropy getexecname getline \
|
||||
pstat_getproc sysconf])
|
||||
|
@@ -4,6 +4,7 @@ nobase_include_HEADERS = \
|
||||
bsd/sys/bitstring.h \
|
||||
bsd/sys/cdefs.h \
|
||||
bsd/sys/endian.h \
|
||||
bsd/sys/param.h \
|
||||
bsd/sys/poll.h \
|
||||
bsd/sys/queue.h \
|
||||
bsd/sys/time.h \
|
||||
@@ -13,10 +14,12 @@ nobase_include_HEADERS = \
|
||||
bsd/bsd.h \
|
||||
bsd/err.h \
|
||||
bsd/getopt.h \
|
||||
bsd/grp.h \
|
||||
bsd/inttypes.h \
|
||||
bsd/libutil.h \
|
||||
bsd/md5.h \
|
||||
bsd/nlist.h \
|
||||
bsd/pwd.h \
|
||||
bsd/readpassphrase.h \
|
||||
bsd/stdio.h \
|
||||
bsd/stdlib.h \
|
||||
|
@@ -26,31 +26,56 @@
|
||||
*/
|
||||
|
||||
#ifdef LIBBSD_OVERLAY
|
||||
#include <sys/cdefs.h>
|
||||
#if __has_include_next(<err.h>)
|
||||
#include_next <err.h>
|
||||
#else
|
||||
#define LIBBSD_NEED_ERR_H_FUNCS
|
||||
#endif
|
||||
#else
|
||||
#include <bsd/sys/cdefs.h>
|
||||
#if __has_include(<err.h>)
|
||||
#include <err.h>
|
||||
#else
|
||||
#define LIBBSD_NEED_ERR_H_FUNCS
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef LIBBSD_ERR_H
|
||||
#define LIBBSD_ERR_H
|
||||
|
||||
#ifdef LIBBSD_OVERLAY
|
||||
#include <sys/cdefs.h>
|
||||
#else
|
||||
#include <bsd/sys/cdefs.h>
|
||||
#endif
|
||||
|
||||
#include <stdarg.h>
|
||||
|
||||
__BEGIN_DECLS
|
||||
void warnc(int code, const char *format, ...)
|
||||
__printflike(2, 3);
|
||||
void vwarnc(int code, const char *format, va_list ap)
|
||||
__printflike(2, 0);
|
||||
void errc(int status, int code, const char *format, ...)
|
||||
__printflike(3, 4);
|
||||
void warnc(int code, const char *format, ...)
|
||||
__printflike(2, 3);
|
||||
|
||||
void verrc(int status, int code, const char *format, va_list ap)
|
||||
__printflike(3, 0);
|
||||
__printflike(3, 0) __dead2;
|
||||
void errc(int status, int code, const char *format, ...)
|
||||
__printflike(3, 4) __dead2;
|
||||
|
||||
#ifdef LIBBSD_NEED_ERR_H_FUNCS
|
||||
void vwarn(const char *format, va_list ap)
|
||||
__printflike(1, 0);
|
||||
void vwarnx(const char *format, va_list ap)
|
||||
__printflike(1, 0);
|
||||
void warn(const char *format, ...)
|
||||
__printflike(1, 2);
|
||||
void warnx(const char *format, ...)
|
||||
__printflike(1, 2);
|
||||
|
||||
void verr(int status, const char *format, va_list ap)
|
||||
__printflike(2, 0) __dead2;
|
||||
void verrx(int status, const char *format, va_list ap)
|
||||
__printflike(2, 0) __dead2;
|
||||
void err(int status, const char *format, ...)
|
||||
__printflike(2, 3) __dead2;
|
||||
void errx(int status, const char *format, ...)
|
||||
__printflike(2, 3) __dead2;
|
||||
#endif
|
||||
__END_DECLS
|
||||
|
||||
#endif
|
||||
|
@@ -25,9 +25,15 @@
|
||||
*/
|
||||
|
||||
#ifdef LIBBSD_OVERLAY
|
||||
#include <sys/cdefs.h>
|
||||
#if __has_include_next(<getopt.h>)
|
||||
#include_next <getopt.h>
|
||||
#endif
|
||||
#include <unistd.h>
|
||||
#else
|
||||
#include <bsd/sys/cdefs.h>
|
||||
#if __has_include(<getopt.h>)
|
||||
#include <getopt.h>
|
||||
#endif
|
||||
#include <bsd/unistd.h>
|
||||
#endif
|
||||
|
51
include/bsd/grp.h
Normal file
51
include/bsd/grp.h
Normal file
@@ -0,0 +1,51 @@
|
||||
/*
|
||||
* Copyright © 2021 Guillem Jover <guillem@hadrons.org>
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifdef LIBBSD_OVERLAY
|
||||
#include <sys/cdefs.h>
|
||||
#if __has_include_next(<grp.h>)
|
||||
#include_next <grp.h>
|
||||
#endif
|
||||
#else
|
||||
#include <bsd/sys/cdefs.h>
|
||||
#if __has_include(<grp.h>)
|
||||
#include <grp.h>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef LIBBSD_GRP_H
|
||||
#define LIBBSD_GRP_H
|
||||
|
||||
#define _GR_BUF_LEN (1024 + 200 * sizeof(char *))
|
||||
|
||||
__BEGIN_DECLS
|
||||
int
|
||||
gid_from_group(const char *, gid_t *);
|
||||
const char *
|
||||
group_from_gid(gid_t, int);
|
||||
__END_DECLS
|
||||
|
||||
#endif
|
@@ -1,58 +1,31 @@
|
||||
/* $OpenBSD: md5.h,v 1.16 2004/06/22 01:57:30 jfb Exp $ */
|
||||
|
||||
/*
|
||||
* This code implements the MD5 message-digest algorithm.
|
||||
* The algorithm is due to Ron Rivest. This code was
|
||||
* written by Colin Plumb in 1993, no copyright is claimed.
|
||||
* This code is in the public domain; do with it what you wish.
|
||||
* Copyright © 2021 Guillem Jover <guillem@hadrons.org>
|
||||
*
|
||||
* Equivalent code is available from RSA Data Security, Inc.
|
||||
* This code has been tested against that, and is equivalent,
|
||||
* except that you don't need to include two pages of legalese
|
||||
* with every copy.
|
||||
* 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 LIBBSD_MD5_H
|
||||
#define LIBBSD_MD5_H
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#define MD5_BLOCK_LENGTH 64
|
||||
#define MD5_DIGEST_LENGTH 16
|
||||
#define MD5_DIGEST_STRING_LENGTH (MD5_DIGEST_LENGTH * 2 + 1)
|
||||
|
||||
typedef struct MD5Context {
|
||||
uint32_t state[4]; /* state */
|
||||
uint64_t count; /* number of bits, mod 2^64 */
|
||||
uint8_t buffer[MD5_BLOCK_LENGTH]; /* input buffer */
|
||||
} MD5_CTX;
|
||||
|
||||
#ifdef LIBBSD_OVERLAY
|
||||
#include <sys/cdefs.h>
|
||||
#include_next <md5.h>
|
||||
#else
|
||||
#include <bsd/sys/cdefs.h>
|
||||
#include <md5.h>
|
||||
#endif
|
||||
#include <sys/types.h>
|
||||
|
||||
__BEGIN_DECLS
|
||||
void MD5Init(MD5_CTX *);
|
||||
void MD5Update(MD5_CTX *, const uint8_t *, size_t)
|
||||
__attribute__((__bounded__(__string__,2,3)));
|
||||
void MD5Pad(MD5_CTX *);
|
||||
void MD5Final(uint8_t [MD5_DIGEST_LENGTH], MD5_CTX *)
|
||||
__attribute__((__bounded__(__minbytes__,1,MD5_DIGEST_LENGTH)));
|
||||
void MD5Transform(uint32_t [4], const uint8_t [MD5_BLOCK_LENGTH])
|
||||
__attribute__((__bounded__(__minbytes__,1,4)))
|
||||
__attribute__((__bounded__(__minbytes__,2,MD5_BLOCK_LENGTH)));
|
||||
char *MD5End(MD5_CTX *, char *)
|
||||
__attribute__((__bounded__(__minbytes__,2,MD5_DIGEST_STRING_LENGTH)));
|
||||
char *MD5File(const char *, char *)
|
||||
__attribute__((__bounded__(__minbytes__,2,MD5_DIGEST_STRING_LENGTH)));
|
||||
char *MD5FileChunk(const char *, char *, off_t, off_t)
|
||||
__attribute__((__bounded__(__minbytes__,2,MD5_DIGEST_STRING_LENGTH)));
|
||||
char *MD5Data(const uint8_t *, size_t, char *)
|
||||
__attribute__((__bounded__(__string__,1,2)))
|
||||
__attribute__((__bounded__(__minbytes__,3,MD5_DIGEST_STRING_LENGTH)));
|
||||
__END_DECLS
|
||||
|
||||
#endif /* LIBBSD_MD5_H */
|
||||
|
@@ -36,9 +36,12 @@
|
||||
struct nlist {
|
||||
union {
|
||||
char *n_name;
|
||||
struct n_list *n_next;
|
||||
long n_strx;
|
||||
} n_un;
|
||||
union {
|
||||
char *n_name;
|
||||
struct n_list *n_next;
|
||||
long n_strx;
|
||||
} n_un;
|
||||
};
|
||||
unsigned char n_type;
|
||||
char n_other;
|
||||
short n_desc;
|
||||
|
51
include/bsd/pwd.h
Normal file
51
include/bsd/pwd.h
Normal file
@@ -0,0 +1,51 @@
|
||||
/*
|
||||
* Copyright © 2021 Guillem Jover <guillem@hadrons.org>
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifdef LIBBSD_OVERLAY
|
||||
#include <sys/cdefs.h>
|
||||
#if __has_include_next(<pwd.h>)
|
||||
#include_next <pwd.h>
|
||||
#endif
|
||||
#else
|
||||
#include <bsd/sys/cdefs.h>
|
||||
#if __has_include(<pwd.h>)
|
||||
#include <pwd.h>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef LIBBSD_PWD_H
|
||||
#define LIBBSD_PWD_H
|
||||
|
||||
#define _PW_BUF_LEN 1024 /* length of getpw*_r buffer */
|
||||
|
||||
__BEGIN_DECLS
|
||||
int
|
||||
uid_from_user(const char *, uid_t *);
|
||||
const char *
|
||||
user_from_uid(uid_t, int);
|
||||
__END_DECLS
|
||||
|
||||
#endif
|
@@ -62,7 +62,7 @@ int dehumanize_number(const char *str, int64_t *size);
|
||||
const char *getprogname(void);
|
||||
void setprogname(const char *);
|
||||
|
||||
int heapsort (void *, size_t, size_t, int (*)(const void *, const void *));
|
||||
int heapsort(void *, size_t, size_t, int (*)(const void *, const void *));
|
||||
int mergesort(void *base, size_t nmemb, size_t size,
|
||||
int (*cmp)(const void *, const void *));
|
||||
int radixsort(const unsigned char **base, int nmemb,
|
||||
@@ -75,6 +75,8 @@ void *reallocf(void *ptr, size_t size);
|
||||
(defined(__GLIBC__) && (!__GLIBC_PREREQ(2, 26) || !defined(_GNU_SOURCE)))
|
||||
void *reallocarray(void *ptr, size_t nmemb, size_t size);
|
||||
#endif
|
||||
void *recallocarray(void *ptr, size_t oldnmemb, size_t nmemb, size_t size);
|
||||
void freezero(void *ptr, size_t size);
|
||||
|
||||
long long strtonum(const char *nptr, long long minval, long long maxval,
|
||||
const char **errstr);
|
||||
|
@@ -30,6 +30,13 @@
|
||||
#ifndef __has_include_next
|
||||
#define __has_include_next(x) 1
|
||||
#endif
|
||||
#ifndef __has_attribute
|
||||
#define __has_attribute(x) 0
|
||||
#endif
|
||||
/* Clang expands this to 1 if an identifier is *not* reserved. */
|
||||
#ifndef __is_identifier
|
||||
#define __is_identifier(x) 1
|
||||
#endif
|
||||
|
||||
#ifdef LIBBSD_OVERLAY
|
||||
/*
|
||||
@@ -85,22 +92,22 @@
|
||||
#define LIBBSD_GCC_VERSION 0
|
||||
#endif
|
||||
|
||||
#if LIBBSD_GCC_VERSION >= 0x0405
|
||||
#define LIBBSD_DEPRECATED(x) __attribute__((deprecated(x)))
|
||||
#if LIBBSD_GCC_VERSION >= 0x0405 || __has_attribute(__deprecated__)
|
||||
#define LIBBSD_DEPRECATED(x) __attribute__((__deprecated__(x)))
|
||||
#elif LIBBSD_GCC_VERSION >= 0x0301
|
||||
#define LIBBSD_DEPRECATED(x) __attribute__((deprecated))
|
||||
#define LIBBSD_DEPRECATED(x) __attribute__((__deprecated__))
|
||||
#else
|
||||
#define LIBBSD_DEPRECATED(x)
|
||||
#endif
|
||||
|
||||
#if LIBBSD_GCC_VERSION >= 0x0200
|
||||
#if LIBBSD_GCC_VERSION >= 0x0200 || defined(__clang__)
|
||||
#define LIBBSD_REDIRECT(name, proto, alias) name proto __asm__(LIBBSD_ASMNAME(#alias))
|
||||
#endif
|
||||
#define LIBBSD_ASMNAME(cname) LIBBSD_ASMNAME_PREFIX(__USER_LABEL_PREFIX__, cname)
|
||||
#define LIBBSD_ASMNAME_PREFIX(prefix, cname) LIBBSD_STRING(prefix) cname
|
||||
|
||||
#ifndef __dead2
|
||||
# if LIBBSD_GCC_VERSION >= 0x0207
|
||||
# if LIBBSD_GCC_VERSION >= 0x0207 || __has_attribute(__noreturn__)
|
||||
# define __dead2 __attribute__((__noreturn__))
|
||||
# else
|
||||
# define __dead2
|
||||
@@ -108,7 +115,7 @@
|
||||
#endif
|
||||
|
||||
#ifndef __pure2
|
||||
# if LIBBSD_GCC_VERSION >= 0x0207
|
||||
# if LIBBSD_GCC_VERSION >= 0x0207 || __has_attribute(__const__)
|
||||
# define __pure2 __attribute__((__const__))
|
||||
# else
|
||||
# define __pure2
|
||||
@@ -116,7 +123,7 @@
|
||||
#endif
|
||||
|
||||
#ifndef __packed
|
||||
# if LIBBSD_GCC_VERSION >= 0x0207
|
||||
# if LIBBSD_GCC_VERSION >= 0x0207 || __has_attribute(__packed__)
|
||||
# define __packed __attribute__((__packed__))
|
||||
# else
|
||||
# define __packed
|
||||
@@ -124,7 +131,7 @@
|
||||
#endif
|
||||
|
||||
#ifndef __aligned
|
||||
# if LIBBSD_GCC_VERSION >= 0x0207
|
||||
# if LIBBSD_GCC_VERSION >= 0x0207 || __has_attribute(__aligned__)
|
||||
# define __aligned(x) __attribute__((__aligned__(x)))
|
||||
# else
|
||||
# define __aligned(x)
|
||||
@@ -137,7 +144,7 @@
|
||||
#if 0
|
||||
#ifndef __unused
|
||||
# if LIBBSD_GCC_VERSION >= 0x0300
|
||||
# define __unused __attribute__((unused))
|
||||
# define __unused __attribute__((__unused__))
|
||||
# else
|
||||
# define __unused
|
||||
# endif
|
||||
@@ -145,15 +152,15 @@
|
||||
#endif
|
||||
|
||||
#ifndef __printflike
|
||||
# if LIBBSD_GCC_VERSION >= 0x0300
|
||||
# define __printflike(x, y) __attribute((format(printf, (x), (y))))
|
||||
# if LIBBSD_GCC_VERSION >= 0x0300 || __has_attribute(__format__)
|
||||
# define __printflike(x, y) __attribute((__format__(__printf__, (x), (y))))
|
||||
# else
|
||||
# define __printflike(x, y)
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifndef __nonnull
|
||||
# if LIBBSD_GCC_VERSION >= 0x0302
|
||||
# if LIBBSD_GCC_VERSION >= 0x0302 || __has_attribute(__nonnull__)
|
||||
# define __nonnull(x) __attribute__((__nonnull__(x)))
|
||||
# else
|
||||
# define __nonnull(x)
|
||||
@@ -175,7 +182,7 @@
|
||||
* require it.
|
||||
*/
|
||||
#ifndef __offsetof
|
||||
# if LIBBSD_GCC_VERSION >= 0x0401
|
||||
# if LIBBSD_GCC_VERSION >= 0x0401 || !__is_identifier(__builtin_offsetof)
|
||||
# define __offsetof(type, field) __builtin_offsetof(type, field)
|
||||
# else
|
||||
# ifndef __cplusplus
|
||||
@@ -200,9 +207,9 @@
|
||||
* compatible with member m.
|
||||
*/
|
||||
#ifndef __containerof
|
||||
# if LIBBSD_GCC_VERSION >= 0x0301
|
||||
# if LIBBSD_GCC_VERSION >= 0x0301 || !__is_identifier(__typeof__)
|
||||
# define __containerof(x, s, m) ({ \
|
||||
const volatile __typeof(((s *)0)->m) *__x = (x); \
|
||||
const volatile __typeof__(((s *)0)->m) *__x = (x); \
|
||||
__DEQUALIFY(s *, (const volatile char *)__x - __offsetof(s, m)); \
|
||||
})
|
||||
# else
|
||||
|
@@ -27,10 +27,16 @@
|
||||
*/
|
||||
|
||||
#ifdef LIBBSD_OVERLAY
|
||||
#include <sys/cdefs.h>
|
||||
#if __has_include_next(<endian.h>)
|
||||
#include_next <endian.h>
|
||||
#endif
|
||||
#else
|
||||
#include <bsd/sys/cdefs.h>
|
||||
#if __has_include(<endian.h>)
|
||||
#include <endian.h>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef LIBBSD_SYS_ENDIAN_H
|
||||
#define LIBBSD_SYS_ENDIAN_H
|
||||
|
49
include/bsd/sys/param.h
Normal file
49
include/bsd/sys/param.h
Normal file
@@ -0,0 +1,49 @@
|
||||
/*
|
||||
* Copyright © 2018 Facebook, Inc.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifdef LIBBSD_OVERLAY
|
||||
#include <sys/cdefs.h>
|
||||
#if __has_include_next(<sys/param.h>)
|
||||
#include_next <sys/param.h>
|
||||
#endif
|
||||
#else
|
||||
#include <bsd/sys/cdefs.h>
|
||||
#if __has_include(<sys/param.h>)
|
||||
#include <sys/param.h>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef LIBBSD_SYS_PARAM_H
|
||||
#define LIBBSD_SYS_PARAM_H
|
||||
|
||||
#ifndef MIN
|
||||
#define MIN(x, y) (((x) < (y)) ? (x) : (y))
|
||||
#endif
|
||||
#ifndef MAX
|
||||
#define MAX(x, y) (((x) > (y)) ? (x) : (y))
|
||||
#endif
|
||||
|
||||
#endif
|
@@ -33,10 +33,16 @@
|
||||
*/
|
||||
|
||||
#ifdef LIBBSD_OVERLAY
|
||||
#include <sys/cdefs.h>
|
||||
#if __has_include_next(<sys/time.h>)
|
||||
#include_next <sys/time.h>
|
||||
#endif
|
||||
#else
|
||||
#include <bsd/sys/cdefs.h>
|
||||
#if __has_include(<sys/time.h>)
|
||||
#include <sys/time.h>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef LIBBSD_SYS_TIME_H
|
||||
#define LIBBSD_SYS_TIME_H
|
||||
|
@@ -26,22 +26,23 @@
|
||||
*/
|
||||
|
||||
#ifdef LIBBSD_OVERLAY
|
||||
#include <sys/cdefs.h>
|
||||
#if __has_include_next(<unistd.h>)
|
||||
#include_next <unistd.h>
|
||||
#endif
|
||||
#else
|
||||
#include <bsd/sys/cdefs.h>
|
||||
#if __has_include(<unistd.h>)
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef LIBBSD_UNISTD_H
|
||||
#define LIBBSD_UNISTD_H
|
||||
|
||||
#ifdef LIBBSD_OVERLAY
|
||||
#include <sys/cdefs.h>
|
||||
#else
|
||||
#include <bsd/sys/cdefs.h>
|
||||
#endif
|
||||
#include <sys/stat.h>
|
||||
|
||||
#ifndef S_ISTXT
|
||||
#if !defined(S_ISTXT) && defined(S_ISVTX)
|
||||
#define S_ISTXT S_ISVTX
|
||||
#endif
|
||||
|
||||
|
@@ -165,6 +165,7 @@ dist_man_MANS = \
|
||||
fgetln.3bsd \
|
||||
fgetwln.3bsd \
|
||||
flopen.3bsd \
|
||||
freezero.3bsd \
|
||||
fmtcheck.3bsd \
|
||||
fparseln.3bsd \
|
||||
fpurge.3bsd \
|
||||
@@ -173,6 +174,8 @@ dist_man_MANS = \
|
||||
getmode.3bsd \
|
||||
getpeereid.3bsd \
|
||||
getprogname.3bsd \
|
||||
gid_from_group.3bsd \
|
||||
group_from_gid.3bsd \
|
||||
heapsort.3bsd \
|
||||
humanize_number.3bsd \
|
||||
le16dec.3bsd \
|
||||
@@ -190,11 +193,13 @@ dist_man_MANS = \
|
||||
pidfile_open.3bsd \
|
||||
pidfile_remove.3bsd \
|
||||
pidfile_write.3bsd \
|
||||
pwcache.3bsd \
|
||||
queue.3bsd \
|
||||
radixsort.3bsd \
|
||||
readpassphrase.3bsd \
|
||||
reallocarray.3bsd \
|
||||
reallocf.3bsd \
|
||||
recallocarray.3bsd \
|
||||
setmode.3bsd \
|
||||
setproctitle.3bsd \
|
||||
setproctitle_init.3bsd \
|
||||
@@ -223,6 +228,7 @@ dist_man_MANS = \
|
||||
timercmp.3bsd \
|
||||
timerisset.3bsd \
|
||||
timersub.3bsd \
|
||||
timespec.3bsd \
|
||||
timespecadd.3bsd \
|
||||
timespecclear.3bsd \
|
||||
timespeccmp.3bsd \
|
||||
@@ -230,7 +236,9 @@ dist_man_MANS = \
|
||||
timespecsub.3bsd \
|
||||
timeval.3bsd \
|
||||
tree.3bsd \
|
||||
uid_from_user.3bsd \
|
||||
unvis.3bsd \
|
||||
user_from_uid.3bsd \
|
||||
vis.3bsd \
|
||||
wcslcat.3bsd \
|
||||
wcslcpy.3bsd \
|
||||
|
@@ -42,6 +42,7 @@
|
||||
.Nd arc4 random number generator
|
||||
.Sh LIBRARY
|
||||
.ds str-Lb-libbsd Utility functions from BSD systems (libbsd, \-lbsd)
|
||||
.ds doc-str-Lb-libbsd \*[str-Lb-libbsd]
|
||||
.Lb libbsd
|
||||
.Sh SYNOPSIS
|
||||
.In stdlib.h
|
||||
|
@@ -44,6 +44,10 @@
|
||||
.Nm bitstr_size ,
|
||||
.Nm bit_test
|
||||
.Nd bit-string manipulation macros
|
||||
.Sh LIBRARY
|
||||
.ds str-Lb-libbsd Utility functions from BSD systems (libbsd, \-lbsd)
|
||||
.ds doc-str-Lb-libbsd \*[str-Lb-libbsd]
|
||||
.Lb libbsd
|
||||
.Sh SYNOPSIS
|
||||
.In bitstring.h
|
||||
(See
|
||||
|
@@ -31,6 +31,10 @@
|
||||
.Nm be16enc , be16dec , be32enc , be32dec , be64enc , be64dec ,
|
||||
.Nm le16enc , le16dec , le32enc , le32dec , le64enc , le64dec
|
||||
.Nd byte order operations
|
||||
.Sh LIBRARY
|
||||
.ds str-Lb-libbsd Utility functions from BSD systems (libbsd, \-lbsd)
|
||||
.ds doc-str-Lb-libbsd \*[str-Lb-libbsd]
|
||||
.Lb libbsd
|
||||
.Sh SYNOPSIS
|
||||
.In sys/endian.h
|
||||
(See
|
||||
|
@@ -33,6 +33,7 @@
|
||||
.Nd delete open file descriptors
|
||||
.Sh LIBRARY
|
||||
.ds str-Lb-libbsd Utility functions from BSD systems (libbsd, \-lbsd)
|
||||
.ds doc-str-Lb-libbsd \*[str-Lb-libbsd]
|
||||
.Lb libbsd
|
||||
.Sh SYNOPSIS
|
||||
.In unistd.h
|
||||
|
@@ -38,6 +38,7 @@
|
||||
.Nd formatted error messages
|
||||
.Sh LIBRARY
|
||||
.ds str-Lb-libbsd Utility functions from BSD systems (libbsd, \-lbsd)
|
||||
.ds doc-str-Lb-libbsd \*[str-Lb-libbsd]
|
||||
.Lb libbsd
|
||||
.Sh SYNOPSIS
|
||||
.In err.h
|
||||
@@ -144,6 +145,7 @@ if ((fd = open(block_device, O_RDONLY, 0)) == -1)
|
||||
.Xr printf 3 ,
|
||||
.Xr strerror 3
|
||||
.Sh HISTORY
|
||||
.ds doc-operating-system-NetBSD-7.0 7.0
|
||||
The functions
|
||||
.Fn errc ,
|
||||
.Fn verrc ,
|
||||
|
@@ -33,6 +33,7 @@
|
||||
.Nd format a number from human readable form
|
||||
.Sh LIBRARY
|
||||
.ds str-Lb-libbsd Utility functions from BSD systems (libbsd, \-lbsd)
|
||||
.ds doc-str-Lb-libbsd \*[str-Lb-libbsd]
|
||||
.Lb libbsd
|
||||
.Sh SYNOPSIS
|
||||
.In libutil.h
|
||||
|
@@ -37,6 +37,7 @@
|
||||
.Nd write zeroes to a byte string
|
||||
.Sh LIBRARY
|
||||
.ds str-Lb-libbsd Utility functions from BSD systems (libbsd, \-lbsd)
|
||||
.ds doc-str-Lb-libbsd \*[str-Lb-libbsd]
|
||||
.Lb libbsd
|
||||
.Sh SYNOPSIS
|
||||
.In string.h
|
||||
|
@@ -36,6 +36,7 @@
|
||||
.Nd get a line from a stream
|
||||
.Sh LIBRARY
|
||||
.ds str-Lb-libbsd Utility functions from BSD systems (libbsd, \-lbsd)
|
||||
.ds doc-str-Lb-libbsd \*[str-Lb-libbsd]
|
||||
.Lb libbsd
|
||||
.Sh SYNOPSIS
|
||||
.In stdio.h
|
||||
|
@@ -36,6 +36,7 @@
|
||||
.Nd get a line of wide characters from a stream
|
||||
.Sh LIBRARY
|
||||
.ds str-Lb-libbsd Utility functions from BSD systems (libbsd, \-lbsd)
|
||||
.ds doc-str-Lb-libbsd \*[str-Lb-libbsd]
|
||||
.Lb libbsd
|
||||
.Sh SYNOPSIS
|
||||
.In stdio.h
|
||||
|
@@ -34,6 +34,7 @@
|
||||
.Nd "Reliably open and lock a file"
|
||||
.Sh LIBRARY
|
||||
.ds str-Lb-libbsd Utility functions from BSD systems (libbsd, \-lbsd)
|
||||
.ds doc-str-Lb-libbsd \*[str-Lb-libbsd]
|
||||
.Lb libbsd
|
||||
.Sh SYNOPSIS
|
||||
.In sys/fcntl.h
|
||||
|
@@ -34,6 +34,7 @@
|
||||
.Nd sanitizes user-supplied printf(3)-style format string
|
||||
.Sh LIBRARY
|
||||
.ds str-Lb-libbsd Utility functions from BSD systems (libbsd, \-lbsd)
|
||||
.ds doc-str-Lb-libbsd \*[str-Lb-libbsd]
|
||||
.Lb libbsd
|
||||
.Sh SYNOPSIS
|
||||
.In stdio.h
|
||||
|
@@ -30,6 +30,7 @@
|
||||
.Nd return the next logical line from a stream
|
||||
.Sh LIBRARY
|
||||
.ds str-Lb-libbsd Utility functions from BSD systems (libbsd, \-lbsd)
|
||||
.ds doc-str-Lb-libbsd \*[str-Lb-libbsd]
|
||||
.Lb libbsd
|
||||
.Sh SYNOPSIS
|
||||
.In stdio.h
|
||||
|
@@ -39,6 +39,7 @@
|
||||
.Nd flush a stream
|
||||
.Sh LIBRARY
|
||||
.ds str-Lb-libbsd Utility functions from BSD systems (libbsd, \-lbsd)
|
||||
.ds doc-str-Lb-libbsd \*[str-Lb-libbsd]
|
||||
.Lb libbsd
|
||||
.Sh SYNOPSIS
|
||||
.In stdio.h
|
||||
|
1
man/freezero.3bsd
Normal file
1
man/freezero.3bsd
Normal file
@@ -0,0 +1 @@
|
||||
.so man3/reallocarray.3bsd
|
@@ -40,6 +40,7 @@
|
||||
.Nd open a stream
|
||||
.Sh LIBRARY
|
||||
.ds str-Lb-libbsd Utility functions from BSD systems (libbsd, \-lbsd)
|
||||
.ds doc-str-Lb-libbsd \*[str-Lb-libbsd]
|
||||
.Lb libbsd
|
||||
.Sh SYNOPSIS
|
||||
.In stdio.h
|
||||
|
@@ -36,6 +36,7 @@
|
||||
.Nd get preferred block size
|
||||
.Sh LIBRARY
|
||||
.ds str-Lb-libbsd Utility functions from BSD systems (libbsd, \-lbsd)
|
||||
.ds doc-str-Lb-libbsd \*[str-Lb-libbsd]
|
||||
.Lb libbsd
|
||||
.Sh SYNOPSIS
|
||||
.In stdlib.h
|
||||
|
@@ -33,6 +33,7 @@
|
||||
.Nd get the effective credentials of a UNIX-domain peer
|
||||
.Sh LIBRARY
|
||||
.ds str-Lb-libbsd Utility functions from BSD systems (libbsd, \-lbsd)
|
||||
.ds doc-str-Lb-libbsd \*[str-Lb-libbsd]
|
||||
.Lb libbsd
|
||||
.Sh SYNOPSIS
|
||||
.In sys/types.h
|
||||
|
@@ -40,6 +40,7 @@
|
||||
.Nd get or set the program name
|
||||
.Sh LIBRARY
|
||||
.ds str-Lb-libbsd Utility functions from BSD systems (libbsd, \-lbsd)
|
||||
.ds doc-str-Lb-libbsd \*[str-Lb-libbsd]
|
||||
.Lb libbsd
|
||||
.Sh SYNOPSIS
|
||||
.In stdlib.h
|
||||
|
1
man/gid_from_group.3bsd
Normal file
1
man/gid_from_group.3bsd
Normal file
@@ -0,0 +1 @@
|
||||
.so man3/pwcache.3bsd
|
1
man/group_from_gid.3bsd
Normal file
1
man/group_from_gid.3bsd
Normal file
@@ -0,0 +1 @@
|
||||
.so man3/pwcache.3bsd
|
@@ -40,6 +40,7 @@
|
||||
.Nd sort functions
|
||||
.Sh LIBRARY
|
||||
.ds str-Lb-libbsd Utility functions from BSD systems (libbsd, \-lbsd)
|
||||
.ds doc-str-Lb-libbsd \*[str-Lb-libbsd]
|
||||
.Lb libbsd
|
||||
.Sh SYNOPSIS
|
||||
.In stdlib.h
|
||||
|
@@ -36,6 +36,7 @@
|
||||
.Nd format a number into a human readable form and viceversa
|
||||
.Sh LIBRARY
|
||||
.ds str-Lb-libbsd Utility functions from BSD systems (libbsd, \-lbsd)
|
||||
.ds doc-str-Lb-libbsd \*[str-Lb-libbsd]
|
||||
.Lb libbsd
|
||||
.Sh SYNOPSIS
|
||||
.In stdlib.h
|
||||
|
43
man/libbsd.7
43
man/libbsd.7
@@ -1,6 +1,6 @@
|
||||
.\" libbsd man page
|
||||
.\"
|
||||
.\" Copyright © 2017-2018 Gullem Jover <guillem@hadrons.org>
|
||||
.\" Copyright © 2017-2018 Guillem Jover <guillem@hadrons.org>
|
||||
.\"
|
||||
.\" Redistribution and use in source and binary forms, with or without
|
||||
.\" modification, are permitted provided that the following conditions
|
||||
@@ -24,7 +24,7 @@
|
||||
.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||
.\" ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
.\"
|
||||
.Dd May 21 2018
|
||||
.Dd May 21, 2018
|
||||
.Dt LIBBSD 7
|
||||
.Os
|
||||
.Sh NAME
|
||||
@@ -33,7 +33,7 @@
|
||||
.Sh DESCRIPTION
|
||||
The
|
||||
.Nm libbsd
|
||||
library provides a set if compatibility macros and functions commonly found
|
||||
library provides a set of compatibility macros and functions commonly found
|
||||
on BSD-based systems.
|
||||
Its purpose is to make those available on non-BSD based systems to ease
|
||||
portability.
|
||||
@@ -76,7 +76,7 @@ The package also provides a
|
||||
.Pa bsd-ctor
|
||||
static library that can be used to inject automatic constructors into a
|
||||
program so that the
|
||||
.Fn setproctitle
|
||||
.Fn setproctitle_init 3
|
||||
function gets invoked automatically at startup time.
|
||||
This can be done with the
|
||||
.Xr pkg-config 3
|
||||
@@ -134,7 +134,7 @@ or non-buggy way; or because there are better more portable replacements now.
|
||||
.Pp
|
||||
This is the list of currently deprecated macros and functions:
|
||||
.Bl -tag -width 4m
|
||||
.It Fn fgetln
|
||||
.It Fn fgetln 3
|
||||
Unportable, requires assistance from the stdio layer.
|
||||
An implementation has to choose between leaking buffers or being reentrant
|
||||
for a limited amount of streams (this implementation chose the latter with
|
||||
@@ -143,7 +143,7 @@ Use
|
||||
.Fn getline 3
|
||||
instead, which is available in many systems and required by
|
||||
.St -p1003.1-2008 .
|
||||
.It Fn fgetwln
|
||||
.It Fn fgetwln 3
|
||||
Unportable, requires assistance from the stdio layer.
|
||||
An implementation has to choose between leaking buffers or being reentrant
|
||||
for a limited amount of streams (this implementation chose the latter with
|
||||
@@ -154,10 +154,10 @@ instead, which is available in many systems and required by
|
||||
.St -isoC-99
|
||||
and
|
||||
.St -p1003.1-2001 .
|
||||
.It Fn funopen
|
||||
.It Fn funopen 3
|
||||
Unportable, requires assistance from the stdio layer or some hook framework.
|
||||
On GNU systems the
|
||||
.Fn fopencookie
|
||||
.Fn fopencookie 3
|
||||
function can be used.
|
||||
Otherwise the code needs to be prepared for neither of these functions being
|
||||
available.
|
||||
@@ -171,23 +171,24 @@ are present in all major
|
||||
for example.
|
||||
.Pp
|
||||
.Bl -tag -width 4m -compact
|
||||
.It Fn MD5Init
|
||||
.It Fn MD5Update
|
||||
.It Fn MD5Pad
|
||||
.It Fn MD5Final
|
||||
.It Fn MD5Transform
|
||||
.It Fn MD5End
|
||||
.It Fn MD5File
|
||||
.It Fn MD5FileChunk
|
||||
.It Fn MD5Data
|
||||
The set of MD5 digest functions are now provided by the
|
||||
.It Fn MD5Init 3
|
||||
.It Fn MD5Update 3
|
||||
.It Fn MD5Pad 3
|
||||
.It Fn MD5Final 3
|
||||
.It Fn MD5Transform 3
|
||||
.It Fn MD5End 3
|
||||
.It Fn MD5File 3
|
||||
.It Fn MD5FileChunk 3
|
||||
.It Fn MD5Data 3
|
||||
The set of MD5 digest functions are now proxies for the implementations
|
||||
provided by the
|
||||
.Nm libmd
|
||||
companion library, so it is advised to use that instead.
|
||||
.It Fn explicit_bzero
|
||||
companion library, so it is advised to switch to use that directly instead.
|
||||
.It Fn explicit_bzero 3
|
||||
This function is provided by
|
||||
.Nm glibc
|
||||
2.25.
|
||||
.It Fn reallocarray
|
||||
.It Fn reallocarray 3
|
||||
This function is provided by
|
||||
.Nm glibc
|
||||
2.26.
|
||||
|
@@ -25,6 +25,7 @@
|
||||
.Nd calculate the RSA Data Security, Inc., ``MDX'' message digest
|
||||
.Sh LIBRARY
|
||||
.ds str-Lb-libbsd Utility functions from BSD systems (libbsd, \-lbsd)
|
||||
.ds doc-str-Lb-libbsd \*[str-Lb-libbsd]
|
||||
.Lb libbsd
|
||||
.Sh SYNOPSIS
|
||||
.In sys/types.h
|
||||
|
@@ -36,6 +36,7 @@
|
||||
.Nd retrieve symbol table name list from an executable file
|
||||
.Sh LIBRARY
|
||||
.ds str-Lb-libbsd Utility functions from BSD systems (libbsd, \-lbsd)
|
||||
.ds doc-str-Lb-libbsd \*[str-Lb-libbsd]
|
||||
.Lb libbsd
|
||||
.Sh SYNOPSIS
|
||||
.In nlist.h
|
||||
@@ -50,7 +51,7 @@ The
|
||||
function
|
||||
retrieves name list entries from the symbol table of an
|
||||
executable file (see
|
||||
.Xr a.out 5 ) .
|
||||
.Xr elf 5 ) .
|
||||
The argument
|
||||
.Fa \&nl
|
||||
is set to reference the
|
||||
@@ -71,9 +72,12 @@ The last entry in the list is always
|
||||
The number of invalid entries is returned if successful; otherwise,
|
||||
if the file
|
||||
.Fa filename
|
||||
does not exist or is not executable, the returned value is \-1.
|
||||
does not exist or is not executable,
|
||||
or the nl pointer is
|
||||
.Dv NULL ,
|
||||
the returned value is \-1.
|
||||
.Sh SEE ALSO
|
||||
.Xr a.out 5
|
||||
.Xr elf 5
|
||||
.Sh HISTORY
|
||||
A
|
||||
.Fn nlist
|
||||
|
@@ -36,6 +36,7 @@
|
||||
.Nd "library for PID files handling"
|
||||
.Sh LIBRARY
|
||||
.ds str-Lb-libbsd Utility functions from BSD systems (libbsd, \-lbsd)
|
||||
.ds doc-str-Lb-libbsd \*[str-Lb-libbsd]
|
||||
.Lb libbsd
|
||||
.Sh SYNOPSIS
|
||||
.In libutil.h
|
||||
|
143
man/pwcache.3bsd
Normal file
143
man/pwcache.3bsd
Normal file
@@ -0,0 +1,143 @@
|
||||
.\" $OpenBSD: pwcache.3,v 1.15 2018/09/13 16:50:54 jmc Exp $
|
||||
.\"
|
||||
.\" Copyright (c) 1989, 1991, 1993
|
||||
.\" The Regents of the University of California. 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. Neither the name of the University nor the names of its contributors
|
||||
.\" may be used to endorse or promote products derived from this software
|
||||
.\" without specific prior written permission.
|
||||
.\"
|
||||
.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``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 REGENTS OR CONTRIBUTORS 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.
|
||||
.\"
|
||||
.Dd $Mdocdate: September 13 2018 $
|
||||
.Dt USER_FROM_UID 3
|
||||
.Os
|
||||
.Sh NAME
|
||||
.Nm user_from_uid ,
|
||||
.Nm uid_from_user ,
|
||||
.Nm group_from_gid ,
|
||||
.Nm gid_from_group
|
||||
.Nd cache password and group entries
|
||||
.Sh LIBRARY
|
||||
.ds str-Lb-libbsd Utility functions from BSD systems (libbsd, \-lbsd)
|
||||
.ds doc-str-Lb-libbsd \*[str-Lb-libbsd]
|
||||
.Lb libbsd
|
||||
.Sh SYNOPSIS
|
||||
.In pwd.h
|
||||
(See
|
||||
.Xr libbsd 7
|
||||
for include usage.)
|
||||
.Ft int
|
||||
.Fn uid_from_user "const char *name" "uid_t *uid"
|
||||
.Ft const char *
|
||||
.Fn user_from_uid "uid_t uid" "int nouser"
|
||||
.In grp.h
|
||||
.Ft int
|
||||
.Fn gid_from_group "const char *name" "gid_t *gid"
|
||||
.Ft const char *
|
||||
.Fn group_from_gid "gid_t gid" "int nogroup"
|
||||
.Sh DESCRIPTION
|
||||
The
|
||||
.Fn user_from_uid
|
||||
function returns the user name associated with the argument
|
||||
.Fa uid .
|
||||
The user name is cached so that multiple calls with the same
|
||||
.Fa uid
|
||||
do not require additional calls to
|
||||
.Xr getpwuid 3 .
|
||||
If there is no user associated with the
|
||||
.Fa uid ,
|
||||
a pointer is returned
|
||||
to a string representation of the
|
||||
.Fa uid ,
|
||||
unless the argument
|
||||
.Fa nouser
|
||||
is non-zero, in which case a null pointer is returned.
|
||||
.Pp
|
||||
The
|
||||
.Fn uid_from_user
|
||||
function returns the user ID associated with the argument
|
||||
.Fa name .
|
||||
The user ID is cached so that multiple calls with the same
|
||||
.Fa name
|
||||
do not require additional calls to
|
||||
.Xr getpwnam 3 .
|
||||
If there is no user ID associated with the
|
||||
.Fa name ,
|
||||
the
|
||||
.Fn uid_from_user
|
||||
function returns -1;
|
||||
otherwise it stores the user ID at the location pointed to by
|
||||
.Fa uid
|
||||
and returns 0.
|
||||
.Pp
|
||||
The
|
||||
.Fn group_from_gid
|
||||
function returns the group name associated with the argument
|
||||
.Fa gid .
|
||||
The group name is cached so that multiple calls with the same
|
||||
.Fa gid
|
||||
do not require additional calls to
|
||||
.Xr getgrgid 3 .
|
||||
If there is no group associated with the
|
||||
.Fa gid ,
|
||||
a pointer is returned
|
||||
to a string representation of the
|
||||
.Fa gid ,
|
||||
unless the argument
|
||||
.Fa nogroup
|
||||
is non-zero, in which case a null pointer is returned.
|
||||
.Pp
|
||||
The
|
||||
.Fn gid_from_group
|
||||
function returns the group ID associated with the argument
|
||||
.Fa name .
|
||||
The group ID is cached so that multiple calls with the same
|
||||
.Fa name
|
||||
do not require additional calls to
|
||||
.Xr getgrnam 3 .
|
||||
If there is no group ID associated with the
|
||||
.Fa name ,
|
||||
the
|
||||
.Fn gid_from_group
|
||||
function returns -1;
|
||||
otherwise it stores the group ID at the location pointed to by
|
||||
.Fa gid
|
||||
and returns 0.
|
||||
.Sh SEE ALSO
|
||||
.Xr getgrgid 3 ,
|
||||
.Xr getpwuid 3
|
||||
.Sh HISTORY
|
||||
The
|
||||
.Fn user_from_uid
|
||||
and
|
||||
.Fn group_from_gid
|
||||
functions first appeared in
|
||||
.Bx 4.4 .
|
||||
.Pp
|
||||
The
|
||||
.Fn uid_from_user
|
||||
and
|
||||
.Fn gid_from_group
|
||||
functions were ported from
|
||||
.Nx
|
||||
and first appeared in
|
||||
.Ox 6.4 .
|
@@ -112,6 +112,10 @@
|
||||
.Nm TAILQ_SWAP
|
||||
.Nd implementations of singly-linked lists, singly-linked tail queues,
|
||||
lists and tail queues
|
||||
.Sh LIBRARY
|
||||
.ds str-Lb-libbsd Utility functions from BSD systems (libbsd, \-lbsd)
|
||||
.ds doc-str-Lb-libbsd \*[str-Lb-libbsd]
|
||||
.Lb libbsd
|
||||
.Sh SYNOPSIS
|
||||
.In sys/queue.h
|
||||
(See
|
||||
|
@@ -38,6 +38,7 @@
|
||||
.Nd radix sort
|
||||
.Sh LIBRARY
|
||||
.ds str-Lb-libbsd Utility functions from BSD systems (libbsd, \-lbsd)
|
||||
.ds doc-str-Lb-libbsd \*[str-Lb-libbsd]
|
||||
.Lb libbsd
|
||||
.Sh SYNOPSIS
|
||||
.In limits.h
|
||||
|
@@ -26,6 +26,7 @@
|
||||
.Nd get a passphrase from the user
|
||||
.Sh LIBRARY
|
||||
.ds str-Lb-libbsd Utility functions from BSD systems (libbsd, \-lbsd)
|
||||
.ds doc-str-Lb-libbsd \*[str-Lb-libbsd]
|
||||
.Lb libbsd
|
||||
.Sh SYNOPSIS
|
||||
.In readpassphrase.h
|
||||
|
@@ -30,16 +30,19 @@
|
||||
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
.\" SUCH DAMAGE.
|
||||
.\"
|
||||
.\" $OpenBSD: malloc.3,v 1.78 2014/05/01 18:41:59 jmc Exp $
|
||||
.\" $OpenBSD: malloc.3,v 1.126 2019/09/14 13:16:50 otto Exp $
|
||||
.\"
|
||||
.Dd $Mdocdate: May 1 2014 $
|
||||
.Dd $Mdocdate: September 14 2019 $
|
||||
.Dt REALLOCARRAY 3bsd
|
||||
.Os
|
||||
.Sh NAME
|
||||
.Nm reallocarray
|
||||
.Nm reallocarray ,
|
||||
.Nm recallocarray ,
|
||||
.Nm freezero
|
||||
.Nd memory allocation and deallocation
|
||||
.Sh LIBRARY
|
||||
.ds str-Lb-libbsd Utility functions from BSD systems (libbsd, \-lbsd)
|
||||
.ds doc-str-Lb-libbsd \*[str-Lb-libbsd]
|
||||
.Lb libbsd
|
||||
.Sh SYNOPSIS
|
||||
.In stdlib.h
|
||||
@@ -48,59 +51,244 @@
|
||||
for include usage.)
|
||||
.Ft void *
|
||||
.Fn reallocarray "void *ptr" "size_t nmemb" "size_t size"
|
||||
.Ft void *
|
||||
.Fn recallocarray "void *ptr" "size_t oldnmemb" "size_t nmemb" "size_t size"
|
||||
.Ft void
|
||||
.Fn freezero "void *ptr" "size_t size"
|
||||
.Sh DESCRIPTION
|
||||
.Pp
|
||||
When using
|
||||
.Fn malloc
|
||||
be careful to avoid the following idiom:
|
||||
.Bd -literal -offset indent
|
||||
if ((p = malloc(num * size)) == NULL)
|
||||
err(1, "malloc");
|
||||
.Ed
|
||||
.Pp
|
||||
The multiplication may lead to an integer overflow, which can
|
||||
be avoided using the extension
|
||||
.Fn reallocarray ,
|
||||
as follows:
|
||||
.Bd -literal -offset indent
|
||||
if ((p = reallocarray(NULL, num, size)) == NULL)
|
||||
err(1, "malloc");
|
||||
.Ed
|
||||
.Pp
|
||||
Alternatively
|
||||
.Fn calloc
|
||||
is a more portable solution which comes with the cost of clearing memory.
|
||||
.Pp
|
||||
If
|
||||
.Fn malloc
|
||||
must be used, be sure to test for overflow:
|
||||
.Bd -literal -offset indent
|
||||
if (size && num > SIZE_MAX / size) {
|
||||
errno = ENOMEM;
|
||||
err(1, "overflow");
|
||||
}
|
||||
.Ed
|
||||
.Pp
|
||||
The use of
|
||||
Designed for safe allocation of arrays,
|
||||
the
|
||||
.Fn reallocarray
|
||||
or
|
||||
.Fn calloc
|
||||
is strongly encouraged when allocating multiple sized objects
|
||||
in order to avoid possible integer overflows.
|
||||
function is similar to
|
||||
.Fn realloc
|
||||
except it operates on
|
||||
.Fa nmemb
|
||||
members of size
|
||||
.Fa size
|
||||
and checks for integer overflow in the calculation
|
||||
.Fa nmemb
|
||||
*
|
||||
.Fa size .
|
||||
.Pp
|
||||
Used for the allocation of memory holding sensitive data,
|
||||
the
|
||||
.Fn recallocarray
|
||||
function guarantees that memory becoming unallocated is explicitly
|
||||
.Em discarded ,
|
||||
meaning cached free objects are cleared with
|
||||
.Xr explicit_bzero 3 .
|
||||
.Pp
|
||||
The
|
||||
.Fn recallocarray
|
||||
function is similar to
|
||||
.Fn reallocarray
|
||||
except it ensures newly allocated memory is cleared similar to
|
||||
.Fn calloc .
|
||||
If
|
||||
.Fa ptr
|
||||
is
|
||||
.Dv NULL ,
|
||||
.Fa oldnmemb
|
||||
is ignored and the call is equivalent to
|
||||
.Fn calloc .
|
||||
If
|
||||
.Fa ptr
|
||||
is not
|
||||
.Dv NULL ,
|
||||
.Fa oldnmemb
|
||||
must be a value such that
|
||||
.Fa oldnmemb
|
||||
*
|
||||
.Fa size
|
||||
is the size of the earlier allocation that returned
|
||||
.Fa ptr ,
|
||||
otherwise the behavior is undefined.
|
||||
The
|
||||
.Fn freezero
|
||||
function is similar to the
|
||||
.Fn free
|
||||
function except it ensures memory is explicitly discarded.
|
||||
If
|
||||
.Fa ptr
|
||||
is
|
||||
.Dv NULL ,
|
||||
no action occurs.
|
||||
If
|
||||
.Fa ptr
|
||||
is not
|
||||
.Dv NULL ,
|
||||
the
|
||||
.Fa size
|
||||
argument must be equal to or smaller than the size of the earlier allocation
|
||||
that returned
|
||||
.Fa ptr .
|
||||
.Fn freezero
|
||||
guarantees the memory range starting at
|
||||
.Fa ptr
|
||||
with length
|
||||
.Fa size
|
||||
is discarded while deallocating the whole object originally allocated.
|
||||
.Sh RETURN VALUES
|
||||
The
|
||||
.Fn reallocarray
|
||||
function returns a pointer to the allocated space if successful; otherwise,
|
||||
and
|
||||
.Fn recallocarray
|
||||
functions return a pointer to the allocated space if successful; otherwise,
|
||||
a null pointer is returned and
|
||||
.Va errno
|
||||
is set to
|
||||
.Er ENOMEM .
|
||||
.Pp
|
||||
If multiplying
|
||||
.Fa nmemb
|
||||
and
|
||||
.Fa size
|
||||
results in integer overflow,
|
||||
.Fn reallocarray
|
||||
and
|
||||
.Fn recallocarray
|
||||
return
|
||||
.Dv NULL
|
||||
and set
|
||||
.Va errno
|
||||
to
|
||||
.Er ENOMEM .
|
||||
.Pp
|
||||
If
|
||||
.Fa ptr
|
||||
is not
|
||||
.Dv NULL
|
||||
and multiplying
|
||||
.Fa oldnmemb
|
||||
and
|
||||
.Fa size
|
||||
results in integer overflow
|
||||
.Fn recallocarray
|
||||
returns
|
||||
.Dv NULL
|
||||
and sets
|
||||
.Va errno
|
||||
to
|
||||
.Er EINVAL .
|
||||
.Sh IDIOMS
|
||||
Consider
|
||||
.Fn calloc
|
||||
or the extensions
|
||||
.Fn reallocarray
|
||||
and
|
||||
.Fn recallocarray
|
||||
when there is multiplication in the
|
||||
.Fa size
|
||||
argument of
|
||||
.Fn malloc
|
||||
or
|
||||
.Fn realloc .
|
||||
For example, avoid this common idiom as it may lead to integer overflow:
|
||||
.Bd -literal -offset indent
|
||||
if ((p = malloc(num * size)) == NULL)
|
||||
err(1, NULL);
|
||||
.Ed
|
||||
.Pp
|
||||
A drop-in replacement is
|
||||
.Fn reallocarray :
|
||||
.Bd -literal -offset indent
|
||||
if ((p = reallocarray(NULL, num, size)) == NULL)
|
||||
err(1, NULL);
|
||||
.Ed
|
||||
.Pp
|
||||
Alternatively,
|
||||
.Fn calloc
|
||||
may be used at the cost of initialization overhead.
|
||||
.Pp
|
||||
When using
|
||||
.Fn realloc ,
|
||||
be careful to avoid the following idiom:
|
||||
.Bd -literal -offset indent
|
||||
size += 50;
|
||||
if ((p = realloc(p, size)) == NULL)
|
||||
return (NULL);
|
||||
.Ed
|
||||
.Pp
|
||||
Do not adjust the variable describing how much memory has been allocated
|
||||
until the allocation has been successful.
|
||||
This can cause aberrant program behavior if the incorrect size value is used.
|
||||
In most cases, the above sample will also result in a leak of memory.
|
||||
As stated earlier, a return value of
|
||||
.Dv NULL
|
||||
indicates that the old object still remains allocated.
|
||||
Better code looks like this:
|
||||
.Bd -literal -offset indent
|
||||
newsize = size + 50;
|
||||
if ((newp = realloc(p, newsize)) == NULL) {
|
||||
free(p);
|
||||
p = NULL;
|
||||
size = 0;
|
||||
return (NULL);
|
||||
}
|
||||
p = newp;
|
||||
size = newsize;
|
||||
.Ed
|
||||
.Pp
|
||||
As with
|
||||
.Fn malloc ,
|
||||
it is important to ensure the new size value will not overflow;
|
||||
i.e. avoid allocations like the following:
|
||||
.Bd -literal -offset indent
|
||||
if ((newp = realloc(p, num * size)) == NULL) {
|
||||
...
|
||||
.Ed
|
||||
.Pp
|
||||
Instead, use
|
||||
.Fn reallocarray :
|
||||
.Bd -literal -offset indent
|
||||
if ((newp = reallocarray(p, num, size)) == NULL) {
|
||||
...
|
||||
.Ed
|
||||
.Pp
|
||||
Calling
|
||||
.Fn realloc
|
||||
with a
|
||||
.Dv NULL
|
||||
.Fa ptr
|
||||
is equivalent to calling
|
||||
.Fn malloc .
|
||||
Instead of this idiom:
|
||||
.Bd -literal -offset indent
|
||||
if (p == NULL)
|
||||
newp = malloc(newsize);
|
||||
else
|
||||
newp = realloc(p, newsize);
|
||||
.Ed
|
||||
.Pp
|
||||
Use the following:
|
||||
.Bd -literal -offset indent
|
||||
newp = realloc(p, newsize);
|
||||
.Ed
|
||||
.Pp
|
||||
The
|
||||
.Fn recallocarray
|
||||
function should be used for resizing objects containing sensitive data like
|
||||
keys.
|
||||
To avoid leaking information,
|
||||
it guarantees memory is cleared before placing it on the internal free list.
|
||||
Deallocation of such an object should be done by calling
|
||||
.Fn freezero .
|
||||
.Sh SEE ALSO
|
||||
.Xr malloc 3 ,
|
||||
.Xr calloc 3 ,
|
||||
.Xr alloca 3
|
||||
.Sh HISTORY
|
||||
The
|
||||
.Fn reallocarray
|
||||
appeared in
|
||||
function appeared in
|
||||
.Ox 5.6 ,
|
||||
glibc 2.26.
|
||||
and glibc 2.26.
|
||||
The
|
||||
.Fn recallocarray
|
||||
function appeared in
|
||||
.Ox 6.1 .
|
||||
The
|
||||
.Fn freezero
|
||||
function appeared in
|
||||
.Ox 6.2 .
|
||||
|
@@ -40,6 +40,7 @@
|
||||
.Nd general purpose memory allocation functions
|
||||
.Sh LIBRARY
|
||||
.ds str-Lb-libbsd Utility functions from BSD systems (libbsd, \-lbsd)
|
||||
.ds doc-str-Lb-libbsd \*[str-Lb-libbsd]
|
||||
.Lb libbsd
|
||||
.Sh SYNOPSIS
|
||||
.In stdlib.h
|
||||
|
1
man/recallocarray.3bsd
Normal file
1
man/recallocarray.3bsd
Normal file
@@ -0,0 +1 @@
|
||||
.so man3/reallocarray.3bsd
|
@@ -39,6 +39,7 @@
|
||||
.Nd modify mode bits
|
||||
.Sh LIBRARY
|
||||
.ds str-Lb-libbsd Utility functions from BSD systems (libbsd, \-lbsd)
|
||||
.ds doc-str-Lb-libbsd \*[str-Lb-libbsd]
|
||||
.Lb libbsd
|
||||
.Sh SYNOPSIS
|
||||
.In unistd.h
|
||||
|
@@ -28,6 +28,7 @@
|
||||
.Nd set process title
|
||||
.Sh LIBRARY
|
||||
.ds str-Lb-libbsd Utility functions from BSD systems (libbsd, \-lbsd)
|
||||
.ds doc-str-Lb-libbsd \*[str-Lb-libbsd]
|
||||
.Lb libbsd
|
||||
.Sh SYNOPSIS
|
||||
.In sys/types.h
|
||||
@@ -118,7 +119,7 @@ similar functions.
|
||||
.Pp
|
||||
The
|
||||
.Fn setproctitle_init
|
||||
function is a libbsd extension not present on the BSDs, avoid using it
|
||||
function is a libbsd extension not present on the BSDs; avoid using it
|
||||
in portable code.
|
||||
.Sh AUTHORS
|
||||
.An -nosplit
|
||||
|
@@ -39,6 +39,7 @@
|
||||
.Nd stringlist manipulation functions
|
||||
.Sh LIBRARY
|
||||
.ds str-Lb-libbsd Utility functions from BSD systems (libbsd, \-lbsd)
|
||||
.ds doc-str-Lb-libbsd \*[str-Lb-libbsd]
|
||||
.Lb libbsd
|
||||
.Sh SYNOPSIS
|
||||
.In stringlist.h
|
||||
|
@@ -23,6 +23,7 @@
|
||||
.Nd size-bounded string copying and concatenation
|
||||
.Sh LIBRARY
|
||||
.ds str-Lb-libbsd Utility functions from BSD systems (libbsd, \-lbsd)
|
||||
.ds doc-str-Lb-libbsd \*[str-Lb-libbsd]
|
||||
.Lb libbsd
|
||||
.Sh SYNOPSIS
|
||||
.In string.h
|
||||
|
@@ -36,6 +36,7 @@
|
||||
.Nd convert inode status information into a symbolic string
|
||||
.Sh LIBRARY
|
||||
.ds str-Lb-libbsd Utility functions from BSD systems (libbsd, \-lbsd)
|
||||
.ds doc-str-Lb-libbsd \*[str-Lb-libbsd]
|
||||
.Lb libbsd
|
||||
.Sh SYNOPSIS
|
||||
.In string.h
|
||||
|
@@ -41,6 +41,7 @@
|
||||
.Nd locate a substring in a string
|
||||
.Sh LIBRARY
|
||||
.ds str-Lb-libbsd Utility functions from BSD systems (libbsd, \-lbsd)
|
||||
.ds doc-str-Lb-libbsd \*[str-Lb-libbsd]
|
||||
.Lb libbsd
|
||||
.Sh SYNOPSIS
|
||||
.In string.h
|
||||
|
@@ -44,6 +44,7 @@
|
||||
.Nd convert string value to an intmax_t integer
|
||||
.Sh LIBRARY
|
||||
.ds str-Lb-libbsd Utility functions from BSD systems (libbsd, \-lbsd)
|
||||
.ds doc-str-Lb-libbsd \*[str-Lb-libbsd]
|
||||
.Lb libbsd
|
||||
.Sh SYNOPSIS
|
||||
.In inttypes.h
|
||||
@@ -225,10 +226,11 @@ function is a
|
||||
.Nx
|
||||
extension.
|
||||
.Sh HISTORY
|
||||
.ds doc-operating-system-NetBSD-7.0 7.0
|
||||
The
|
||||
.Fn strtoi
|
||||
function first appeared in
|
||||
.Nx 7 .
|
||||
.Nx 7.0 .
|
||||
.Ox
|
||||
introduced the
|
||||
.Fn strtonum 3bsd
|
||||
|
@@ -23,6 +23,7 @@
|
||||
.Nd reliably convert string value to an integer
|
||||
.Sh LIBRARY
|
||||
.ds str-Lb-libbsd Utility functions from BSD systems (libbsd, \-lbsd)
|
||||
.ds doc-str-Lb-libbsd \*[str-Lb-libbsd]
|
||||
.Lb libbsd
|
||||
.Sh SYNOPSIS
|
||||
.In limits.h
|
||||
@@ -144,13 +145,14 @@ is an
|
||||
.Ox
|
||||
extension.
|
||||
.Sh HISTORY
|
||||
.ds doc-operating-system-NetBSD-8.0 8.0
|
||||
The
|
||||
.Fn strtonum
|
||||
function first appeared in
|
||||
.Ox 3.6 .
|
||||
.Fn strtonum
|
||||
was redesigned in
|
||||
.Nx 8
|
||||
.Nx 8.0
|
||||
as
|
||||
.Fn strtoi 3bsd
|
||||
and
|
||||
|
@@ -44,6 +44,7 @@
|
||||
.Nd convert a string to an uintmax_t integer
|
||||
.Sh LIBRARY
|
||||
.ds str-Lb-libbsd Utility functions from BSD systems (libbsd, \-lbsd)
|
||||
.ds doc-str-Lb-libbsd \*[str-Lb-libbsd]
|
||||
.Lb libbsd
|
||||
.Sh SYNOPSIS
|
||||
.In inttypes.h
|
||||
@@ -219,6 +220,7 @@ the range given was invalid, i.e.
|
||||
.Xr strtoull 3 ,
|
||||
.Xr strtoumax 3
|
||||
.Sh STANDARDS
|
||||
.ds doc-operating-system-NetBSD-7.0 7.0
|
||||
The
|
||||
.Fn strtou
|
||||
function is a
|
||||
@@ -228,7 +230,7 @@ extension.
|
||||
The
|
||||
.Fn strtou
|
||||
function first appeared in
|
||||
.Nx 7 .
|
||||
.Nx 7.0 .
|
||||
.Ox
|
||||
introduced the
|
||||
.Fn strtonum 3bsd
|
||||
|
@@ -47,6 +47,7 @@
|
||||
.Nd operations on time structure
|
||||
.Sh LIBRARY
|
||||
.ds str-Lb-libbsd Utility functions from BSD systems (libbsd, \-lbsd)
|
||||
.ds doc-str-Lb-libbsd \*[str-Lb-libbsd]
|
||||
.Lb libbsd
|
||||
.Sh SYNOPSIS
|
||||
.In sys/time.h
|
||||
|
1
man/timespec.3bsd
Normal file
1
man/timespec.3bsd
Normal file
@@ -0,0 +1 @@
|
||||
.so man3/timeval.3bsd
|
@@ -36,6 +36,7 @@
|
||||
.Nd time structures
|
||||
.Sh LIBRARY
|
||||
.ds str-Lb-libbsd Utility functions from BSD systems (libbsd, \-lbsd)
|
||||
.ds doc-str-Lb-libbsd \*[str-Lb-libbsd]
|
||||
.Lb libbsd
|
||||
.Sh SYNOPSIS
|
||||
.In sys/time.h
|
||||
|
@@ -75,6 +75,10 @@
|
||||
.Nm RB_INSERT ,
|
||||
.Nm RB_REMOVE
|
||||
.Nd implementations of splay and red-black trees
|
||||
.Sh LIBRARY
|
||||
.ds str-Lb-libbsd Utility functions from BSD systems (libbsd, \-lbsd)
|
||||
.ds doc-str-Lb-libbsd \*[str-Lb-libbsd]
|
||||
.Lb libbsd
|
||||
.Sh SYNOPSIS
|
||||
.In sys/tree.h
|
||||
(See
|
||||
|
1
man/uid_from_user.3bsd
Normal file
1
man/uid_from_user.3bsd
Normal file
@@ -0,0 +1 @@
|
||||
.so man3/pwcache.3bsd
|
@@ -41,6 +41,7 @@
|
||||
.Nd decode a visual representation of characters
|
||||
.Sh LIBRARY
|
||||
.ds str-Lb-libbsd Utility functions from BSD systems (libbsd, \-lbsd)
|
||||
.ds doc-str-Lb-libbsd \*[str-Lb-libbsd]
|
||||
.Lb libbsd
|
||||
.Sh SYNOPSIS
|
||||
.In vis.h
|
||||
|
1
man/user_from_uid.3bsd
Normal file
1
man/user_from_uid.3bsd
Normal file
@@ -0,0 +1 @@
|
||||
.so man3/pwcache.3bsd
|
@@ -51,6 +51,7 @@
|
||||
.Nd visually encode characters
|
||||
.Sh LIBRARY
|
||||
.ds str-Lb-libbsd Utility functions from BSD systems (libbsd, \-lbsd)
|
||||
.ds doc-str-Lb-libbsd \*[str-Lb-libbsd]
|
||||
.Lb libbsd
|
||||
.Sh SYNOPSIS
|
||||
.In vis.h
|
||||
@@ -528,6 +529,7 @@ The destination buffer size is not large enough to perform the conversion.
|
||||
.%O "RFC 2045"
|
||||
.Re
|
||||
.Sh HISTORY
|
||||
.ds doc-operating-system-NetBSD-7.0 7.0
|
||||
The
|
||||
.Fn vis ,
|
||||
.Fn strvis ,
|
||||
|
@@ -44,6 +44,7 @@
|
||||
.Nd wide character string manipulation operations
|
||||
.Sh LIBRARY
|
||||
.ds str-Lb-libbsd Utility functions from BSD systems (libbsd, \-lbsd)
|
||||
.ds doc-str-Lb-libbsd \*[str-Lb-libbsd]
|
||||
.Lb libbsd
|
||||
.Sh SYNOPSIS
|
||||
.In wchar.h
|
||||
|
@@ -7,8 +7,14 @@ AM_CPPFLAGS = \
|
||||
-DLIBBSD_OVERLAY -DLIBBSD_DISABLE_DEPRECATED \
|
||||
-D__REENTRANT
|
||||
|
||||
if OS_WINDOWS
|
||||
AM_CPPFLAGS += \
|
||||
-D_CRT_SECURE_NO_WARNINGS \
|
||||
-D_CRT_NONSTDC_NO_WARNINGS \
|
||||
$(nil)
|
||||
endif
|
||||
|
||||
libbsd_la_included_sources = \
|
||||
hash/helper.c \
|
||||
getentropy_aix.c \
|
||||
getentropy_bsd.c \
|
||||
getentropy_hpux.c \
|
||||
@@ -27,10 +33,6 @@ EXTRA_DIST = \
|
||||
$(libbsd_la_included_sources) \
|
||||
$(nil)
|
||||
|
||||
CLEANFILES = \
|
||||
hash/md5hl.c \
|
||||
$(nil)
|
||||
|
||||
pkgconfigdir = $(libdir)/pkgconfig
|
||||
pkgconfig_DATA = \
|
||||
libbsd.pc \
|
||||
@@ -46,18 +48,20 @@ pkgconfig_DATA += libbsd-ctor.pc
|
||||
lib_LIBRARIES += libbsd-ctor.a
|
||||
endif
|
||||
|
||||
hash/md5hl.c: $(srcdir)/hash/helper.c
|
||||
$(AM_V_at) $(MKDIR_P) hash
|
||||
$(AM_V_GEN) sed -e 's:hashinc:md5.h:g' -e 's:HASH:MD5:g' $< > $@
|
||||
|
||||
libbsd_la_DEPENDENCIES = \
|
||||
$(libbsd_la_included_sources) \
|
||||
libbsd.map
|
||||
libbsd_la_LIBADD = \
|
||||
$(CLOCK_GETTIME_LIBS)
|
||||
$(MD_LIBS) \
|
||||
$(CLOCK_GETTIME_LIBS) \
|
||||
$(ARC4RANDOM_ATFORK_LIBS) \
|
||||
$(nil)
|
||||
libbsd_la_LDFLAGS = \
|
||||
-Wl,--version-script=$(srcdir)/libbsd.map \
|
||||
-version-number $(LIBBSD_ABI)
|
||||
if HAVE_LINKER_VERSION_SCRIPT
|
||||
libbsd_la_LDFLAGS += \
|
||||
-Wl,--version-script=$(srcdir)/libbsd.map
|
||||
endif
|
||||
libbsd_la_SOURCES = \
|
||||
arc4random.c \
|
||||
arc4random.h \
|
||||
@@ -74,6 +78,7 @@ libbsd_la_SOURCES = \
|
||||
expand_number.c \
|
||||
explicit_bzero.c \
|
||||
fgetln.c \
|
||||
freezero.c \
|
||||
fgetwln.c \
|
||||
flopen.c \
|
||||
fmtcheck.c \
|
||||
@@ -82,23 +87,22 @@ libbsd_la_SOURCES = \
|
||||
funopen.c \
|
||||
getbsize.c \
|
||||
getpeereid.c \
|
||||
hash/md5.c \
|
||||
hash/md5hl.c \
|
||||
hash/sha512.h \
|
||||
hash/sha512c.c \
|
||||
heapsort.c \
|
||||
humanize_number.c \
|
||||
inet_net_pton.c \
|
||||
local-elf.h \
|
||||
local-link.h \
|
||||
md5.c \
|
||||
merge.c \
|
||||
nlist.c \
|
||||
pidfile.c \
|
||||
progname.c \
|
||||
pwcache.c \
|
||||
radixsort.c \
|
||||
readpassphrase.c \
|
||||
reallocarray.c \
|
||||
reallocf.c \
|
||||
recallocarray.c \
|
||||
setmode.c \
|
||||
setproctitle.c \
|
||||
strlcat.c \
|
||||
|
@@ -39,11 +39,11 @@
|
||||
|
||||
#define minimum(a, b) ((a) < (b) ? (a) : (b))
|
||||
|
||||
#if defined(__GNUC__) || defined(_MSC_VER)
|
||||
#if defined(__GNUC__) || defined(__clang__) || defined(_MSC_VER)
|
||||
#define inline __inline
|
||||
#else /* __GNUC__ || _MSC_VER */
|
||||
#else /* __GNUC__ || __clang__ || _MSC_VER */
|
||||
#define inline
|
||||
#endif /* !__GNUC__ && !_MSC_VER */
|
||||
#endif /* !__GNUC__ && !__clang__ && !_MSC_VER */
|
||||
|
||||
#define KEYSZ 32
|
||||
#define IVSZ 8
|
||||
|
@@ -32,7 +32,7 @@ static pthread_mutex_t arc4random_mtx = PTHREAD_MUTEX_INITIALIZER;
|
||||
#define _ARC4_LOCK() pthread_mutex_lock(&arc4random_mtx)
|
||||
#define _ARC4_UNLOCK() pthread_mutex_unlock(&arc4random_mtx)
|
||||
|
||||
#ifdef __GLIBC__
|
||||
#ifdef HAVE___REGISTER_ATFORK
|
||||
extern void *__dso_handle;
|
||||
extern int __register_atfork(void (*)(void), void(*)(void), void (*)(void), void *);
|
||||
#define _ARC4_ATFORK(f) __register_atfork(NULL, NULL, (f), __dso_handle)
|
||||
|
@@ -32,7 +32,7 @@ static pthread_mutex_t arc4random_mtx = PTHREAD_MUTEX_INITIALIZER;
|
||||
#define _ARC4_LOCK() pthread_mutex_lock(&arc4random_mtx)
|
||||
#define _ARC4_UNLOCK() pthread_mutex_unlock(&arc4random_mtx)
|
||||
|
||||
#ifdef __GLIBC__
|
||||
#ifdef HAVE___REGISTER_ATFORK
|
||||
extern void *__dso_handle;
|
||||
extern int __register_atfork(void (*)(void), void(*)(void), void (*)(void), void *);
|
||||
#define _ARC4_ATFORK(f) __register_atfork(NULL, NULL, (f), __dso_handle)
|
||||
|
104
src/err.c
104
src/err.c
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* Copyright © 2006 Robert Millan
|
||||
* Copyright © 2011 Guillem Jover <guillem@hadrons.org>
|
||||
* Copyright © 2011, 2019 Guillem Jover <guillem@hadrons.org>
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
@@ -26,8 +26,24 @@
|
||||
*/
|
||||
|
||||
#include <err.h>
|
||||
#ifdef LIBBSD_NEED_ERR_H_FUNCS
|
||||
#include <errno.h>
|
||||
#endif
|
||||
#include <string.h>
|
||||
#include <stdarg.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
|
||||
void
|
||||
vwarnc(int code, const char *format, va_list ap)
|
||||
{
|
||||
fprintf(stderr, "%s: ", getprogname());
|
||||
if (format) {
|
||||
vfprintf(stderr, format, ap);
|
||||
fprintf(stderr, ": ");
|
||||
}
|
||||
fprintf(stderr, "%s\n", strerror(code));
|
||||
}
|
||||
|
||||
void
|
||||
warnc(int code, const char *format, ...)
|
||||
@@ -40,13 +56,15 @@ warnc(int code, const char *format, ...)
|
||||
}
|
||||
|
||||
void
|
||||
vwarnc(int code, const char *format, va_list ap)
|
||||
verrc(int status, int code, const char *format, va_list ap)
|
||||
{
|
||||
int tmp = errno;
|
||||
|
||||
errno = code;
|
||||
vwarn(format, ap);
|
||||
errno = tmp;
|
||||
fprintf(stderr, "%s: ", getprogname());
|
||||
if (format) {
|
||||
vfprintf(stderr, format, ap);
|
||||
fprintf(stderr, ": ");
|
||||
}
|
||||
fprintf(stderr, "%s\n", strerror(code));
|
||||
exit(status);
|
||||
}
|
||||
|
||||
void
|
||||
@@ -59,9 +77,75 @@ errc(int status, int code, const char *format, ...)
|
||||
va_end(ap);
|
||||
}
|
||||
|
||||
#ifdef LIBBSD_NEED_ERR_H_FUNCS
|
||||
void
|
||||
verrc(int status, int code, const char *format, va_list ap)
|
||||
vwarn(const char *format, va_list ap)
|
||||
{
|
||||
errno = code;
|
||||
verr(status, format, ap);
|
||||
vwarnc(errno, format, ap);
|
||||
}
|
||||
|
||||
void
|
||||
warn(const char *format, ...)
|
||||
{
|
||||
va_list ap;
|
||||
|
||||
va_start(ap, format);
|
||||
vwarnc(errno, format, ap);
|
||||
va_end(ap);
|
||||
}
|
||||
|
||||
void
|
||||
vwarnx(const char *format, va_list ap)
|
||||
{
|
||||
fprintf(stderr, "%s: ", getprogname());
|
||||
if (format)
|
||||
vfprintf(stderr, format, ap);
|
||||
fprintf(stderr, "\n");
|
||||
}
|
||||
|
||||
void
|
||||
warnx(const char *format, ...)
|
||||
{
|
||||
va_list ap;
|
||||
|
||||
va_start(ap, format);
|
||||
vwarnx(format, ap);
|
||||
va_end(ap);
|
||||
}
|
||||
|
||||
void
|
||||
verr(int status, const char *format, va_list ap)
|
||||
{
|
||||
verrc(status, errno, format, ap);
|
||||
}
|
||||
|
||||
void
|
||||
err(int status, const char *format, ...)
|
||||
{
|
||||
va_list ap;
|
||||
|
||||
va_start(ap, format);
|
||||
verrc(status, errno, format, ap);
|
||||
va_end(ap);
|
||||
}
|
||||
|
||||
void
|
||||
verrx(int eval, const char *format, va_list ap)
|
||||
{
|
||||
fprintf(stderr, "%s: ", getprogname());
|
||||
if (format)
|
||||
vfprintf(stderr, format, ap);
|
||||
fprintf(stderr, "\n");
|
||||
exit(eval);
|
||||
}
|
||||
|
||||
void
|
||||
errx(int eval, const char *format, ...)
|
||||
{
|
||||
va_list ap;
|
||||
|
||||
va_start(ap, format);
|
||||
verrx(eval, format, ap);
|
||||
va_end(ap);
|
||||
}
|
||||
#endif
|
||||
|
@@ -6,7 +6,7 @@
|
||||
|
||||
#include <string.h>
|
||||
|
||||
__attribute__((weak)) void
|
||||
__attribute__((__weak__)) void
|
||||
__explicit_bzero_hook(void *buf, size_t len)
|
||||
{
|
||||
}
|
||||
|
@@ -32,6 +32,7 @@
|
||||
#include <sys/stat.h>
|
||||
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#include <stdarg.h>
|
||||
#include <unistd.h>
|
||||
|
||||
|
30
src/freezero.c
Normal file
30
src/freezero.c
Normal file
@@ -0,0 +1,30 @@
|
||||
/* $OpenBSD: malloc.c,v 1.267 2020/11/23 15:42:11 otto Exp $ */
|
||||
/*
|
||||
* Copyright (c) 2008, 2010, 2011, 2016 Otto Moerbeek <otto@drijf.net>
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* 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 <string.h>
|
||||
|
||||
void
|
||||
freezero(void *ptr, size_t sz)
|
||||
{
|
||||
/* This is legal. */
|
||||
if (ptr == NULL)
|
||||
return;
|
||||
|
||||
explicit_bzero(ptr, sz);
|
||||
free(ptr);
|
||||
}
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright © 2011, 2013, 2017 Guillem Jover
|
||||
* Copyright © 2011, 2013, 2017, 2020 Guillem Jover
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
@@ -87,10 +87,10 @@ funopen_close(void *cookie)
|
||||
struct funopen_cookie *cookiewrap = cookie;
|
||||
int rc;
|
||||
|
||||
if (cookiewrap->closefn == NULL)
|
||||
return 0;
|
||||
|
||||
rc = cookiewrap->closefn(cookiewrap->orig_cookie);
|
||||
if (cookiewrap->closefn)
|
||||
rc = cookiewrap->closefn(cookiewrap->orig_cookie);
|
||||
else
|
||||
rc = 0;
|
||||
|
||||
free(cookiewrap);
|
||||
|
||||
|
@@ -39,7 +39,7 @@
|
||||
#include <string.h>
|
||||
#include <termios.h>
|
||||
|
||||
#include "hash/sha512.h"
|
||||
#include <sha512.h>
|
||||
|
||||
#include <libperfstat.h>
|
||||
|
||||
@@ -54,9 +54,9 @@
|
||||
HD(b); \
|
||||
} while (0)
|
||||
|
||||
#define HR(x, l) (SHA512_Update(&ctx, (char *)(x), (l)))
|
||||
#define HD(x) (SHA512_Update(&ctx, (char *)&(x), sizeof (x)))
|
||||
#define HF(x) (SHA512_Update(&ctx, (char *)&(x), sizeof (void*)))
|
||||
#define HR(x, l) (SHA512_Update(&ctx, (uint8_t *)(x), (l)))
|
||||
#define HD(x) (SHA512_Update(&ctx, (uint8_t *)&(x), sizeof (x)))
|
||||
#define HF(x) (SHA512_Update(&ctx, (uint8_t *)&(x), sizeof (void*)))
|
||||
|
||||
int getentropy(void *buf, size_t len);
|
||||
|
||||
|
@@ -42,7 +42,7 @@
|
||||
#include <unistd.h>
|
||||
#include <time.h>
|
||||
|
||||
#include "hash/sha512.h"
|
||||
#include <sha512.h>
|
||||
|
||||
#include <sys/vfs.h>
|
||||
|
||||
@@ -59,9 +59,9 @@
|
||||
HD(b); \
|
||||
} while (0)
|
||||
|
||||
#define HR(x, l) (SHA512_Update(&ctx, (char *)(x), (l)))
|
||||
#define HD(x) (SHA512_Update(&ctx, (char *)&(x), sizeof (x)))
|
||||
#define HF(x) (SHA512_Update(&ctx, (char *)&(x), sizeof (void*)))
|
||||
#define HR(x, l) (SHA512_Update(&ctx, (uint8_t *)(x), (l)))
|
||||
#define HD(x) (SHA512_Update(&ctx, (uint8_t *)&(x), sizeof (x)))
|
||||
#define HF(x) (SHA512_Update(&ctx, (uint8_t *)&(x), sizeof (void*)))
|
||||
|
||||
int getentropy(void *buf, size_t len);
|
||||
|
||||
|
@@ -44,7 +44,7 @@
|
||||
#include <unistd.h>
|
||||
#include <time.h>
|
||||
|
||||
#include "hash/sha512.h"
|
||||
#include <sha512.h>
|
||||
|
||||
#ifdef HAVE_GETAUXVAL
|
||||
#include <sys/auxv.h>
|
||||
@@ -62,9 +62,9 @@
|
||||
HD(b); \
|
||||
} while (0)
|
||||
|
||||
#define HR(x, l) (SHA512_Update(&ctx, (char *)(x), (l)))
|
||||
#define HD(x) (SHA512_Update(&ctx, (char *)&(x), sizeof (x)))
|
||||
#define HF(x) (SHA512_Update(&ctx, (char *)&(x), sizeof (void*)))
|
||||
#define HR(x, l) (SHA512_Update(&ctx, (uint8_t *)(x), (l)))
|
||||
#define HD(x) (SHA512_Update(&ctx, (uint8_t *)&(x), sizeof (x)))
|
||||
#define HF(x) (SHA512_Update(&ctx, (uint8_t *)&(x), sizeof (void*)))
|
||||
|
||||
int getentropy(void *buf, size_t len);
|
||||
|
||||
@@ -228,7 +228,7 @@ getentropy_phdr(struct dl_phdr_info *info, size_t size, void *data)
|
||||
{
|
||||
SHA512_CTX *ctx = data;
|
||||
|
||||
SHA512_Update(ctx, &info->dlpi_addr, sizeof (info->dlpi_addr));
|
||||
SHA512_Update(ctx, (uint8_t *)&info->dlpi_addr, sizeof (info->dlpi_addr));
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
@@ -48,7 +48,7 @@
|
||||
#include <unistd.h>
|
||||
#include <time.h>
|
||||
|
||||
#include "hash/sha512.h"
|
||||
#include <sha512.h>
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/random.h>
|
||||
@@ -68,9 +68,9 @@
|
||||
HD(b); \
|
||||
} while (0)
|
||||
|
||||
#define HR(x, l) (SHA512_Update(&ctx, (char *)(x), (l)))
|
||||
#define HD(x) (SHA512_Update(&ctx, (char *)&(x), sizeof (x)))
|
||||
#define HF(x) (SHA512_Update(&ctx, (char *)&(x), sizeof (void*)))
|
||||
#define HR(x, l) (SHA512_Update(&ctx, (uint8_t *)(x), (l)))
|
||||
#define HD(x) (SHA512_Update(&ctx, (uint8_t *)&(x), sizeof (x)))
|
||||
#define HF(x) (SHA512_Update(&ctx, (uint8_t *)&(x), sizeof (void*)))
|
||||
|
||||
int getentropy(void *buf, size_t len);
|
||||
|
||||
@@ -333,7 +333,7 @@ getentropy_phdr(struct dl_phdr_info *info, size_t size, void *data)
|
||||
{
|
||||
SHA512_CTX *ctx = data;
|
||||
|
||||
SHA512_Update(ctx, &info->dlpi_addr, sizeof (info->dlpi_addr));
|
||||
SHA512_Update(ctx, (uint8_t *)&info->dlpi_addr, sizeof (info->dlpi_addr));
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
@@ -76,9 +76,9 @@
|
||||
HD(b); \
|
||||
} while (0)
|
||||
|
||||
#define HR(x, l) (SHA512_Update(&ctx, (char *)(x), (l)))
|
||||
#define HD(x) (SHA512_Update(&ctx, (char *)&(x), sizeof (x)))
|
||||
#define HF(x) (SHA512_Update(&ctx, (char *)&(x), sizeof (void*)))
|
||||
#define HR(x, l) (SHA512_Update(&ctx, (uint8_t *)(x), (l)))
|
||||
#define HD(x) (SHA512_Update(&ctx, (uint8_t *)&(x), sizeof (x)))
|
||||
#define HF(x) (SHA512_Update(&ctx, (uint8_t *)&(x), sizeof (void*)))
|
||||
|
||||
int getentropy(void *buf, size_t len);
|
||||
|
||||
|
@@ -62,9 +62,9 @@
|
||||
HD(b); \
|
||||
} while (0)
|
||||
|
||||
#define HR(x, l) (SHA512_Update(&ctx, (char *)(x), (l)))
|
||||
#define HD(x) (SHA512_Update(&ctx, (char *)&(x), sizeof (x)))
|
||||
#define HF(x) (SHA512_Update(&ctx, (char *)&(x), sizeof (void*)))
|
||||
#define HR(x, l) (SHA512_Update(&ctx, (uint8_t *)(x), (l)))
|
||||
#define HD(x) (SHA512_Update(&ctx, (uint8_t *)&(x), sizeof (x)))
|
||||
#define HF(x) (SHA512_Update(&ctx, (uint8_t *)&(x), sizeof (void*)))
|
||||
|
||||
int getentropy(void *buf, size_t len);
|
||||
|
||||
@@ -249,7 +249,7 @@ getentropy_phdr(struct dl_phdr_info *info, size_t size, void *data)
|
||||
{
|
||||
SHA512_CTX *ctx = data;
|
||||
|
||||
SHA512_Update(ctx, &info->dlpi_addr, sizeof (info->dlpi_addr));
|
||||
SHA512_Update(ctx, (uint8_t *)&info->dlpi_addr, sizeof (info->dlpi_addr));
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
1
src/hash/.gitignore
vendored
1
src/hash/.gitignore
vendored
@@ -1 +0,0 @@
|
||||
md5hl.c
|
@@ -1,102 +0,0 @@
|
||||
/** $MirOS: src/lib/libc/hash/helper.c,v 1.5 2007/05/07 15:21:18 tg Exp $ */
|
||||
/* $OpenBSD: helper.c,v 1.8 2005/08/08 08:05:35 espie Exp $ */
|
||||
|
||||
/*
|
||||
* ----------------------------------------------------------------------------
|
||||
* "THE BEER-WARE LICENSE" (Revision 42):
|
||||
* <phk@login.dkuug.dk> 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. Poul-Henning Kamp
|
||||
* ----------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/stat.h>
|
||||
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include <hashinc>
|
||||
|
||||
/* ARGSUSED */
|
||||
char *
|
||||
HASHEnd(HASH_CTX *ctx, char *buf)
|
||||
{
|
||||
int i;
|
||||
uint8_t digest[HASH_DIGEST_LENGTH];
|
||||
#ifdef HASH_DIGEST_UPPERCASE
|
||||
static const char hex[] = "0123456789ABCDEF";
|
||||
#else
|
||||
static const char hex[] = "0123456789abcdef";
|
||||
#endif
|
||||
|
||||
if (buf == NULL && (buf = malloc(HASH_DIGEST_STRING_LENGTH)) == NULL)
|
||||
return (NULL);
|
||||
|
||||
HASHFinal(digest, ctx);
|
||||
for (i = 0; i < HASH_DIGEST_LENGTH; i++) {
|
||||
buf[i + i] = hex[digest[i] >> 4];
|
||||
buf[i + i + 1] = hex[digest[i] & 0x0f];
|
||||
}
|
||||
buf[i + i] = '\0';
|
||||
memset(digest, 0, sizeof(digest));
|
||||
return (buf);
|
||||
}
|
||||
|
||||
char *
|
||||
HASHFileChunk(const char *filename, char *buf, off_t off, off_t len)
|
||||
{
|
||||
struct stat sb;
|
||||
unsigned char buffer[BUFSIZ];
|
||||
HASH_CTX ctx;
|
||||
int fd, save_errno;
|
||||
ssize_t nr;
|
||||
|
||||
HASHInit(&ctx);
|
||||
|
||||
if ((fd = open(filename, O_RDONLY)) < 0)
|
||||
return (NULL);
|
||||
if (len == 0) {
|
||||
if (fstat(fd, &sb) == -1) {
|
||||
close(fd);
|
||||
return (NULL);
|
||||
}
|
||||
len = sb.st_size;
|
||||
}
|
||||
if ((len < 0) || (off > 0 && lseek(fd, off, SEEK_SET) < 0)) {
|
||||
close(fd);
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
while ((nr = read(fd, buffer,
|
||||
(size_t)(len ? MIN(BUFSIZ, len) : BUFSIZ))) > 0) {
|
||||
HASHUpdate(&ctx, buffer, (size_t)nr);
|
||||
if (len > 0 && (len -= nr) == 0)
|
||||
break;
|
||||
}
|
||||
|
||||
save_errno = errno;
|
||||
close(fd);
|
||||
errno = save_errno;
|
||||
return (nr < 0 ? NULL : HASHEnd(&ctx, buf));
|
||||
}
|
||||
|
||||
char *
|
||||
HASHFile(const char *filename, char *buf)
|
||||
{
|
||||
return (HASHFileChunk(filename, buf, (off_t)0, (off_t)0));
|
||||
}
|
||||
|
||||
char *
|
||||
HASHData(const unsigned char *data, size_t len, char *buf)
|
||||
{
|
||||
HASH_CTX ctx;
|
||||
|
||||
HASHInit(&ctx);
|
||||
HASHUpdate(&ctx, data, len);
|
||||
return (HASHEnd(&ctx, buf));
|
||||
}
|
248
src/hash/md5.c
248
src/hash/md5.c
@@ -1,248 +0,0 @@
|
||||
/* $OpenBSD: md5.c,v 1.8 2005/08/08 08:05:35 espie Exp $ */
|
||||
|
||||
/*
|
||||
* This code implements the MD5 message-digest algorithm.
|
||||
* The algorithm is due to Ron Rivest. This code was
|
||||
* written by Colin Plumb in 1993, no copyright is claimed.
|
||||
* This code is in the public domain; do with it what you wish.
|
||||
*
|
||||
* Equivalent code is available from RSA Data Security, Inc.
|
||||
* This code has been tested against that, and is equivalent,
|
||||
* except that you don't need to include two pages of legalese
|
||||
* with every copy.
|
||||
*
|
||||
* To compute the message digest of a chunk of bytes, declare an
|
||||
* MD5Context structure, pass it to MD5Init, call MD5Update as
|
||||
* needed on buffers full of bytes, and then call MD5Final, which
|
||||
* will fill a supplied 16-byte array with the digest.
|
||||
*/
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <string.h>
|
||||
#include <md5.h>
|
||||
|
||||
#define PUT_64BIT_LE(cp, value) do { \
|
||||
(cp)[7] = (value) >> 56; \
|
||||
(cp)[6] = (value) >> 48; \
|
||||
(cp)[5] = (value) >> 40; \
|
||||
(cp)[4] = (value) >> 32; \
|
||||
(cp)[3] = (value) >> 24; \
|
||||
(cp)[2] = (value) >> 16; \
|
||||
(cp)[1] = (value) >> 8; \
|
||||
(cp)[0] = (value); } while (0)
|
||||
|
||||
#define PUT_32BIT_LE(cp, value) do { \
|
||||
(cp)[3] = (value) >> 24; \
|
||||
(cp)[2] = (value) >> 16; \
|
||||
(cp)[1] = (value) >> 8; \
|
||||
(cp)[0] = (value); } while (0)
|
||||
|
||||
static uint8_t PADDING[MD5_BLOCK_LENGTH] = {
|
||||
0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
|
||||
};
|
||||
|
||||
/*
|
||||
* Start MD5 accumulation. Set bit count to 0 and buffer to mysterious
|
||||
* initialization constants.
|
||||
*/
|
||||
void
|
||||
MD5Init(MD5_CTX *ctx)
|
||||
{
|
||||
ctx->count = 0;
|
||||
ctx->state[0] = 0x67452301;
|
||||
ctx->state[1] = 0xefcdab89;
|
||||
ctx->state[2] = 0x98badcfe;
|
||||
ctx->state[3] = 0x10325476;
|
||||
}
|
||||
|
||||
/*
|
||||
* Update context to reflect the concatenation of another buffer full
|
||||
* of bytes.
|
||||
*/
|
||||
void
|
||||
MD5Update(MD5_CTX *ctx, const unsigned char *input, size_t len)
|
||||
{
|
||||
size_t have, need;
|
||||
|
||||
/* Check how many bytes we already have and how many more we need. */
|
||||
have = (size_t)((ctx->count >> 3) & (MD5_BLOCK_LENGTH - 1));
|
||||
need = MD5_BLOCK_LENGTH - have;
|
||||
|
||||
/* Update bitcount */
|
||||
ctx->count += (uint64_t)len << 3;
|
||||
|
||||
if (len >= need) {
|
||||
if (have != 0) {
|
||||
memcpy(ctx->buffer + have, input, need);
|
||||
MD5Transform(ctx->state, ctx->buffer);
|
||||
input += need;
|
||||
len -= need;
|
||||
have = 0;
|
||||
}
|
||||
|
||||
/* Process data in MD5_BLOCK_LENGTH-byte chunks. */
|
||||
while (len >= MD5_BLOCK_LENGTH) {
|
||||
MD5Transform(ctx->state, input);
|
||||
input += MD5_BLOCK_LENGTH;
|
||||
len -= MD5_BLOCK_LENGTH;
|
||||
}
|
||||
}
|
||||
|
||||
/* Handle any remaining bytes of data. */
|
||||
if (len != 0)
|
||||
memcpy(ctx->buffer + have, input, len);
|
||||
}
|
||||
|
||||
/*
|
||||
* Pad pad to 64-byte boundary with the bit pattern
|
||||
* 1 0* (64-bit count of bits processed, MSB-first)
|
||||
*/
|
||||
void
|
||||
MD5Pad(MD5_CTX *ctx)
|
||||
{
|
||||
uint8_t count[8];
|
||||
size_t padlen;
|
||||
|
||||
/* Convert count to 8 bytes in little endian order. */
|
||||
PUT_64BIT_LE(count, ctx->count);
|
||||
|
||||
/* Pad out to 56 mod 64. */
|
||||
padlen = MD5_BLOCK_LENGTH -
|
||||
((ctx->count >> 3) & (MD5_BLOCK_LENGTH - 1));
|
||||
if (padlen < 1 + 8)
|
||||
padlen += MD5_BLOCK_LENGTH;
|
||||
MD5Update(ctx, PADDING, padlen - 8); /* padlen - 8 <= 64 */
|
||||
MD5Update(ctx, count, 8);
|
||||
}
|
||||
|
||||
/*
|
||||
* Final wrapup--call MD5Pad, fill in digest and zero out ctx.
|
||||
*/
|
||||
void
|
||||
MD5Final(unsigned char digest[MD5_DIGEST_LENGTH], MD5_CTX *ctx)
|
||||
{
|
||||
int i;
|
||||
|
||||
MD5Pad(ctx);
|
||||
if (digest != NULL) {
|
||||
for (i = 0; i < 4; i++)
|
||||
PUT_32BIT_LE(digest + i * 4, ctx->state[i]);
|
||||
memset(ctx, 0, sizeof(*ctx));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* The four core functions - F1 is optimized somewhat */
|
||||
|
||||
/* #define F1(x, y, z) (x & y | ~x & z) */
|
||||
#define F1(x, y, z) (z ^ (x & (y ^ z)))
|
||||
#define F2(x, y, z) F1(z, x, y)
|
||||
#define F3(x, y, z) (x ^ y ^ z)
|
||||
#define F4(x, y, z) (y ^ (x | ~z))
|
||||
|
||||
/* This is the central step in the MD5 algorithm. */
|
||||
#define MD5STEP(f, w, x, y, z, data, s) \
|
||||
( w += f(x, y, z) + data, w = w<<s | w>>(32-s), w += x )
|
||||
|
||||
/*
|
||||
* The core of the MD5 algorithm, this alters an existing MD5 hash to
|
||||
* reflect the addition of 16 longwords of new data. MD5Update blocks
|
||||
* the data and converts bytes into longwords for this routine.
|
||||
*/
|
||||
void
|
||||
MD5Transform(uint32_t state[4], const uint8_t block[MD5_BLOCK_LENGTH])
|
||||
{
|
||||
uint32_t a, b, c, d, in[MD5_BLOCK_LENGTH / 4];
|
||||
|
||||
#if BYTE_ORDER == LITTLE_ENDIAN
|
||||
memcpy(in, block, sizeof(in));
|
||||
#else
|
||||
for (a = 0; a < MD5_BLOCK_LENGTH / 4; a++) {
|
||||
in[a] = (uint32_t)(
|
||||
(uint32_t)(block[a * 4 + 0]) |
|
||||
(uint32_t)(block[a * 4 + 1]) << 8 |
|
||||
(uint32_t)(block[a * 4 + 2]) << 16 |
|
||||
(uint32_t)(block[a * 4 + 3]) << 24);
|
||||
}
|
||||
#endif
|
||||
|
||||
a = state[0];
|
||||
b = state[1];
|
||||
c = state[2];
|
||||
d = state[3];
|
||||
|
||||
MD5STEP(F1, a, b, c, d, in[ 0] + 0xd76aa478, 7);
|
||||
MD5STEP(F1, d, a, b, c, in[ 1] + 0xe8c7b756, 12);
|
||||
MD5STEP(F1, c, d, a, b, in[ 2] + 0x242070db, 17);
|
||||
MD5STEP(F1, b, c, d, a, in[ 3] + 0xc1bdceee, 22);
|
||||
MD5STEP(F1, a, b, c, d, in[ 4] + 0xf57c0faf, 7);
|
||||
MD5STEP(F1, d, a, b, c, in[ 5] + 0x4787c62a, 12);
|
||||
MD5STEP(F1, c, d, a, b, in[ 6] + 0xa8304613, 17);
|
||||
MD5STEP(F1, b, c, d, a, in[ 7] + 0xfd469501, 22);
|
||||
MD5STEP(F1, a, b, c, d, in[ 8] + 0x698098d8, 7);
|
||||
MD5STEP(F1, d, a, b, c, in[ 9] + 0x8b44f7af, 12);
|
||||
MD5STEP(F1, c, d, a, b, in[10] + 0xffff5bb1, 17);
|
||||
MD5STEP(F1, b, c, d, a, in[11] + 0x895cd7be, 22);
|
||||
MD5STEP(F1, a, b, c, d, in[12] + 0x6b901122, 7);
|
||||
MD5STEP(F1, d, a, b, c, in[13] + 0xfd987193, 12);
|
||||
MD5STEP(F1, c, d, a, b, in[14] + 0xa679438e, 17);
|
||||
MD5STEP(F1, b, c, d, a, in[15] + 0x49b40821, 22);
|
||||
|
||||
MD5STEP(F2, a, b, c, d, in[ 1] + 0xf61e2562, 5);
|
||||
MD5STEP(F2, d, a, b, c, in[ 6] + 0xc040b340, 9);
|
||||
MD5STEP(F2, c, d, a, b, in[11] + 0x265e5a51, 14);
|
||||
MD5STEP(F2, b, c, d, a, in[ 0] + 0xe9b6c7aa, 20);
|
||||
MD5STEP(F2, a, b, c, d, in[ 5] + 0xd62f105d, 5);
|
||||
MD5STEP(F2, d, a, b, c, in[10] + 0x02441453, 9);
|
||||
MD5STEP(F2, c, d, a, b, in[15] + 0xd8a1e681, 14);
|
||||
MD5STEP(F2, b, c, d, a, in[ 4] + 0xe7d3fbc8, 20);
|
||||
MD5STEP(F2, a, b, c, d, in[ 9] + 0x21e1cde6, 5);
|
||||
MD5STEP(F2, d, a, b, c, in[14] + 0xc33707d6, 9);
|
||||
MD5STEP(F2, c, d, a, b, in[ 3] + 0xf4d50d87, 14);
|
||||
MD5STEP(F2, b, c, d, a, in[ 8] + 0x455a14ed, 20);
|
||||
MD5STEP(F2, a, b, c, d, in[13] + 0xa9e3e905, 5);
|
||||
MD5STEP(F2, d, a, b, c, in[ 2] + 0xfcefa3f8, 9);
|
||||
MD5STEP(F2, c, d, a, b, in[ 7] + 0x676f02d9, 14);
|
||||
MD5STEP(F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20);
|
||||
|
||||
MD5STEP(F3, a, b, c, d, in[ 5] + 0xfffa3942, 4);
|
||||
MD5STEP(F3, d, a, b, c, in[ 8] + 0x8771f681, 11);
|
||||
MD5STEP(F3, c, d, a, b, in[11] + 0x6d9d6122, 16);
|
||||
MD5STEP(F3, b, c, d, a, in[14] + 0xfde5380c, 23);
|
||||
MD5STEP(F3, a, b, c, d, in[ 1] + 0xa4beea44, 4);
|
||||
MD5STEP(F3, d, a, b, c, in[ 4] + 0x4bdecfa9, 11);
|
||||
MD5STEP(F3, c, d, a, b, in[ 7] + 0xf6bb4b60, 16);
|
||||
MD5STEP(F3, b, c, d, a, in[10] + 0xbebfbc70, 23);
|
||||
MD5STEP(F3, a, b, c, d, in[13] + 0x289b7ec6, 4);
|
||||
MD5STEP(F3, d, a, b, c, in[ 0] + 0xeaa127fa, 11);
|
||||
MD5STEP(F3, c, d, a, b, in[ 3] + 0xd4ef3085, 16);
|
||||
MD5STEP(F3, b, c, d, a, in[ 6] + 0x04881d05, 23);
|
||||
MD5STEP(F3, a, b, c, d, in[ 9] + 0xd9d4d039, 4);
|
||||
MD5STEP(F3, d, a, b, c, in[12] + 0xe6db99e5, 11);
|
||||
MD5STEP(F3, c, d, a, b, in[15] + 0x1fa27cf8, 16);
|
||||
MD5STEP(F3, b, c, d, a, in[2 ] + 0xc4ac5665, 23);
|
||||
|
||||
MD5STEP(F4, a, b, c, d, in[ 0] + 0xf4292244, 6);
|
||||
MD5STEP(F4, d, a, b, c, in[7 ] + 0x432aff97, 10);
|
||||
MD5STEP(F4, c, d, a, b, in[14] + 0xab9423a7, 15);
|
||||
MD5STEP(F4, b, c, d, a, in[5 ] + 0xfc93a039, 21);
|
||||
MD5STEP(F4, a, b, c, d, in[12] + 0x655b59c3, 6);
|
||||
MD5STEP(F4, d, a, b, c, in[3 ] + 0x8f0ccc92, 10);
|
||||
MD5STEP(F4, c, d, a, b, in[10] + 0xffeff47d, 15);
|
||||
MD5STEP(F4, b, c, d, a, in[1 ] + 0x85845dd1, 21);
|
||||
MD5STEP(F4, a, b, c, d, in[8 ] + 0x6fa87e4f, 6);
|
||||
MD5STEP(F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10);
|
||||
MD5STEP(F4, c, d, a, b, in[6 ] + 0xa3014314, 15);
|
||||
MD5STEP(F4, b, c, d, a, in[13] + 0x4e0811a1, 21);
|
||||
MD5STEP(F4, a, b, c, d, in[4 ] + 0xf7537e82, 6);
|
||||
MD5STEP(F4, d, a, b, c, in[11] + 0xbd3af235, 10);
|
||||
MD5STEP(F4, c, d, a, b, in[2 ] + 0x2ad7d2bb, 15);
|
||||
MD5STEP(F4, b, c, d, a, in[9 ] + 0xeb86d391, 21);
|
||||
|
||||
state[0] += a;
|
||||
state[1] += b;
|
||||
state[2] += c;
|
||||
state[3] += d;
|
||||
}
|
@@ -1,53 +0,0 @@
|
||||
/*-
|
||||
* Copyright 2005 Colin Percival
|
||||
* 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.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
|
||||
*
|
||||
* $FreeBSD$
|
||||
*/
|
||||
|
||||
#ifndef _SHA512_H_
|
||||
#define _SHA512_H_
|
||||
|
||||
#include <sys/types.h>
|
||||
|
||||
#define SHA512_DIGEST_LENGTH 64
|
||||
|
||||
typedef struct SHA512Context {
|
||||
uint64_t state[8];
|
||||
uint64_t count[2];
|
||||
unsigned char buf[128];
|
||||
} SHA512_CTX;
|
||||
|
||||
__BEGIN_DECLS
|
||||
|
||||
void SHA512_Init(SHA512_CTX *);
|
||||
void SHA512_Update(SHA512_CTX *, const void *, size_t);
|
||||
void SHA512_Final(unsigned char [64], SHA512_CTX *);
|
||||
char *SHA512_End(SHA512_CTX *, char *);
|
||||
char *SHA512_File(const char *, char *);
|
||||
char *SHA512_FileChunk(const char *, char *, off_t, off_t);
|
||||
char *SHA512_Data(const void *, unsigned int, char *);
|
||||
__END_DECLS
|
||||
|
||||
#endif /* !_SHA512_H_ */
|
@@ -1,318 +0,0 @@
|
||||
/*-
|
||||
* Copyright 2005 Colin Percival
|
||||
* 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.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#include <sys/endian.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#include "sha512.h"
|
||||
|
||||
#if BYTE_ORDER == BIG_ENDIAN
|
||||
|
||||
/* Copy a vector of big-endian uint64_t into a vector of bytes */
|
||||
#define be64enc_vect(dst, src, len) \
|
||||
memcpy((void *)dst, (const void *)src, (size_t)len)
|
||||
|
||||
/* Copy a vector of bytes into a vector of big-endian uint64_t */
|
||||
#define be64dec_vect(dst, src, len) \
|
||||
memcpy((void *)dst, (const void *)src, (size_t)len)
|
||||
|
||||
#else /* BYTE_ORDER != BIG_ENDIAN */
|
||||
|
||||
/*
|
||||
* Encode a length len/4 vector of (uint64_t) into a length len vector of
|
||||
* (unsigned char) in big-endian form. Assumes len is a multiple of 8.
|
||||
*/
|
||||
static void
|
||||
be64enc_vect(unsigned char *dst, const uint64_t *src, size_t len)
|
||||
{
|
||||
size_t i;
|
||||
|
||||
for (i = 0; i < len / 8; i++)
|
||||
be64enc(dst + i * 8, src[i]);
|
||||
}
|
||||
|
||||
/*
|
||||
* Decode a big-endian length len vector of (unsigned char) into a length
|
||||
* len/4 vector of (uint64_t). Assumes len is a multiple of 8.
|
||||
*/
|
||||
static void
|
||||
be64dec_vect(uint64_t *dst, const unsigned char *src, size_t len)
|
||||
{
|
||||
size_t i;
|
||||
|
||||
for (i = 0; i < len / 8; i++)
|
||||
dst[i] = be64dec(src + i * 8);
|
||||
}
|
||||
|
||||
#endif /* BYTE_ORDER != BIG_ENDIAN */
|
||||
|
||||
/* Elementary functions used by SHA512 */
|
||||
#define Ch(x, y, z) ((x & (y ^ z)) ^ z)
|
||||
#define Maj(x, y, z) ((x & (y | z)) | (y & z))
|
||||
#define SHR(x, n) (x >> n)
|
||||
#define ROTR(x, n) ((x >> n) | (x << (64 - n)))
|
||||
#define S0(x) (ROTR(x, 28) ^ ROTR(x, 34) ^ ROTR(x, 39))
|
||||
#define S1(x) (ROTR(x, 14) ^ ROTR(x, 18) ^ ROTR(x, 41))
|
||||
#define s0(x) (ROTR(x, 1) ^ ROTR(x, 8) ^ SHR(x, 7))
|
||||
#define s1(x) (ROTR(x, 19) ^ ROTR(x, 61) ^ SHR(x, 6))
|
||||
|
||||
/* SHA512 round function */
|
||||
#define RND(a, b, c, d, e, f, g, h, k) \
|
||||
t0 = h + S1(e) + Ch(e, f, g) + k; \
|
||||
t1 = S0(a) + Maj(a, b, c); \
|
||||
d += t0; \
|
||||
h = t0 + t1;
|
||||
|
||||
/* Adjusted round function for rotating state */
|
||||
#define RNDr(S, W, i, k) \
|
||||
RND(S[(80 - i) % 8], S[(81 - i) % 8], \
|
||||
S[(82 - i) % 8], S[(83 - i) % 8], \
|
||||
S[(84 - i) % 8], S[(85 - i) % 8], \
|
||||
S[(86 - i) % 8], S[(87 - i) % 8], \
|
||||
W[i] + k)
|
||||
|
||||
/*
|
||||
* SHA512 block compression function. The 512-bit state is transformed via
|
||||
* the 512-bit input block to produce a new state.
|
||||
*/
|
||||
static void
|
||||
SHA512_Transform(uint64_t * state, const unsigned char block[128])
|
||||
{
|
||||
uint64_t W[80];
|
||||
uint64_t S[8];
|
||||
uint64_t t0, t1;
|
||||
int i;
|
||||
|
||||
/* 1. Prepare message schedule W. */
|
||||
be64dec_vect(W, block, 128);
|
||||
for (i = 16; i < 80; i++)
|
||||
W[i] = s1(W[i - 2]) + W[i - 7] + s0(W[i - 15]) + W[i - 16];
|
||||
|
||||
/* 2. Initialize working variables. */
|
||||
memcpy(S, state, 64);
|
||||
|
||||
/* 3. Mix. */
|
||||
RNDr(S, W, 0, 0x428a2f98d728ae22ULL);
|
||||
RNDr(S, W, 1, 0x7137449123ef65cdULL);
|
||||
RNDr(S, W, 2, 0xb5c0fbcfec4d3b2fULL);
|
||||
RNDr(S, W, 3, 0xe9b5dba58189dbbcULL);
|
||||
RNDr(S, W, 4, 0x3956c25bf348b538ULL);
|
||||
RNDr(S, W, 5, 0x59f111f1b605d019ULL);
|
||||
RNDr(S, W, 6, 0x923f82a4af194f9bULL);
|
||||
RNDr(S, W, 7, 0xab1c5ed5da6d8118ULL);
|
||||
RNDr(S, W, 8, 0xd807aa98a3030242ULL);
|
||||
RNDr(S, W, 9, 0x12835b0145706fbeULL);
|
||||
RNDr(S, W, 10, 0x243185be4ee4b28cULL);
|
||||
RNDr(S, W, 11, 0x550c7dc3d5ffb4e2ULL);
|
||||
RNDr(S, W, 12, 0x72be5d74f27b896fULL);
|
||||
RNDr(S, W, 13, 0x80deb1fe3b1696b1ULL);
|
||||
RNDr(S, W, 14, 0x9bdc06a725c71235ULL);
|
||||
RNDr(S, W, 15, 0xc19bf174cf692694ULL);
|
||||
RNDr(S, W, 16, 0xe49b69c19ef14ad2ULL);
|
||||
RNDr(S, W, 17, 0xefbe4786384f25e3ULL);
|
||||
RNDr(S, W, 18, 0x0fc19dc68b8cd5b5ULL);
|
||||
RNDr(S, W, 19, 0x240ca1cc77ac9c65ULL);
|
||||
RNDr(S, W, 20, 0x2de92c6f592b0275ULL);
|
||||
RNDr(S, W, 21, 0x4a7484aa6ea6e483ULL);
|
||||
RNDr(S, W, 22, 0x5cb0a9dcbd41fbd4ULL);
|
||||
RNDr(S, W, 23, 0x76f988da831153b5ULL);
|
||||
RNDr(S, W, 24, 0x983e5152ee66dfabULL);
|
||||
RNDr(S, W, 25, 0xa831c66d2db43210ULL);
|
||||
RNDr(S, W, 26, 0xb00327c898fb213fULL);
|
||||
RNDr(S, W, 27, 0xbf597fc7beef0ee4ULL);
|
||||
RNDr(S, W, 28, 0xc6e00bf33da88fc2ULL);
|
||||
RNDr(S, W, 29, 0xd5a79147930aa725ULL);
|
||||
RNDr(S, W, 30, 0x06ca6351e003826fULL);
|
||||
RNDr(S, W, 31, 0x142929670a0e6e70ULL);
|
||||
RNDr(S, W, 32, 0x27b70a8546d22ffcULL);
|
||||
RNDr(S, W, 33, 0x2e1b21385c26c926ULL);
|
||||
RNDr(S, W, 34, 0x4d2c6dfc5ac42aedULL);
|
||||
RNDr(S, W, 35, 0x53380d139d95b3dfULL);
|
||||
RNDr(S, W, 36, 0x650a73548baf63deULL);
|
||||
RNDr(S, W, 37, 0x766a0abb3c77b2a8ULL);
|
||||
RNDr(S, W, 38, 0x81c2c92e47edaee6ULL);
|
||||
RNDr(S, W, 39, 0x92722c851482353bULL);
|
||||
RNDr(S, W, 40, 0xa2bfe8a14cf10364ULL);
|
||||
RNDr(S, W, 41, 0xa81a664bbc423001ULL);
|
||||
RNDr(S, W, 42, 0xc24b8b70d0f89791ULL);
|
||||
RNDr(S, W, 43, 0xc76c51a30654be30ULL);
|
||||
RNDr(S, W, 44, 0xd192e819d6ef5218ULL);
|
||||
RNDr(S, W, 45, 0xd69906245565a910ULL);
|
||||
RNDr(S, W, 46, 0xf40e35855771202aULL);
|
||||
RNDr(S, W, 47, 0x106aa07032bbd1b8ULL);
|
||||
RNDr(S, W, 48, 0x19a4c116b8d2d0c8ULL);
|
||||
RNDr(S, W, 49, 0x1e376c085141ab53ULL);
|
||||
RNDr(S, W, 50, 0x2748774cdf8eeb99ULL);
|
||||
RNDr(S, W, 51, 0x34b0bcb5e19b48a8ULL);
|
||||
RNDr(S, W, 52, 0x391c0cb3c5c95a63ULL);
|
||||
RNDr(S, W, 53, 0x4ed8aa4ae3418acbULL);
|
||||
RNDr(S, W, 54, 0x5b9cca4f7763e373ULL);
|
||||
RNDr(S, W, 55, 0x682e6ff3d6b2b8a3ULL);
|
||||
RNDr(S, W, 56, 0x748f82ee5defb2fcULL);
|
||||
RNDr(S, W, 57, 0x78a5636f43172f60ULL);
|
||||
RNDr(S, W, 58, 0x84c87814a1f0ab72ULL);
|
||||
RNDr(S, W, 59, 0x8cc702081a6439ecULL);
|
||||
RNDr(S, W, 60, 0x90befffa23631e28ULL);
|
||||
RNDr(S, W, 61, 0xa4506cebde82bde9ULL);
|
||||
RNDr(S, W, 62, 0xbef9a3f7b2c67915ULL);
|
||||
RNDr(S, W, 63, 0xc67178f2e372532bULL);
|
||||
RNDr(S, W, 64, 0xca273eceea26619cULL);
|
||||
RNDr(S, W, 65, 0xd186b8c721c0c207ULL);
|
||||
RNDr(S, W, 66, 0xeada7dd6cde0eb1eULL);
|
||||
RNDr(S, W, 67, 0xf57d4f7fee6ed178ULL);
|
||||
RNDr(S, W, 68, 0x06f067aa72176fbaULL);
|
||||
RNDr(S, W, 69, 0x0a637dc5a2c898a6ULL);
|
||||
RNDr(S, W, 70, 0x113f9804bef90daeULL);
|
||||
RNDr(S, W, 71, 0x1b710b35131c471bULL);
|
||||
RNDr(S, W, 72, 0x28db77f523047d84ULL);
|
||||
RNDr(S, W, 73, 0x32caab7b40c72493ULL);
|
||||
RNDr(S, W, 74, 0x3c9ebe0a15c9bebcULL);
|
||||
RNDr(S, W, 75, 0x431d67c49c100d4cULL);
|
||||
RNDr(S, W, 76, 0x4cc5d4becb3e42b6ULL);
|
||||
RNDr(S, W, 77, 0x597f299cfc657e2aULL);
|
||||
RNDr(S, W, 78, 0x5fcb6fab3ad6faecULL);
|
||||
RNDr(S, W, 79, 0x6c44198c4a475817ULL);
|
||||
|
||||
/* 4. Mix local working variables into global state */
|
||||
for (i = 0; i < 8; i++)
|
||||
state[i] += S[i];
|
||||
}
|
||||
|
||||
static unsigned char PAD[128] = {
|
||||
0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
|
||||
};
|
||||
|
||||
/* Add padding and terminating bit-count. */
|
||||
static void
|
||||
SHA512_Pad(SHA512_CTX * ctx)
|
||||
{
|
||||
unsigned char len[16];
|
||||
uint64_t r, plen;
|
||||
|
||||
/*
|
||||
* Convert length to a vector of bytes -- we do this now rather
|
||||
* than later because the length will change after we pad.
|
||||
*/
|
||||
be64enc_vect(len, ctx->count, 16);
|
||||
|
||||
/* Add 1--128 bytes so that the resulting length is 112 mod 128 */
|
||||
r = (ctx->count[1] >> 3) & 0x7f;
|
||||
plen = (r < 112) ? (112 - r) : (240 - r);
|
||||
SHA512_Update(ctx, PAD, (size_t)plen);
|
||||
|
||||
/* Add the terminating bit-count */
|
||||
SHA512_Update(ctx, len, 16);
|
||||
}
|
||||
|
||||
/* SHA-512 initialization. Begins a SHA-512 operation. */
|
||||
void
|
||||
SHA512_Init(SHA512_CTX * ctx)
|
||||
{
|
||||
|
||||
/* Zero bits processed so far */
|
||||
ctx->count[0] = ctx->count[1] = 0;
|
||||
|
||||
/* Magic initialization constants */
|
||||
ctx->state[0] = 0x6a09e667f3bcc908ULL;
|
||||
ctx->state[1] = 0xbb67ae8584caa73bULL;
|
||||
ctx->state[2] = 0x3c6ef372fe94f82bULL;
|
||||
ctx->state[3] = 0xa54ff53a5f1d36f1ULL;
|
||||
ctx->state[4] = 0x510e527fade682d1ULL;
|
||||
ctx->state[5] = 0x9b05688c2b3e6c1fULL;
|
||||
ctx->state[6] = 0x1f83d9abfb41bd6bULL;
|
||||
ctx->state[7] = 0x5be0cd19137e2179ULL;
|
||||
}
|
||||
|
||||
/* Add bytes into the hash */
|
||||
void
|
||||
SHA512_Update(SHA512_CTX * ctx, const void *in, size_t len)
|
||||
{
|
||||
uint64_t bitlen[2];
|
||||
uint64_t r;
|
||||
const unsigned char *src = in;
|
||||
|
||||
/* Number of bytes left in the buffer from previous updates */
|
||||
r = (ctx->count[1] >> 3) & 0x7f;
|
||||
|
||||
/* Convert the length into a number of bits */
|
||||
bitlen[1] = ((uint64_t)len) << 3;
|
||||
bitlen[0] = ((uint64_t)len) >> 61;
|
||||
|
||||
/* Update number of bits */
|
||||
if ((ctx->count[1] += bitlen[1]) < bitlen[1])
|
||||
ctx->count[0]++;
|
||||
ctx->count[0] += bitlen[0];
|
||||
|
||||
/* Handle the case where we don't need to perform any transforms */
|
||||
if (len < 128 - r) {
|
||||
memcpy(&ctx->buf[r], src, len);
|
||||
return;
|
||||
}
|
||||
|
||||
/* Finish the current block */
|
||||
memcpy(&ctx->buf[r], src, 128 - r);
|
||||
SHA512_Transform(ctx->state, ctx->buf);
|
||||
src += 128 - r;
|
||||
len -= 128 - r;
|
||||
|
||||
/* Perform complete blocks */
|
||||
while (len >= 128) {
|
||||
SHA512_Transform(ctx->state, src);
|
||||
src += 128;
|
||||
len -= 128;
|
||||
}
|
||||
|
||||
/* Copy left over data into buffer */
|
||||
memcpy(ctx->buf, src, len);
|
||||
}
|
||||
|
||||
/*
|
||||
* SHA-512 finalization. Pads the input data, exports the hash value,
|
||||
* and clears the context state.
|
||||
*/
|
||||
void
|
||||
SHA512_Final(unsigned char digest[64], SHA512_CTX * ctx)
|
||||
{
|
||||
|
||||
/* Add padding */
|
||||
SHA512_Pad(ctx);
|
||||
|
||||
/* Write the hash */
|
||||
be64enc_vect(digest, ctx->state, 64);
|
||||
|
||||
/* Clear the context state */
|
||||
memset((void *)ctx, 0, sizeof(*ctx));
|
||||
}
|
@@ -19,9 +19,14 @@
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#include <sys/types.h>
|
||||
#ifdef _WIN32
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#include <WinSock2.h>
|
||||
#else
|
||||
#include <sys/socket.h>
|
||||
#include <netinet/in.h>
|
||||
#include <arpa/inet.h>
|
||||
#endif
|
||||
|
||||
#include <assert.h>
|
||||
#include <ctype.h>
|
||||
|
@@ -35,6 +35,8 @@ LIBBSD_0.0 {
|
||||
strunvis;
|
||||
strunvisx;
|
||||
|
||||
/* The following functions are provided via the system libc or libmd
|
||||
* implementations. */
|
||||
MD5Init;
|
||||
MD5Update;
|
||||
MD5Pad;
|
||||
@@ -168,3 +170,28 @@ LIBBSD_0.9.1 {
|
||||
strnvis_netbsd;
|
||||
strnunvis_netbsd;
|
||||
} LIBBSD_0.9;
|
||||
|
||||
LIBBSD_0.10.0 {
|
||||
/* These BSD extensions are available on GNU systems, but not on other
|
||||
* systems such as Windows or musl libc based ones. */
|
||||
vwarn;
|
||||
vwarnx;
|
||||
warn;
|
||||
warnx;
|
||||
verr;
|
||||
verrx;
|
||||
err;
|
||||
errx;
|
||||
} LIBBSD_0.9.1;
|
||||
|
||||
LIBBSD_0.11.0 {
|
||||
strnvisx;
|
||||
|
||||
recallocarray;
|
||||
freezero;
|
||||
|
||||
gid_from_group;
|
||||
group_from_gid;
|
||||
uid_from_user;
|
||||
user_from_uid;
|
||||
} LIBBSD_0.10.0;
|
||||
|
@@ -37,13 +37,15 @@
|
||||
|
||||
#define ELF_TARG_VER EV_CURRENT
|
||||
|
||||
/* The following entries are sorted alphabetically. */
|
||||
|
||||
#if defined(__alpha__)
|
||||
|
||||
#define ELF_TARG_MACH EM_ALPHA
|
||||
#define ELF_TARG_CLASS ELFCLASS64
|
||||
#define ELF_TARG_DATA ELFDATA2LSB
|
||||
|
||||
#elif defined(__amd64__)
|
||||
#elif defined(__amd64__) || defined(__x86_64__)
|
||||
|
||||
#define ELF_TARG_MACH EM_X86_64
|
||||
#if defined(__ILP32__)
|
||||
@@ -53,6 +55,12 @@
|
||||
#endif
|
||||
#define ELF_TARG_DATA ELFDATA2LSB
|
||||
|
||||
#elif defined (__arc__)
|
||||
|
||||
#define ELF_TARG_MACH EM_ARC
|
||||
#define ELF_TARG_CLASS ELFCLASS32
|
||||
#define ELF_TARG_DATA ELFDATA2LSB
|
||||
|
||||
#elif defined(__arm__)
|
||||
|
||||
#define ELF_TARG_MACH EM_ARM
|
||||
@@ -66,7 +74,11 @@
|
||||
#elif defined(__aarch64__)
|
||||
|
||||
#define ELF_TARG_MACH EM_AARCH64
|
||||
#if defined(__ILP32__)
|
||||
#define ELF_TARG_CLASS ELFCLASS32
|
||||
#else
|
||||
#define ELF_TARG_CLASS ELFCLASS64
|
||||
#endif
|
||||
#if defined(__AARCH64EB__)
|
||||
#define ELF_TARG_DATA ELFDATA2MSB
|
||||
#else
|
||||
@@ -88,6 +100,12 @@
|
||||
#error Unknown AVR32 endianness
|
||||
#endif
|
||||
|
||||
#elif defined(__e2k__)
|
||||
|
||||
#define ELF_TARG_MACH EM_MCST_ELBRUS
|
||||
#define ELF_TARG_CLASS ELFCLASS64
|
||||
#define ELF_TARG_DATA ELFDATA2LSB
|
||||
|
||||
#elif defined(__hppa__)
|
||||
|
||||
#define ELF_TARG_MACH EM_PARISC
|
||||
|
@@ -29,5 +29,19 @@
|
||||
|
||||
#define libbsd_link_warning(symbol, msg) \
|
||||
static const char libbsd_emit_link_warning_##symbol[] \
|
||||
__attribute__((used,section(".gnu.warning." #symbol))) = msg;
|
||||
__attribute__((__used__,__section__(".gnu.warning." #symbol))) = msg;
|
||||
|
||||
#ifdef __ELF__
|
||||
#define libbsd_symver_default(alias, symbol, version) \
|
||||
__asm__(".symver " #symbol "," #alias "@@" #version)
|
||||
|
||||
#define libbsd_symver_variant(alias, symbol, version) \
|
||||
__asm__(".symver " #symbol "," #alias "@" #version)
|
||||
#else
|
||||
#define libbsd_symver_default(alias, symbol, version) \
|
||||
extern __typeof(symbol) alias __attribute__((__alias__(#symbol)))
|
||||
|
||||
#define libbsd_symver_variant(alias, symbol, version)
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
91
src/md5.c
Normal file
91
src/md5.c
Normal file
@@ -0,0 +1,91 @@
|
||||
/*
|
||||
* Copyright © 2021 Guillem Jover <guillem@hadrons.org>
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#include <md5.h>
|
||||
#include "local-link.h"
|
||||
|
||||
void
|
||||
bsd_MD5Init(MD5_CTX *context)
|
||||
{
|
||||
MD5Init(context);
|
||||
}
|
||||
libbsd_symver_variant(MD5Init, bsd_MD5Init, LIBBSD_0.0);
|
||||
|
||||
void
|
||||
bsd_MD5Update(MD5_CTX *context, const uint8_t *data, size_t len)
|
||||
{
|
||||
MD5Update(context, data, len);
|
||||
}
|
||||
libbsd_symver_variant(MD5Update, bsd_MD5Update, LIBBSD_0.0);
|
||||
|
||||
void
|
||||
bsd_MD5Pad(MD5_CTX *context)
|
||||
{
|
||||
MD5Pad(context);
|
||||
}
|
||||
libbsd_symver_variant(MD5Pad, bsd_MD5Pad, LIBBSD_0.0);
|
||||
|
||||
void
|
||||
bsd_MD5Final(uint8_t digest[MD5_DIGEST_LENGTH], MD5_CTX *context)
|
||||
{
|
||||
MD5Final(digest, context);
|
||||
}
|
||||
libbsd_symver_variant(MD5Final, bsd_MD5Final, LIBBSD_0.0);
|
||||
|
||||
void
|
||||
bsd_MD5Transform(uint32_t state[4], const uint8_t block[MD5_BLOCK_LENGTH])
|
||||
{
|
||||
MD5Transform(state, block);
|
||||
}
|
||||
libbsd_symver_variant(MD5Transform, bsd_MD5Transform, LIBBSD_0.0);
|
||||
|
||||
char *
|
||||
bsd_MD5End(MD5_CTX *context, char *buf)
|
||||
{
|
||||
return MD5End(context, buf);
|
||||
}
|
||||
libbsd_symver_variant(MD5End, bsd_MD5End, LIBBSD_0.0);
|
||||
|
||||
char *
|
||||
bsd_MD5File(const char *filename, char *buf)
|
||||
{
|
||||
return MD5File(filename, buf);
|
||||
}
|
||||
libbsd_symver_variant(MD5File, bsd_MD5File, LIBBSD_0.0);
|
||||
|
||||
char *
|
||||
bsd_MD5FileChunk(const char *filename, char *buf, off_t offset, off_t length)
|
||||
{
|
||||
return MD5FileChunk(filename, buf, offset, length);
|
||||
}
|
||||
libbsd_symver_variant(MD5FileChunk, bsd_MD5FileChunk, LIBBSD_0.0);
|
||||
|
||||
char *
|
||||
bsd_MD5Data(const uint8_t *data, size_t len, char *buf)
|
||||
{
|
||||
return MD5Data(data, len, buf);
|
||||
}
|
||||
libbsd_symver_variant(MD5Data, bsd_MD5Data, LIBBSD_0.0);
|
29
src/nlist.c
29
src/nlist.c
@@ -43,7 +43,9 @@
|
||||
|
||||
#include "local-elf.h"
|
||||
|
||||
#ifndef SIZE_T_MAX
|
||||
#define SIZE_T_MAX 0xffffffffU
|
||||
#endif
|
||||
|
||||
/* Note: This function is used by libkvm0, so we need to export it.
|
||||
* It is not declared in the include files though. */
|
||||
@@ -141,11 +143,17 @@ __fdnlist(int fd, struct nlist *list)
|
||||
fstat(fd, &st) < 0)
|
||||
return (-1);
|
||||
|
||||
if (ehdr.e_shnum == 0 ||
|
||||
ehdr.e_shentsize != sizeof(Elf_Shdr)) {
|
||||
errno = ERANGE;
|
||||
return (-1);
|
||||
}
|
||||
|
||||
/* calculate section header table size */
|
||||
shdr_size = ehdr.e_shentsize * ehdr.e_shnum;
|
||||
|
||||
/* Make sure it's not too big to mmap */
|
||||
if (shdr_size > SIZE_T_MAX) {
|
||||
if (shdr_size > SIZE_T_MAX || shdr_size > st.st_size) {
|
||||
errno = EFBIG;
|
||||
return (-1);
|
||||
}
|
||||
@@ -155,7 +163,7 @@ __fdnlist(int fd, struct nlist *list)
|
||||
return (-1);
|
||||
|
||||
/* Load section header table. */
|
||||
if (pread(fd, shdr, (size_t)shdr_size, (off_t)ehdr.e_shoff) < 0)
|
||||
if (pread(fd, shdr, (size_t)shdr_size, (off_t)ehdr.e_shoff) != (ssize_t)shdr_size)
|
||||
goto done;
|
||||
|
||||
/*
|
||||
@@ -166,6 +174,9 @@ __fdnlist(int fd, struct nlist *list)
|
||||
*/
|
||||
for (i = 0; i < ehdr.e_shnum; i++) {
|
||||
if (shdr[i].sh_type == SHT_SYMTAB) {
|
||||
if (shdr[i].sh_link >= ehdr.e_shnum)
|
||||
goto done;
|
||||
|
||||
symoff = shdr[i].sh_offset;
|
||||
symsize = shdr[i].sh_size;
|
||||
symstroff = shdr[shdr[i].sh_link].sh_offset;
|
||||
@@ -175,7 +186,7 @@ __fdnlist(int fd, struct nlist *list)
|
||||
}
|
||||
|
||||
/* Check for files too large to mmap. */
|
||||
if (symstrsize > SIZE_T_MAX) {
|
||||
if (symstrsize > SIZE_T_MAX || symstrsize > st.st_size) {
|
||||
errno = EFBIG;
|
||||
goto done;
|
||||
}
|
||||
@@ -189,7 +200,7 @@ __fdnlist(int fd, struct nlist *list)
|
||||
if (strtab == NULL)
|
||||
goto done;
|
||||
|
||||
if (pread(fd, strtab, (size_t)symstrsize, (off_t)symstroff) < 0)
|
||||
if (pread(fd, strtab, (size_t)symstrsize, (off_t)symstroff) != (ssize_t)symstrsize)
|
||||
goto done;
|
||||
|
||||
/*
|
||||
@@ -227,16 +238,18 @@ __fdnlist(int fd, struct nlist *list)
|
||||
symsize -= cc;
|
||||
for (s = sbuf; cc > 0 && nent > 0; ++s, cc -= sizeof(*s)) {
|
||||
char *name;
|
||||
Elf_Word size;
|
||||
struct nlist *p;
|
||||
|
||||
name = strtab + s->st_name;
|
||||
if (name[0] == '\0')
|
||||
continue;
|
||||
size = symstrsize - s->st_name;
|
||||
|
||||
for (p = list; !ISLAST(p); p++) {
|
||||
if ((p->n_un.n_name[0] == '_' &&
|
||||
strcmp(name, p->n_un.n_name+1) == 0)
|
||||
|| strcmp(name, p->n_un.n_name) == 0) {
|
||||
strncmp(name, p->n_un.n_name+1, size) == 0) ||
|
||||
strncmp(name, p->n_un.n_name, size) == 0) {
|
||||
elf_sym_to_nlist(p, s, shdr,
|
||||
ehdr.e_shnum);
|
||||
if (--nent <= 0)
|
||||
@@ -258,6 +271,10 @@ nlist(const char *name, struct nlist *list)
|
||||
{
|
||||
int fd, n;
|
||||
|
||||
if (list == NULL) {
|
||||
errno = EINVAL;
|
||||
return (-1);
|
||||
}
|
||||
fd = open(name, O_RDONLY, 0);
|
||||
if (fd < 0)
|
||||
return (-1);
|
||||
|
@@ -1,6 +1,7 @@
|
||||
/*
|
||||
* Copyright © 2006 Robert Millan
|
||||
* Copyright © 2010-2012 Guillem Jover <guillem@hadrons.org>
|
||||
* Copyright © 2018 Facebook, Inc.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
@@ -30,11 +31,16 @@
|
||||
* <https://sourceware.org/ml/libc-alpha/2006-03/msg00125.html>.
|
||||
*/
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <errno.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#ifdef _WIN32
|
||||
#include <Windows.h>
|
||||
#include <shlwapi.h>
|
||||
#endif
|
||||
|
||||
#if defined(_WIN32) || defined(__WIN32__) || defined(__WINDOWS__)
|
||||
#ifdef _WIN32
|
||||
#define LIBBSD_IS_PATHNAME_SEPARATOR(c) ((c) == '/' || (c) == '\\')
|
||||
#else
|
||||
#define LIBBSD_IS_PATHNAME_SEPARATOR(c) ((c) == '/')
|
||||
@@ -56,6 +62,70 @@ getprogname(void)
|
||||
/* getexecname(3) returns an absolute pathname, normalize it. */
|
||||
if (__progname == NULL)
|
||||
setprogname(getexecname());
|
||||
#elif defined(_WIN32)
|
||||
if (__progname == NULL) {
|
||||
WCHAR *wpath = NULL;
|
||||
WCHAR *wname = NULL;
|
||||
WCHAR *wext = NULL;
|
||||
DWORD wpathsiz = MAX_PATH / 2;
|
||||
DWORD len, i;
|
||||
char *mbname = NULL;
|
||||
int mbnamesiz;
|
||||
|
||||
/* Use the Unicode version of this function to support long
|
||||
* paths. MAX_PATH isn't actually the maximum length of a
|
||||
* path in this case. */
|
||||
do {
|
||||
WCHAR *wpathnew;
|
||||
|
||||
wpathsiz *= 2;
|
||||
wpathsiz = MIN(wpathsiz, UNICODE_STRING_MAX_CHARS);
|
||||
wpathnew = reallocarray(wpath, wpathsiz, sizeof(*wpath));
|
||||
if (wpathnew == NULL)
|
||||
goto done;
|
||||
wpath = wpathnew;
|
||||
|
||||
len = GetModuleFileNameW(NULL, wpath, wpathsiz);
|
||||
if (wpathsiz == UNICODE_STRING_MAX_CHARS)
|
||||
goto done;
|
||||
} while (wpathsiz == len);
|
||||
if (len == 0)
|
||||
goto done;
|
||||
|
||||
/* GetModuleFileNameW() retrieves an absolute path. Locate the
|
||||
* filename now to only convert necessary characters and save
|
||||
* memory. */
|
||||
wname = wpath;
|
||||
for (i = len; i > 0; i--) {
|
||||
if (LIBBSD_IS_PATHNAME_SEPARATOR(wpath[i - 1])) {
|
||||
wname = wpath + i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* Remove any trailing extension, such as '.exe', to make the
|
||||
* behavior mach the non-Windows systems. */
|
||||
wext = PathFindExtensionW(wname);
|
||||
wext[0] = '\0';
|
||||
|
||||
mbnamesiz = WideCharToMultiByte(CP_UTF8, 0, wname, -1, NULL,
|
||||
0, NULL, NULL);
|
||||
if (mbnamesiz == 0)
|
||||
goto done;
|
||||
mbname = malloc(mbnamesiz);
|
||||
if (mbname == NULL)
|
||||
goto done;
|
||||
mbnamesiz = WideCharToMultiByte(CP_UTF8, 0, wname, -1, mbname,
|
||||
mbnamesiz, NULL, NULL);
|
||||
if (mbnamesiz == 0)
|
||||
goto done;
|
||||
__progname = mbname;
|
||||
mbname = NULL;
|
||||
|
||||
done:
|
||||
free(wpath);
|
||||
free(mbname);
|
||||
}
|
||||
#endif
|
||||
|
||||
return __progname;
|
||||
|
437
src/pwcache.c
Normal file
437
src/pwcache.c
Normal file
@@ -0,0 +1,437 @@
|
||||
/* $OpenBSD: pwcache.c,v 1.15 2018/09/22 02:47:23 millert Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 1992 Keith Muller.
|
||||
* Copyright (c) 1992, 1993
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
*
|
||||
* This code is derived from software contributed to Berkeley by
|
||||
* Keith Muller of the University of California, San Diego.
|
||||
*
|
||||
* 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. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``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 REGENTS OR CONTRIBUTORS 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.
|
||||
*/
|
||||
|
||||
#include <sys/types.h>
|
||||
|
||||
#include <assert.h>
|
||||
#include <grp.h>
|
||||
#include <pwd.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
/*
|
||||
* Constants and data structures used to implement group and password file
|
||||
* caches. Name lengths have been chosen to be as large as those supported
|
||||
* by the passwd and group files as well as the standard archive formats.
|
||||
* CACHE SIZES MUST BE PRIME
|
||||
*/
|
||||
#define UNMLEN 32 /* >= user name found in any protocol */
|
||||
#define GNMLEN 32 /* >= group name found in any protocol */
|
||||
#define UID_SZ 317 /* size of uid to user_name cache */
|
||||
#define UNM_SZ 317 /* size of user_name to uid cache */
|
||||
#define GID_SZ 251 /* size of gid to group_name cache */
|
||||
#define GNM_SZ 251 /* size of group_name to gid cache */
|
||||
#define VALID 1 /* entry and name are valid */
|
||||
#define INVALID 2 /* entry valid, name NOT valid */
|
||||
|
||||
/*
|
||||
* Node structures used in the user, group, uid, and gid caches.
|
||||
*/
|
||||
|
||||
typedef struct uidc {
|
||||
int valid; /* is this a valid or a miss entry */
|
||||
char name[UNMLEN]; /* uid name */
|
||||
uid_t uid; /* cached uid */
|
||||
} UIDC;
|
||||
|
||||
typedef struct gidc {
|
||||
int valid; /* is this a valid or a miss entry */
|
||||
char name[GNMLEN]; /* gid name */
|
||||
gid_t gid; /* cached gid */
|
||||
} GIDC;
|
||||
|
||||
/*
|
||||
* Routines that control user, group, uid and gid caches.
|
||||
* Traditional passwd/group cache routines perform quite poorly with
|
||||
* archives. The chances of hitting a valid lookup with an archive is quite a
|
||||
* bit worse than with files already resident on the file system. These misses
|
||||
* create a MAJOR performance cost. To adress this problem, these routines
|
||||
* cache both hits and misses.
|
||||
*/
|
||||
|
||||
static UIDC **uidtb; /* uid to name cache */
|
||||
static GIDC **gidtb; /* gid to name cache */
|
||||
static UIDC **usrtb; /* user name to uid cache */
|
||||
static GIDC **grptb; /* group name to gid cache */
|
||||
|
||||
static u_int
|
||||
st_hash(const char *name, size_t len, int tabsz)
|
||||
{
|
||||
u_int key = 0;
|
||||
|
||||
assert(name != NULL);
|
||||
|
||||
while (len--) {
|
||||
key += *name++;
|
||||
key = (key << 8) | (key >> 24);
|
||||
}
|
||||
|
||||
return key % tabsz;
|
||||
}
|
||||
|
||||
/*
|
||||
* uidtb_start
|
||||
* creates an an empty uidtb
|
||||
* Return:
|
||||
* 0 if ok, -1 otherwise
|
||||
*/
|
||||
static int
|
||||
uidtb_start(void)
|
||||
{
|
||||
static int fail = 0;
|
||||
|
||||
if (uidtb != NULL)
|
||||
return 0;
|
||||
if (fail)
|
||||
return -1;
|
||||
if ((uidtb = calloc(UID_SZ, sizeof(UIDC *))) == NULL) {
|
||||
++fail;
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* gidtb_start
|
||||
* creates an an empty gidtb
|
||||
* Return:
|
||||
* 0 if ok, -1 otherwise
|
||||
*/
|
||||
static int
|
||||
gidtb_start(void)
|
||||
{
|
||||
static int fail = 0;
|
||||
|
||||
if (gidtb != NULL)
|
||||
return 0;
|
||||
if (fail)
|
||||
return -1;
|
||||
if ((gidtb = calloc(GID_SZ, sizeof(GIDC *))) == NULL) {
|
||||
++fail;
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* usrtb_start
|
||||
* creates an an empty usrtb
|
||||
* Return:
|
||||
* 0 if ok, -1 otherwise
|
||||
*/
|
||||
static int
|
||||
usrtb_start(void)
|
||||
{
|
||||
static int fail = 0;
|
||||
|
||||
if (usrtb != NULL)
|
||||
return 0;
|
||||
if (fail)
|
||||
return -1;
|
||||
if ((usrtb = calloc(UNM_SZ, sizeof(UIDC *))) == NULL) {
|
||||
++fail;
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* grptb_start
|
||||
* creates an an empty grptb
|
||||
* Return:
|
||||
* 0 if ok, -1 otherwise
|
||||
*/
|
||||
static int
|
||||
grptb_start(void)
|
||||
{
|
||||
static int fail = 0;
|
||||
|
||||
if (grptb != NULL)
|
||||
return 0;
|
||||
if (fail)
|
||||
return -1;
|
||||
if ((grptb = calloc(GNM_SZ, sizeof(GIDC *))) == NULL) {
|
||||
++fail;
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* user_from_uid()
|
||||
* caches the name (if any) for the uid. If noname clear, we always
|
||||
* return the stored name (if valid or invalid match).
|
||||
* We use a simple hash table.
|
||||
* Return:
|
||||
* Pointer to stored name (or a empty string)
|
||||
*/
|
||||
const char *
|
||||
user_from_uid(uid_t uid, int noname)
|
||||
{
|
||||
struct passwd pwstore, *pw = NULL;
|
||||
char pwbuf[_PW_BUF_LEN];
|
||||
UIDC **pptr, *ptr = NULL;
|
||||
|
||||
if ((uidtb != NULL) || (uidtb_start() == 0)) {
|
||||
/*
|
||||
* see if we have this uid cached
|
||||
*/
|
||||
pptr = uidtb + (uid % UID_SZ);
|
||||
ptr = *pptr;
|
||||
|
||||
if ((ptr != NULL) && (ptr->valid > 0) && (ptr->uid == uid)) {
|
||||
/*
|
||||
* have an entry for this uid
|
||||
*/
|
||||
if (!noname || (ptr->valid == VALID))
|
||||
return ptr->name;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (ptr == NULL)
|
||||
*pptr = ptr = malloc(sizeof(UIDC));
|
||||
}
|
||||
|
||||
getpwuid_r(uid, &pwstore, pwbuf, sizeof(pwbuf), &pw);
|
||||
if (pw == NULL) {
|
||||
/*
|
||||
* no match for this uid in the local password file
|
||||
* a string that is the uid in numeric format
|
||||
*/
|
||||
if (ptr == NULL)
|
||||
return NULL;
|
||||
ptr->uid = uid;
|
||||
(void)snprintf(ptr->name, UNMLEN, "%u", uid);
|
||||
ptr->valid = INVALID;
|
||||
if (noname)
|
||||
return NULL;
|
||||
} else {
|
||||
/*
|
||||
* there is an entry for this uid in the password file
|
||||
*/
|
||||
if (ptr == NULL)
|
||||
return pw->pw_name;
|
||||
ptr->uid = uid;
|
||||
(void)strlcpy(ptr->name, pw->pw_name, sizeof(ptr->name));
|
||||
ptr->valid = VALID;
|
||||
}
|
||||
return ptr->name;
|
||||
}
|
||||
|
||||
/*
|
||||
* group_from_gid()
|
||||
* caches the name (if any) for the gid. If noname clear, we always
|
||||
* return the stored name (if valid or invalid match).
|
||||
* We use a simple hash table.
|
||||
* Return:
|
||||
* Pointer to stored name (or a empty string)
|
||||
*/
|
||||
const char *
|
||||
group_from_gid(gid_t gid, int noname)
|
||||
{
|
||||
struct group grstore, *gr = NULL;
|
||||
char grbuf[_GR_BUF_LEN];
|
||||
GIDC **pptr, *ptr = NULL;
|
||||
|
||||
if ((gidtb != NULL) || (gidtb_start() == 0)) {
|
||||
/*
|
||||
* see if we have this gid cached
|
||||
*/
|
||||
pptr = gidtb + (gid % GID_SZ);
|
||||
ptr = *pptr;
|
||||
|
||||
if ((ptr != NULL) && (ptr->valid > 0) && (ptr->gid == gid)) {
|
||||
/*
|
||||
* have an entry for this gid
|
||||
*/
|
||||
if (!noname || (ptr->valid == VALID))
|
||||
return ptr->name;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (ptr == NULL)
|
||||
*pptr = ptr = malloc(sizeof(GIDC));
|
||||
}
|
||||
|
||||
getgrgid_r(gid, &grstore, grbuf, sizeof(grbuf), &gr);
|
||||
if (gr == NULL) {
|
||||
/*
|
||||
* no match for this gid in the local group file, put in
|
||||
* a string that is the gid in numeric format
|
||||
*/
|
||||
if (ptr == NULL)
|
||||
return NULL;
|
||||
ptr->gid = gid;
|
||||
(void)snprintf(ptr->name, GNMLEN, "%u", gid);
|
||||
ptr->valid = INVALID;
|
||||
if (noname)
|
||||
return NULL;
|
||||
} else {
|
||||
/*
|
||||
* there is an entry for this group in the group file
|
||||
*/
|
||||
if (ptr == NULL)
|
||||
return gr->gr_name;
|
||||
ptr->gid = gid;
|
||||
(void)strlcpy(ptr->name, gr->gr_name, sizeof(ptr->name));
|
||||
ptr->valid = VALID;
|
||||
}
|
||||
return ptr->name;
|
||||
}
|
||||
|
||||
/*
|
||||
* uid_from_user()
|
||||
* caches the uid for a given user name. We use a simple hash table.
|
||||
* Return:
|
||||
* 0 if the user name is found (filling in uid), -1 otherwise
|
||||
*/
|
||||
int
|
||||
uid_from_user(const char *name, uid_t *uid)
|
||||
{
|
||||
struct passwd pwstore, *pw = NULL;
|
||||
char pwbuf[_PW_BUF_LEN];
|
||||
UIDC **pptr, *ptr = NULL;
|
||||
size_t namelen;
|
||||
|
||||
/*
|
||||
* return -1 for mangled names
|
||||
*/
|
||||
if (name == NULL || ((namelen = strlen(name)) == 0))
|
||||
return -1;
|
||||
|
||||
if ((usrtb != NULL) || (usrtb_start() == 0)) {
|
||||
/*
|
||||
* look up in hash table, if found and valid return the uid,
|
||||
* if found and invalid, return a -1
|
||||
*/
|
||||
pptr = usrtb + st_hash(name, namelen, UNM_SZ);
|
||||
ptr = *pptr;
|
||||
|
||||
if ((ptr != NULL) && (ptr->valid > 0) &&
|
||||
strcmp(name, ptr->name) == 0) {
|
||||
if (ptr->valid == INVALID)
|
||||
return -1;
|
||||
*uid = ptr->uid;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (ptr == NULL)
|
||||
*pptr = ptr = malloc(sizeof(UIDC));
|
||||
}
|
||||
|
||||
/*
|
||||
* no match, look it up, if no match store it as an invalid entry,
|
||||
* or store the matching uid
|
||||
*/
|
||||
getpwnam_r(name, &pwstore, pwbuf, sizeof(pwbuf), &pw);
|
||||
if (ptr == NULL) {
|
||||
if (pw == NULL)
|
||||
return -1;
|
||||
*uid = pw->pw_uid;
|
||||
return 0;
|
||||
}
|
||||
(void)strlcpy(ptr->name, name, sizeof(ptr->name));
|
||||
if (pw == NULL) {
|
||||
ptr->valid = INVALID;
|
||||
return -1;
|
||||
}
|
||||
ptr->valid = VALID;
|
||||
*uid = ptr->uid = pw->pw_uid;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* gid_from_group()
|
||||
* caches the gid for a given group name. We use a simple hash table.
|
||||
* Return:
|
||||
* 0 if the group name is found (filling in gid), -1 otherwise
|
||||
*/
|
||||
int
|
||||
gid_from_group(const char *name, gid_t *gid)
|
||||
{
|
||||
struct group grstore, *gr = NULL;
|
||||
char grbuf[_GR_BUF_LEN];
|
||||
GIDC **pptr, *ptr = NULL;
|
||||
size_t namelen;
|
||||
|
||||
/*
|
||||
* return -1 for mangled names
|
||||
*/
|
||||
if (name == NULL || ((namelen = strlen(name)) == 0))
|
||||
return -1;
|
||||
|
||||
if ((grptb != NULL) || (grptb_start() == 0)) {
|
||||
/*
|
||||
* look up in hash table, if found and valid return the uid,
|
||||
* if found and invalid, return a -1
|
||||
*/
|
||||
pptr = grptb + st_hash(name, namelen, GID_SZ);
|
||||
ptr = *pptr;
|
||||
|
||||
if ((ptr != NULL) && (ptr->valid > 0) &&
|
||||
strcmp(name, ptr->name) == 0) {
|
||||
if (ptr->valid == INVALID)
|
||||
return -1;
|
||||
*gid = ptr->gid;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (ptr == NULL)
|
||||
*pptr = ptr = malloc(sizeof(GIDC));
|
||||
}
|
||||
|
||||
/*
|
||||
* no match, look it up, if no match store it as an invalid entry,
|
||||
* or store the matching gid
|
||||
*/
|
||||
getgrnam_r(name, &grstore, grbuf, sizeof(grbuf), &gr);
|
||||
if (ptr == NULL) {
|
||||
if (gr == NULL)
|
||||
return -1;
|
||||
*gid = gr->gr_gid;
|
||||
return 0;
|
||||
}
|
||||
|
||||
(void)strlcpy(ptr->name, name, sizeof(ptr->name));
|
||||
if (gr == NULL) {
|
||||
ptr->valid = INVALID;
|
||||
return -1;
|
||||
}
|
||||
ptr->valid = VALID;
|
||||
*gid = ptr->gid = gr->gr_gid;
|
||||
return 0;
|
||||
}
|
80
src/recallocarray.c
Normal file
80
src/recallocarray.c
Normal file
@@ -0,0 +1,80 @@
|
||||
/* $OpenBSD: recallocarray.c,v 1.1 2017/03/06 18:44:21 otto Exp $ */
|
||||
/*
|
||||
* Copyright (c) 2008, 2017 Otto Moerbeek <otto@drijf.net>
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* 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 <errno.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdint.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
/*
|
||||
* This is sqrt(SIZE_MAX+1), as s1*s2 <= SIZE_MAX
|
||||
* if both s1 < MUL_NO_OVERFLOW and s2 < MUL_NO_OVERFLOW
|
||||
*/
|
||||
#define MUL_NO_OVERFLOW ((size_t)1 << (sizeof(size_t) * 4))
|
||||
|
||||
void *
|
||||
recallocarray(void *ptr, size_t oldnmemb, size_t newnmemb, size_t size)
|
||||
{
|
||||
size_t oldsize, newsize;
|
||||
void *newptr;
|
||||
|
||||
if (ptr == NULL)
|
||||
return calloc(newnmemb, size);
|
||||
|
||||
if ((newnmemb >= MUL_NO_OVERFLOW || size >= MUL_NO_OVERFLOW) &&
|
||||
newnmemb > 0 && SIZE_MAX / newnmemb < size) {
|
||||
errno = ENOMEM;
|
||||
return NULL;
|
||||
}
|
||||
newsize = newnmemb * size;
|
||||
|
||||
if ((oldnmemb >= MUL_NO_OVERFLOW || size >= MUL_NO_OVERFLOW) &&
|
||||
oldnmemb > 0 && SIZE_MAX / oldnmemb < size) {
|
||||
errno = EINVAL;
|
||||
return NULL;
|
||||
}
|
||||
oldsize = oldnmemb * size;
|
||||
|
||||
/*
|
||||
* Don't bother too much if we're shrinking just a bit,
|
||||
* we do not shrink for series of small steps, oh well.
|
||||
*/
|
||||
if (newsize <= oldsize) {
|
||||
size_t d = oldsize - newsize;
|
||||
|
||||
if (d < oldsize / 2 && d < (size_t)getpagesize()) {
|
||||
memset((char *)ptr + newsize, 0, d);
|
||||
return ptr;
|
||||
}
|
||||
}
|
||||
|
||||
newptr = malloc(newsize);
|
||||
if (newptr == NULL)
|
||||
return NULL;
|
||||
|
||||
if (newsize > oldsize) {
|
||||
memcpy(newptr, ptr, oldsize);
|
||||
memset((char *)newptr + oldsize, 0, newsize - oldsize);
|
||||
} else
|
||||
memcpy(newptr, ptr, newsize);
|
||||
|
||||
explicit_bzero(ptr, oldsize);
|
||||
free(ptr);
|
||||
|
||||
return newptr;
|
||||
}
|
@@ -31,6 +31,7 @@
|
||||
#include <err.h>
|
||||
#include <unistd.h>
|
||||
#include <string.h>
|
||||
#include "local-link.h"
|
||||
|
||||
static struct {
|
||||
/* Original value. */
|
||||
@@ -280,16 +281,19 @@ setproctitle_impl(const char *fmt, ...)
|
||||
*++nul = '\0';
|
||||
}
|
||||
}
|
||||
__asm__(".symver setproctitle_impl,setproctitle@@LIBBSD_0.5");
|
||||
libbsd_symver_default(setproctitle, setproctitle_impl, LIBBSD_0.5);
|
||||
|
||||
/* The original function introduced in 0.2 was a stub, it only got implemented
|
||||
* in 0.5, make the implementation available in the old version as an alias
|
||||
* for code linking against that version, and change the default to use the
|
||||
* new version, so that new code depends on the implemented version. */
|
||||
#ifdef HAVE_TYPEOF
|
||||
extern typeof(setproctitle_impl) setproctitle_stub __attribute__((alias("setproctitle_impl")));
|
||||
extern __typeof__(setproctitle_impl)
|
||||
setproctitle_stub
|
||||
__attribute__((__alias__("setproctitle_impl")));
|
||||
#else
|
||||
void setproctitle_stub(const char *fmt, ...)
|
||||
__attribute__((alias("setproctitle_impl")));
|
||||
void
|
||||
setproctitle_stub(const char *fmt, ...)
|
||||
__attribute__((__alias__("setproctitle_impl")));
|
||||
#endif
|
||||
__asm__(".symver setproctitle_stub,setproctitle@LIBBSD_0.2");
|
||||
libbsd_symver_variant(setproctitle, setproctitle_stub, LIBBSD_0.2);
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user