Compare commits

...

11 Commits
0.6.0 ... 0.7.0

Author SHA1 Message Date
Guillem Jover
e390651b64 Release libbsd 0.7.0 2014-07-29 03:19:15 +02:00
Guillem Jover
e8d3d04177 build: Remove hard requirement for GNU .init_array section support
In case the support is not available, just stop building the
libbsd-ctor.a library, which is a nice to have thing, but should not
have been a hard requirement from the start. This should allow to
build libbsd on non-glibc based systems using another libc.
2014-07-20 02:09:20 +02:00
Benjamin Baier
faa005cb32 Add reallocarray() function from OpenBSD
Signed-off-by: Guillem Jover <guillem@hadrons.org>
2014-07-17 05:13:05 +02:00
Guillem Jover
36aca8c06e Add stringlist module from NetBSD 2014-07-17 05:11:00 +02:00
Guillem Jover
e8f9300355 Add getbsize() function
Import code from DragonFlyBSD and man page from FreeBSD.
2014-07-15 10:57:42 +02:00
Christian Svensson
a88bb8380d Add OpenRISC support to nlist()
Signed-off-by: Guillem Jover <guillem@hadrons.org>
2014-03-06 22:11:27 +01:00
Guillem Jover
8d16c3df67 Add timeconv module from FreeBSD
Inline license information from FreeBSD root dir COPYRIGHT file.
2013-10-21 05:48:30 +02:00
Guillem Jover
f41fdcf186 Add funopen() function
This is a wrapper over the glibc fopencookie() function.

We diverge from the FreeBSD, OpenBSD and DragonFlyBSD declarations,
because seekfn() there wrongly uses fpos_t, assuming it's an integral
type, and any code using that on a system where fpos_t is a struct
(such as GNU-based systems or NetBSD) will fail to build. In which case,
as the code has to be modified anyway, we might just as well use the
correct declaration.
2013-10-21 05:35:44 +02:00
Guillem Jover
86cbff385a Handle glibc partial header inclusions
The glibc headers use selective inclusions through the __need_NAME
mechanism to avoid circular dependencies.

The problem is that if we are being overlaid, and have been requested
a partial inclusion, when we pass control to the system header, then
we might miss definitions needed by our own header, resulting in build
failures.

Workaround that by catching current partial requests, and skip the
current inclusion.
2013-10-21 05:35:17 +02:00
Guillem Jover
ee04e8de14 build: Set subdir-objects automake option
Bump automake minimal version to 1.9.
2013-10-21 05:33:08 +02:00
Guillem Jover
61b2dbb8f5 Fix dehumanize_number() to correctly detect overflows
Do not allow numbers greated than INT64_MAX and smaller than INT64_MIN.
Clarify the positive sign value by prefixing it with an explicit +.

Fixes: https://bugs.freedesktop.org/show_bug.cgi?id=66909
2013-10-21 05:29:37 +02:00
27 changed files with 1423 additions and 17 deletions

1
.gitignore vendored
View File

@@ -7,6 +7,7 @@ ChangeLog
*.a *.a
*.log *.log
*.trs *.trs
.dirstamp
.deps/ .deps/
.libs/ .libs/
Makefile Makefile

18
COPYING
View File

@@ -118,6 +118,12 @@ The rest of the licenses apply to code and/or man pages.
Some code is derived from software contributed to Berkeley by Some code is derived from software contributed to Berkeley by
Chris Torek. Chris Torek.
© UNIX System Laboratories, Inc.
All or some portions of this file are derived from material licensed
to the University of California by American Telephone and Telegraph
Co. or Unix System Laboratories, Inc. and are reproduced herein with
the permission of UNIX System Laboratories, Inc.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions modification, are permitted provided that the following conditions
are met: are met:
@@ -201,11 +207,13 @@ The rest of the licenses apply to code and/or man pages.
-- --
Copyright © 1997-2000, 2002, 2008 The NetBSD Foundation, Inc. Copyright © 1994, 1997-2000, 2002, 2008 The NetBSD Foundation, Inc.
All rights reserved. All rights reserved.
Some code was contributed to The NetBSD Foundation by Allen Briggs. Some code was contributed to The NetBSD Foundation by Allen Briggs.
Some code was contributed to The NetBSD Foundation by Luke Mewburn.
Some code is derived from software contributed to The NetBSD Foundation Some code is derived from software contributed to The NetBSD Foundation
by Jason R. Thorpe of the Numerical Aerospace Simulation Facility, by Jason R. Thorpe of the Numerical Aerospace Simulation Facility,
NASA Ames Research Center, by Luke Mewburn and by Tomas Svensson. NASA Ames Research Center, by Luke Mewburn and by Tomas Svensson.
@@ -214,6 +222,9 @@ The rest of the licenses apply to code and/or man pages.
by Julio M. Merino Vidal, developed as part of Google's Summer of Code by Julio M. Merino Vidal, developed as part of Google's Summer of Code
2005 program. 2005 program.
Some code is derived from software contributed to The NetBSD Foundation
by Christos Zoulas.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions modification, are permitted provided that the following conditions
are met: are met:
@@ -243,6 +254,9 @@ The rest of the licenses apply to code and/or man pages.
Copyright © 2001 Dima Dorfman. Copyright © 2001 Dima Dorfman.
All rights reserved. All rights reserved.
Copyright © 2001 FreeBSD Inc.
All rights reserved.
Copyright © 2002 Thomas Moestl <tmm@FreeBSD.org> Copyright © 2002 Thomas Moestl <tmm@FreeBSD.org>
All rights reserved. All rights reserved.
@@ -344,6 +358,8 @@ The rest of the licenses apply to code and/or man pages.
Copyright © 2004 Ted Unangst and Todd Miller Copyright © 2004 Ted Unangst and Todd Miller
All rights reserved. All rights reserved.
Copyright © 2008 Otto Moerbeek <otto@drijf.net>
Permission to use, copy, modify, and distribute this software for any Permission to use, copy, modify, and distribute this software for any
purpose with or without fee is hereby granted, provided that the above purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies. copyright notice and this permission notice appear in all copies.

View File

@@ -6,13 +6,13 @@ AC_CONFIG_SRCDIR([src/fgetln.c])
AC_CONFIG_AUX_DIR([build-aux]) AC_CONFIG_AUX_DIR([build-aux])
AC_CONFIG_MACRO_DIR([m4]) AC_CONFIG_MACRO_DIR([m4])
AM_INIT_AUTOMAKE([1.8 foreign nostdinc no-dist-gzip dist-xz]) AM_INIT_AUTOMAKE([1.9 foreign nostdinc subdir-objects no-dist-gzip dist-xz])
m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])], m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])],
[AC_SUBST([AM_DEFAULT_VERBOSITY], [1])]) [AC_SUBST([AM_DEFAULT_VERBOSITY], [1])])
LIBBSD_ABI_MAJOR=0 LIBBSD_ABI_MAJOR=0
LIBBSD_ABI_MINOR=6 LIBBSD_ABI_MINOR=7
LIBBSD_ABI_PATCH=0 LIBBSD_ABI_PATCH=0
LIBBSD_ABI="$LIBBSD_ABI_MAJOR:$LIBBSD_ABI_MINOR:$LIBBSD_ABI_PATCH" LIBBSD_ABI="$LIBBSD_ABI_MAJOR:$LIBBSD_ABI_MINOR:$LIBBSD_ABI_PATCH"
@@ -101,9 +101,8 @@ int main() { return rc; }
] ]
)] )]
) )
if test "$libbsd_cv_gnu_init_array_support" = no; then AM_CONDITIONAL([BUILD_LIBBSD_CTOR],
AC_MSG_ERROR([missing required GNU .init_array section support]) [test "$libbsd_cv_gnu_init_array_support" = yes])
fi
# Checks for library functions. # Checks for library functions.
AC_MSG_CHECKING([for program_invocation_short_name]) AC_MSG_CHECKING([for program_invocation_short_name])
@@ -124,7 +123,7 @@ AC_LINK_IFELSE(
AC_MSG_RESULT([yes])], AC_MSG_RESULT([yes])],
[AC_MSG_RESULT([no])]) [AC_MSG_RESULT([no])])
AC_CHECK_FUNCS([clearenv dirfd __fpurge getexecname getline sysconf]) AC_CHECK_FUNCS([clearenv dirfd fopencookie __fpurge getexecname getline sysconf])
AC_CONFIG_FILES([ AC_CONFIG_FILES([
Makefile Makefile

View File

@@ -19,6 +19,8 @@ nobase_include_HEADERS = \
bsd/stdio.h \ bsd/stdio.h \
bsd/stdlib.h \ bsd/stdlib.h \
bsd/string.h \ bsd/string.h \
bsd/stringlist.h \
bsd/timeconv.h \
bsd/unistd.h \ bsd/unistd.h \
bsd/vis.h \ bsd/vis.h \
bsd/wchar.h \ bsd/wchar.h \

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright © 2004, 2005, 2009, 2011 Guillem Jover <guillem@hadrons.org> * Copyright © 2004-2005, 2009, 2011-2013 Guillem Jover <guillem@hadrons.org>
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions
@@ -24,12 +24,17 @@
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/ */
#if defined(__need_FILE) || defined(__need___FILE)
#define LIBBSD_STDIO_H_SKIP
#endif
#ifdef LIBBSD_OVERLAY #ifdef LIBBSD_OVERLAY
#include_next <stdio.h> #include_next <stdio.h>
#else #else
#include <stdio.h> #include <stdio.h>
#endif #endif
#ifndef LIBBSD_STDIO_H_SKIP
#ifndef LIBBSD_STDIO_H #ifndef LIBBSD_STDIO_H
#define LIBBSD_STDIO_H #define LIBBSD_STDIO_H
@@ -41,7 +46,26 @@ const char *fmtcheck(const char *, const char *);
char *fgetln(FILE *fp, size_t *lenp); char *fgetln(FILE *fp, size_t *lenp);
/*
* Note: We diverge from the FreeBSD, OpenBSD and DragonFlyBSD declarations,
* because seekfn() there wrongly uses fpos_t, assuming it's an integral
* type, and any code using that on a system where fpos_t is a struct
* (such as GNU-based systems or NetBSD) will fail to build. In which case,
* as the code has to be modified anyway, we might just as well use the
* correct declaration here.
*/
FILE *funopen(const void *cookie,
int (*readfn)(void *cookie, char *buf, int size),
int (*writefn)(void *cookie, const char *buf, int size),
off_t (*seekfn)(void *cookie, off_t offset, int whence),
int (*closefn)(void *cookie));
#define fropen(cookie, fn) funopen(cookie, fn, NULL, NULL, NULL)
#define fwopen(cookie, fn) funopen(cookie, NULL, fn, NULL, NULL)
int fpurge(FILE *fp); int fpurge(FILE *fp);
__END_DECLS __END_DECLS
#endif #endif
#endif
#undef LIBBSD_STDIO_H_SKIP

View File

@@ -67,9 +67,12 @@ int sradixsort(const unsigned char **base, int nmemb,
const unsigned char *table, unsigned endbyte); const unsigned char *table, unsigned endbyte);
void *reallocf(void *ptr, size_t size); void *reallocf(void *ptr, size_t size);
void *reallocarray(void *ptr, size_t nmemb, size_t size);
long long strtonum(const char *nptr, long long minval, long long maxval, long long strtonum(const char *nptr, long long minval, long long maxval,
const char **errstr); const char **errstr);
char *getbsize(int *headerlenp, long *blocksizep);
__END_DECLS __END_DECLS
#endif #endif

54
include/bsd/stringlist.h Normal file
View File

@@ -0,0 +1,54 @@
/* $NetBSD: stringlist.h,v 1.6 2006/07/27 15:37:19 christos Exp $ */
/*-
* Copyright (c) 1994 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
* by Christos Zoulas.
*
* 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 NETBSD FOUNDATION, INC. 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 FOUNDATION 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.
*/
#ifndef _STRINGLIST_H
#define _STRINGLIST_H
#include <sys/cdefs.h>
#include <sys/types.h>
/*
* Simple string list
*/
typedef struct _stringlist {
char **sl_str;
size_t sl_max;
size_t sl_cur;
} StringList;
__BEGIN_DECLS
StringList *sl_init(void);
int sl_add(StringList *, char *);
void sl_free(StringList *, int);
char *sl_find(StringList *, const char *);
int sl_delete(StringList *, const char *, int);
__END_DECLS
#endif /* _STRINGLIST_H */

57
include/bsd/timeconv.h Normal file
View File

@@ -0,0 +1,57 @@
/*
* Copyright (c) 1989, 1993
* The Regents of the University of California. All rights reserved.
* (c) UNIX System Laboratories, Inc.
* All or some portions of this file are derived from material licensed
* to the University of California by American Telephone and Telegraph
* Co. or Unix System Laboratories, Inc. and are reproduced herein with
* the permission of UNIX System Laboratories, 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. 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.
*
* @(#)time.h 8.3 (Berkeley) 1/21/94
*/
/*
* $FreeBSD$
*/
#ifndef _TIMECONV_H_
#define _TIMECONV_H_
#include <sys/cdefs.h>
#include <stdint.h>
#include <time.h>
time_t _time32_to_time(int32_t t32);
int32_t _time_to_time32(time_t t);
time_t _time64_to_time(int64_t t64);
int64_t _time_to_time64(time_t t);
long _time_to_long(time_t t);
time_t _long_to_time(long tlong);
int _time_to_int(time_t t);
time_t _int_to_time(int tint);
#endif /* _TIMECONV_H_ */

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright © 2012 Guillem Jover <guillem@hadrons.org> * Copyright © 2012-2013 Guillem Jover <guillem@hadrons.org>
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions
@@ -24,12 +24,18 @@
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/ */
#if defined(__need_wchar_t) || defined(__need_wint_t) || \
defined(__need_mbstate_t)
#define LIBBSD_WCHAR_H_SKIP
#endif
#ifdef LIBBSD_OVERLAY #ifdef LIBBSD_OVERLAY
#include_next <wchar.h> #include_next <wchar.h>
#else #else
#include <wchar.h> #include <wchar.h>
#endif #endif
#ifndef LIBBSD_WCHAR_H_SKIP
#ifndef LIBBSD_WCHAR_H #ifndef LIBBSD_WCHAR_H
#define LIBBSD_WCHAR_H #define LIBBSD_WCHAR_H
@@ -45,3 +51,5 @@ size_t wcslcpy(wchar_t *dst, const wchar_t *src, size_t size);
__END_DECLS __END_DECLS
#endif #endif
#endif
#undef LIBBSD_WCHAR_H_SKIP

View File

@@ -28,6 +28,8 @@ dist_man_MANS = \
flopen.3 \ flopen.3 \
fmtcheck.3 \ fmtcheck.3 \
fparseln.3 \ fparseln.3 \
funopen.3 \
getbsize.3 \
getmode.3 \ getmode.3 \
getpeereid.3 \ getpeereid.3 \
getprogname.3 \ getprogname.3 \
@@ -45,6 +47,7 @@ dist_man_MANS = \
setproctitle.3 \ setproctitle.3 \
setprogname.3 \ setprogname.3 \
sradixsort.3 \ sradixsort.3 \
stringlist.3 \
strlcat.3 \ strlcat.3 \
strlcpy.3 \ strlcpy.3 \
strnstr.3 \ strnstr.3 \

191
man/funopen.3 Normal file
View File

@@ -0,0 +1,191 @@
.\" Copyright (c) 1990, 1991, 1993
.\" The Regents of the University of California. All rights reserved.
.\"
.\" This code is derived from software contributed to Berkeley by
.\" Chris Torek.
.\" 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.
.\" 4. 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.
.\"
.\" @(#)funopen.3 8.1 (Berkeley) 6/9/93
.\" $FreeBSD$
.\"
.Dd March 19, 2004
.Dt FUNOPEN 3
.Os
.Sh NAME
.Nm funopen ,
.Nm fropen ,
.Nm fwopen
.Nd open a stream
.Sh LIBRARY
.ds str-Lb-libbsd Utility functions from BSD systems (libbsd, \-lbsd)
.Lb libbsd
.Sh SYNOPSIS
.In bsd/stdio.h
.Ft FILE *
.Fn funopen "const void *cookie" "int (*readfn)(void *, char *, int)" "int (*writefn)(void *, const char *, int)" "off_t (*seekfn)(void *, off_t, int)" "int (*closefn)(void *)"
.Ft FILE *
.Fn fropen "void *cookie" "int (*readfn)(void *, char *, int)"
.Ft FILE *
.Fn fwopen "void *cookie" "int (*writefn)(void *, const char *, int)"
.Sh DESCRIPTION
The
.Fn funopen
function
associates a stream with up to four
.Dq Tn I/O No functions .
Either
.Fa readfn
or
.Fa writefn
must be specified;
the others can be given as an appropriately-typed
.Dv NULL
pointer.
These
.Tn I/O
functions will be used to read, write, seek and
close the new stream.
.Pp
In general, omitting a function means that any attempt to perform the
associated operation on the resulting stream will fail.
If the close function is omitted, closing the stream will flush
any buffered output and then succeed.
.Pp
The calling conventions of
.Fa readfn ,
.Fa writefn ,
.Fa seekfn
and
.Fa closefn
must match those, respectively, of
.Xr read 2 ,
.Xr write 2 ,
.Xr lseek 2 ,
and
.Xr close 2
with the single exception that they are passed the
.Fa cookie
argument specified to
.Fn funopen
in place of the traditional file descriptor argument.
.Pp
Read and write
.Tn I/O
functions are allowed to change the underlying buffer
on fully buffered or line buffered streams by calling
.Xr setvbuf 3 .
They are also not required to completely fill or empty the buffer.
They are not, however, allowed to change streams from unbuffered to buffered
or to change the state of the line buffering flag.
They must also be prepared to have read or write calls occur on buffers other
than the one most recently specified.
.Pp
All user
.Tn I/O
functions can report an error by returning \-1.
Additionally, all of the functions should set the external variable
.Va errno
appropriately if an error occurs.
.Pp
An error on
.Fn closefn
does not keep the stream open.
.Pp
As a convenience, the include file
.In stdio.h
defines the macros
.Fn fropen
and
.Fn fwopen
as calls to
.Fn funopen
with only a read or write function specified.
.Sh RETURN VALUES
Upon successful completion,
.Fn funopen
returns a
.Dv FILE
pointer.
Otherwise,
.Dv NULL
is returned and the global variable
.Va errno
is set to indicate the error.
.Sh ERRORS
.Bl -tag -width Er
.It Bq Er EINVAL
The
.Fn funopen
function
was called without either a read or write function.
The
.Fn funopen
function
may also fail and set
.Va errno
for any of the errors
specified for the routine
.Xr malloc 3 .
.El
.Sh SEE ALSO
.Xr fcntl 2 ,
.Xr open 2 ,
.Xr fclose 3 ,
.Xr fopen 3 ,
.Xr fseek 3 ,
.Xr setbuf 3
.Sh HISTORY
The
.Fn funopen
functions first appeared in
.Bx 4.4 .
.Sh BUGS
The
.Fn funopen
function
may not be portable to systems other than
.Bx .
.Pp
On
.Fx ,
.Ox
and
.Dx
the
.Fn funopen
interface erroneously assumes that
.Vt fpos_t
is an integral type, and uses it in the
.Fa seekfn
hook; but because code using a
.Fa seekfn
hook will fail to build on systems where
.Vt fpos_t
is a struct, and it will need to be slightly fixed anyway, the
implementation provided by libbsd (in the same way as
.Nx )
uses the correct
.Vt off_t
types.

95
man/getbsize.3 Normal file
View File

@@ -0,0 +1,95 @@
.\" Copyright (c) 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.
.\"
.\" @(#)getbsize.3 8.1 (Berkeley) 6/4/93
.\" $FreeBSD$
.\"
.Dd November 16, 2012
.Dt GETBSIZE 3
.Os
.Sh NAME
.Nm getbsize
.Nd get preferred block size
.Sh LIBRARY
.ds str-Lb-libbsd Utility functions from BSD systems (libbsd, \-lbsd)
.Lb libbsd
.Sh SYNOPSIS
.In bsd/stdlib.h
.Ft char *
.Fn getbsize "int *headerlenp" "long *blocksizep"
.Sh DESCRIPTION
The
.Fn getbsize
function returns a preferred block size for reporting by system utilities
.Xr df 1 ,
.Xr du 1 ,
.Xr ls 1
and
.Xr systat 1 ,
based on the value of the
.Ev BLOCKSIZE
environment variable.
.Ev BLOCKSIZE
may be specified directly in bytes, or in multiples of a kilobyte by
specifying a number followed by ``K'' or ``k'', in multiples of a
megabyte by specifying a number followed by ``M'' or ``m'' or in
multiples of a gigabyte by specifying a number followed by ``G'' or
``g''.
Multiples must be integers.
.Pp
Valid values of
.Ev BLOCKSIZE
are 512 bytes to 1 gigabyte.
Sizes less than 512 bytes are rounded up to 512 bytes, and sizes
greater than 1 GB are rounded down to 1 GB.
In each case
.Fn getbsize
produces a warning message.
.Pp
The
.Fn getbsize
function returns a pointer to a null-terminated string describing
the block size, something like
.Dq 1K-blocks .
The memory referenced by
.Fa headerlenp
is filled in with the length of the string (not including the
terminating null).
The memory referenced by
.Fa blocksizep
is filled in with block size, in bytes.
.Sh SEE ALSO
.Xr df 1 ,
.Xr du 1 ,
.Xr ls 1 ,
.Xr systat 1 ,
.Xr environ 7
.Sh HISTORY
The
.Fn getbsize
function first appeared in
.Bx 4.4 .

147
man/stringlist.3 Normal file
View File

@@ -0,0 +1,147 @@
.\" $NetBSD: stringlist.3,v 1.15 2010/05/06 09:46:49 jruoho Exp $
.\"
.\" Copyright (c) 1997, 1999 The NetBSD Foundation, Inc.
.\" All rights reserved.
.\"
.\" This file was contributed to The NetBSD Foundation by Luke Mewburn.
.\"
.\" 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 NETBSD FOUNDATION, INC. 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 FOUNDATION 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 May 6, 2010
.Dt STRINGLIST 3
.Os
.Sh NAME
.Nm stringlist ,
.Nm sl_init ,
.Nm sl_add ,
.Nm sl_free ,
.Nm sl_find ,
.Nm sl_delete
.Nd stringlist manipulation functions
.Sh LIBRARY
.ds str-Lb-libbsd Utility functions from BSD systems (libbsd, \-lbsd)
.Lb libbsd
.Sh SYNOPSIS
.In bsd/stringlist.h
.Ft StringList *
.Fn sl_init "void"
.Ft int
.Fn sl_add "StringList *sl" "char *item"
.Ft void
.Fn sl_free "StringList *sl" "int freeall"
.Ft char *
.Fn sl_find "StringList *sl" "const char *item"
.Ft int
.Fn sl_delete "StringList *sl" "const char *item" "int freeit"
.Sh DESCRIPTION
The
.Nm
functions manipulate stringlists, which are lists of
strings that extend automatically if necessary.
.Pp
The
.Ar StringList
structure has the following definition:
.Bd -literal -offset indent
typedef struct _stringlist {
char **sl_str;
size_t sl_max;
size_t sl_cur;
} StringList;
.Ed
.Pp
where:
.Bl -tag -width "sl_str" -offset indent
.It Ar sl_str
is a pointer to the base of the array containing the list,
.It Ar sl_max
is the size of
.Ar sl_str ,
and
.It Ar sl_cur
is the offset in
.Ar sl_str
of the current element.
.El
.Pp
The following stringlist manipulation functions are available:
.Bl -tag -width "sl_delete()" -offset 2n
.It Fn sl_init
Create a stringlist.
Returns a pointer to a
.Ar StringList ,
or
.Dv NULL
in case of failure.
.It Fn sl_free
Releases memory occupied by
.Ar sl
and the
.Ar sl-\*[Gt]sl_str
array.
If
.Ar freeall
is non-zero, then each of the items within
.Ar sl-\*[Gt]sl_str
is released as well.
.It Fn sl_add
Add
.Ar item
to
.Ar sl-\*[Gt]sl_str
at
.Ar sl-\*[Gt]sl_cur ,
extending the size of
.Ar sl-\*[Gt]sl_str .
Returns zero upon success, \-1 upon failure.
.It Fn sl_find
Find
.Ar item
in
.Ar sl ,
returning
.Dv NULL
if it's not found.
.It Fn sl_delete
Remove
.Ar item
from the list.
If
.Ar freeit
is non-zero, the string is freed.
Returns
.Dv 0
if the name is found
and
.Dv \-1
if the name is not found.
.El
.Sh SEE ALSO
.Xr free 3 ,
.Xr malloc 3
.Sh HISTORY
The
.Nm
functions appeared in
.Fx 2.2.6
and
.Nx 1.3 .

View File

@@ -22,12 +22,17 @@ CLEANFILES = \
pkgconfigdir = $(libdir)/pkgconfig pkgconfigdir = $(libdir)/pkgconfig
pkgconfig_DATA = \ pkgconfig_DATA = \
libbsd.pc \ libbsd.pc \
libbsd-ctor.pc \
libbsd-overlay.pc \ libbsd-overlay.pc \
$(nil) $(nil)
lib_LTLIBRARIES = libbsd.la lib_LTLIBRARIES = libbsd.la
lib_LIBRARIES = libbsd-ctor.a lib_LIBRARIES =
if BUILD_LIBBSD_CTOR
pkgconfig_DATA += libbsd-ctor.pc
lib_LIBRARIES += libbsd-ctor.a
endif
hash/md5hl.c: $(srcdir)/hash/helper.c hash/md5hl.c: $(srcdir)/hash/helper.c
$(AM_V_at) $(MKDIR_P) hash $(AM_V_at) $(MKDIR_P) hash
@@ -51,6 +56,8 @@ libbsd_la_SOURCES = \
fmtcheck.c \ fmtcheck.c \
fparseln.c \ fparseln.c \
fpurge.c \ fpurge.c \
funopen.c \
getbsize.c \
getpeereid.c \ getpeereid.c \
hash/md5.c \ hash/md5.c \
hash/md5hl.c \ hash/md5hl.c \
@@ -64,14 +71,17 @@ libbsd_la_SOURCES = \
progname.c \ progname.c \
radixsort.c \ radixsort.c \
readpassphrase.c \ readpassphrase.c \
reallocarray.c \
reallocf.c \ reallocf.c \
setmode.c \ setmode.c \
setproctitle.c \ setproctitle.c \
strlcat.c \ strlcat.c \
strlcpy.c \ strlcpy.c \
stringlist.c \
strmode.c \ strmode.c \
strnstr.c \ strnstr.c \
strtonum.c \ strtonum.c \
timeconv.c \
unvis.c \ unvis.c \
vis.c \ vis.c \
wcslcat.c \ wcslcat.c \

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright © 2012 Guillem Jover <guillem@hadrons.org> * Copyright © 2012-2013 Guillem Jover <guillem@hadrons.org>
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions
@@ -35,8 +35,8 @@
int int
dehumanize_number(const char *buf, int64_t *num) dehumanize_number(const char *buf, int64_t *num)
{ {
uint64_t rval; uint64_t rval, rmax;
int sign = 1; int sign = +1;
int rc; int rc;
/* The current expand_number() implementation uses bit shifts, so /* The current expand_number() implementation uses bit shifts, so
@@ -52,7 +52,13 @@ dehumanize_number(const char *buf, int64_t *num)
rc = expand_number(buf, &rval); rc = expand_number(buf, &rval);
if (rc < 0) if (rc < 0)
return rc; return rc;
if (rval == UINT64_MAX && sign == -1) {
/* The sign has been stripped, so rval has the absolute value.
* Error out, regardless of the sign, if rval is greater than
* abs(INT64_MIN) (== INT64_MAX + 1), or if the sign is positive
* and the value has overflown by one (INT64_MAX + 1). */
rmax = INT64_MAX + 1ULL;
if (rval > rmax || (rval == rmax && sign == +1)) {
errno = ERANGE; errno = ERANGE;
return -1; return -1;
} }

142
src/funopen.c Normal file
View File

@@ -0,0 +1,142 @@
/*
* Copyright © 2011, 2013 Guillem Jover
*
* 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 <sys/cdefs.h>
#include <sys/types.h>
#include <errno.h>
#include <stdlib.h>
#include <stdio.h>
#ifdef HAVE_FOPENCOOKIE
struct funopen_cookie {
void *orig_cookie;
int (*readfn)(void *cookie, char *buf, int size);
int (*writefn)(void *cookie, const char *buf, int size);
off_t (*seekfn)(void *cookie, off_t offset, int whence);
int (*closefn)(void *cookie);
};
static ssize_t
funopen_read(void *cookie, char *buf, size_t size)
{
struct funopen_cookie *cookiewrap = cookie;
if (cookiewrap->readfn == NULL) {
errno = EBADF;
return -1;
}
return cookiewrap->readfn(cookiewrap->orig_cookie, buf, size);
}
static ssize_t
funopen_write(void *cookie, const char *buf, size_t size)
{
struct funopen_cookie *cookiewrap = cookie;
if (cookiewrap->writefn == NULL)
return EOF;
return cookiewrap->writefn(cookiewrap->orig_cookie, buf, size);
}
static int
funopen_seek(void *cookie, off64_t *offset, int whence)
{
struct funopen_cookie *cookiewrap = cookie;
off_t soff = *offset;
if (cookiewrap->seekfn == NULL) {
errno = ESPIPE;
return -1;
}
soff = cookiewrap->seekfn(cookiewrap->orig_cookie, soff, whence);
*offset = soff;
return *offset;
}
static int
funopen_close(void *cookie)
{
struct funopen_cookie *cookiewrap = cookie;
int rc;
if (cookiewrap->closefn == NULL)
return 0;
rc = cookiewrap->closefn(cookiewrap->orig_cookie);
free(cookiewrap);
return rc;
}
FILE *
funopen(const void *cookie,
int (*readfn)(void *cookie, char *buf, int size),
int (*writefn)(void *cookie, const char *buf, int size),
off_t (*seekfn)(void *cookie, off_t offset, int whence),
int (*closefn)(void *cookie))
{
struct funopen_cookie *cookiewrap;
cookie_io_functions_t funcswrap = {
.read = funopen_read,
.write = funopen_write,
.seek = funopen_seek,
.close = funopen_close,
};
const char *mode;
if (readfn) {
if (writefn == NULL)
mode = "r";
else
mode = "r+";
} else if (writefn) {
mode = "w";
} else {
errno = EINVAL;
return NULL;
}
cookiewrap = malloc(sizeof(*cookiewrap));
if (cookiewrap == NULL)
return NULL;
cookiewrap->orig_cookie = (void *)cookie;
cookiewrap->readfn = readfn;
cookiewrap->writefn = writefn;
cookiewrap->seekfn = seekfn;
cookiewrap->closefn = closefn;
return fopencookie(cookiewrap, mode, funcswrap);
}
#else
#error "Function funopen() needs to be ported."
#endif

102
src/getbsize.c Normal file
View File

@@ -0,0 +1,102 @@
/*-
* Copyright (c) 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.
*
* @(#)getbsize.c 8.1 (Berkeley) 6/4/93
* $FreeBSD: src/lib/libc/gen/getbsize.c,v 1.9 2008/08/04 06:53:13 cperciva Exp $
* $DragonFly: src/lib/libc/gen/getbsize.c,v 1.4 2005/11/13 00:07:42 swildner Exp $
*/
#include <err.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *
getbsize(int *headerlenp, long *blocksizep)
{
static char header[20];
long n, max, mul, blocksize;
char *ep, *p;
const char *form;
#define KB (1024L)
#define MB (1024L * 1024L)
#define GB (1024L * 1024L * 1024L)
#define MAXB GB /* No tera, peta, nor exa. */
form = "";
if ((p = getenv("BLOCKSIZE")) != NULL && *p != '\0') {
if ((n = strtol(p, &ep, 10)) < 0)
goto underflow;
if (n == 0)
n = 1;
if (*ep && ep[1])
goto fmterr;
switch (*ep) {
case 'G': case 'g':
form = "G";
max = MAXB / GB;
mul = GB;
break;
case 'K': case 'k':
form = "K";
max = MAXB / KB;
mul = KB;
break;
case 'M': case 'm':
form = "M";
max = MAXB / MB;
mul = MB;
break;
case '\0':
max = MAXB;
mul = 1;
break;
default:
fmterr: warnx("%s: unknown blocksize", p);
n = 512;
max = MAXB;
mul = 1;
break;
}
if (n > max) {
warnx("maximum blocksize is %ldG", MAXB / GB);
n = max;
}
if ((blocksize = n * mul) < 512) {
underflow: warnx("minimum blocksize is 512");
form = "";
blocksize = n = 512;
}
} else
blocksize = n = 512;
snprintf(header, sizeof(header), "%ld%s-blocks", n, form);
*headerlenp = strlen(header);
*blocksizep = blocksize;
return (header);
}

View File

@@ -110,3 +110,25 @@ LIBBSD_0.6 {
/* Exported to cope with the constructor+dlopen+threads mess. */ /* Exported to cope with the constructor+dlopen+threads mess. */
setproctitle_init; setproctitle_init;
} LIBBSD_0.5; } LIBBSD_0.5;
LIBBSD_0.7 {
getbsize;
funopen;
reallocarray;
sl_init;
sl_add;
sl_free;
sl_find;
_time32_to_time;
_time_to_time32;
_time64_to_time;
_time_to_time64;
_time_to_long;
_long_to_time;
_time_to_int;
_int_to_time;
} LIBBSD_0.6;

View File

@@ -179,6 +179,12 @@
#endif #endif
#define ELF_TARG_DATA ELFDATA2MSB #define ELF_TARG_DATA ELFDATA2MSB
#elif defined(__or1k__)
#define ELF_TARG_MACH EM_OPENRISC
#define ELF_TARG_CLASS ELFCLASS32
#define ELF_TARG_DATA ELFDATA2MSB
#else #else
#error Unknown ELF machine type #error Unknown ELF machine type

38
src/reallocarray.c Normal file
View File

@@ -0,0 +1,38 @@
/* $OpenBSD: reallocarray.c,v 1.1 2014/05/08 21:43:49 deraadt Exp $ */
/*
* Copyright (c) 2008 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 <sys/types.h>
#include <errno.h>
#include <stdint.h>
#include <stdlib.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 (1UL << (sizeof(size_t) * 4))
void *
reallocarray(void *optr, size_t nmemb, size_t size)
{
if ((nmemb >= MUL_NO_OVERFLOW || size >= MUL_NO_OVERFLOW) &&
nmemb > 0 && SIZE_MAX / nmemb < size) {
errno = ENOMEM;
return NULL;
}
return realloc(optr, size * nmemb);
}

155
src/stringlist.c Normal file
View File

@@ -0,0 +1,155 @@
/* $NetBSD: stringlist.c,v 1.12 2007/05/09 17:10:29 christos Exp $ */
/*-
* Copyright (c) 1994, 1999 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
* by Christos Zoulas.
*
* 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 NETBSD FOUNDATION, INC. 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 FOUNDATION 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>
#if defined(LIBC_SCCS) && !defined(lint)
__RCSID("$NetBSD: stringlist.c,v 1.12 2007/05/09 17:10:29 christos Exp $");
#endif /* LIBC_SCCS and not lint */
#include <assert.h>
#include <err.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stringlist.h>
#define _DIAGASSERT(t)
#ifdef __weak_alias
__weak_alias(sl_add,_sl_add)
__weak_alias(sl_find,_sl_find)
__weak_alias(sl_free,_sl_free)
__weak_alias(sl_init,_sl_init)
__weak_alias(sl_delete,_sl_delete)
#endif
#define _SL_CHUNKSIZE 20
/*
* sl_init(): Initialize a string list
*/
StringList *
sl_init(void)
{
StringList *sl;
sl = malloc(sizeof(StringList));
if (sl == NULL)
return NULL;
sl->sl_cur = 0;
sl->sl_max = _SL_CHUNKSIZE;
sl->sl_str = malloc(sl->sl_max * sizeof(char *));
if (sl->sl_str == NULL) {
free(sl);
sl = NULL;
}
return sl;
}
/*
* sl_add(): Add an item to the string list
*/
int
sl_add(StringList *sl, char *name)
{
_DIAGASSERT(sl != NULL);
if (sl->sl_cur == sl->sl_max - 1) {
char **new;
new = realloc(sl->sl_str,
(sl->sl_max + _SL_CHUNKSIZE) * sizeof(char *));
if (new == NULL)
return -1;
sl->sl_max += _SL_CHUNKSIZE;
sl->sl_str = new;
}
sl->sl_str[sl->sl_cur++] = name;
return 0;
}
/*
* sl_free(): Free a stringlist
*/
void
sl_free(StringList *sl, int all)
{
size_t i;
if (sl == NULL)
return;
if (sl->sl_str) {
if (all)
for (i = 0; i < sl->sl_cur; i++)
free(sl->sl_str[i]);
free(sl->sl_str);
}
free(sl);
}
/*
* sl_find(): Find a name in the string list
*/
char *
sl_find(StringList *sl, const char *name)
{
size_t i;
_DIAGASSERT(sl != NULL);
for (i = 0; i < sl->sl_cur; i++)
if (strcmp(sl->sl_str[i], name) == 0)
return sl->sl_str[i];
return NULL;
}
int
sl_delete(StringList *sl, const char *name, int all)
{
size_t i, j;
for (i = 0; i < sl->sl_cur; i++)
if (strcmp(sl->sl_str[i], name) == 0) {
if (all)
free(sl->sl_str[i]);
for (j = i + 1; j < sl->sl_cur; j++)
sl->sl_str[j - 1] = sl->sl_str[j];
sl->sl_str[--sl->sl_cur] = NULL;
return 0;
}
return -1;
}

119
src/timeconv.c Normal file
View File

@@ -0,0 +1,119 @@
/*-
* Copyright (c) 2001 FreeBSD Inc.
* 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.
*
* These routines are for converting time_t to fixed-bit representations
* for use in protocols or storage. When converting time to a larger
* representation of time_t these routines are expected to assume temporal
* locality and use the 50-year rule to properly set the msb bits. XXX
*
*/
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
#include <sys/types.h>
#include <timeconv.h>
/*
* Convert a 32 bit representation of time_t into time_t. XXX needs to
* implement the 50-year rule to handle post-2038 conversions.
*/
time_t
_time32_to_time(int32_t t32)
{
return((time_t)t32);
}
/*
* Convert time_t to a 32 bit representation. If time_t is 64 bits we can
* simply chop it down. The resulting 32 bit representation can be
* converted back to a temporally local 64 bit time_t using time32_to_time.
*/
int32_t
_time_to_time32(time_t t)
{
return((int32_t)t);
}
/*
* Convert a 64 bit representation of time_t into time_t. If time_t is
* represented as 32 bits we can simply chop it and not support times
* past 2038.
*/
time_t
_time64_to_time(int64_t t64)
{
return((time_t)t64);
}
/*
* Convert time_t to a 64 bit representation. If time_t is represented
* as 32 bits we simply sign-extend and do not support times past 2038.
*/
int64_t
_time_to_time64(time_t t)
{
return((int64_t)t);
}
/*
* Convert to/from 'long'. Depending on the sizeof(long) this may or
* may not require using the 50-year rule.
*/
long
_time_to_long(time_t t)
{
if (sizeof(long) == sizeof(int64_t))
return(_time_to_time64(t));
return((long)t);
}
time_t
_long_to_time(long tlong)
{
if (sizeof(long) == sizeof(int32_t))
return(_time32_to_time(tlong));
return((time_t)tlong);
}
/*
* Convert to/from 'int'. Depending on the sizeof(int) this may or
* may not require using the 50-year rule.
*/
int
_time_to_int(time_t t)
{
if (sizeof(int) == sizeof(int64_t))
return(_time_to_time64(t));
return((int)t);
}
time_t
_int_to_time(int tint)
{
if (sizeof(int) == sizeof(int32_t))
return(_time32_to_time(tint));
return((time_t)tint);
}

2
test/.gitignore vendored
View File

@@ -1,6 +1,8 @@
endian endian
fgetln fgetln
funopen
headers headers
humanize humanize
overlay overlay
proctitle-init
proctitle proctitle

View File

@@ -13,11 +13,20 @@ check_PROGRAMS = \
endian \ endian \
humanize \ humanize \
fgetln \ fgetln \
proctitle \ funopen \
proctitle-init \
$(nil) $(nil)
if BUILD_LIBBSD_CTOR
check_PROGRAMS += proctitle
endif
humanize_LDFLAGS = $(top_builddir)/src/libbsd.la humanize_LDFLAGS = $(top_builddir)/src/libbsd.la
fgetln_LDFLAGS = $(top_builddir)/src/libbsd.la fgetln_LDFLAGS = $(top_builddir)/src/libbsd.la
funopen_LDFLAGS = $(top_builddir)/src/libbsd.la
proctitle_init_SOURCES = proctitle.c
proctitle_init_CPPFLAGS = $(AM_CPPFLAGS) -DTEST_USE_SETPROCTITLE_INIT=1
proctitle_init_LDFLAGS = $(top_builddir)/src/libbsd.la
proctitle_LDFLAGS = \ proctitle_LDFLAGS = \
-Wl,-u,libbsd_init_func \ -Wl,-u,libbsd_init_func \
$(top_builddir)/src/libbsd-ctor.a \ $(top_builddir)/src/libbsd-ctor.a \

178
test/funopen.c Normal file
View File

@@ -0,0 +1,178 @@
/*
* Copyright © 2013 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 <assert.h>
#include <errno.h>
#include <string.h>
#include <stdio.h>
#define ARRAY_SIZE 100
#define TEST_SIZE 50
struct test_cookie {
char array[ARRAY_SIZE];
int index;
};
int
test_readfn(void *cookie, char *buf, int size)
{
struct test_cookie *tc = cookie;
int left_size = sizeof(tc->array) - tc->index;
if (left_size < 0)
size = 0;
else if (left_size < size)
size = left_size;
if (size > 0) {
memcpy(buf, tc->array + tc->index, size);
tc->index += size;
}
return size;
}
int
test_writefn(void *cookie, const char *buf, int size)
{
struct test_cookie *tc = cookie;
int left_size = sizeof(tc->array) - tc->index;
if (left_size < 0)
size = 0;
else if (left_size < size)
size = left_size;
if (size > 0) {
memcpy(tc->array + tc->index, buf, size);
tc->index += size;
}
return size;
}
off_t
test_seekfn(void *cookie, off_t offset, int whence)
{
struct test_cookie *tc = cookie;
switch (whence) {
case SEEK_SET:
tc->index = offset;
break;
case SEEK_CUR:
tc->index += offset;
break;
case SEEK_END:
tc->index = sizeof(tc->array) + offset;
break;
}
return tc->index;
}
int
test_closefn(void *cookie)
{
struct test_cookie *tc = cookie;
memset(tc->array, 0x7f, sizeof(tc->array));
return 0;
}
int
main(int argc, char **argv)
{
struct test_cookie tc;
char data[ARRAY_SIZE];
FILE *fp;
size_t i;
/* Test invalid hooks. */
fp = funopen(&tc, NULL, NULL, NULL, NULL);
assert(fp == NULL);
assert(errno == EINVAL);
/* Test read-only file. */
tc.index = 0;
for (i = 0; i < sizeof(tc.array); i++)
tc.array[i] = i;
fp = fropen(&tc, test_readfn);
assert(fp);
assert(fread(data, 1, TEST_SIZE, fp) == TEST_SIZE);
assert(memcmp(tc.array, data, TEST_SIZE) == 0);
assert(fwrite(data, 1, TEST_SIZE, fp) == 0);
assert(fclose(fp) == 0);
/* Test write-only file. */
memset(&tc, 0, sizeof(tc));
fp = fwopen(&tc, test_writefn);
assert(fp);
setvbuf(fp, NULL, _IONBF, 0);
assert(fwrite(data, 1, TEST_SIZE, fp) == TEST_SIZE);
assert(memcmp(tc.array, data, TEST_SIZE) == 0);
assert(fread(data, 1, TEST_SIZE, fp) == 0);
assert(fclose(fp) == 0);
/* Test seekable file. */
memset(&tc, 0, sizeof(tc));
fp = funopen(&tc, test_readfn, test_writefn, test_seekfn, NULL);
assert(fp);
setvbuf(fp, NULL, _IONBF, 0);
assert(fwrite(data, 1, TEST_SIZE, fp) == TEST_SIZE);
assert(fseek(fp, 0L, SEEK_SET) == 0);
assert(fwrite(data, 1, ARRAY_SIZE, fp) == ARRAY_SIZE);
assert(memcmp(tc.array, data, ARRAY_SIZE) == 0);
assert(fread(data, 1, TEST_SIZE, fp) == 0);
assert(fclose(fp) == 0);
/* Test close hook. */
memset(&tc, 0, sizeof(tc));
fp = funopen(&tc, test_readfn, test_writefn, NULL, test_closefn);
assert(fclose(fp) == 0);
for (i = 0; i < sizeof(tc.array); i++)
assert(tc.array[i] == 0x7f);
return 0;
}

View File

@@ -25,6 +25,7 @@
*/ */
#include <assert.h> #include <assert.h>
#include <errno.h>
#include <stdlib.h> #include <stdlib.h>
int int
@@ -60,5 +61,17 @@ main(int argc, char **argv)
assert(dehumanize_number("-3G", &val) == 0); assert(dehumanize_number("-3G", &val) == 0);
assert(val == -3221225472LL); assert(val == -3221225472LL);
assert(dehumanize_number("9223372036854775807", &val) == 0);
assert(val == INT64_MAX);
assert(dehumanize_number("9223372036854775808", &val) == -1);
assert(errno == ERANGE);
assert(dehumanize_number("-9223372036854775808", &val) == 0);
assert(val == INT64_MIN);
assert(dehumanize_number("-9223372036854775809", &val) == -1);
assert(errno == ERANGE);
return 0; return 0;
} }

View File

@@ -31,12 +31,16 @@
#include <string.h> #include <string.h>
int int
main(int argc, char **argv) main(int argc, char **argv, char **envp)
{ {
const char newtitle_base[] = "test arg1 arg2"; const char newtitle_base[] = "test arg1 arg2";
char *newtitle_full; char *newtitle_full;
char *envvar; char *envvar;
#ifdef TEST_USE_SETPROCTITLE_INIT
setproctitle_init(argc, argv, envp);
#endif
setproctitle("-test %s arg2", "arg1"); setproctitle("-test %s arg2", "arg1");
assert(strcmp(argv[0], newtitle_base) == 0); assert(strcmp(argv[0], newtitle_base) == 0);