libbsd: Branch 'master' - 3 commits

Guillem Jover guillem at kemper.freedesktop.org
Wed Jul 16 20:15:29 PDT 2014


 COPYING                  |    9 ++
 include/Makefile.am      |    1 
 include/bsd/stdlib.h     |    3 
 include/bsd/stringlist.h |   54 ++++++++++++++++
 man/Makefile.am          |    2 
 man/getbsize.3           |   95 ++++++++++++++++++++++++++++
 man/stringlist.3         |  147 ++++++++++++++++++++++++++++++++++++++++++++
 src/Makefile.am          |    3 
 src/getbsize.c           |  102 ++++++++++++++++++++++++++++++
 src/libbsd.map           |    9 ++
 src/reallocarray.c       |   38 +++++++++++
 src/stringlist.c         |  155 +++++++++++++++++++++++++++++++++++++++++++++++
 12 files changed, 617 insertions(+), 1 deletion(-)

New commits:
commit faa005cb3209239bdbdf001e387cbcf9f088b12c
Author: Benjamin Baier <programmer at netzbasis.de>
Date:   Fri Jun 27 02:05:11 2014 +0200

    Add reallocarray() function from OpenBSD
    
    Signed-off-by: Guillem Jover <guillem at hadrons.org>

diff --git a/COPYING b/COPYING
index 960c920..51a1b27 100644
--- a/COPYING
+++ b/COPYING
@@ -358,6 +358,8 @@ The rest of the licenses apply to code and/or man pages.
     Copyright © 2004 Ted Unangst and Todd Miller
     All rights reserved.
 
+    Copyright © 2008 Otto Moerbeek <otto at 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.
diff --git a/include/bsd/stdlib.h b/include/bsd/stdlib.h
index eb1f1c1..22a6dc8 100644
--- a/include/bsd/stdlib.h
+++ b/include/bsd/stdlib.h
@@ -67,6 +67,7 @@ int sradixsort(const unsigned char **base, int nmemb,
                const unsigned char *table, unsigned endbyte);
 
 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,
                    const char **errstr);
diff --git a/src/Makefile.am b/src/Makefile.am
index 950e47b..b9ff0bc 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -66,6 +66,7 @@ libbsd_la_SOURCES = \
 	progname.c \
 	radixsort.c \
 	readpassphrase.c \
+	reallocarray.c \
 	reallocf.c \
 	setmode.c \
 	setproctitle.c \
diff --git a/src/libbsd.map b/src/libbsd.map
index 35eb374..29e84fd 100644
--- a/src/libbsd.map
+++ b/src/libbsd.map
@@ -116,6 +116,8 @@ LIBBSD_0.7 {
 
     funopen;
 
+    reallocarray;
+
     sl_init;
     sl_add;
     sl_free;
diff --git a/src/reallocarray.c b/src/reallocarray.c
new file mode 100644
index 0000000..7accd99
--- /dev/null
+++ b/src/reallocarray.c
@@ -0,0 +1,38 @@
+/*	$OpenBSD: reallocarray.c,v 1.1 2014/05/08 21:43:49 deraadt Exp $	*/
+/*
+ * Copyright (c) 2008 Otto Moerbeek <otto at 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);
+}
commit 36aca8c06ee6b41e917eb4f70622831852ad72f7
Author: Guillem Jover <guillem at hadrons.org>
Date:   Thu Jun 26 21:43:55 2014 +0200

    Add stringlist module from NetBSD

diff --git a/COPYING b/COPYING
index 2a40164..960c920 100644
--- a/COPYING
+++ b/COPYING
@@ -207,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.
 
     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
     by Jason R. Thorpe of the Numerical Aerospace Simulation Facility,
     NASA Ames Research Center, by Luke Mewburn and by Tomas Svensson.
@@ -220,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
     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
     modification, are permitted provided that the following conditions
     are met:
diff --git a/include/Makefile.am b/include/Makefile.am
index d8843c1..b8140d9 100644
--- a/include/Makefile.am
+++ b/include/Makefile.am
@@ -19,6 +19,7 @@ nobase_include_HEADERS = \
 	bsd/stdio.h \
 	bsd/stdlib.h \
 	bsd/string.h \
+	bsd/stringlist.h \
 	bsd/timeconv.h \
 	bsd/unistd.h \
 	bsd/vis.h \
diff --git a/include/bsd/stringlist.h b/include/bsd/stringlist.h
new file mode 100644
index 0000000..e3c42e9
--- /dev/null
+++ b/include/bsd/stringlist.h
@@ -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 */
diff --git a/man/Makefile.am b/man/Makefile.am
index e3b7e17..4e57553 100644
--- a/man/Makefile.am
+++ b/man/Makefile.am
@@ -47,6 +47,7 @@ dist_man_MANS = \
 	setproctitle.3 \
 	setprogname.3 \
 	sradixsort.3 \
+	stringlist.3 \
 	strlcat.3 \
 	strlcpy.3 \
 	strnstr.3 \
diff --git a/man/stringlist.3 b/man/stringlist.3
new file mode 100644
index 0000000..c62e444
--- /dev/null
+++ b/man/stringlist.3
@@ -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 .
diff --git a/src/Makefile.am b/src/Makefile.am
index 6efddf5..950e47b 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -71,6 +71,7 @@ libbsd_la_SOURCES = \
 	setproctitle.c \
 	strlcat.c \
 	strlcpy.c \
+	stringlist.c \
 	strmode.c \
 	strnstr.c \
 	strtonum.c \
diff --git a/src/libbsd.map b/src/libbsd.map
index c0286a3..35eb374 100644
--- a/src/libbsd.map
+++ b/src/libbsd.map
@@ -116,6 +116,11 @@ LIBBSD_0.7 {
 
     funopen;
 
+    sl_init;
+    sl_add;
+    sl_free;
+    sl_find;
+
     _time32_to_time;
     _time_to_time32;
     _time64_to_time;
diff --git a/src/stringlist.c b/src/stringlist.c
new file mode 100644
index 0000000..ce1b2ce
--- /dev/null
+++ b/src/stringlist.c
@@ -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;
+}
commit e8f930035525b5bb7a66c4894ffc1d37e4250f7a
Author: Guillem Jover <guillem at hadrons.org>
Date:   Thu Jun 26 21:32:11 2014 +0200

    Add getbsize() function
    
    Import code from DragonFlyBSD and man page from FreeBSD.

diff --git a/include/bsd/stdlib.h b/include/bsd/stdlib.h
index dd30703..eb1f1c1 100644
--- a/include/bsd/stdlib.h
+++ b/include/bsd/stdlib.h
@@ -70,6 +70,8 @@ void *reallocf(void *ptr, size_t size);
 
 long long strtonum(const char *nptr, long long minval, long long maxval,
                    const char **errstr);
+
+char *getbsize(int *headerlenp, long *blocksizep);
 __END_DECLS
 
 #endif
diff --git a/man/Makefile.am b/man/Makefile.am
index cbd71e4..e3b7e17 100644
--- a/man/Makefile.am
+++ b/man/Makefile.am
@@ -29,6 +29,7 @@ dist_man_MANS = \
 	fmtcheck.3 \
 	fparseln.3 \
 	funopen.3 \
+	getbsize.3 \
 	getmode.3 \
 	getpeereid.3 \
 	getprogname.3 \
diff --git a/man/getbsize.3 b/man/getbsize.3
new file mode 100644
index 0000000..38ec41a
--- /dev/null
+++ b/man/getbsize.3
@@ -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 .
diff --git a/src/Makefile.am b/src/Makefile.am
index c9a4df0..6efddf5 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -52,6 +52,7 @@ libbsd_la_SOURCES = \
 	fparseln.c \
 	fpurge.c \
 	funopen.c \
+	getbsize.c \
 	getpeereid.c \
 	hash/md5.c \
 	hash/md5hl.c \
diff --git a/src/getbsize.c b/src/getbsize.c
new file mode 100644
index 0000000..3e3ff49
--- /dev/null
+++ b/src/getbsize.c
@@ -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);
+}
diff --git a/src/libbsd.map b/src/libbsd.map
index 4d483df..c0286a3 100644
--- a/src/libbsd.map
+++ b/src/libbsd.map
@@ -112,6 +112,8 @@ LIBBSD_0.6 {
 } LIBBSD_0.5;
 
 LIBBSD_0.7 {
+    getbsize;
+
     funopen;
 
     _time32_to_time;


More information about the libbsd mailing list