MFC - tracking commit.

This commit is contained in:
Mark Murray 2013-10-08 07:02:23 +00:00
commit 842d654ca7
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/projects/random_number_generator/; revision=256136
43 changed files with 1243 additions and 110 deletions

View File

@ -31,6 +31,10 @@ NOTE TO PEOPLE WHO THINK THAT FreeBSD 10.x IS SLOW:
disable the most expensive debugging functionality run
"ln -s 'abort:false,junk:false' /etc/malloc.conf".)
20131006:
RCS has been removed from the base system. If you need RCS
install either devel/rcs or devel/rcs57.
20130930:
BIND has been removed from the base system. If all you need
is a local resolver, simply enable and start the local_unbound

View File

@ -58,6 +58,7 @@
#include <sys/types.h>
#include <time.h>
#include <err.h>
#include <jail.h>
#include <libzfs.h>
#include <libzfs_core.h>

View File

@ -6438,14 +6438,22 @@ VMX_Fixup (int extrachar ATTRIBUTE_UNUSED, int sizeflag)
static void
OP_VMX (int bytemode, int sizeflag)
{
used_prefixes |= (prefixes & (PREFIX_DATA | PREFIX_REPZ));
if (prefixes & PREFIX_DATA)
strcpy (obuf, "vmclear");
else if (prefixes & PREFIX_REPZ)
strcpy (obuf, "vmxon");
if (modrm.mod == 3)
{
strcpy (obuf, "rdrand");
OP_E (v_mode, sizeflag);
}
else
strcpy (obuf, "vmptrld");
OP_E (bytemode, sizeflag);
{
used_prefixes |= (prefixes & (PREFIX_DATA | PREFIX_REPZ));
if (prefixes & PREFIX_DATA)
strcpy (obuf, "vmclear");
else if (prefixes & PREFIX_REPZ)
strcpy (obuf, "vmxon");
else
strcpy (obuf, "vmptrld");
OP_E (bytemode, sizeflag);
}
}
static void

View File

@ -79,6 +79,7 @@ typedef struct template
#define CpuNo64 0x8000000 /* Not supported in the 64bit mode */
#define CpuPCLMUL 0x10000000 /* Carry-less Multiplication extensions */
#define CpuRdRnd 0x20000000 /* Intel Random Number Generator extensions */
/* SSE4.1/4.2 Instructions required */
#define CpuSSE4 (CpuSSE4_1|CpuSSE4_2)
@ -87,7 +88,7 @@ typedef struct template
#define CpuUnknownFlags (Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|Cpu686 \
|CpuP4|CpuSledgehammer|CpuMMX|CpuMMX2|CpuSSE|CpuSSE2|CpuSSE3|CpuVMX \
|Cpu3dnow|Cpu3dnowA|CpuK6|CpuPadLock|CpuSVME|CpuSSSE3|CpuSSE4_1 \
|CpuSSE4_2|CpuABM|CpuSSE4a|CpuXSAVE|CpuAES|CpuPCLMUL)
|CpuSSE4_2|CpuABM|CpuSSE4a|CpuXSAVE|CpuAES|CpuPCLMUL|CpuRdRnd)
/* the bits in opcode_modifier are used to generate the final opcode from
the base_opcode. These bits also are used to detect alternate forms of

View File

@ -1502,3 +1502,21 @@ xrstor, 1, 0xfae, 0x5, CpuXSAVE, Modrm|No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_xSuf,
// INVPCID
invpcid, 2, 0x660f3882, None, CpuNo64, Modrm|IgnoreSize|No_bSuf|No_wSuf|No_sSuf|No_qSuf|No_xSuf|NoRex64, { BaseIndex|Disp8|Disp16|Disp32|Disp32S, Reg32 }
invpcid, 2, 0x660f3882, None, Cpu64, Modrm|IgnoreSize|No_bSuf|No_wSuf|No_sSuf|No_qSuf|No_xSuf|NoRex64, { BaseIndex|Disp8|Disp16|Disp32|Disp32S, Reg64 }
// Intel AES extensions
aesdec, 2, 0x660f38de, None, CpuAES, Modrm|IgnoreSize|No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_xSuf, { RegXMM|LLongMem, RegXMM }
aesdeclast, 2, 0x660f38df, None, CpuAES, Modrm|IgnoreSize|No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_xSuf, { RegXMM|LLongMem, RegXMM }
aesenc, 2, 0x660f38dc, None, CpuAES, Modrm|IgnoreSize|No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_xSuf, { RegXMM|LLongMem, RegXMM }
aesenclast, 2, 0x660f38dd, None, CpuAES, Modrm|IgnoreSize|No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_xSuf, { RegXMM|LLongMem, RegXMM }
aesimc, 2, 0x660f38db, None, CpuAES, Modrm|IgnoreSize|No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_xSuf, { RegXMM|LLongMem, RegXMM }
aeskeygenassist, 3, 0x660f3adf, None, CpuAES, Modrm|IgnoreSize|No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_xSuf, { Imm8, RegXMM|LLongMem, RegXMM }
// Intel Carry-less Multiplication extensions
pclmulqdq, 3, 0x660f3a44, None, CpuPCLMUL, Modrm|IgnoreSize|No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_xSuf, { Imm8, RegXMM|LLongMem, RegXMM }
pclmullqlqdq, 2, 0x660f3a44, 0x0, CpuPCLMUL, Modrm|IgnoreSize|No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_xSuf|ImmExt, { RegXMM|LLongMem, RegXMM }
pclmulhqlqdq, 2, 0x660f3a44, 0x1, CpuPCLMUL, Modrm|IgnoreSize|No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_xSuf|ImmExt, { RegXMM|LLongMem, RegXMM }
pclmullqhqdq, 2, 0x660f3a44, 0x10, CpuPCLMUL, Modrm|IgnoreSize|No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_xSuf|ImmExt, { RegXMM|LLongMem, RegXMM }
pclmulhqhqdq, 2, 0x660f3a44, 0x11, CpuPCLMUL, Modrm|IgnoreSize|No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_xSuf|ImmExt, { RegXMM|LLongMem, RegXMM }
// Intel Random Number Generator extensions
rdrand, 1, 0x0fc7, 0x6, CpuRdRnd, Modrm|No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_xSuf, { Reg16|Reg32|Reg64 }

View File

@ -4374,6 +4374,11 @@ const template i386_optab[] =
Modrm|IgnoreSize|NoSuf|ImmExt,
{ RegXMM|LLongMem,
RegXMM } },
/* Intel Random Number Generator extensions */
{"rdrand", 1, 0x0fc7, 0x6, CpuRdRnd,
Modrm|NoSuf,
{ Reg16|Reg32|Reg64 } },
{ NULL, 0, 0, 0, 0, 0, { 0 } }
};

View File

@ -53,7 +53,7 @@ sshd_keygen_alg()
fi
if [ -f "${keyfile}" ] ; then
echo "$ALG host key exists."
info "$ALG host key exists."
else
echo "Generating $ALG host key."
/usr/bin/ssh-keygen -q -t $alg -f "$keyfile" -N ""

View File

@ -28,7 +28,7 @@
.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
.\" POSSIBILITY OF SUCH DAMAGE.
.\"
.Dd Apr 12, 2011
.Dd October 7, 2013
.Dt HUMANIZE_NUMBER 3
.Os
.Sh NAME
@ -140,7 +140,7 @@ The following flags may be passed in
.Fa flags :
.Bl -tag -width ".Dv HN_DIVISOR_1000" -offset indent
.It Dv HN_DECIMAL
If the final result is less than 10, display it using one digit.
If the final result is less than 10, display it using one decimal place.
.It Dv HN_NOSPACE
Do not put a space between
.Fa number
@ -160,13 +160,18 @@ This flag has no effect when
is also specified.
.El
.Sh RETURN VALUES
The
.Fn humanize_number
function returns the number of characters stored in
Upon success, the
.Nm
function returns the number of characters that would have been stored in
.Fa buf
(excluding the terminating
.Dv NUL )
upon success, or \-1 upon failure.
if
.Fa buf
was large enough, or \-1 upon failure.
Even upon failure, the contents of
.Fa buf
may be modified.
If
.Dv HN_GETSCALE
is specified, the prefix index number will be returned instead.

View File

@ -2,6 +2,7 @@
/*
* Copyright (c) 1997, 1998, 1999, 2002 The NetBSD Foundation, Inc.
* Copyright 2013 John-Mark Gurney <jmg@FreeBSD.org>
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
@ -50,15 +51,26 @@ humanize_number(char *buf, size_t len, int64_t quotient,
{
const char *prefixes, *sep;
int i, r, remainder, s1, s2, sign;
int divisordeccut;
int64_t divisor, max;
size_t baselen;
assert(buf != NULL);
assert(suffix != NULL);
assert(scale >= 0);
assert(scale < maxscale || (((scale & (HN_AUTOSCALE | HN_GETSCALE)) != 0)));
assert(!((flags & HN_DIVISOR_1000) && (flags & HN_IEC_PREFIXES)));
/* Since so many callers don't check -1, NUL terminate the buffer */
if (len > 0)
buf[0] = '\0';
/* validate args */
if (buf == NULL || suffix == NULL)
return (-1);
if (scale < 0)
return (-1);
else if (scale >= maxscale &&
((scale & ~(HN_AUTOSCALE|HN_GETSCALE)) != 0))
return (-1);
if ((flags & HN_DIVISOR_1000) && (flags & HN_IEC_PREFIXES))
return (-1);
/* setup parameters */
remainder = 0;
if (flags & HN_IEC_PREFIXES) {
@ -73,34 +85,32 @@ humanize_number(char *buf, size_t len, int64_t quotient,
* an assertion earlier).
*/
divisor = 1024;
divisordeccut = 973; /* ceil(.95 * 1024) */
if (flags & HN_B)
prefixes = "B\0\0Ki\0Mi\0Gi\0Ti\0Pi\0Ei";
else
prefixes = "\0\0\0Ki\0Mi\0Gi\0Ti\0Pi\0Ei";
} else {
baselen = 1;
if (flags & HN_DIVISOR_1000)
if (flags & HN_DIVISOR_1000) {
divisor = 1000;
else
divisordeccut = 950;
if (flags & HN_B)
prefixes = "B\0\0k\0\0M\0\0G\0\0T\0\0P\0\0E";
else
prefixes = "\0\0\0k\0\0M\0\0G\0\0T\0\0P\0\0E";
} else {
divisor = 1024;
if (flags & HN_B)
prefixes = "B\0\0k\0\0M\0\0G\0\0T\0\0P\0\0E";
else
prefixes = "\0\0\0k\0\0M\0\0G\0\0T\0\0P\0\0E";
divisordeccut = 973; /* ceil(.95 * 1024) */
if (flags & HN_B)
prefixes = "B\0\0K\0\0M\0\0G\0\0T\0\0P\0\0E";
else
prefixes = "\0\0\0K\0\0M\0\0G\0\0T\0\0P\0\0E";
}
}
#define SCALE2PREFIX(scale) (&prefixes[(scale) * 3])
if (scale < 0 || (scale >= maxscale &&
(scale & (HN_AUTOSCALE | HN_GETSCALE)) == 0))
return (-1);
if (buf == NULL || suffix == NULL)
return (-1);
if (len > 0)
buf[0] = '\0';
if (quotient < 0) {
sign = -1;
quotient = -quotient;
@ -132,8 +142,8 @@ humanize_number(char *buf, size_t len, int64_t quotient,
* divide once more.
*/
for (i = 0;
(quotient >= max || (quotient == max - 1 && remainder >= 950)) &&
i < maxscale; i++) {
(quotient >= max || (quotient == max - 1 &&
remainder >= divisordeccut)) && i < maxscale; i++) {
remainder = quotient % divisor;
quotient /= divisor;
}
@ -148,20 +158,22 @@ humanize_number(char *buf, size_t len, int64_t quotient,
}
/* If a value <= 9.9 after rounding and ... */
if (quotient <= 9 && remainder < 950 && i > 0 && flags & HN_DECIMAL) {
/* baselen + \0 + .N */
if (len < baselen + 1 + 2)
return (-1);
s1 = (int)quotient + ((remainder + 50) / 1000);
s2 = ((remainder + 50) / 100) % 10;
/*
* XXX - should we make sure there is enough space for the decimal
* place and if not, don't do HN_DECIMAL?
*/
if (((quotient == 9 && remainder < divisordeccut) || quotient < 9) &&
i > 0 && flags & HN_DECIMAL) {
s1 = (int)quotient + ((remainder * 10 + divisor / 2) /
divisor / 10);
s2 = ((remainder * 10 + divisor / 2) / divisor) % 10;
r = snprintf(buf, len, "%d%s%d%s%s%s",
sign * s1, localeconv()->decimal_point, s2,
sep, SCALE2PREFIX(i), suffix);
} else
r = snprintf(buf, len, "%" PRId64 "%s%s%s",
sign * (quotient + (remainder + 50) / 1000),
sign * (quotient + (remainder + divisor / 2) / divisor),
sep, SCALE2PREFIX(i), suffix);
return (r);
}

View File

@ -8,6 +8,7 @@ SUBDIR= ${_atf} \
bootpd \
${_comsat} \
fingerd \
freebsd-version \
ftpd \
getty \
${_mail.local} \

View File

@ -0,0 +1,21 @@
# $FreeBSD$
SCRIPTS = freebsd-version
MAN = freebsd-version.1
BINDIR = /libexec
CLEANFILES = freebsd-version.sh
NEWVERS = ${.CURDIR}/../../sys/conf/newvers.sh
freebsd-version.sh.in: ${NEWVERS}
freebsd-version.sh: freebsd-version.sh.in
eval $$(egrep '^(TYPE|REVISION|BRANCH)=' ${NEWVERS}) ; \
if ! sed -e "\
s/@@TYPE@@/$${TYPE}/g; \
s/@@REVISION@@/$${REVISION}/g; \
s/@@BRANCH@@/$${BRANCH}/g; \
" ${.ALLSRC} >${.TARGET} ; then \
rm -f ${.TARGET} ; \
exit 1 ; \
fi
.include <bsd.prog.mk>

View File

@ -0,0 +1,124 @@
.\"-
.\" Copyright (c) 2013 Dag-Erling Smørgrav
.\" 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$
.\"
.Dd October 5, 2013
.Dt FREEBSD-VERSION 1
.Os
.Sh NAME
.Nm freebsd-version
.Nd print the version and patch level of the installed system
.Sh SYNOPSIS
.Nm
.Op Fl ku
.Sh DESCRIPTION
The
.Nm
utility makes a best effort to determine the version and patch level
of the installed kernel and / or userland.
.Pp
The following options are available:
.Bl -tag -width Fl
.It Fl k
Print the version and patch level of the installed kernel.
Unlike
.Xr uname 1 ,
if a new kernel has been installed but the system has not yet
rebooted,
.Nm
will print the version and patch level of the new kernel.
.It Fl u
Print the version and patch level of the installed userland.
These are hardcoded into
.Nm
during the build.
.El
.Pp
If both
.Fl k
and
.Fl u
are specified,
.Nm
will print the kernel version first, then the userland version, on
separate lines.
If neither is specified, it will print the userland version only.
.Sh IMPLEMENTATION NOTES
The
.Nm
utility should provide the correct answer in the vast majority of
cases, including on systems kept up-to-date using
.Xr freebsd-update 8 ,
which does not update the kernel version unless the kernel itself was
affected by the latest patch.
.Pp
To determine the name (and hence the location) of a custom kernel, the
.Nm
utility will attempt to parse
.Pa /boot/defaults/loader.conf
and
.Pa /boot/loader.conf ,
looking for definitions of the
.Va kernel
and
.Va bootfile
variables, both with a default value of
.Dq kernel .
It may however fail to locate the correct kernel if either or both of
these variables are defined in a non-standard location, such as in
.Pa /boot/loader.rc .
.Sh ENVIRONMENT
.Bl -tag -width ROOT
.It Ev ROOT
Path to the root of the filesystem in which to look for
.Pa loader.conf
and the kernel.
.El
.Sh EXAMPLES
To determine the version of the currently running userland:
.Bd -literal -offset indent
/libexec/freebsd-version -u
.Ed
.Pp
To inspect a system being repaired using a live CD:
.Bd -literal -offset indent
mount -rt ufs /dev/ada0p2 /mnt
env ROOT=/mnt /mnt/libexec/freebsd-version -ku
.Ed
.Sh SEE ALSO
.Xr uname 1 ,
.Xr loader.conf 5 ,
.Xr freebsd-version 8
.Sh HISTORY
The
.Nm
command appeared in
.Fx 10.0 .
.Sh AUTHORS
The
.Nm
utility and this manual page were written by
.An Dag-Erling Sm\(/orgrav Aq des@FreeBSD.org .

View File

@ -0,0 +1,126 @@
#!/bin/sh
#-
# Copyright (c) 2013 Dag-Erling Smørgrav
# 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$
#
set -e
USERLAND_VERSION="@@REVISION@@-@@BRANCH@@"
: ${ROOT:=}
: ${LOADER_DIR:=$ROOT/boot}
: ${LOADER_CONF_FILES:=$LOADER_DIR/defaults/loader.conf $LOADER_DIR/loader.conf $LOADER_DIR/loader.conf.local}
LOADER_RE1='^\([A-Z_a-z][0-9A-Z_a-z]*=[-./0-9A-Z_a-z]\{1,\}\).*$'
LOADER_RE2='^\([A-Z_a-z][0-9A-Z_a-z]*="[-./0-9A-Z_a-z]\{1,\}"\).*$'
KERNEL_RE='^@(#)@@TYPE@@ \([-.0-9A-Za-z]\{1,\}\) .*$'
progname=$(basename $0)
#
# Print an error message and exit.
#
error() {
echo "$progname: $*" >&2
exit 1
}
#
# Try to get the name of the installed kernel from loader.conf and
# return the full path. If loader.conf does not exist or we could not
# read it, return the path to the default kernel.
#
kernel_file() {
eval $(sed -n "s/$LOADER_RE1/\\1;/p; s/$LOADER_RE2/\\1;/p" \
$LOADER_CONF_FILES 2>/dev/null)
echo "$LOADER_DIR/${kernel:-kernel}/${bootfile:-kernel}"
}
#
# Extract the kernel version from the installed kernel.
#
kernel_version() {
kernfile=$(kernel_file)
if [ ! -f "$kernfile" -o ! -r "$kernfile" ] ; then
error "unable to locate kernel"
fi
strings "$kernfile" | sed -n "s/$KERNEL_RE/\\1/p"
}
#
# Print the hardcoded userland version.
#
userland_version() {
echo $USERLAND_VERSION
}
#
# Print a usage string and exit.
#
usage() {
echo "usage: $progname [-ku]\n" >&2
exit 1
}
#
# Main program.
#
main() {
# parse command-line arguments
while getopts "ku" option ; do
case $option in
k)
opt_k=1
;;
u)
opt_u=1
;;
*)
usage
;;
esac
done
if [ $OPTIND -le $# ] ; then
usage
fi
# default is -u
if [ $((opt_k + opt_u)) -eq 0 ] ; then
opt_u=1
fi
# print kernel version
if [ $opt_k ] ; then
kernel_version
fi
# print userland version
if [ $opt_u ] ; then
userland_version
fi
}
main "$@"

View File

@ -116,6 +116,7 @@ static Objlist_Entry *objlist_find(Objlist *, const Obj_Entry *);
static void objlist_init(Objlist *);
static void objlist_push_head(Objlist *, Obj_Entry *);
static void objlist_push_tail(Objlist *, Obj_Entry *);
static void objlist_put_after(Objlist *, Obj_Entry *, Obj_Entry *);
static void objlist_remove(Objlist *, Obj_Entry *);
static void *path_enumerate(const char *, path_enum_proc, void *);
static int relocate_object_dag(Obj_Entry *root, bool bind_now,
@ -323,6 +324,7 @@ _rtld(Elf_Addr *sp, func_ptr_type *exit_proc, Obj_Entry **objp)
Objlist_Entry *entry;
Obj_Entry *obj;
Obj_Entry **preload_tail;
Obj_Entry *last_interposer;
Objlist initlist;
RtldLockState lockstate;
char *library_path_rpath;
@ -537,8 +539,14 @@ _rtld(Elf_Addr *sp, func_ptr_type *exit_proc, Obj_Entry **objp)
die();
/* Make a list of all objects loaded at startup. */
last_interposer = obj_main;
for (obj = obj_list; obj != NULL; obj = obj->next) {
objlist_push_tail(&list_main, obj);
if (obj->z_interpose && obj != obj_main) {
objlist_put_after(&list_main, last_interposer, obj);
last_interposer = obj;
} else {
objlist_push_tail(&list_main, obj);
}
obj->refcount++;
}
@ -1128,6 +1136,8 @@ digest_dynamic1(Obj_Entry *obj, int early, const Elf_Dyn **dyn_rpath,
obj->z_nodelete = true;
if (dynp->d_un.d_val & DF_1_LOADFLTR)
obj->z_loadfltr = true;
if (dynp->d_un.d_val & DF_1_INTERPOSE)
obj->z_interpose = true;
if (dynp->d_un.d_val & DF_1_NODEFLIB)
obj->z_nodeflib = true;
break;
@ -1976,6 +1986,7 @@ static int
load_preload_objects(void)
{
char *p = ld_preload;
Obj_Entry *obj;
static const char delim[] = " \t:;";
if (p == NULL)
@ -1988,8 +1999,10 @@ load_preload_objects(void)
savech = p[len];
p[len] = '\0';
if (load_object(p, -1, NULL, 0) == NULL)
obj = load_object(p, -1, NULL, 0);
if (obj == NULL)
return -1; /* XXX - cleanup */
obj->z_interpose = true;
p[len] = savech;
p += len;
p += strspn(p, delim);
@ -2377,6 +2390,23 @@ objlist_push_tail(Objlist *list, Obj_Entry *obj)
STAILQ_INSERT_TAIL(list, elm, link);
}
static void
objlist_put_after(Objlist *list, Obj_Entry *listobj, Obj_Entry *obj)
{
Objlist_Entry *elm, *listelm;
STAILQ_FOREACH(listelm, list, link) {
if (listelm->obj == listobj)
break;
}
elm = NEW(Objlist_Entry);
elm->obj = obj;
if (listelm != NULL)
STAILQ_INSERT_AFTER(list, listelm, elm, link);
else
STAILQ_INSERT_TAIL(list, elm, link);
}
static void
objlist_remove(Objlist *list, Obj_Entry *obj)
{

View File

@ -259,6 +259,7 @@ typedef struct Struct_Obj_Entry {
bool z_nodelete : 1; /* Do not unload the object and dependencies */
bool z_noopen : 1; /* Do not load on dlopen */
bool z_loadfltr : 1; /* Immediately load filtees */
bool z_interpose : 1; /* Interpose all objects but main */
bool z_nodeflib : 1; /* Don't search default library path */
bool ref_nodel : 1; /* Refcount increased to prevent dlclose */
bool init_scanned: 1; /* Object is already on init list. */

View File

@ -2748,7 +2748,7 @@ atasecurity(struct cam_device *device, int retry_count, int timeout,
if (strcasecmp(optarg, "user") == 0) {
pwd.ctrl |= ATA_SECURITY_PASSWORD_USER;
pwd.ctrl &= ~ATA_SECURITY_PASSWORD_MASTER;
} else if (strcasecmp(optarg, "master") != 0) {
} else if (strcasecmp(optarg, "master") == 0) {
pwd.ctrl |= ATA_SECURITY_PASSWORD_MASTER;
pwd.ctrl &= ~ATA_SECURITY_PASSWORD_USER;
} else {

View File

@ -224,6 +224,7 @@ fw_read_img(const char *fw_img_path, const struct fw_vendor *vp, int *num_bytes)
goto bailout;
}
*num_bytes = img_size;
close(fd);
return (buf);
bailout:
free(buf);
@ -286,6 +287,7 @@ fw_download_img(struct cam_device *cam_dev, const struct fw_vendor *vp,
ata_28bit_cmd(&ccb->ataio, ATA_ATA_IDENTIFY, 0, 0, 0);
} else {
warnx("weird disk type '%s'", type);
cam_freeccb(ccb);
return 1;
}
/* Disable freezing the device queue. */

View File

@ -56,11 +56,11 @@ entries configure the address, size, I/O disposition, and
.Pa /dev
device node name that will be used.
The
.Xr open ,
.Xr read ,
.Xr write ,
.Xr open 2 ,
.Xr read 2 ,
.Xr write 2 ,
and
.Xr mmap
.Xr mmap 2
system calls (and variations) may be used on
.Nm
device nodes, subject to constraints imposed using

View File

@ -35,9 +35,9 @@ place the following lines in your kernel configuration file:
.Pp
Alternatively, to load the driver as a module at boot time,
place the following line in
.Xr loader.conf 5:
.Xr loader.conf 5 :
.Bd -literal -offset indent
.Xr if_rsu_load="YES"
if_rsu_load="YES"
.Ed
.Pp
After you have read the license in /usr/share/doc/legal/realtek

View File

@ -1,7 +1,7 @@
.\" DO NOT EDIT-- this file is automatically generated.
.\" from FreeBSD: head/tools/build/options/makeman 253304 2013-07-12 23:08:44Z bapt
.\" from FreeBSD: head/tools/build/options/makeman 255964 2013-10-01 07:22:04Z des
.\" $FreeBSD$
.Dd September 30, 2013
.Dd October 6, 2013
.Dt SRC.CONF 5
.Os
.Sh NAME
@ -200,7 +200,7 @@ When set, it also enforces the following options:
Set to not build the Clang C/C++ compiler.
.Pp
It is a default setting on
arm/armeb, arm/armv6eb, ia64/ia64, mips/mipsel, mips/mips, mips/mips64el, mips/mips64, mips/mipsn32 and sparc64/sparc64.
arm/armeb, ia64/ia64, mips/mipsel, mips/mips, mips/mips64el, mips/mips64, mips/mipsn32 and sparc64/sparc64.
When set, it also enforces the following options:
.Pp
.Bl -item -compact
@ -228,7 +228,7 @@ Set to avoid building the ARCMigrate, Rewriter and StaticAnalyzer components of
the Clang C/C++ compiler.
.Pp
It is a default setting on
arm/arm, arm/armeb, arm/armv6, arm/armv6eb, ia64/ia64, mips/mipsel, mips/mips, mips/mips64el, mips/mips64, mips/mipsn32 and sparc64/sparc64.
arm/arm, arm/armeb, arm/armv6, ia64/ia64, mips/mipsel, mips/mips, mips/mips64el, mips/mips64, mips/mipsn32 and sparc64/sparc64.
.It Va WITH_CLANG_FULL
.\" from FreeBSD: head/tools/build/options/WITH_CLANG_FULL 246259 2013-02-02 22:28:29Z dim
Set to build the ARCMigrate, Rewriter and StaticAnalyzer components of the
@ -245,7 +245,7 @@ and
.Pa /usr/bin/cpp .
.Pp
It is a default setting on
arm/armeb, arm/armv6eb, ia64/ia64, mips/mipsel, mips/mips, mips/mips64el, mips/mips64, mips/mipsn32, powerpc/powerpc, powerpc/powerpc64 and sparc64/sparc64.
arm/armeb, ia64/ia64, mips/mipsel, mips/mips, mips/mips64el, mips/mips64, mips/mipsn32, powerpc/powerpc, powerpc/powerpc64 and sparc64/sparc64.
When set, it also enforces the following options:
.Pp
.Bl -item -compact
@ -369,7 +369,7 @@ Set to build Flattened Device Tree support as part of the base system.
This includes the device tree compiler (dtc) and libfdt support library.
.Pp
It is a default setting on
arm/arm, arm/armeb, arm/armv6, arm/armv6eb, mips/mipsel, mips/mips, mips/mips64el, mips/mips64, mips/mipsn32, powerpc/powerpc and powerpc/powerpc64.
arm/arm, arm/armeb, arm/armv6, mips/mipsel, mips/mips, mips/mips64el, mips/mips64, mips/mipsn32, powerpc/powerpc and powerpc/powerpc64.
.It Va WITHOUT_FLOPPY
.\" from FreeBSD: head/tools/build/options/WITHOUT_FLOPPY 221540 2011-05-06 19:13:03Z ru
Set to not build or install programs
@ -406,7 +406,7 @@ amd64/amd64, arm/arm, arm/armv6 and i386/i386.
Set to build and install gcc and g++.
.Pp
It is a default setting on
arm/armeb, arm/armv6eb, ia64/ia64, mips/mipsel, mips/mips, mips/mips64el, mips/mips64, mips/mipsn32, pc98/i386, powerpc/powerpc, powerpc/powerpc64 and sparc64/sparc64.
arm/armeb, ia64/ia64, mips/mipsel, mips/mips, mips/mips64el, mips/mips64, mips/mipsn32, pc98/i386, powerpc/powerpc, powerpc/powerpc64 and sparc64/sparc64.
.It Va WITHOUT_GCOV
.\" from FreeBSD: head/tools/build/options/WITHOUT_GCOV 156932 2006-03-21 07:50:50Z ru
Set to not build the
@ -443,7 +443,7 @@ Build the GNU C++ stack (g++, libstdc++).
This is the default on platforms where gcc is the system compiler.
.Pp
It is a default setting on
arm/armeb, arm/armv6eb, ia64/ia64, mips/mipsel, mips/mips, mips/mips64el, mips/mips64, mips/mipsn32, powerpc/powerpc, powerpc/powerpc64 and sparc64/sparc64.
arm/armeb, ia64/ia64, mips/mipsel, mips/mips, mips/mips64el, mips/mips64, mips/mipsn32, powerpc/powerpc, powerpc/powerpc64 and sparc64/sparc64.
.It Va WITHOUT_GNU_SUPPORT
.\" from FreeBSD: head/tools/build/options/WITHOUT_GNU_SUPPORT 156932 2006-03-21 07:50:50Z ru
Set to build some programs without optional GNU support.
@ -909,11 +909,6 @@ This includes
.Xr rlogin 1 ,
.Xr rsh 1 ,
etc.
.It Va WITHOUT_RCS
.\" from FreeBSD: head/tools/build/options/WITHOUT_RCS 156932 2006-03-21 07:50:50Z ru
Set to not build
.Xr rcs 1
and related utilities.
.It Va WITHOUT_RESCUE
.\" from FreeBSD: head/tools/build/options/WITHOUT_RESCUE 156932 2006-03-21 07:50:50Z ru
Set to not build

View File

@ -20,7 +20,7 @@ utility is a script which produces a minimal implementation of
which typically fits on a small media such as a floppy disk,
or can be downloaded as a
single image file from some media such as CDROM, flash memory, or through
.Xr etherboot .
etherboot.
.Pp
The
.Nm
@ -64,7 +64,7 @@ kernel.
This is the default behaviour, and is
extremely useful as the kernel itself can be loaded,
using
.Xr etherboot
etherboot
or
.Xr pxeboot 8 ,
.\"
@ -378,9 +378,7 @@ If the build is successful, the directory
.Pa build_dir-bridge/
will contain a
.Pa kernel
that can be downloaded with
.Xr etherboot ,
a floppy image called
that can be downloaded with etherboot, a floppy image called
.Pa picobsd.bin ,
plus the products of the compilation in other directories.
If you want to modify the source tree in
@ -480,9 +478,7 @@ Booting from a floppy is normally rather slow (in the order of 1-2
minutes), things are much faster if you store your image on
a hard disk, Compact Flash, or CDROM.
.Pp
You can also use
.Xr etherboot
to load the preloaded, uncompressed kernel image
You can also use etherboot to load the preloaded, uncompressed kernel image
which is a byproduct of the
.Nm
build.

View File

@ -343,7 +343,9 @@ MAN= accept_filter.9 \
vnode.9 \
VOP_ACCESS.9 \
VOP_ACLCHECK.9 \
VOP_ADVISE.9 \
VOP_ADVLOCK.9 \
VOP_ALLOCATE.9 \
VOP_ATTRIB.9 \
VOP_BWRITE.9 \
VOP_CREATE.9 \

View File

@ -0,0 +1,88 @@
.\" -*- nroff -*-
.\"
.\" Copyright (c) 2013 Advanced Computing Technologies LLC
.\" Written by: John H. Baldwin <jhb@FreeBSD.org>
.\" 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$
.\"
.Dd October 3, 2013
.Dt VOP_ADVISE 9
.Os
.Sh NAME
.Nm VOP_ADVISE
.Nd apply advice about use of file data
.Sh SYNOPSIS
.In sys/param.h
.In sys/vnode.h
.Ft int
.Fn VOP_ADVISE "struct vnode *vp" "off_t start" "off_t end" "int advice"
.Sh DESCRIPTION
This call applies advice for a range of a file's data.
It is used to implement the
.Xr posix_fadvise
system call.
.Pp
Its arguments are:
.Bl -tag -width offset
.It Fa vp
The vnode of the file.
.It Fa start
The start of the range of file data.
.It Fa end
The end of the range of file data.
.It Fa advice
The type of operation to apply to the file data.
Possible values are:
.Bl -tag -width POSIX_FADV_WILLNEED
.It Dv POSIX_FADV_WILLNEED
Initiate an asynchronous read of the file data if it is not already resident.
.It Dv POSIX_FADV_DONTNEED
Decrease the in-memory priority of clean file data or discard clean file data.
.El
.El
.Pp
If the
.Fa start
and
.Fa end
offsets are both zero,
then the operation should be applied to the entire file.
Note that this call is advisory only and may perform the requested
operation on a subset of the requested range
.Pq including not performing it at all
and still return success.
.Sh LOCKS
The file should be unlocked on entry.
.Sh RETURN VALUES
Zero is returned if the call is successful, otherwise an appropriate
error code is returned.
.Sh ERRORS
.Bl -tag -width Er
.It Bq Er EINVAL
An invalid value was given for
.Fa advice .
.El
.Sh SEE ALSO
.Xr vnode 9

View File

@ -0,0 +1,84 @@
.\" -*- nroff -*-
.\"
.\" Copyright (c) 2013 Advanced Computing Technologies LLC
.\" Written by: John H. Baldwin <jhb@FreeBSD.org>
.\" 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$
.\"
.Dd October 3, 2013
.Dt VOP_ALLOCATE 9
.Os
.Sh NAME
.Nm VOP_ALLOCATE
.Nd allocate storage for a file
.Sh SYNOPSIS
.In sys/param.h
.In sys/vnode.h
.Ft int
.Fn VOP_ALLOCATE "struct vnode *vp" "off_t *offset" "off_t *len"
.Sh DESCRIPTION
This call allocates storage for a range of offsets in a file.
It is used to implement the
.Xr posix_fallocate
system call.
.Pp
Its arguments are:
.Bl -tag -width offset
.It Fa vp
The vnode of the file.
.It Fa offset
The start of the range to allocate storage for in the file.
.It Fa len
The length of the range to allocate storage for in the file.
.El
.Pp
The
.Fa offset
and
.Fa len
arguments are updated to reflect the portion of the range that
still needs to be allocated on return.
A partial allocation is considered a successful operation.
The file's contents are not changed.
.Sh LOCKS
The file should be exclusively locked on entry and will still be locked on exit.
.Sh RETURN VALUES
Zero is returned if the call is successful, otherwise an appropriate
error code is returned.
.Sh ERRORS
.Bl -tag -width Er
.It Bq Er EFBIG
An attempt was made to write a file that exceeds the process's file size
limit or the maximum file size.
.It Bq Er ENOSPC
The file system is full.
.It Bq Er EPERM
An append-only flag is set on the file, but the caller is attempting to
write before the current end of file.
.El
.Sh SEE ALSO
.Xr vnode 9 ,
.Xr VOP_READ 9 ,
.Xr VOP_WRITE 9

View File

@ -65,15 +65,6 @@ Push data not written by file system syncer.
.It Fa td
The calling thread.
.El
.Pp
The argument
.Fa waitfor
is either
.Dv MNT_WAIT
or
.Dv MNT_NOWAIT
and specifies whether or not the function should wait for the writes
to finish before returning.
.Sh LOCKS
The file should be locked on entry.
.Sh RETURN VALUES

View File

@ -254,8 +254,8 @@ IxNpeMicrocode.dat optional npe_fw \\
.Pp
Note that generating the firmware modules in this way requires
the availability of the following tools:
.Xr awk ,
.Xr make ,
.Xr awk 1 ,
.Xr make 1 ,
the compiler and the linker.
.Sh SEE ALSO
.Xr kld 4 ,

View File

@ -64,7 +64,7 @@ function sleeps for any reason, the object lock is temporary dropped.
The
.Fn vm_page_grab
supports all of the flags supported by
.Xr vm_page_alloc .
.Xr vm_page_alloc 9 .
In addition,
.Fn vm_page_grab
supports the following flags:

View File

@ -163,7 +163,9 @@ intertwining of VM Objects and Vnodes.
.Xr malloc 9 ,
.Xr VOP_ACCESS 9 ,
.Xr VOP_ACLCHECK 9 ,
.Xr VOP_ADVISE 9 ,
.Xr VOP_ADVLOCK 9 ,
.Xr VOP_ALLOCATE 9 ,
.Xr VOP_ATTRIB 9 ,
.Xr VOP_BWRITE 9 ,
.Xr VOP_CREATE 9 ,

View File

@ -270,17 +270,23 @@ FreeBSD 5.2 | | | |
| | | | | | \ | |
| | | | | | NetBSD | |
| | | | | | 6.0.1 | |
| | | | | | | | |
| | | | | | NetBSD | |
| | | | | | 6.0.2 | |
| | | | | | | OpenBSD 5.3 DragonFly 3.4.1
| | | | | | NetBSD | |
| | | | | | 6.0.2 | |
| | | | | | | |
| | | | | `-NetBSD 6.1 | |
| | FreeBSD | | | |
| | 8.4 | | | |
| | | | | |
| FreeBSD | | | |
| | | | | |`-NetBSD 6.1 | |
| | FreeBSD | | | | |
| | 8.4 | | NetBSD 6.1.1 | |
| | | | | | |
| FreeBSD | | NetBSD 6.1.2 | |
| 9.2 | | | |
| | | | |
| | | | |
| | | | |
| | | | |
FreeBSD 10 -current | NetBSD -current OpenBSD -current |
| | | | |
v v v v v
@ -588,9 +594,12 @@ OpenBSD 5.3 2013-05-01 [OBD]
NetBSD 6.0.2 2013-05-18 [NBD] (security/critical release)
NetBSD 6.1 2013-05-18 [NBD]
FreeBSD 8.4 2013-06-07 [FBD]
NetBSD 6.1.1 2013-08-22 [NBD]
NetBSD 5.1.3 2013-09-29 [NBD]
NetBSD 5.2.1 2013-09-29 [NBD]
FreeBSD 9.2 2013-09-30 [FBD]
NetBSD 6.0.3 2013-09-30 [NBD]
NetBSD 6.1.2 2013-09-30 [NBD]
Bibliography
------------------------

View File

@ -117,7 +117,9 @@ lzjb_decompress(void *s_start, void *d_start, size_t s_len, size_t d_len, int n)
src += 2;
if ((cpy = dst - offset) < (uchar_t *)d_start)
return (-1);
while (--mlen >= 0 && dst < d_end)
if (mlen > (d_end - dst))
mlen = d_end - dst;
while (--mlen >= 0)
*dst++ = *cpy++;
} else {
*dst++ = *src++;

View File

@ -50,6 +50,7 @@ __FBSDID("$FreeBSD$");
#include <netinet/ip.h>
#include <netinet/ip6.h>
#include <netinet/tcp.h>
#include <machine/md_var.h>
#include "common/common.h"
#include "common/t4_regs.h"
@ -215,10 +216,6 @@ static int handle_fw_msg(struct sge_iq *, const struct rss_header *,
static int sysctl_uint16(SYSCTL_HANDLER_ARGS);
#if defined(__i386__) || defined(__amd64__)
extern u_int cpu_clflush_line_size;
#endif
/*
* Called on MOD_LOAD. Validates and calculates the SGE tunables.
*/

View File

@ -84,6 +84,7 @@ static driver_t isci_pci_driver = {
};
DRIVER_MODULE(isci, pci, isci_pci_driver, isci_devclass, 0, 0);
MODULE_DEPEND(isci, cam, 1, 1, 1);
static struct _pcsid
{

View File

@ -371,6 +371,7 @@ xctrl_suspend()
mtx_unlock(&Giant);
#ifdef SMP
CPU_ZERO(&cpu_suspend_map); /* silence gcc */
if (smp_started) {
/*
* Suspend other CPUs. This prevents IPIs while we

View File

@ -54,8 +54,6 @@ MODULE_VERSION(ibcs2, 1);
extern int bsd_to_ibcs2_errno[];
extern struct sysent ibcs2_sysent[IBCS2_SYS_MAXSYSCALL];
extern int szsigcode;
extern char sigcode[];
static int ibcs2_fixup(register_t **, struct image_params *);
struct sysentvec ibcs2_svr3_sysvec = {

View File

@ -37,9 +37,6 @@
/* Everything below this point is not included by assembler (.S) files. */
#ifndef __ASSEMBLY__
/* Force a proper event-channel callback from Xen. */
void force_evtchn_callback(void);
/* REP NOP (PAUSE) is a good thing to insert into busy-wait loops. */
static inline void rep_nop(void)
{

View File

@ -616,7 +616,7 @@ X_ip6_mrouter_done(void)
for (rte = rt->mf6c_stall; rte != NULL; ) {
struct rtdetq *n = rte->next;
m_free(rte->m);
m_freem(rte->m);
free(rte, M_MRTABLE6);
rte = n;
}

View File

@ -660,7 +660,7 @@ struct ib_qp_init_attr {
union {
struct ib_qp *qpg_parent; /* see qpg_type */
struct ib_qpg_init_attrib parent_attrib;
};
} pp;
enum ib_sig_type sq_sig_type;
enum ib_qp_type qp_type;
enum ib_qp_create_flags create_flags;

View File

@ -487,6 +487,7 @@ typedef struct {
#define DF_1_LOADFLTR 0x00000010 /* Immediate loading of filtees */
#define DF_1_NOOPEN 0x00000040 /* Do not allow loading on dlopen() */
#define DF_1_ORIGIN 0x00000080 /* Process $ORIGIN */
#define DF_1_INTERPOSE 0x00000400 /* Interpose all objects but main */
#define DF_1_NODEFLIB 0x00000800 /* Do not search default paths */
/* Values for n_type. Used in core files. */

View File

@ -64,6 +64,8 @@ typedef __va_list va_list;
(((sizeof(type) + sizeof(long) - 1) / sizeof(long)) * sizeof(long))
#define va_start(ap, last) \
((ap) = (va_list)&(last) + __va_size(last))
#define va_copy(dst, src) \
((dst) = (src))
#define va_arg(ap, type) \
(*(type *)((ap) += __va_size(type), (ap) - __va_size(type)))
#define va_end(ap)

View File

@ -1,6 +1,7 @@
# $FreeBSD$
TESTS= test-trimdomain test-trimdomain-nodomain test-flopen test-grp test-pidfile
TESTS= test-trimdomain test-trimdomain-nodomain test-flopen test-grp \
test-pidfile test-humanize_number
CFLAGS+= -g -Wall -Wextra -Werror -lutil
.PHONY: tests

View File

@ -0,0 +1,592 @@
/*-
* Copyright 2012 Clifton Royston
* Copyright 2013 John-Mark Gurney
* 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$
*
*/
#include <sys/types.h>
#include <stdlib.h>
#include <libutil.h>
#include <stdio.h>
#include <string.h>
#include <inttypes.h>
#include <math.h>
#include <unistd.h>
#include <limits.h>
extern char * optarg;
#define MAX_STR_FLAGS_RESULT 80
#define MAX_INT_STR_DIGITS 12
static const int64_t halfExabyte = (int64_t)500*1000*1000*1000*1000*1000L;
static struct {
int retval;
const char *res;
int64_t num;
int flags;
int scale;
} test_args[] = {
/* tests 0-13 test 1000 suffixes */
{ 2, "0 ", (int64_t)0L, HN_DIVISOR_1000, HN_AUTOSCALE },
{ 3, "1 k", (int64_t)500L, HN_DIVISOR_1000, HN_AUTOSCALE },
{ 3, "1 M", (int64_t)500*1000L, HN_DIVISOR_1000, HN_AUTOSCALE },
{ 3, "1 G", (int64_t)500*1000*1000L, HN_DIVISOR_1000, HN_AUTOSCALE },
{ 3, "1 T", (int64_t)500*1000*1000*1000L, HN_DIVISOR_1000, HN_AUTOSCALE },
{ 3, "1 P", (int64_t)500*1000*1000*1000*1000L, HN_DIVISOR_1000, HN_AUTOSCALE },
{ 3, "1 E", (int64_t)500*1000*1000*1000*1000*1000L, HN_DIVISOR_1000, HN_AUTOSCALE },
{ 2, "1 ", (int64_t)1L, HN_DIVISOR_1000, HN_AUTOSCALE },
{ 3, "2 k", (int64_t)1500L, HN_DIVISOR_1000, HN_AUTOSCALE },
{ 3, "2 M", (int64_t)1500*1000L, HN_DIVISOR_1000, HN_AUTOSCALE },
{ 3, "2 G", (int64_t)1500*1000*1000L, HN_DIVISOR_1000, HN_AUTOSCALE },
{ 3, "2 T", (int64_t)1500*1000*1000*1000L, HN_DIVISOR_1000, HN_AUTOSCALE },
{ 3, "2 P", (int64_t)1500*1000*1000*1000*1000L, HN_DIVISOR_1000, HN_AUTOSCALE },
{ 3, "2 E", (int64_t)1500*1000*1000*1000*1000*1000L, HN_DIVISOR_1000, HN_AUTOSCALE },
/* tests 14-27 test 1024 suffixes */
{ 2, "0 ", (int64_t)0L, 0, HN_AUTOSCALE },
{ 3, "1 K", (int64_t)512L, 0, HN_AUTOSCALE },
{ 3, "1 M", (int64_t)512*1024L, 0, HN_AUTOSCALE },
{ 3, "1 G", (int64_t)512*1024*1024L, 0, HN_AUTOSCALE },
{ 3, "1 T", (int64_t)512*1024*1024*1024L, 0, HN_AUTOSCALE },
{ 3, "1 P", (int64_t)512*1024*1024*1024*1024L, 0, HN_AUTOSCALE },
{ 3, "1 E", (int64_t)512*1024*1024*1024*1024*1024L, 0, HN_AUTOSCALE },
{ 2, "1 ", (int64_t)1L, 0, HN_AUTOSCALE },
{ 3, "2 K", (int64_t)1536L, 0, HN_AUTOSCALE },
{ 3, "2 M", (int64_t)1536*1024L, 0, HN_AUTOSCALE },
{ 3, "2 G", (int64_t)1536*1024*1024L, 0, HN_AUTOSCALE },
{ 3, "2 T", (int64_t)1536*1024*1024*1024L, 0, HN_AUTOSCALE },
{ 3, "2 P", (int64_t)1536*1024*1024*1024*1024L, 0, HN_AUTOSCALE },
{ 3, "2 E", (int64_t)1536*1024*1024*1024*1024*1024L, 0, HN_AUTOSCALE },
/* tests 28-37 test rounding */
{ 3, "0 M", (int64_t)500*1000L-1, HN_DIVISOR_1000, HN_AUTOSCALE },
{ 3, "1 M", (int64_t)500*1000L, HN_DIVISOR_1000, HN_AUTOSCALE },
{ 3, "1 M", (int64_t)1000*1000L + 500*1000L-1, HN_DIVISOR_1000, HN_AUTOSCALE },
{ 3, "2 M", (int64_t)1000*1000L + 500*1000L, HN_DIVISOR_1000, HN_AUTOSCALE },
{ 3, "0 K", (int64_t)512L-1, 0, HN_AUTOSCALE },
{ 3, "1 K", (int64_t)512L, 0, HN_AUTOSCALE },
{ 3, "0 M", (int64_t)512*1024L-1, 0, HN_AUTOSCALE },
{ 3, "1 M", (int64_t)512*1024L, 0, HN_AUTOSCALE },
{ 3, "1 M", (int64_t)1024*1024L + 512*1024L-1, 0, HN_AUTOSCALE },
{ 3, "2 M", (int64_t)1024*1024L + 512*1024L, 0, HN_AUTOSCALE },
/* tests 38-61 test specific scale factors with 1000 divisor */
{ 3, "0 k", (int64_t)0L, HN_DIVISOR_1000, 1 },
{ 3, "1 k", (int64_t)500L, HN_DIVISOR_1000, 1 },
{ 3, "0 M", (int64_t)500L, HN_DIVISOR_1000, 2 },
{ 3, "1 M", (int64_t)500*1000L, HN_DIVISOR_1000, 2 },
{ 3, "0 G", (int64_t)500*1000L, HN_DIVISOR_1000, 3 },
{ 3, "1 G", (int64_t)500*1000*1000L, HN_DIVISOR_1000, 3 },
{ 3, "0 T", (int64_t)500*1000*1000L, HN_DIVISOR_1000, 4 },
{ 3, "1 T", (int64_t)500*1000*1000*1000L, HN_DIVISOR_1000, 4 },
{ 3, "0 P", (int64_t)500*1000*1000*1000L, HN_DIVISOR_1000, 5 },
{ 3, "1 P", (int64_t)500*1000*1000*1000*1000L, HN_DIVISOR_1000, 5 },
{ 3, "0 E", (int64_t)500*1000*1000*1000*1000L, HN_DIVISOR_1000, 6 },
{ 3, "1 E", (int64_t)500*1000*1000*1000*1000*1000L, HN_DIVISOR_1000, 6 },
{ 3, "0 k", (int64_t)1L, HN_DIVISOR_1000, 1 },
{ 3, "2 k", (int64_t)1500L, HN_DIVISOR_1000, 1 },
{ 3, "0 M", (int64_t)1500L, HN_DIVISOR_1000, 2 },
{ 3, "2 M", (int64_t)1500*1000L, HN_DIVISOR_1000, 2 },
{ 3, "0 G", (int64_t)1500*1000L, HN_DIVISOR_1000, 3 },
{ 3, "2 G", (int64_t)1500*1000*1000L, HN_DIVISOR_1000, 3 },
{ 3, "0 T", (int64_t)1500*1000*1000L, HN_DIVISOR_1000, 4 },
{ 3, "2 T", (int64_t)1500*1000*1000*1000L, HN_DIVISOR_1000, 4 },
{ 3, "0 P", (int64_t)1500*1000*1000*1000L, HN_DIVISOR_1000, 5 },
{ 3, "2 P", (int64_t)1500*1000*1000*1000*1000L, HN_DIVISOR_1000, 5 },
{ 3, "0 E", (int64_t)1500*1000*1000*1000*1000L, HN_DIVISOR_1000, 6 },
{ 3, "2 E", (int64_t)1500*1000*1000*1000*1000*1000L, HN_DIVISOR_1000, 6 },
/* tests 62-85 test specific scale factors with 1024 divisor */
{ 3, "0 K", (int64_t)0L, 0, 1 },
{ 3, "1 K", (int64_t)512L, 0, 1 },
{ 3, "0 M", (int64_t)512L, 0, 2 },
{ 3, "1 M", (int64_t)512*1024L, 0, 2 },
{ 3, "0 G", (int64_t)512*1024L, 0, 3 },
{ 3, "1 G", (int64_t)512*1024*1024L, 0, 3 },
{ 3, "0 T", (int64_t)512*1024*1024L, 0, 4 },
{ 3, "1 T", (int64_t)512*1024*1024*1024L, 0, 4 },
{ 3, "0 P", (int64_t)512*1024*1024*1024L, 0, 5 },
{ 3, "1 P", (int64_t)512*1024*1024*1024*1024L, 0, 5 },
{ 3, "0 E", (int64_t)512*1024*1024*1024*1024L, 0, 6 },
{ 3, "1 E", (int64_t)512*1024*1024*1024*1024*1024L, 0, 6 },
{ 3, "0 K", (int64_t)1L, 0, 1 },
{ 3, "2 K", (int64_t)1536L, 0, 1 },
{ 3, "0 M", (int64_t)1536L, 0, 2 },
{ 3, "2 M", (int64_t)1536*1024L, 0, 2 },
{ 3, "0 G", (int64_t)1536*1024L, 0, 3 },
{ 3, "2 G", (int64_t)1536*1024*1024L, 0, 3 },
{ 3, "0 T", (int64_t)1536*1024*1024L, 0, 4 },
{ 3, "2 T", (int64_t)1536*1024*1024*1024L, 0, 4 },
{ 3, "0 P", (int64_t)1536*1024*1024*1024L, 0, 5 },
{ 3, "2 P", (int64_t)1536*1024*1024*1024*1024L, 0, 5 },
{ 3, "0 E", (int64_t)1536*1024*1024*1024*1024L, 0, 6 },
{ 3, "2 E", (int64_t)1536*1024*1024*1024*1024*1024L, 0, 6 },
/* tests 86-99 test invalid specific scale values of < 0 or >= 7 with
and without HN_DIVISOR_1000 set */
/* all should return errors with new code; with old, the latter 3
are instead processed as if having AUTOSCALE and/or GETSCALE set */
{ -1, "", (int64_t)1L, 0, 7 },
{ -1, "", (int64_t)1L, HN_DIVISOR_1000, 7 },
{ -1, "", (int64_t)1L, 0, 1000 },
{ -1, "", (int64_t)1L, HN_DIVISOR_1000, 1000 },
{ -1, "", (int64_t)0L, 0, 1000*1000 },
{ -1, "", (int64_t)0L, HN_DIVISOR_1000, 1000*1000 },
{ -1, "", (int64_t)0L, 0, INT_MAX },
{ -1, "", (int64_t)0L, HN_DIVISOR_1000, INT_MAX },
/* Negative scale values are not handled well
by the existing library routine - should report as error */
/* all should return errors with new code, fail assertion with old */
{ -1, "", (int64_t)1L, 0, -1 },
{ -1, "", (int64_t)1L, HN_DIVISOR_1000, -1 },
{ -1, "", (int64_t)1L, 0, -1000 },
{ -1, "", (int64_t)1L, HN_DIVISOR_1000, -1000 },
/* __INT_MIN doesn't print properly, skipped. */
{ -1, "", (int64_t)1L, 0, -__INT_MAX },
{ -1, "", (int64_t)1L, HN_DIVISOR_1000, -__INT_MAX },
/* tests for scale == 0, without autoscale */
/* tests 100-114 test scale 0 with 1000 divisor - print first N digits */
{ 2, "0 ", (int64_t)0L, HN_DIVISOR_1000, 0 },
{ 2, "1 ", (int64_t)1L, HN_DIVISOR_1000, 0 },
{ 3, "10 ", (int64_t)10L, HN_DIVISOR_1000, 0 },
{ 3, "0 M", (int64_t)150L, HN_DIVISOR_1000, HN_NOSPACE },
{ 3, "0 M", (int64_t)500L, HN_DIVISOR_1000, HN_NOSPACE },
{ 3, "0 M", (int64_t)999L, HN_DIVISOR_1000, HN_NOSPACE },
{ 4, "150", (int64_t)150L, HN_DIVISOR_1000, 0 },
{ 4, "500", (int64_t)500L, HN_DIVISOR_1000, 0 },
{ 4, "999", (int64_t)999L, HN_DIVISOR_1000, 0 },
{ 5, "100", (int64_t)1000L, HN_DIVISOR_1000, 0 },
{ 5, "150", (int64_t)1500L, HN_DIVISOR_1000, 0 },
{ 7, "500", (int64_t)500*1000L, HN_DIVISOR_1000, 0 },
{ 8, "150", (int64_t)1500*1000L, HN_DIVISOR_1000, 0 },
{ 10, "500", (int64_t)500*1000*1000L, HN_DIVISOR_1000, 0 },
{ 11, "150", (int64_t)1500*1000*1000L, HN_DIVISOR_1000, 0 },
/* tests 115-126 test scale 0 with 1024 divisor - print first N digits */
{ 2, "0 ", (int64_t)0L, 0, 0 },
{ 2, "1 ", (int64_t)1L, 0, 0 },
{ 3, "10 ", (int64_t)10L, 0, 0 },
{ 4, "150", (int64_t)150L, 0, 0 },
{ 4, "500", (int64_t)500L, 0, 0 },
{ 4, "999", (int64_t)999L, 0, 0 },
{ 5, "100", (int64_t)1000L, 0, 0 },
{ 5, "150", (int64_t)1500L, 0, 0 },
{ 7, "500", (int64_t)500*1000L, 0, 0 },
{ 8, "150", (int64_t)1500*1000L, 0, 0 },
{ 10, "500", (int64_t)500*1000*1000L, 0, 0 },
{ 11, "150", (int64_t)1500*1000*1000L, 0, 0 },
/* Test boundary cases for very large positive/negative number formatting */
/* Explicit scale, divisor 1024 */
/* XXX = requires length 5 (buflen 6) for some cases*/
/* KLUDGE - test loop below will bump length 5 up to 5 */
{ 3, "8 E", INT64_MAX, 0, 6 },
{ 4, "-8 E", -INT64_MAX, 0, 6 },
{ 3, "0 E", (int64_t)92*1024*1024*1024*1024*1024L, 0, 6 },
{ 3, "0 E", -(int64_t)92*1024*1024*1024*1024*1024L, 0, 6 },
{ 3, "0 E", (int64_t)82*1024*1024*1024*1024*1024L, 0, 6 },
{ 3, "0 E", -(int64_t)82*1024*1024*1024*1024*1024L, 0, 6 },
{ 3, "0 E", (int64_t)81*1024*1024*1024*1024*1024L, 0, 6 },
{ 3, "0 E", -(int64_t)81*1024*1024*1024*1024*1024L, 0, 6 },
{ 4, "92 P", (int64_t)92*1024*1024*1024*1024*1024L, 0, 5 },
{ 5, "-92 P", -(int64_t)92*1024*1024*1024*1024*1024L, 0, 5 },
{ 4, "82 P", (int64_t)82*1024*1024*1024*1024*1024L, 0, 5 },
{ 5, "-82 P", -(int64_t)82*1024*1024*1024*1024*1024L, 0, 5 },
{ 4, "81 P", (int64_t)81*1024*1024*1024*1024*1024L, 0, 5 },
{ 5, "-81 P", -(int64_t)81*1024*1024*1024*1024*1024L, 0, 5 },
/* Explicit scale, divisor 1000 */
{ 3, "9 E", INT64_MAX, HN_DIVISOR_1000, 6 },
{ 4, "-9 E", -INT64_MAX, HN_DIVISOR_1000, 6 },
{ 3, "0 E", (int64_t)82*1024*1024*1024*1024*1024L, HN_DIVISOR_1000, 6 },
{ 3, "0 E", -(int64_t)82*1024*1024*1024*1024*1024L, HN_DIVISOR_1000, 6 },
{ 3, "0 E", (int64_t)82*1024*1024*1024*1024*1024L, HN_DIVISOR_1000, 6 },
{ 3, "0 E", -(int64_t)82*1024*1024*1024*1024*1024L, HN_DIVISOR_1000, 6 },
{ 4, "92 P", (int64_t)82*1024*1024*1024*1024*1024L, HN_DIVISOR_1000, 5 },
{ 5, "-92 P", -(int64_t)82*1024*1024*1024*1024*1024L, HN_DIVISOR_1000, 5 },
{ 4, "91 P", (int64_t)81*1024*1024*1024*1024*1024L, HN_DIVISOR_1000, 5 },
{ 5, "-91 P", -(int64_t)81*1024*1024*1024*1024*1024L, HN_DIVISOR_1000, 5 },
/* Autoscale, divisor 1024 */
{ 3, "8 E", INT64_MAX, 0, HN_AUTOSCALE },
{ 4, "-8 E", -INT64_MAX, 0, HN_AUTOSCALE },
{ 4, "92 P", (int64_t)92*1024*1024*1024*1024*1024L, 0, HN_AUTOSCALE },
{ 5, "-92 P", -(int64_t)92*1024*1024*1024*1024*1024L, 0, HN_AUTOSCALE },
{ 4, "82 P", (int64_t)82*1024*1024*1024*1024*1024L, 0, HN_AUTOSCALE },
{ 5, "-82 P", -(int64_t)82*1024*1024*1024*1024*1024L, 0, HN_AUTOSCALE },
{ 4, "81 P", (int64_t)81*1024*1024*1024*1024*1024L, 0, HN_AUTOSCALE },
{ 5, "-81 P", -(int64_t)81*1024*1024*1024*1024*1024L, 0, HN_AUTOSCALE },
/* Autoscale, divisor 1000 */
{ 3, "9 E", INT64_MAX, HN_DIVISOR_1000, HN_AUTOSCALE },
{ 4, "-9 E", -INT64_MAX, HN_DIVISOR_1000, HN_AUTOSCALE },
{ 4, "92 P", (int64_t)82*1024*1024*1024*1024*1024L, HN_DIVISOR_1000, HN_AUTOSCALE },
{ 5, "-92 P", -(int64_t)82*1024*1024*1024*1024*1024L, HN_DIVISOR_1000, HN_AUTOSCALE },
{ 4, "91 P", (int64_t)81*1024*1024*1024*1024*1024L, HN_DIVISOR_1000, HN_AUTOSCALE },
{ 5, "-91 P", -(int64_t)81*1024*1024*1024*1024*1024L, HN_DIVISOR_1000, HN_AUTOSCALE },
/* 0 scale, divisor 1024 */
{ 12, "skdj", INT64_MAX, 0, 0 },
{ 21, "-9223", -INT64_MAX, 0, 0 },
{ 19, "10358", (int64_t)92*1024*1024*1024*1024*1024L, 0, 0 },
{ 20, "-1035", -(int64_t)92*1024*1024*1024*1024*1024L, 0, 0 },
{ 18, "92323", (int64_t)82*1024*1024*1024*1024*1024L, 0, 0 },
{ 19, "-9232", -(int64_t)82*1024*1024*1024*1024*1024L, 0, 0 },
{ 18, "91197", (int64_t)81*1024*1024*1024*1024*1024L, 0, 0 },
{ 19, "-9119", -(int64_t)81*1024*1024*1024*1024*1024L, 0, 0 },
/* 0 scale, divisor 1000 */
/* XXX - why does this fail? */
{ -1, "", INT64_MAX, HN_DIVISOR_1000, 0 },
{ 21, "-9223", -INT64_MAX, HN_DIVISOR_1000, 0 },
{ 19, "10358", (int64_t)92*1024*1024*1024*1024*1024L, HN_DIVISOR_1000, 0 },
{ 20, "-1035", -(int64_t)92*1024*1024*1024*1024*1024L, HN_DIVISOR_1000, 0 },
{ 18, "92323", (int64_t)82*1024*1024*1024*1024*1024L, HN_DIVISOR_1000, 0 },
{ 19, "-9232", -(int64_t)82*1024*1024*1024*1024*1024L, HN_DIVISOR_1000, 0 },
/* Expected to pass */
{ 18, "91197", (int64_t)81*1024*1024*1024*1024*1024L, HN_DIVISOR_1000, 0 },
{ 19, "-9119", -(int64_t)81*1024*1024*1024*1024*1024L, HN_DIVISOR_1000, 0 },
/* Need to implement tests for GETSCALE */
/* { ?, "", (int64_t)0L, HN_DIVISOR_1000, HN_GETSCALE },
...
*/
/* Tests for HN_DECIMAL */
/* Positive, Autoscale */
{ 5, "500 k", (int64_t)500*1000L, HN_DECIMAL|HN_DIVISOR_1000, HN_AUTOSCALE },
{ 5, "994 k", (int64_t)994*1000L, HN_DECIMAL|HN_DIVISOR_1000, HN_AUTOSCALE },
{ 5, "995 k", (int64_t)995*1000L, HN_DECIMAL|HN_DIVISOR_1000, HN_AUTOSCALE },
{ 5, "999 k", (int64_t)999*1000L, HN_DECIMAL|HN_DIVISOR_1000, HN_AUTOSCALE },
{ 5, "1.0 M", (int64_t)1000*1000L, HN_DECIMAL|HN_DIVISOR_1000, HN_AUTOSCALE },
{ 5, "1.5 M", (int64_t)1500*1000L, HN_DECIMAL|HN_DIVISOR_1000, HN_AUTOSCALE },
{ 5, "1.9 M", (int64_t)1949*1000L, HN_DECIMAL|HN_DIVISOR_1000, HN_AUTOSCALE },
{ 5, "2.0 M", (int64_t)1950*1000L, HN_DECIMAL|HN_DIVISOR_1000, HN_AUTOSCALE },
{ 5, "9.9 M", (int64_t)9949*1000L, HN_DECIMAL|HN_DIVISOR_1000, HN_AUTOSCALE },
{ 4, "10 M", (int64_t)9950*1000L, HN_DECIMAL|HN_DIVISOR_1000, HN_AUTOSCALE },
{ 5, "500 M", (int64_t)500*1000*1000L, HN_DECIMAL|HN_DIVISOR_1000, HN_AUTOSCALE },
{ 5, "994 M", (int64_t)994*1000*1000L, HN_DECIMAL|HN_DIVISOR_1000, HN_AUTOSCALE },
{ 5, "995 M", (int64_t)995*1000*1000L, HN_DECIMAL|HN_DIVISOR_1000, HN_AUTOSCALE },
{ 5, "999 M", (int64_t)999*1000*1000L, HN_DECIMAL|HN_DIVISOR_1000, HN_AUTOSCALE },
{ 5, "500 K", (int64_t)500*1024L, HN_DECIMAL, HN_AUTOSCALE },
{ 5, "994 K", (int64_t)994*1024L, HN_DECIMAL, HN_AUTOSCALE },
{ 5, "995 K", (int64_t)995*1024L, HN_DECIMAL, HN_AUTOSCALE },
{ 5, "999 K", (int64_t)999*1024L, HN_DECIMAL, HN_AUTOSCALE },
{ 5, "1.0 M", (int64_t)1000*1024L, HN_DECIMAL, HN_AUTOSCALE },
{ 5, "1.0 M", (int64_t)1018*1024L, HN_DECIMAL, HN_AUTOSCALE },
{ 5, "1.0 M", (int64_t)1019*1024L, HN_DECIMAL, HN_AUTOSCALE },
{ 5, "1.5 M", (int64_t)1536*1024L, HN_DECIMAL, HN_AUTOSCALE },
{ 5, "1.9 M", (int64_t)1996*1024L, HN_DECIMAL, HN_AUTOSCALE },
{ 5, "2.0 M", (int64_t)1997*1024L, HN_DECIMAL, HN_AUTOSCALE },
{ 5, "2.0 M", (int64_t)2047*1024L, HN_DECIMAL, HN_AUTOSCALE },
{ 5, "2.0 M", (int64_t)2048*1024L, HN_DECIMAL, HN_AUTOSCALE },
{ 5, "2.0 M", (int64_t)2099*1024L, HN_DECIMAL, HN_AUTOSCALE },
{ 5, "2.1 M", (int64_t)2100*1024L, HN_DECIMAL, HN_AUTOSCALE },
{ 5, "9.9 M", (int64_t)10188*1024L, HN_DECIMAL, HN_AUTOSCALE },
/* XXX - shouldn't the following two be "10. M"? */
{ 4, "10 M", (int64_t)10189*1024L, HN_DECIMAL, HN_AUTOSCALE },
{ 4, "10 M", (int64_t)10240*1024L, HN_DECIMAL, HN_AUTOSCALE },
{ 5, "500 M", (int64_t)500*1024*1024L, HN_DECIMAL, HN_AUTOSCALE },
{ 5, "994 M", (int64_t)994*1024*1024L, HN_DECIMAL, HN_AUTOSCALE },
{ 5, "995 M", (int64_t)995*1024*1024L, HN_DECIMAL, HN_AUTOSCALE },
{ 5, "999 M", (int64_t)999*1024*1024L, HN_DECIMAL, HN_AUTOSCALE },
{ 5, "1.0 G", (int64_t)1000*1024*1024L, HN_DECIMAL, HN_AUTOSCALE },
{ 5, "1.0 G", (int64_t)1023*1024*1024L, HN_DECIMAL, HN_AUTOSCALE },
/* Negative, Autoscale - should pass */
{ 6, "-1.5 ", -(int64_t)1500*1000L, HN_DECIMAL|HN_DIVISOR_1000, HN_AUTOSCALE },
{ 6, "-1.9 ", -(int64_t)1949*1000L, HN_DECIMAL|HN_DIVISOR_1000, HN_AUTOSCALE },
{ 6, "-9.9 ", -(int64_t)9949*1000L, HN_DECIMAL|HN_DIVISOR_1000, HN_AUTOSCALE },
{ 6, "-1.5 ", -(int64_t)1536*1024L, HN_DECIMAL, HN_AUTOSCALE },
{ 6, "-1.9 ", -(int64_t)1949*1024L, HN_DECIMAL, HN_AUTOSCALE },
{ 6, "-9.7 ", -(int64_t)9949*1024L, HN_DECIMAL, HN_AUTOSCALE },
/* Positive/negative, at maximum scale */
{ 5, "500 P", (int64_t)500*1000*1000*1000*1000*1000L, HN_DIVISOR_1000, HN_AUTOSCALE },
{ 5, "1.9 E", (int64_t)1949*1000*1000*1000*1000*1000L, HN_DIVISOR_1000, HN_AUTOSCALE },
{ 5, "8.9 E", (int64_t)8949*1000*1000*1000*1000*1000L, HN_DIVISOR_1000, HN_AUTOSCALE },
{ 5, "9.2 E", INT64_MAX, HN_DECIMAL|HN_DIVISOR_1000, HN_AUTOSCALE },
/* Negatives work with latest rev only: */
{ 6, "-9.2 ", -INT64_MAX, HN_DECIMAL|HN_DIVISOR_1000, HN_AUTOSCALE },
{ 6, "-8.9 ", -(int64_t)8949*1000*1000*1000*1000*1000L, HN_DECIMAL|HN_DIVISOR_1000, HN_AUTOSCALE },
{ 5, "8.0 E", INT64_MAX, HN_DECIMAL, HN_AUTOSCALE },
{ 5, "7.9 E", INT64_MAX-(int64_t)100*1024*1024*1024*1024*1024LL, HN_DECIMAL, HN_AUTOSCALE },
{ 6, "-8.0 ", -INT64_MAX, HN_DECIMAL, HN_AUTOSCALE },
{ 6, "-7.9 ", -INT64_MAX+(int64_t)100*1024*1024*1024*1024*1024LL, HN_DECIMAL, HN_AUTOSCALE },
/* Positive, Fixed scales */
{ 5, "500 k", (int64_t)500*1000L, HN_DECIMAL|HN_DIVISOR_1000, 1 },
{ 5, "0.5 M", (int64_t)500*1000L, HN_DECIMAL|HN_DIVISOR_1000, 2 },
{ 5, "949 k", (int64_t)949*1000L, HN_DECIMAL|HN_DIVISOR_1000, 1 },
{ 5, "0.9 M", (int64_t)949*1000L, HN_DECIMAL|HN_DIVISOR_1000, 2 },
{ 5, "950 k", (int64_t)950*1000L, HN_DECIMAL|HN_DIVISOR_1000, 1 },
{ 5, "1.0 M", (int64_t)950*1000L, HN_DECIMAL|HN_DIVISOR_1000, 2 },
{ 5, "999 k", (int64_t)999*1000L, HN_DECIMAL|HN_DIVISOR_1000, 1 },
{ 5, "1.0 M", (int64_t)999*1000L, HN_DECIMAL|HN_DIVISOR_1000, 2 },
{ 5, "1.5 M", (int64_t)1500*1000L, HN_DECIMAL|HN_DIVISOR_1000, 2 },
{ 5, "1.9 M", (int64_t)1949*1000L, HN_DECIMAL|HN_DIVISOR_1000, 2 },
{ 5, "2.0 M", (int64_t)1950*1000L, HN_DECIMAL|HN_DIVISOR_1000, 2 },
{ 5, "9.9 M", (int64_t)9949*1000L, HN_DECIMAL|HN_DIVISOR_1000, 2 },
{ 4, "10 M", (int64_t)9950*1000L, HN_DECIMAL|HN_DIVISOR_1000, 2 },
{ 5, "500 M", (int64_t)500*1000*1000L, HN_DECIMAL|HN_DIVISOR_1000, 2 },
{ 5, "0.5 G", (int64_t)500*1000*1000L, HN_DECIMAL|HN_DIVISOR_1000, 3 },
{ 5, "999 M", (int64_t)999*1000*1000L, HN_DECIMAL|HN_DIVISOR_1000, 2 },
{ 5, "1.0 G", (int64_t)999*1000*1000L, HN_DECIMAL|HN_DIVISOR_1000, 3 },
/* Positive/negative, at maximum scale */
{ 5, "500 P", (int64_t)500*1000*1000*1000*1000*1000L, HN_DIVISOR_1000, 5 },
{ 5, "1.0 E", (int64_t)500*1000*1000*1000*1000*1000L, HN_DIVISOR_1000, 6 },
{ 5, "1.9 E", (int64_t)1949*1000*1000*1000*1000*1000L, HN_DIVISOR_1000, 6 },
{ 5, "8.9 E", (int64_t)8949*1000*1000*1000*1000*1000L, HN_DIVISOR_1000, 6 },
{ 5, "9.2 E", INT64_MAX, HN_DECIMAL|HN_DIVISOR_1000, 6 },
/* HN_DECIMAL + binary + fixed scale cases not completed */
{ 5, "512 K", (int64_t)512*1024L, HN_DECIMAL, 1 },
{ 5, "0.5 M", (int64_t)512*1024L, HN_DECIMAL, 2 },
/* Negative, Fixed scales */
/* Not yet added, but should work with latest rev */
};
/* Command line options usage */
static void
usage(char * progname) {
printf("%s: tests libutil humanize_number function\n", progname);
printf("Usage: %s [-nE] [-l num] [-v]\n\n", progname);
printf("Options:\n");
printf("\t-l num\tSet max length for result; buflen = num + 1\n");
printf("\t\t (NOTE: does not change expected result strings.)\n");
printf("\t-n\tInclude negative scale tests, which cause older libutil\n");
printf("\t\t version of function to coredump with assertion failure\n");
printf("\t-E\tInclude numbers > 1/2 Exa[byte] which currently fail\n");
printf("\t-v\tVerbose - always print summary results\n");
printf("\t-h, -?\tShow options\n");
}
/* Parse command line options */
static void
read_options(int argc, char * const argv[], size_t *bufLength,
int *includeNegativeScale, int *includeExabytes, int *verbose) {
int ch;
size_t temp;
while ((ch = getopt(argc, argv, "nEh?vl:")) != -1) {
switch (ch) {
default:
usage(argv[0]);
exit(1);
break; /* UNREACHABLE */
case 'h' :
case '?' :
usage(argv[0]);
exit(0);
break; /* UNREACHABLE */
case 'l' :
sscanf(optarg, "%zu", &temp);
*bufLength = temp + 1;
break;
case 'n' :
*includeNegativeScale = 1;
break;
case 'E' :
*includeExabytes = 1;
break;
case 'v' :
*verbose = 1;
break;
}
}
}
static struct {
int value;
const char *name;
} flags[] = {
{ HN_AUTOSCALE, "HN_AUTOSCALE" },
{ HN_GETSCALE, "HN_GETSCALE" },
{ HN_DIVISOR_1000, "HN_DIVISOR_1000"},
{ HN_B, "HN_B"},
{ HN_DECIMAL, "HN_DECIMAL"},
};
static const char *separator = "|";
/* Format flags parameter for meaningful display */
static char *
str_flags(int hn_flags, char *noFlags) {
size_t i;
char * result;
result = malloc(MAX_STR_FLAGS_RESULT);
result[0] = '\0';
for (i = 0; i < sizeof flags / sizeof *flags; i++) {
if (hn_flags & flags[i].value) {
if (*result != 0)
strlcat(result, separator,
MAX_STR_FLAGS_RESULT);
strlcat(result, flags[i].name, MAX_STR_FLAGS_RESULT);
}
}
if (strlen(result) == 0)
strlcat(result, noFlags, MAX_STR_FLAGS_RESULT);
return result;
}
/* Format scale parameter for meaningful display */
static char *
str_scale(int scale) {
char *result;
if (scale == HN_AUTOSCALE || scale == HN_GETSCALE)
return str_flags(scale, "");
result = malloc(MAX_INT_STR_DIGITS);
result[0] = '\0';
snprintf(result, MAX_INT_STR_DIGITS, "%d", scale);
return result;
}
static void
testskipped(size_t i)
{
printf("ok %lu # skip - not turned on\n", i);
}
int
main(int argc, char * const argv[])
{
char *buf;
char *flag_str, *scale_str;
size_t i;
size_t errcnt, tested, skipped;
int r;
size_t buflen;
int includeNegScale;
int includeExabyteTests;
int verbose;
buflen = 4;
includeNegScale = 0;
includeExabyteTests = 0;
verbose = 0;
read_options(argc, argv, &buflen, &includeNegScale,
&includeExabyteTests, &verbose);
buf = malloc(buflen);
errcnt = 0;
tested = 0;
skipped = 0;
if (buflen != 4)
printf("Warning: buffer size %zu != 4, expect some results to differ.\n", buflen);
printf("1..%lu\n", sizeof test_args / sizeof *test_args);
for (i = 0; i < sizeof test_args / sizeof *test_args; i++) {
/* KLUDGE */
if (test_args[i].num == INT64_MAX && buflen == 4) {
/* Start final tests which require buffer of 6 */
free(buf);
buflen = 6;
buf = malloc(buflen);
if (verbose)
printf("Buffer length increased to %zu\n",
buflen);
}
if (test_args[i].scale < 0 && ! includeNegScale) {
skipped++;
testskipped(i);
continue;
}
if (test_args[i].num >= halfExabyte && ! includeExabyteTests) {
skipped++;
testskipped(i);
continue;
}
r = humanize_number(buf, buflen, test_args[i].num, "",
test_args[i].scale, test_args[i].flags);
flag_str = str_flags(test_args[i].flags, "[no flags]");
scale_str = str_scale(test_args[i].scale);
if (r != test_args[i].retval) {
if (verbose)
printf("wrong return value on index %lu, buflen: %zu, got: %d + \"%s\", expected %d + \"%s\"; num = %" PRId64 ", scale = %s, flags= %s.\n",
i, buflen, r, buf, test_args[i].retval,
test_args[i].res, test_args[i].num,
scale_str, flag_str);
else
printf("not ok %lu # return %d != %d\n", i, r,
test_args[i].retval);
errcnt++;
} else if (strcmp(buf, test_args[i].res) != 0) {
if (verbose)
printf("result mismatch on index %lu, got: \"%s\", expected \"%s\"; num = %" PRId64 ", scale = %s, flags= %s.\n",
i, buf, test_args[i].res, test_args[i].num,
scale_str, flag_str);
else
printf("not ok %lu # buf \"%s\" != \"%s\"\n", i,
buf, test_args[i].res);
errcnt++;
} else {
if (verbose)
printf("successful result on index %lu, returned %d, got: \"%s\"; num = %" PRId64 ", scale = %s, flags= %s.\n",
i, r, buf, test_args[i].num, scale_str,
flag_str);
else
printf("ok %lu\n", i);
}
tested++;
}
if (verbose)
printf("total errors: %lu/%lu tests, %lu skipped\n", errcnt,
tested, skipped);
if (errcnt)
return 1;
return 0;
}

View File

@ -0,0 +1,10 @@
#!/bin/sh
# $FreeBSD$
cd `dirname $0`
executable=`basename $0 .t`
make $executable 2>&1 > /dev/null
exec ./$executable && echo humanize_numbers ok

View File

@ -1655,10 +1655,15 @@ ktrstat(struct stat *statp)
* buffer exactly sizeof(struct stat) bytes long.
*/
printf("struct stat {");
strmode(statp->st_mode, mode);
printf("dev=%ju, ino=%ju, mode=%s, nlink=%ju, ",
(uintmax_t)statp->st_dev, (uintmax_t)statp->st_ino, mode,
(uintmax_t)statp->st_nlink);
printf("dev=%ju, ino=%ju, ",
(uintmax_t)statp->st_dev, (uintmax_t)statp->st_ino);
if (resolv == 0)
printf("mode=0%jo, ", (uintmax_t)statp->st_mode);
else {
strmode(statp->st_mode, mode);
printf("mode=%s, ", mode);
}
printf("nlink=%ju, ", (uintmax_t)statp->st_nlink);
if (resolv == 0 || (pwd = getpwuid(statp->st_uid)) == NULL)
printf("uid=%ju, ", (uintmax_t)statp->st_uid);
else