mirror of
https://gitlab.freedesktop.org/libbsd/libbsd.git
synced 2025-01-24 02:51:43 +01:00
Add getbsize() function
Import code from DragonFlyBSD and man page from FreeBSD.
This commit is contained in:
parent
a88bb8380d
commit
e8f9300355
@ -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
|
||||
|
@ -29,6 +29,7 @@ dist_man_MANS = \
|
||||
fmtcheck.3 \
|
||||
fparseln.3 \
|
||||
funopen.3 \
|
||||
getbsize.3 \
|
||||
getmode.3 \
|
||||
getpeereid.3 \
|
||||
getprogname.3 \
|
||||
|
95
man/getbsize.3
Normal file
95
man/getbsize.3
Normal 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 .
|
@ -52,6 +52,7 @@ libbsd_la_SOURCES = \
|
||||
fparseln.c \
|
||||
fpurge.c \
|
||||
funopen.c \
|
||||
getbsize.c \
|
||||
getpeereid.c \
|
||||
hash/md5.c \
|
||||
hash/md5hl.c \
|
||||
|
102
src/getbsize.c
Normal file
102
src/getbsize.c
Normal 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);
|
||||
}
|
@ -112,6 +112,8 @@ LIBBSD_0.6 {
|
||||
} LIBBSD_0.5;
|
||||
|
||||
LIBBSD_0.7 {
|
||||
getbsize;
|
||||
|
||||
funopen;
|
||||
|
||||
_time32_to_time;
|
||||
|
Loading…
x
Reference in New Issue
Block a user