Merge tag 'freebsd-head-20140717'

FreeBSD HEAD as merged 2014-07-17

This includes a complete reimplementation of magic_load_buffers() in
libmagic as the infrastructure it used was rewritten upstream.
This commit is contained in:
Brooks Davis 2014-07-17 23:20:44 +00:00
commit cb1afb58c2
3246 changed files with 104976 additions and 128290 deletions

View file

@ -102,13 +102,12 @@ linux emul emulation Please discuss changes here.
bs{diff,patch} cperciva Pre-commit review requested.
portsnap cperciva Pre-commit review requested.
freebsd-update cperciva Pre-commit review requested.
openssl benl Pre-commit review requested.
openssl benl,jkim Pre-commit review requested.
sys/netgraph/bluetooth emax Pre-commit review preferred.
lib/libbluetooth emax Pre-commit review preferred.
lib/libsdp emax Pre-commit review preferred.
usr.bin/bluetooth emax Pre-commit review preferred.
usr.sbin/bluetooth emax Pre-commit review preferred.
gnu/usr.bin/send-pr bugmaster Pre-commit review requested.
*env(3) secteam Due to the problematic security history of this
code, please have patches reviewed by secteam.
share/zoneinfo edwin Heads-up appreciated, since our data is coming

View file

@ -36,6 +36,7 @@
# specified with XDEV and XDEV_ARCH.
# xdev-build - Build cross-development tools.
# xdev-install - Install cross-development tools.
# xdev-links - Create traditional links in /usr/bin for cc, etc
#
# "quick" way to test all kernel builds:
# _jflag=`sysctl -n hw.ncpu`
@ -82,7 +83,7 @@
#
# See src/UPDATING `COMMON ITEMS' for more complete information.
#
# If TARGET=machine (e.g. ia64, sparc64, ...) is specified you can
# If TARGET=machine (e.g. powerpc, sparc64, ...) is specified you can
# cross build world for other machine types using the buildworld target,
# and once the world is built you can cross build a kernel using the
# buildkernel target.
@ -110,6 +111,7 @@ TGTS= all all-man buildenv buildenvvars buildkernel buildworld \
_worldtmp _legacy _bootstrap-tools _cleanobj _obj \
_build-tools _cross-tools _includes _libraries _depend \
build32 builddtb distribute32 install32 xdev xdev-build xdev-install \
xdev-links \
TGTS+= ${SUBDIR_TARGETS}
@ -338,6 +340,7 @@ MMAKEENV= MAKEOBJDIRPREFIX=${MYMAKE:H} \
MMAKE= ${MMAKEENV} ${MAKE} \
-DNO_MAN -DNO_SHARED \
-DNO_CPU_CFLAGS -DNO_WERROR \
MK_TESTS=no \
DESTDIR= PROGNAME=${MYMAKE:T}
bmake: .PHONY
@ -370,7 +373,7 @@ kernel-toolchains:
# existing system is.
#
.if make(universe) || make(universe_kernels) || make(tinderbox) || make(targets)
TARGETS?=amd64 arm i386 ia64 mips pc98 powerpc sparc64
TARGETS?=amd64 arm i386 mips pc98 powerpc sparc64
TARGET_ARCHES_arm?= arm armeb armv6 armv6hf
TARGET_ARCHES_mips?= mipsel mips mips64el mips64 mipsn32
TARGET_ARCHES_powerpc?= powerpc powerpc64

View file

@ -17,6 +17,7 @@
# -DNO_DOCUPDATE do not update doc in ${MAKE} update
# -DWITHOUT_CTF do not run the DTrace CTF conversion tools on built objects
# LOCAL_DIRS="list of dirs" to add additional dirs to the SUBDIR list
# LOCAL_ITOOLS="list of tools" to add additional tools to the ITOOLS list
# LOCAL_LIB_DIRS="list of dirs" to add additional dirs to libraries target
# LOCAL_MTREE="list of mtree files" to process to allow local directories
# to be created before files are installed
@ -150,7 +151,7 @@ SRCRELDATE!= awk '/^\#define[[:space:]]*__FreeBSD_version/ { print $$3 }' \
VERSION= FreeBSD ${REVISION}-${BRANCH:C/-p[0-9]+$//} ${TARGET_ARCH} ${SRCRELDATE}
.endif
KNOWN_ARCHES?= amd64 arm armeb/arm armv6/arm armv6hf/arm i386 i386/pc98 ia64 mips mipsel/mips mips64el/mips mips64/mips mipsn32el/mips mipsn32/mips powerpc powerpc64/powerpc sparc64
KNOWN_ARCHES?= amd64 arm armeb/arm armv6/arm armv6hf/arm i386 i386/pc98 mips mipsel/mips mips64el/mips mips64/mips mipsn32el/mips mipsn32/mips powerpc powerpc64/powerpc sparc64
.if ${TARGET} == ${TARGET_ARCH}
_t= ${TARGET}
.else
@ -771,7 +772,8 @@ _zoneinfo= zic tzsetup
ITOOLS= [ awk cap_mkdb cat chflags chmod chown \
date echo egrep find grep id install ${_install-info} \
ln lockf make mkdir mtree mv pwd_mkdb \
rm sed services_mkdb sh sysctl test true uname wc ${_zoneinfo}
rm sed services_mkdb sh sysctl test true uname wc ${_zoneinfo} \
${LOCAL_ITOOLS}
#
# distributeworld
@ -791,6 +793,14 @@ EXTRA_DISTRIBUTIONS+= games
.if defined(LIB32TMP) && ${MK_LIB32} != "no"
EXTRA_DISTRIBUTIONS+= lib32
.endif
.if ${MK_TESTS} != "no"
EXTRA_DISTRIBUTIONS+= tests
.endif
DEBUG_DISTRIBUTIONS=
.if ${MK_DEBUG_FILES} != "no"
DEBUG_DISTRIBUTIONS+= base ${EXTRA_DISTRIBUTIONS:S,doc,,}
.endif
MTREE_MAGIC?= mtree 2.0
@ -832,6 +842,10 @@ distributeworld installworld: _installcheck_world
mtree -deU -f ${.CURDIR}/etc/mtree/BSD.debug.dist \
-p ${DESTDIR}/${DISTDIR}/${dist}/usr/lib >/dev/null
.endif
.if ${MK_TESTS} != "no" && ${dist} == "tests"
mtree -deU -f ${.CURDIR}/etc/mtree/BSD.tests.dist \
-p ${DESTDIR}/${DISTDIR}/${dist}/usr >/dev/null
.endif
.if defined(NO_ROOT)
${IMAKEENV} mtree -C -f ${.CURDIR}/etc/mtree/BSD.root.dist | \
sed -e 's#^\./#./${dist}/#' >> ${METALOG}
@ -864,8 +878,7 @@ distributeworld installworld: _installcheck_world
awk 'BEGIN { print "#${MTREE_MAGIC}" } !/ type=/ { file = $$1 } / type=/ { if ($$1 == file) { sub(/^\.\/${dist}\//, "./"); print } }' > \
${DESTDIR}/${DISTDIR}/${dist}.meta
.endfor
.if ${MK_DEBUG_FILES} != "no"
. for dist in base ${EXTRA_DISTRIBUTIONS}
.for dist in ${DEBUG_DISTRIBUTIONS}
@# For each file that exists in this dist, print the corresponding
@# line from the METALOG. This relies on the fact that
@# a line containing only the filename will sort immediatly before
@ -874,8 +887,7 @@ distributeworld installworld: _installcheck_world
find ./${dist}/usr/lib/debug | sort -u ${METALOG} - | \
awk 'BEGIN { print "#${MTREE_MAGIC}" } !/ type=/ { file = $$1 } / type=/ { if ($$1 == file) { sub(/^\.\/${dist}\//, "./"); print } }' > \
${DESTDIR}/${DISTDIR}/${dist}.debug.meta
. endfor
.endif
.endfor
.endif
.endif
@ -893,19 +905,17 @@ packageworld:
.endif
.endfor
.if ${MK_DEBUG_FILES} != "no"
. for dist in base ${EXTRA_DISTRIBUTIONS}
. if defined(NO_ROOT)
.for dist in ${DEBUG_DISTRIBUTIONS}
. if defined(NO_ROOT)
${_+_}cd ${DESTDIR}/${DISTDIR}/${dist}; \
tar cvJf ${DESTDIR}/${DISTDIR}/${dist}.debug.txz \
tar cvJf ${DESTDIR}/${DISTDIR}/${dist}-dbg.txz \
@${DESTDIR}/${DISTDIR}/${dist}.debug.meta
. else
. else
${_+_}cd ${DESTDIR}/${DISTDIR}/${dist}; \
tar cvJfL ${DESTDIR}/${DISTDIR}/${dist}.debug.txz \
tar cvJfL ${DESTDIR}/${DISTDIR}/${dist}-dbg.txz \
usr/lib/debug
. endif
. endfor
.endif
. endif
.endfor
#
# reinstall
@ -1204,6 +1214,10 @@ _gperf= gnu/usr.bin/gperf
_groff= gnu/usr.bin/groff
.endif
.if ${MK_VT} != "no"
_vtfontcvt= usr.bin/vtfontcvt
.endif
.if ${BOOTSTRAPPING} < 900002
_sed= usr.bin/sed
.endif
@ -1303,7 +1317,8 @@ bootstrap-tools: .MAKE
${_gensnmptree} \
usr.sbin/config \
${_crunch} \
${_nmtree}
${_nmtree} \
${_vtfontcvt}
${_+_}@${ECHODIR} "===> ${_tool} (obj,depend,all,install)"; \
cd ${.CURDIR}/${_tool} && \
${MAKE} DIRPRFX=${_tool}/ obj && \
@ -1494,7 +1509,7 @@ _prebuild_libs= ${_kerberos5_lib_libasn1} \
lib/libutil lib/libpjdlog ${_lib_libypclnt} lib/libz lib/msun \
${_secure_lib_libcrypto} ${_lib_libldns} \
${_secure_lib_libssh} ${_secure_lib_libssl}
.if ${MK_GNUCXX} != "no" && ${MK_CXX} != "no"
.if ${MK_GNUCXX} != "no"
_prebuild_libs+= gnu/lib/libstdc++ gnu/lib/libsupc++
gnu/lib/libstdc++__L: lib/msun__L
.endif
@ -1893,7 +1908,7 @@ XDDESTDIR=${DESTDIR}/${XDTP}
OSREL!= uname -r | sed -e 's/[-(].*//'
.endif
.ORDER: xdev-build xdev-install
.ORDER: xdev-build xdev-install xdev-links
xdev: xdev-build xdev-install
.ORDER: _xb-worldtmp _xb-bootstrap-tools _xb-build-tools _xb-cross-tools
@ -1943,8 +1958,8 @@ _xi-mtree:
mtree -deU -f ${.CURDIR}/etc/mtree/BSD.include.dist \
-p ${XDDESTDIR}/usr/include >/dev/null
.ORDER: xdev-build _xi-mtree _xi-cross-tools _xi-includes _xi-libraries _xi-links
xdev-install: xdev-build _xi-mtree _xi-cross-tools _xi-includes _xi-libraries _xi-links
.ORDER: xdev-build _xi-mtree _xi-cross-tools _xi-includes _xi-libraries
xdev-install: xdev-build _xi-mtree _xi-cross-tools _xi-includes _xi-libraries
_xi-cross-tools:
@echo "_xi-cross-tools"
@ -1967,9 +1982,9 @@ _xi-libraries:
${_+_}cd ${.CURDIR}; ${CD2MAKE} -f Makefile.inc1 libraries \
DESTDIR=${XDDESTDIR}
_xi-links:
xdev-links:
${_+_}cd ${XDDESTDIR}/usr/bin; \
mkdir -p ../../../../usr/bin; \
mkdir -p ../../../../usr/bin; \
for i in *; do \
ln -sf ../../${XDTP}/usr/bin/$$i \
../../../../usr/bin/${XDDIR}-$$i; \
@ -1977,6 +1992,6 @@ _xi-links:
../../../../usr/bin/${XDDIR}${OSREL}-$$i; \
done
.else
xdev xdev-build xdev-install:
xdev xdev-build xdev-install xdev-links:
@echo "*** Error: Both XDEV and XDEV_ARCH must be defined for \"${.TARGET}\" target"
.endif

View file

@ -38,6 +38,44 @@
# xargs -n1 | sort | uniq -d;
# done
# 20140716: Remove an incorrectly named man page
OLD_FILES+=usr/share/man/man9/pmap_ts_modified.9.gz
# 20140712: Removal of bsd.dtrace.mk
OLD_FILES+=usr/share/mk/bsd.dtrace.mk
# 20140705: turn libreadline into an internal lib
OLD_LIBS+=lib/libreadline.so.8
OLD_FILES+=usr/lib/libreadline.a
OLD_FILES+=usr/lib/libreadline_p.a
OLD_FILES+=usr/lib/libreadline.so
OLD_FILES+=usr/lib/libhistory.a
OLD_FILES+=usr/lib/libhistory_p.a
OLD_FILES+=usr/lib/libhistory.so
OLD_LIBS+=usr/lib/libhistory.so.8
OLD_FILES+=usr/include/readline/chardefs.h
OLD_FILES+=usr/include/readline/history.h
OLD_FILES+=usr/include/readline/keymaps.h
OLD_FILES+=usr/include/readline/readline.h
OLD_FILES+=usr/include/readline/rlconf.h
OLD_FILES+=usr/include/readline/rlstdc.h
OLD_FILES+=usr/include/readline/rltypedefs.h
OLD_FILES+=usr/include/readline/rltypedefs.h
OLD_FILES+=usr/share/info/readline.info.gz
OLD_FILES+=usr/share/man/man3/readline.3.gz
# 20140625: csup removal
OLD_FILES+=usr/bin/csup
OLD_FILES+=usr/bin/cpasswd
OLD_FILES+=usr/share/man/man1/csup.1.gz
OLD_FILES+=usr/share/man/man1/cpasswd.1.gz
OLD_FILES+=usr/share/examples/cvsup/README
OLD_FILES+=usr/share/examples/cvsup/cvs-supfile
OLD_FILES+=usr/share/examples/cvsup/stable-supfile
OLD_FILES+=usr/share/examples/cvsup/standard-supfile
OLD_DIRS+=usr/share/examples/cvsup
# 20140614: send-pr removal
OLD_FILES+=usr/share/info/send-pr.info.gz
OLD_FILES+=usr/share/man/man1/send-pr.1.gz
OLD_FILES+=etc/gnats/freefall
OLD_DIRS+=etc/gnats
# 20140512: new clang import which bumps version from 3.4 to 3.4.1.
OLD_FILES+=usr/include/clang/3.4/__wmmintrin_aes.h
OLD_FILES+=usr/include/clang/3.4/__wmmintrin_pclmul.h
@ -544,6 +582,7 @@ OLD_FILES+=usr/share/man/man9/vfs_mount.9.gz
OLD_FILES+=usr/bin/cvs
OLD_FILES+=usr/bin/cvsbug
OLD_FILES+=usr/share/doc/psd/28.cvs/paper.ascii.gz
OLD_FILES+=usr/share/doc/psd/28.cvs/paper.ps.gz
OLD_DIRS+=usr/share/doc/psd/28.cvs
OLD_FILES+=usr/share/examples/cvs/contrib/README
OLD_FILES+=usr/share/examples/cvs/contrib/clmerge
@ -1164,9 +1203,6 @@ OLD_FILES+=usr/include/xmmintrin.h
.if ${TARGET_ARCH} == "amd64" || ${TARGET_ARCH} == "i386" || ${TARGET_ARCH} == "arm"
OLD_FILES+=usr/include/mmintrin.h
.endif
.if ${TARGET_ARCH} == "ia64"
OLD_FILES+=usr/include/ia64intrin.h
.endif
.if ${TARGET_ARCH} == "powerpc"
OLD_FILES+=usr/include/altivec.h
OLD_FILES+=usr/include/ppc-asm.h
@ -1184,10 +1220,6 @@ OLD_FILES+=usr/include/machine/rm7000.h
OLD_FILES+=usr/include/machine/defs.h
OLD_FILES+=usr/include/machine/queue.h
.endif
# 20100326: [ia64] removed <machine/nexusvar.h>
.if ${TARGET_ARCH} == "ia64"
OLD_FILES+=usr/include/machine/nexusvar.h
.endif
# 20100326: gcpio removal
OLD_FILES+=usr/bin/gcpio
OLD_FILES+=usr/share/info/cpio.info.gz
@ -1201,11 +1233,6 @@ OLD_FILES+=usr/share/man/man3/regexp.3.gz
OLD_FILES+=usr/share/man/man3/regsub.3.gz
# 20100303: actual removal of utmp.h
OLD_FILES+=usr/include/utmp.h
# 20100227: [ia64] removed <machine/sapicreg.h> and <machine/sapicvar.h>
.if ${TARGET_ARCH} == "ia64"
OLD_FILES+=usr/include/machine/sapicreg.h
OLD_FILES+=usr/include/machine/sapicvar.h
.endif
# 20100208: man pages moved
.if ${TARGET_ARCH} == "i386"
OLD_FILES+=usr/share/man/man4/i386/alpm.4.gz
@ -1898,14 +1925,6 @@ OLD_FILES+=usr/share/man/man8/arlcontrol.8.gz
OLD_FILES+=sbin/sunlabel
OLD_FILES+=usr/share/man/man8/sunlabel.8.gz
.endif
# 20080703: bsdlabel & fdisk removed on ia64
.if ${TARGET_ARCH} == "ia64"
OLD_FILES+=sbin/bsdlabel
OLD_FILES+=usr/share/man/man8/bsdlabel.8.gz
OLD_FILES+=usr/share/man/man8/disklabel.8.gz
OLD_FILES+=sbin/fdisk
OLD_FILES+=usr/share/man/man8/fdisk.8.gz
.endif
# 20080701: wpa_supplicant.conf moved to share/examples/etc/
OLD_FILES+=usr/share/examples/wpa_supplicant/wpa_supplicant.conf
OLD_DIRS+=usr/share/examples/wpa_supplicant
@ -2114,12 +2133,6 @@ OLD_FILES+=usr/include/sys/_elf_solaris.h
OLD_FILES+=usr/share/man/man3/pmc_x86_get_msr.3.gz
# 20071108: Removed very crunch OLDCARD support file
OLD_FILES+=etc/defaults/pccard.conf
# 20071104: Removed bsdlabel, fdisk and gpt from rescue on ia64.
.if ${TARGET_ARCH} == "ia64"
OLD_FILES+=rescue/bsdlabel
OLD_FILES+=rescue/fdisk
OLD_FILES+=rescue/gpt
.endif
# 20071025: rc.d/nfslocking superceeded by rc.d/lockd and rc.d/statd
OLD_FILES+=etc/rc.d/nfslocking
# 20070930: rename of cached to nscd
@ -2780,10 +2793,6 @@ OLD_FILES+=usr/share/man/man8/mount_std.8.gz
OLD_FILES+=usr/share/man/man4/uhidev.4.gz
# 20061106: archive_write_prepare.3 removed
OLD_FILES+=usr/share/man/man3/archive_write_prepare.3.gz
.if ${TARGET_ARCH} == "ia64"
# 20061104: skiload.help removed
OLD_FILES+=boot/skiload.help
.endif
# 20061018: pccardc removed
OLD_FILES+=usr/sbin/pccardc usr/share/man/man8/pccardc.8.gz
# 20060930: demangle.h from contrib/libstdc++/include/ext/

View file

@ -31,6 +31,40 @@ NOTE TO PEOPLE WHO THINK THAT FreeBSD 11.x IS SLOW:
disable the most expensive debugging functionality run
"ln -s 'abort:false,junk:false' /etc/malloc.conf".)
20140709:
The GNU texinfo and GNU info pages are not built and installed
anymore, WITH_INFO knob has been added to allow to built and install
them again.
20140708:
The GNU readline library is now an INTERNALLIB - that is, it is
statically linked into consumers (GDB and variants) in the base
system, and the shared library is no longer installed. The
devel/readline port is available for third party software that
requires readline.
20140702:
The Itanium architecture (ia64) has been removed from the list of
known architectures. This is the first step in the removal of the
architecture.
20140701:
Commit r268115 has added NFSv4.1 server support, merged from
projects/nfsv4.1-server. Since this includes changes to the
internal interfaces between the NFS related modules, a full
build of the kernel and modules will be necessary.
__FreeBSD_version has been bumped.
20140629:
The WITHOUT_VT_SUPPORT kernel config knob has been renamed
WITHOUT_VT. (The other _SUPPORT knobs have a consistent meaning
which differs from the behaviour controlled by this knob.)
20140619:
Maximal length of the serial number in CTL was increased from 16 to
64 chars, that breaks ABI. All CTL-related tools, such as ctladm
and ctld, need to be rebuilt to work with a new kernel.
20140606:
The libatf-c and libatf-c++ major versions were downgraded to 0 and
1 respectively to match the upstream numbers. They were out of
@ -71,7 +105,8 @@ NOTE TO PEOPLE WHO THINK THAT FreeBSD 11.x IS SLOW:
Although this has survived make universe and some upgrade scenarios,
other upgrade scenarios may have broken. At least one form of
temporary breakage was fixed with MAKESYSPATH settings for buildworld
as well...
as well... In cases where MAKESYSPATH isn't working with this
setting, you'll need to set it to the full path to your tree.
One side effect of all this cleaning up is that bsd.compiler.mk
is no longer implicitly included by bsd.own.mk. If you wish to

View file

@ -151,7 +151,6 @@ This command will query the status of the specified media unit, and
will move it to the element specified in its source attribute.
This is a convenient way to return media from a drive or portal
to its previous element in the changer.
.Pp
.It Ic position Xo
.Ar <to ET> <to EU>
.Op Cm inv
@ -173,7 +172,6 @@ Report which picker unit the changer is currently configured to use.
.Xc
Configure the changer to use picker
.Ar <unit> .
.Pp
.It Ic ielem Xo
.Op Ar <timeout>
.Xc
@ -292,13 +290,11 @@ Configure the changer to use picker 2 (third picker) for operations.
The
.Nm
program and SCSI changer driver were written by
.An Jason R. Thorpe Aq thorpej@and.com
.An Jason R. Thorpe Aq Mt thorpej@and.com
for And Communications,
.Pa http://www.and.com/ .
.Pp
Additional work by
.An Hans Huebner
.Aq hans@artcom.de
.An Hans Huebner Aq Mt hans@artcom.de
and
.An Steve Gunn
.Aq csg@waterspout.com .
.An Steve Gunn Aq Mt csg@waterspout.com .

View file

@ -121,4 +121,4 @@ command appeared in
The
.Nm
utility and this manual page were written by
.An Dag-Erling Sm\(/orgrav Aq des@FreeBSD.org .
.An Dag-Erling Sm\(/orgrav Aq Mt des@FreeBSD.org .

View file

@ -278,6 +278,7 @@ fastcopy(const char *from, const char *to, struct stat *sbp)
static char *bp = NULL;
mode_t oldmode;
int nread, from_fd, to_fd;
struct stat tsb;
if ((from_fd = open(from, O_RDONLY, 0)) < 0) {
warn("fastcopy: open() failed (from): %s", from);
@ -336,10 +337,18 @@ err: if (unlink(to))
* if the server supports flags and we were trying to *remove* flags
* on a file that we copied, i.e., that we didn't create.)
*/
errno = 0;
if (fchflags(to_fd, sbp->st_flags))
if (errno != EOPNOTSUPP || sbp->st_flags != 0)
warn("%s: set flags (was: 0%07o)", to, sbp->st_flags);
if (fstat(to_fd, &tsb) == 0) {
if ((sbp->st_flags & ~UF_ARCHIVE) !=
(tsb.st_flags & ~UF_ARCHIVE)) {
if (fchflags(to_fd,
sbp->st_flags | (tsb.st_flags & UF_ARCHIVE)))
if (errno != EOPNOTSUPP ||
((sbp->st_flags & ~UF_ARCHIVE) != 0))
warn("%s: set flags (was: 0%07o)",
to, sbp->st_flags);
}
} else
warn("%s: cannot stat", to);
tval[0].tv_sec = sbp->st_atime;
tval[1].tv_sec = sbp->st_mtime;

View file

@ -291,5 +291,4 @@ Solaris 7.
They made their first appearance in
.Fx 5.3 .
.Sh AUTHORS
.An Andrew Doran
.Aq ad@NetBSD.org
.An Andrew Doran Aq Mt ad@NetBSD.org

View file

@ -121,7 +121,6 @@ each directory's contents are processed (as well as before the attempt
is made to remove the directory).
If the user does not respond affirmatively, the file hierarchy rooted in
that directory is skipped.
.Pp
.It Fl r
Equivalent to
.Fl R .

View file

@ -335,7 +335,7 @@ rm_tree(char **argv)
warn("%s", p->fts_path);
eval = 1;
}
if (errno)
if (!fflag && errno)
err(1, "fts_read");
fts_close(fts);
}

View file

@ -485,6 +485,6 @@ NFSv4 ACL support was introduced in
The
.Nm
utility was written by
.An Chris D. Faulhaber Aq jedgar@fxp.org .
.An Chris D. Faulhaber Aq Mt jedgar@fxp.org .
NFSv4 ACL support was implemented by
.An Edward Tomasz Napierala Aq trasz@FreeBSD.org .
.An Edward Tomasz Napierala Aq Mt trasz@FreeBSD.org .

View file

@ -846,9 +846,11 @@ varisset(const char *name, int nulok)
}
} else if (is_digit(*name)) {
char *ap;
int num = atoi(name);
long num;
if (num > shellparam.nparam)
errno = 0;
num = strtol(name, NULL, 10);
if (errno != 0 || num > shellparam.nparam)
return 0;
if (num == 0)
@ -928,17 +930,16 @@ varvalue(const char *name, int quoted, int subtype, int flag)
STPUTC(sep, expdest);
}
break;
case '0':
p = arg0;
strtodest(p, flag, subtype, quoted);
break;
default:
if (is_digit(*name)) {
num = atoi(name);
if (num > 0 && num <= shellparam.nparam) {
if (num == 0)
p = arg0;
else if (num > 0 && num <= shellparam.nparam)
p = shellparam.p[num - 1];
strtodest(p, flag, subtype, quoted);
}
else
break;
strtodest(p, flag, subtype, quoted);
}
break;
}

View file

@ -414,7 +414,6 @@ static const struct limits limits[] = {
int
ulimitcmd(int argc __unused, char **argv __unused)
{
int c;
rlim_t val = 0;
enum { SOFT = 0x1, HARD = 0x2 }
how = SOFT | HARD;
@ -453,17 +452,22 @@ ulimitcmd(int argc __unused, char **argv __unused)
if (strcmp(p, "unlimited") == 0)
val = RLIM_INFINITY;
else {
val = 0;
char *end;
uintmax_t uval;
while ((c = *p++) >= '0' && c <= '9')
{
val = (val * 10) + (long)(c - '0');
if (val < 0)
break;
}
if (c)
if (*p < '0' || *p > '9')
error("bad number");
errno = 0;
uval = strtoumax(p, &end, 10);
if (errno != 0 || *end != '\0')
error("bad number");
if (uval > UINTMAX_MAX / l->factor)
error("bad number");
uval *= l->factor;
val = (rlim_t)uval;
if (val < 0 || (uintmax_t)val != uval ||
val == RLIM_INFINITY)
error("bad number");
val *= l->factor;
}
}
if (all) {

View file

@ -99,7 +99,9 @@ FILES+= local1.0
FILES+= local2.0
FILES+= local3.0
FILES+= local4.0
.if ${MK_NLS} != "no"
FILES+= locale1.0
.endif
FILES+= printf1.0
FILES+= printf2.0
FILES+= printf3.0

View file

@ -13,6 +13,9 @@ FILES+= optind1.0
FILES+= optind2.0
FILES+= positional1.0
FILES+= positional2.0
FILES+= positional3.0
FILES+= positional4.0
FILES+= positional5.0
FILES+= pwd1.0
FILES+= pwd2.0

View file

@ -0,0 +1,4 @@
# $FreeBSD$
r=$(${SH} -c 'echo ${01:+yes}${010:+yes}' '' a '' '' '' '' '' '' '' '' b)
[ "$r" = yesyes ]

View file

@ -0,0 +1,4 @@
# $FreeBSD$
set -- "x$0" 2 3 4 5 6 7 8 9 "y$0"
[ "${01}.${010}" = "$1.${10}" ]

View file

@ -0,0 +1,14 @@
# $FreeBSD$
i=1
r=0
while [ $i -lt $((0x100000000)) ]; do
t=
eval t=\${$i-x}
case $t in
x) ;;
*) echo "Problem with \${$i}" >&2; r=1 ;;
esac
i=$((i + 0x10000000))
done
exit $r

View file

@ -25,6 +25,7 @@
*/
/*
* Copyright (c) 2012 by Delphix. All rights reserved.
* Copyright (c) 2013, Joyent, Inc. All rights reserved.
*/
#include <sys/types.h>
@ -513,6 +514,7 @@ static void
print_probe_info(const dtrace_probeinfo_t *p)
{
char buf[BUFSIZ];
char *user;
int i;
oprintf("\n\tProbe Description Attributes\n");
@ -536,10 +538,14 @@ print_probe_info(const dtrace_probeinfo_t *p)
oprintf("\n\tArgument Types\n");
for (i = 0; i < p->dtp_argc; i++) {
if (p->dtp_argv[i].dtt_flags & DTT_FL_USER)
user = "userland ";
else
user = "";
if (ctf_type_name(p->dtp_argv[i].dtt_ctfp,
p->dtp_argv[i].dtt_type, buf, sizeof (buf)) == NULL)
(void) strlcpy(buf, "(unknown)", sizeof (buf));
oprintf("\t\targs[%d]: %s\n", i, buf);
oprintf("\t\targs[%d]: %s%s\n", i, user, buf);
}
if (p->dtp_argc == 0)

View file

@ -0,0 +1,32 @@
/*
* This file and its contents are supplied under the terms of the
* Common Development and Distribution License ("CDDL"), version 1.0.
* You may only use this file in accordance with the terms of version
* 1.0 of the CDDL.
*
* A full copy of the text of the CDDL should have accompanied this
* source. A copy of the CDDL is also available via the Internet at
* http://www.illumos.org/license/CDDL.
*/
/*
* Copyright (c) 2013 Joyent, Inc. All rights reserved.
*/
#pragma D option quiet
#pragma D option encoding=utf8
#pragma D option aggzoom
tick-1ms
/i++ < 320/
{
@ = lquantize(i, 0, 640, 1, i);
@ = lquantize(641 - i, 0, 640, 1, i);
}
tick-1ms
/i == 320/
{
printa(@);
exit(0);
}

View file

@ -0,0 +1,646 @@
value ------------- Distribution ------------- count
0 | 0
1 | 1
2 |▏ 2
3 |▎ 3
4 |▍ 4
5 |▌ 5
6 |▋ 6
7 |▊ 7
8 |▉ 8
9 |█ 9
10 |█▏ 10
11 |█▎ 11
12 |█▍ 12
13 |█▌ 13
14 |█▋ 14
15 |█▊ 15
16 |█▉ 16
17 |██ 17
18 |██▏ 18
19 |██▎ 19
20 |██▍ 20
21 |██▍ 21
22 |██▌ 22
23 |██▋ 23
24 |██▊ 24
25 |██▉ 25
26 |███ 26
27 |███▏ 27
28 |███▎ 28
29 |███▍ 29
30 |███▌ 30
31 |███▋ 31
32 |███▊ 32
33 |███▉ 33
34 |████ 34
35 |████▏ 35
36 |████▎ 36
37 |████▍ 37
38 |████▌ 38
39 |████▋ 39
40 |████▊ 40
41 |████▊ 41
42 |████▉ 42
43 |█████ 43
44 |█████▏ 44
45 |█████▎ 45
46 |█████▍ 46
47 |█████▌ 47
48 |█████▋ 48
49 |█████▊ 49
50 |█████▉ 50
51 |██████ 51
52 |██████▏ 52
53 |██████▎ 53
54 |██████▍ 54
55 |██████▌ 55
56 |██████▋ 56
57 |██████▊ 57
58 |██████▉ 58
59 |███████ 59
60 |███████▏ 60
61 |███████▏ 61
62 |███████▎ 62
63 |███████▍ 63
64 |███████▌ 64
65 |███████▋ 65
66 |███████▊ 66
67 |███████▉ 67
68 |████████ 68
69 |████████▏ 69
70 |████████▎ 70
71 |████████▍ 71
72 |████████▌ 72
73 |████████▋ 73
74 |████████▊ 74
75 |████████▉ 75
76 |█████████ 76
77 |█████████▏ 77
78 |█████████▎ 78
79 |█████████▍ 79
80 |█████████▌ 80
81 |█████████▌ 81
82 |█████████▋ 82
83 |█████████▊ 83
84 |█████████▉ 84
85 |██████████ 85
86 |██████████▏ 86
87 |██████████▎ 87
88 |██████████▍ 88
89 |██████████▌ 89
90 |██████████▋ 90
91 |██████████▊ 91
92 |██████████▉ 92
93 |███████████ 93
94 |███████████▏ 94
95 |███████████▎ 95
96 |███████████▍ 96
97 |███████████▌ 97
98 |███████████▋ 98
99 |███████████▊ 99
100 |███████████▉ 100
101 |███████████▉ 101
102 |████████████ 102
103 |████████████▏ 103
104 |████████████▎ 104
105 |████████████▍ 105
106 |████████████▌ 106
107 |████████████▋ 107
108 |████████████▊ 108
109 |████████████▉ 109
110 |█████████████ 110
111 |█████████████▏ 111
112 |█████████████▎ 112
113 |█████████████▍ 113
114 |█████████████▌ 114
115 |█████████████▋ 115
116 |█████████████▊ 116
117 |█████████████▉ 117
118 |██████████████ 118
119 |██████████████▏ 119
120 |██████████████▎ 120
121 |██████████████▎ 121
122 |██████████████▍ 122
123 |██████████████▌ 123
124 |██████████████▋ 124
125 |██████████████▊ 125
126 |██████████████▉ 126
127 |███████████████ 127
128 |███████████████▏ 128
129 |███████████████▎ 129
130 |███████████████▍ 130
131 |███████████████▌ 131
132 |███████████████▋ 132
133 |███████████████▊ 133
134 |███████████████▉ 134
135 |████████████████ 135
136 |████████████████▏ 136
137 |████████████████▎ 137
138 |████████████████▍ 138
139 |████████████████▌ 139
140 |████████████████▋ 140
141 |████████████████▋ 141
142 |████████████████▊ 142
143 |████████████████▉ 143
144 |█████████████████ 144
145 |█████████████████▏ 145
146 |█████████████████▎ 146
147 |█████████████████▍ 147
148 |█████████████████▌ 148
149 |█████████████████▋ 149
150 |█████████████████▊ 150
151 |█████████████████▉ 151
152 |██████████████████ 152
153 |██████████████████▏ 153
154 |██████████████████▎ 154
155 |██████████████████▍ 155
156 |██████████████████▌ 156
157 |██████████████████▋ 157
158 |██████████████████▊ 158
159 |██████████████████▉ 159
160 |███████████████████ 160
161 |███████████████████ 161
162 |███████████████████▏ 162
163 |███████████████████▎ 163
164 |███████████████████▍ 164
165 |███████████████████▌ 165
166 |███████████████████▋ 166
167 |███████████████████▊ 167
168 |███████████████████▉ 168
169 |████████████████████ 169
170 |████████████████████▏ 170
171 |████████████████████▎ 171
172 |████████████████████▍ 172
173 |████████████████████▌ 173
174 |████████████████████▋ 174
175 |████████████████████▊ 175
176 |████████████████████▉ 176
177 |█████████████████████ 177
178 |█████████████████████▏ 178
179 |█████████████████████▎ 179
180 |█████████████████████▍ 180
181 |█████████████████████▍ 181
182 |█████████████████████▌ 182
183 |█████████████████████▋ 183
184 |█████████████████████▊ 184
185 |█████████████████████▉ 185
186 |██████████████████████ 186
187 |██████████████████████▏ 187
188 |██████████████████████▎ 188
189 |██████████████████████▍ 189
190 |██████████████████████▌ 190
191 |██████████████████████▋ 191
192 |██████████████████████▊ 192
193 |██████████████████████▉ 193
194 |███████████████████████ 194
195 |███████████████████████▏ 195
196 |███████████████████████▎ 196
197 |███████████████████████▍ 197
198 |███████████████████████▌ 198
199 |███████████████████████▋ 199
200 |███████████████████████▊ 200
201 |███████████████████████▊ 201
202 |███████████████████████▉ 202
203 |████████████████████████ 203
204 |████████████████████████▏ 204
205 |████████████████████████▎ 205
206 |████████████████████████▍ 206
207 |████████████████████████▌ 207
208 |████████████████████████▋ 208
209 |████████████████████████▊ 209
210 |████████████████████████▉ 210
211 |█████████████████████████ 211
212 |█████████████████████████▏ 212
213 |█████████████████████████▎ 213
214 |█████████████████████████▍ 214
215 |█████████████████████████▌ 215
216 |█████████████████████████▋ 216
217 |█████████████████████████▊ 217
218 |█████████████████████████▉ 218
219 |██████████████████████████ 219
220 |██████████████████████████▏ 220
221 |██████████████████████████▏ 221
222 |██████████████████████████▎ 222
223 |██████████████████████████▍ 223
224 |██████████████████████████▌ 224
225 |██████████████████████████▋ 225
226 |██████████████████████████▊ 226
227 |██████████████████████████▉ 227
228 |███████████████████████████ 228
229 |███████████████████████████▏ 229
230 |███████████████████████████▎ 230
231 |███████████████████████████▍ 231
232 |███████████████████████████▌ 232
233 |███████████████████████████▋ 233
234 |███████████████████████████▊ 234
235 |███████████████████████████▉ 235
236 |████████████████████████████ 236
237 |████████████████████████████▏ 237
238 |████████████████████████████▎ 238
239 |████████████████████████████▍ 239
240 |████████████████████████████▌ 240
241 |████████████████████████████▌ 241
242 |████████████████████████████▋ 242
243 |████████████████████████████▊ 243
244 |████████████████████████████▉ 244
245 |█████████████████████████████ 245
246 |█████████████████████████████▏ 246
247 |█████████████████████████████▎ 247
248 |█████████████████████████████▍ 248
249 |█████████████████████████████▌ 249
250 |█████████████████████████████▋ 250
251 |█████████████████████████████▊ 251
252 |█████████████████████████████▉ 252
253 |██████████████████████████████ 253
254 |██████████████████████████████▏ 254
255 |██████████████████████████████▎ 255
256 |██████████████████████████████▍ 256
257 |██████████████████████████████▌ 257
258 |██████████████████████████████▋ 258
259 |██████████████████████████████▊ 259
260 |██████████████████████████████▉ 260
261 |██████████████████████████████▉ 261
262 |███████████████████████████████ 262
263 |███████████████████████████████▏ 263
264 |███████████████████████████████▎ 264
265 |███████████████████████████████▍ 265
266 |███████████████████████████████▌ 266
267 |███████████████████████████████▋ 267
268 |███████████████████████████████▊ 268
269 |███████████████████████████████▉ 269
270 |████████████████████████████████ 270
271 |████████████████████████████████▏ 271
272 |████████████████████████████████▎ 272
273 |████████████████████████████████▍ 273
274 |████████████████████████████████▌ 274
275 |████████████████████████████████▋ 275
276 |████████████████████████████████▊ 276
277 |████████████████████████████████▉ 277
278 |█████████████████████████████████ 278
279 |█████████████████████████████████▏ 279
280 |█████████████████████████████████▎ 280
281 |█████████████████████████████████▎ 281
282 |█████████████████████████████████▍ 282
283 |█████████████████████████████████▌ 283
284 |█████████████████████████████████▋ 284
285 |█████████████████████████████████▊ 285
286 |█████████████████████████████████▉ 286
287 |██████████████████████████████████ 287
288 |██████████████████████████████████▏ 288
289 |██████████████████████████████████▎ 289
290 |██████████████████████████████████▍ 290
291 |██████████████████████████████████▌ 291
292 |██████████████████████████████████▋ 292
293 |██████████████████████████████████▊ 293
294 |██████████████████████████████████▉ 294
295 |███████████████████████████████████ 295
296 |███████████████████████████████████▏ 296
297 |███████████████████████████████████▎ 297
298 |███████████████████████████████████▍ 298
299 |███████████████████████████████████▌ 299
300 |███████████████████████████████████▋ 300
301 |███████████████████████████████████▋ 301
302 |███████████████████████████████████▊ 302
303 |███████████████████████████████████▉ 303
304 |████████████████████████████████████ 304
305 |████████████████████████████████████▏ 305
306 |████████████████████████████████████▎ 306
307 |████████████████████████████████████▍ 307
308 |████████████████████████████████████▌ 308
309 |████████████████████████████████████▋ 309
310 |████████████████████████████████████▊ 310
311 |████████████████████████████████████▉ 311
312 |█████████████████████████████████████ 312
313 |█████████████████████████████████████▏ 313
314 |█████████████████████████████████████▎ 314
315 |█████████████████████████████████████▍ 315
316 |█████████████████████████████████████▌ 316
317 |█████████████████████████████████████▋ 317
318 |█████████████████████████████████████▊ 318
319 |█████████████████████████████████████▉ 319
320 |██████████████████████████████████████ 320
321 |██████████████████████████████████████ 320
322 |█████████████████████████████████████▉ 319
323 |█████████████████████████████████████▊ 318
324 |█████████████████████████████████████▋ 317
325 |█████████████████████████████████████▌ 316
326 |█████████████████████████████████████▍ 315
327 |█████████████████████████████████████▎ 314
328 |█████████████████████████████████████▏ 313
329 |█████████████████████████████████████ 312
330 |████████████████████████████████████▉ 311
331 |████████████████████████████████████▊ 310
332 |████████████████████████████████████▋ 309
333 |████████████████████████████████████▌ 308
334 |████████████████████████████████████▍ 307
335 |████████████████████████████████████▎ 306
336 |████████████████████████████████████▏ 305
337 |████████████████████████████████████ 304
338 |███████████████████████████████████▉ 303
339 |███████████████████████████████████▊ 302
340 |███████████████████████████████████▋ 301
341 |███████████████████████████████████▋ 300
342 |███████████████████████████████████▌ 299
343 |███████████████████████████████████▍ 298
344 |███████████████████████████████████▎ 297
345 |███████████████████████████████████▏ 296
346 |███████████████████████████████████ 295
347 |██████████████████████████████████▉ 294
348 |██████████████████████████████████▊ 293
349 |██████████████████████████████████▋ 292
350 |██████████████████████████████████▌ 291
351 |██████████████████████████████████▍ 290
352 |██████████████████████████████████▎ 289
353 |██████████████████████████████████▏ 288
354 |██████████████████████████████████ 287
355 |█████████████████████████████████▉ 286
356 |█████████████████████████████████▊ 285
357 |█████████████████████████████████▋ 284
358 |█████████████████████████████████▌ 283
359 |█████████████████████████████████▍ 282
360 |█████████████████████████████████▎ 281
361 |█████████████████████████████████▎ 280
362 |█████████████████████████████████▏ 279
363 |█████████████████████████████████ 278
364 |████████████████████████████████▉ 277
365 |████████████████████████████████▊ 276
366 |████████████████████████████████▋ 275
367 |████████████████████████████████▌ 274
368 |████████████████████████████████▍ 273
369 |████████████████████████████████▎ 272
370 |████████████████████████████████▏ 271
371 |████████████████████████████████ 270
372 |███████████████████████████████▉ 269
373 |███████████████████████████████▊ 268
374 |███████████████████████████████▋ 267
375 |███████████████████████████████▌ 266
376 |███████████████████████████████▍ 265
377 |███████████████████████████████▎ 264
378 |███████████████████████████████▏ 263
379 |███████████████████████████████ 262
380 |██████████████████████████████▉ 261
381 |██████████████████████████████▉ 260
382 |██████████████████████████████▊ 259
383 |██████████████████████████████▋ 258
384 |██████████████████████████████▌ 257
385 |██████████████████████████████▍ 256
386 |██████████████████████████████▎ 255
387 |██████████████████████████████▏ 254
388 |██████████████████████████████ 253
389 |█████████████████████████████▉ 252
390 |█████████████████████████████▊ 251
391 |█████████████████████████████▋ 250
392 |█████████████████████████████▌ 249
393 |█████████████████████████████▍ 248
394 |█████████████████████████████▎ 247
395 |█████████████████████████████▏ 246
396 |█████████████████████████████ 245
397 |████████████████████████████▉ 244
398 |████████████████████████████▊ 243
399 |████████████████████████████▋ 242
400 |████████████████████████████▌ 241
401 |████████████████████████████▌ 240
402 |████████████████████████████▍ 239
403 |████████████████████████████▎ 238
404 |████████████████████████████▏ 237
405 |████████████████████████████ 236
406 |███████████████████████████▉ 235
407 |███████████████████████████▊ 234
408 |███████████████████████████▋ 233
409 |███████████████████████████▌ 232
410 |███████████████████████████▍ 231
411 |███████████████████████████▎ 230
412 |███████████████████████████▏ 229
413 |███████████████████████████ 228
414 |██████████████████████████▉ 227
415 |██████████████████████████▊ 226
416 |██████████████████████████▋ 225
417 |██████████████████████████▌ 224
418 |██████████████████████████▍ 223
419 |██████████████████████████▎ 222
420 |██████████████████████████▏ 221
421 |██████████████████████████▏ 220
422 |██████████████████████████ 219
423 |█████████████████████████▉ 218
424 |█████████████████████████▊ 217
425 |█████████████████████████▋ 216
426 |█████████████████████████▌ 215
427 |█████████████████████████▍ 214
428 |█████████████████████████▎ 213
429 |█████████████████████████▏ 212
430 |█████████████████████████ 211
431 |████████████████████████▉ 210
432 |████████████████████████▊ 209
433 |████████████████████████▋ 208
434 |████████████████████████▌ 207
435 |████████████████████████▍ 206
436 |████████████████████████▎ 205
437 |████████████████████████▏ 204
438 |████████████████████████ 203
439 |███████████████████████▉ 202
440 |███████████████████████▊ 201
441 |███████████████████████▊ 200
442 |███████████████████████▋ 199
443 |███████████████████████▌ 198
444 |███████████████████████▍ 197
445 |███████████████████████▎ 196
446 |███████████████████████▏ 195
447 |███████████████████████ 194
448 |██████████████████████▉ 193
449 |██████████████████████▊ 192
450 |██████████████████████▋ 191
451 |██████████████████████▌ 190
452 |██████████████████████▍ 189
453 |██████████████████████▎ 188
454 |██████████████████████▏ 187
455 |██████████████████████ 186
456 |█████████████████████▉ 185
457 |█████████████████████▊ 184
458 |█████████████████████▋ 183
459 |█████████████████████▌ 182
460 |█████████████████████▍ 181
461 |█████████████████████▍ 180
462 |█████████████████████▎ 179
463 |█████████████████████▏ 178
464 |█████████████████████ 177
465 |████████████████████▉ 176
466 |████████████████████▊ 175
467 |████████████████████▋ 174
468 |████████████████████▌ 173
469 |████████████████████▍ 172
470 |████████████████████▎ 171
471 |████████████████████▏ 170
472 |████████████████████ 169
473 |███████████████████▉ 168
474 |███████████████████▊ 167
475 |███████████████████▋ 166
476 |███████████████████▌ 165
477 |███████████████████▍ 164
478 |███████████████████▎ 163
479 |███████████████████▏ 162
480 |███████████████████ 161
481 |███████████████████ 160
482 |██████████████████▉ 159
483 |██████████████████▊ 158
484 |██████████████████▋ 157
485 |██████████████████▌ 156
486 |██████████████████▍ 155
487 |██████████████████▎ 154
488 |██████████████████▏ 153
489 |██████████████████ 152
490 |█████████████████▉ 151
491 |█████████████████▊ 150
492 |█████████████████▋ 149
493 |█████████████████▌ 148
494 |█████████████████▍ 147
495 |█████████████████▎ 146
496 |█████████████████▏ 145
497 |█████████████████ 144
498 |████████████████▉ 143
499 |████████████████▊ 142
500 |████████████████▋ 141
501 |████████████████▋ 140
502 |████████████████▌ 139
503 |████████████████▍ 138
504 |████████████████▎ 137
505 |████████████████▏ 136
506 |████████████████ 135
507 |███████████████▉ 134
508 |███████████████▊ 133
509 |███████████████▋ 132
510 |███████████████▌ 131
511 |███████████████▍ 130
512 |███████████████▎ 129
513 |███████████████▏ 128
514 |███████████████ 127
515 |██████████████▉ 126
516 |██████████████▊ 125
517 |██████████████▋ 124
518 |██████████████▌ 123
519 |██████████████▍ 122
520 |██████████████▎ 121
521 |██████████████▎ 120
522 |██████████████▏ 119
523 |██████████████ 118
524 |█████████████▉ 117
525 |█████████████▊ 116
526 |█████████████▋ 115
527 |█████████████▌ 114
528 |█████████████▍ 113
529 |█████████████▎ 112
530 |█████████████▏ 111
531 |█████████████ 110
532 |████████████▉ 109
533 |████████████▊ 108
534 |████████████▋ 107
535 |████████████▌ 106
536 |████████████▍ 105
537 |████████████▎ 104
538 |████████████▏ 103
539 |████████████ 102
540 |███████████▉ 101
541 |███████████▉ 100
542 |███████████▊ 99
543 |███████████▋ 98
544 |███████████▌ 97
545 |███████████▍ 96
546 |███████████▎ 95
547 |███████████▏ 94
548 |███████████ 93
549 |██████████▉ 92
550 |██████████▊ 91
551 |██████████▋ 90
552 |██████████▌ 89
553 |██████████▍ 88
554 |██████████▎ 87
555 |██████████▏ 86
556 |██████████ 85
557 |█████████▉ 84
558 |█████████▊ 83
559 |█████████▋ 82
560 |█████████▌ 81
561 |█████████▌ 80
562 |█████████▍ 79
563 |█████████▎ 78
564 |█████████▏ 77
565 |█████████ 76
566 |████████▉ 75
567 |████████▊ 74
568 |████████▋ 73
569 |████████▌ 72
570 |████████▍ 71
571 |████████▎ 70
572 |████████▏ 69
573 |████████ 68
574 |███████▉ 67
575 |███████▊ 66
576 |███████▋ 65
577 |███████▌ 64
578 |███████▍ 63
579 |███████▎ 62
580 |███████▏ 61
581 |███████▏ 60
582 |███████ 59
583 |██████▉ 58
584 |██████▊ 57
585 |██████▋ 56
586 |██████▌ 55
587 |██████▍ 54
588 |██████▎ 53
589 |██████▏ 52
590 |██████ 51
591 |█████▉ 50
592 |█████▊ 49
593 |█████▋ 48
594 |█████▌ 47
595 |█████▍ 46
596 |█████▎ 45
597 |█████▏ 44
598 |█████ 43
599 |████▉ 42
600 |████▊ 41
601 |████▊ 40
602 |████▋ 39
603 |████▌ 38
604 |████▍ 37
605 |████▎ 36
606 |████▏ 35
607 |████ 34
608 |███▉ 33
609 |███▊ 32
610 |███▋ 31
611 |███▌ 30
612 |███▍ 29
613 |███▎ 28
614 |███▏ 27
615 |███ 26
616 |██▉ 25
617 |██▊ 24
618 |██▋ 23
619 |██▌ 22
620 |██▍ 21
621 |██▍ 20
622 |██▎ 19
623 |██▏ 18
624 |██ 17
625 |█▉ 16
626 |█▊ 15
627 |█▋ 14
628 |█▌ 13
629 |█▍ 12
630 |█▎ 11
631 |█▏ 10
632 |█ 9
633 |▉ 8
634 |▊ 7
635 |▋ 6
636 |▌ 5
637 |▍ 4
638 |▎ 3
639 |▏ 2
>= 640 | 1

View file

@ -0,0 +1,46 @@
/*
* This file and its contents are supplied under the terms of the
* Common Development and Distribution License ("CDDL"), version 1.0.
* You may only use this file in accordance with the terms of version
* 1.0 of the CDDL.
*
* A full copy of the text of the CDDL should have accompanied this
* source. A copy of the CDDL is also available via the Internet at
* http://www.illumos.org/license/CDDL.
*/
/*
* Copyright (c) 2013 Joyent, Inc. All rights reserved.
*/
#pragma D option agghist
#pragma D option quiet
BEGIN
{
@["demerit"] = sum(-10);
@["wtf"] = sum(10);
@["bot"] = sum(20);
@bagnoogle["SOAP/XML"] = sum(1);
@bagnoogle["XACML store"] = sum(5);
@bagnoogle["SAML token"] = sum(6);
@stalloogle["breakfast"] = sum(-5);
@stalloogle["non-diet pepsi"] = sum(-20);
@stalloogle["parrot"] = sum(-100);
printa(@);
printa(@bagnoogle);
printa(@stalloogle);
printf("\nzoomed:");
setopt("aggzoom");
printa(@);
printa(@bagnoogle);
printa(@stalloogle);
exit(0);
}

View file

@ -0,0 +1,38 @@
key ------------- Distribution ------------- count
demerit @@@@@| -10
wtf |@@@@@ 10
bot |@@@@@@@@@@ 20
key ------------- Distribution ------------- count
SOAP/XML |@@@ 1
XACML store |@@@@@@@@@@@@@@@@@ 5
SAML token |@@@@@@@@@@@@@@@@@@@@ 6
key ------------- Distribution ------------- count
parrot @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@| -100
non-diet pepsi @@@@@@| -20
breakfast @@| -5
zoomed:
key ------------- Distribution ------------- count
demerit @@@@@@@@@@| -10
wtf |@@@@@@@@@@ 10
bot |@@@@@@@@@@@@@@@@@@@ 20
key ------------- Distribution ------------- count
SOAP/XML |@@@@@@@ 1
XACML store |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 5
SAML token |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 6
key ------------- Distribution ------------- count
parrot @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@| -100
non-diet pepsi @@@@@@@@| -20
breakfast @@| -5

View file

@ -0,0 +1,53 @@
/*
* This file and its contents are supplied under the terms of the
* Common Development and Distribution License ("CDDL"), version 1.0.
* You may only use this file in accordance with the terms of version
* 1.0 of the CDDL.
*
* A full copy of the text of the CDDL should have accompanied this
* source. A copy of the CDDL is also available via the Internet at
* http://www.illumos.org/license/CDDL.
*/
/*
* Copyright (c) 2013 Joyent, Inc. All rights reserved.
*/
#pragma D option aggpack
#pragma D option encoding=ascii
#pragma D option quiet
BEGIN
{
@x = quantize(1 << 32);
@y[1] = quantize(1);
@z["mumble"] = quantize(1);
@xx["foo", (char)1, (short)2, (long)3] = quantize(1);
@neg = lquantize(-10, -10, 20, 1, -1);
@neg = lquantize(-5, -10, 20, 1, 1);
@neg = lquantize(0, -10, 20, 1, 1);
i = 0;
}
tick-1ms
{
@a[i] = quantize(0, i);
@a[i] = quantize(1, 100 - i);
i++;
}
tick-1ms
/i > 100/
{
exit(0);
}
END
{
setopt("aggzoom", "true");
printa(@neg);
setopt("aggzoom", "false");
printa(@neg);
}

View file

@ -0,0 +1,124 @@
min .--------------------------------. max | count
< -10 : V X X : >= 20 | 1
min .--------------------------------. max | count
< -10 : v x x : >= 20 | 1
min .---. max | count
2147483648 : X : 8589934592 | 1
key min .---. max | count
1 0 : X : 2 | 1
key min .---. max | count
mumble 0 : X : 2 | 1
key min .---. max | count
foo 1 2 3 0 : X : 2 | 1
key min .---. max | count
100 0 :X : 2 | 100
99 0 :X_ : 2 | 100
98 0 :X_ : 2 | 100
97 0 :X_ : 2 | 100
96 0 :X_ : 2 | 100
95 0 :X_ : 2 | 100
94 0 :X_ : 2 | 100
93 0 :X_ : 2 | 100
92 0 :X_ : 2 | 100
91 0 :X_ : 2 | 100
90 0 :X_ : 2 | 100
89 0 :X_ : 2 | 100
88 0 :X_ : 2 | 100
87 0 :X_ : 2 | 100
86 0 :X_ : 2 | 100
85 0 :X_ : 2 | 100
84 0 :X_ : 2 | 100
83 0 :X_ : 2 | 100
82 0 :X_ : 2 | 100
81 0 :X_ : 2 | 100
80 0 :X_ : 2 | 100
79 0 :X_ : 2 | 100
78 0 :xx : 2 | 100
77 0 :xx : 2 | 100
76 0 :xx : 2 | 100
75 0 :xx : 2 | 100
74 0 :xx : 2 | 100
73 0 :xx : 2 | 100
72 0 :xx : 2 | 100
71 0 :xx : 2 | 100
70 0 :xx : 2 | 100
69 0 :xx : 2 | 100
68 0 :xx : 2 | 100
67 0 :xx : 2 | 100
66 0 :xx : 2 | 100
65 0 :xx : 2 | 100
64 0 :xx : 2 | 100
63 0 :xx : 2 | 100
62 0 :xx : 2 | 100
61 0 :xx : 2 | 100
60 0 :xx : 2 | 100
59 0 :xx : 2 | 100
58 0 :xx : 2 | 100
57 0 :xx : 2 | 100
56 0 :xx : 2 | 100
55 0 :xx : 2 | 100
54 0 :xx : 2 | 100
53 0 :xx : 2 | 100
52 0 :xx : 2 | 100
51 0 :xx : 2 | 100
50 0 :xx : 2 | 100
49 0 :xx : 2 | 100
48 0 :xx : 2 | 100
47 0 :xx : 2 | 100
46 0 :xx : 2 | 100
45 0 :xx : 2 | 100
44 0 :xx : 2 | 100
43 0 :xx : 2 | 100
42 0 :xx : 2 | 100
41 0 :xx : 2 | 100
40 0 :xx : 2 | 100
39 0 :xx : 2 | 100
38 0 :xx : 2 | 100
37 0 :xx : 2 | 100
36 0 :xx : 2 | 100
35 0 :xx : 2 | 100
34 0 :xx : 2 | 100
33 0 :xx : 2 | 100
32 0 :xx : 2 | 100
31 0 :xx : 2 | 100
30 0 :xx : 2 | 100
29 0 :xx : 2 | 100
28 0 :xx : 2 | 100
27 0 :xx : 2 | 100
26 0 :xx : 2 | 100
25 0 :xx : 2 | 100
24 0 :xx : 2 | 100
23 0 :xx : 2 | 100
22 0 :xx : 2 | 100
21 0 :_X : 2 | 100
20 0 :_X : 2 | 100
19 0 :_X : 2 | 100
18 0 :_X : 2 | 100
17 0 :_X : 2 | 100
16 0 :_X : 2 | 100
15 0 :_X : 2 | 100
14 0 :_X : 2 | 100
13 0 :_X : 2 | 100
12 0 :_X : 2 | 100
11 0 :_X : 2 | 100
10 0 :_X : 2 | 100
9 0 :_X : 2 | 100
8 0 :_X : 2 | 100
7 0 :_X : 2 | 100
6 0 :_X : 2 | 100
5 0 :_X : 2 | 100
4 0 :_X : 2 | 100
3 0 :_X : 2 | 100
2 0 :_X : 2 | 100
1 0 :_X : 2 | 100
0 0 : X : 2 | 100

View file

@ -0,0 +1,75 @@
#
# This file and its contents are supplied under the terms of the
# Common Development and Distribution License ("CDDL"), version 1.0.
# You may only use this file in accordance with the terms of version
# 1.0 of the CDDL.
#
# A full copy of the text of the CDDL should have accompanied this
# source. A copy of the CDDL is also available via the Internet at
# http://www.illumos.org/license/CDDL.
#
#
# Copyright (c) 2013 Joyent, Inc. All rights reserved.
#
let width=8
function outputchar
{
banner $3 | /bin/nawk -v line=$1 -v pos=$2 -v width=$width '{ \
for (i = 1; i <= length($0); i++) { \
if (substr($0, i, 1) == " ") \
continue; \
printf("\t@letter%d[%d] = lquantize(%d, 0, 40, 1);\n", \
line, NR, i + (pos * width));
} \
}'
}
function outputstr
{
let pos=0;
let line=0
printf "#pragma D option aggpack\n#pragma D option aggsortkey\n"
printf "BEGIN\n{\n"
for c in `echo "$1" | /bin/nawk '{ \
for (i = 1; i <= length($0); i++) { \
c = substr($0, i, 1); \
printf("%s\n", c == " " ? "space" : \
c == "\n" ? "newline" : c); \
} \
}'`; do
if [[ "$c" == "space" ]]; then
let line=line+1
let pos=0
continue
fi
outputchar $line $pos $c
let pos=pos+1
done
let i=0
while [[ $i -le $line ]]; do
printf "\tprinta(@letter%d);\n" $i
let i=i+1
done
printf "\texit(0);\n}\n"
}
dtrace -qs /dev/stdin -x encoding=utf8 <<EOF
`outputstr "why must i do this"`
EOF
dtrace -qs /dev/stdin -x encoding=ascii -x aggzoom <<EOF
`outputstr "i am not well"`
EOF
dtrace -qs /dev/stdin -x encoding=utf8 -x aggzoom <<EOF
`outputstr "send help"`
EOF

View file

@ -0,0 +1,102 @@
key min .------------------------------------------. max | count
2 < 0 : ▂ ▂ ▂ ▂ ▂ ▂ : >= 40 | 6
3 < 0 : ▂ ▂ ▂ ▂ ▂ ▂ : >= 40 | 6
4 < 0 : ▂ ▂ ▂▂▂▂▂▂ ▂ : >= 40 | 9
5 < 0 : ▂ ▂▂ ▂ ▂ ▂ ▂ : >= 40 | 7
6 < 0 : ▂▂ ▂▂ ▂ ▂ ▂ : >= 40 | 7
7 < 0 : ▂ ▂ ▂ ▂ ▂ : >= 40 | 5
key min .------------------------------------------. max | count
2 < 0 : ▂ ▂ ▂ ▂ ▂▂▂▂ ▂▂▂▂▂ : >= 40 | 13
3 < 0 : ▂▂ ▂▂ ▂ ▂ ▂ ▂ : >= 40 | 8
4 < 0 : ▂ ▂▂ ▂ ▂ ▂ ▂▂▂▂ ▂ : >= 40 | 11
5 < 0 : ▂ ▂ ▂ ▂ ▂ ▂ : >= 40 | 6
6 < 0 : ▂ ▂ ▂ ▂ ▂ ▂ ▂ : >= 40 | 7
7 < 0 : ▂ ▂ ▂▂▂▂ ▂▂▂▂ ▂ : >= 40 | 11
key min .------------------------------------------. max | count
2 < 0 : █ : >= 40 | 1
3 < 0 : █ : >= 40 | 1
4 < 0 : █ : >= 40 | 1
5 < 0 : █ : >= 40 | 1
6 < 0 : █ : >= 40 | 1
7 < 0 : █ : >= 40 | 1
key min .------------------------------------------. max | count
2 < 0 : ▂▂▂▂▂ ▂▂▂▂ : >= 40 | 9
3 < 0 : ▃ ▃ ▃ ▃ : >= 40 | 4
4 < 0 : ▃ ▃ ▃ ▃ : >= 40 | 4
5 < 0 : ▃ ▃ ▃ ▃ : >= 40 | 4
6 < 0 : ▃ ▃ ▃ ▃ : >= 40 | 4
7 < 0 : ▂▂▂▂▂ ▂▂▂▂ : >= 40 | 9
key min .------------------------------------------. max | count
2 < 0 : ▂▂▂▂▂ ▂ ▂ ▂ ▂▂▂▂ : >= 40 | 12
3 < 0 : ▂ ▂ ▂ ▂ ▂ : >= 40 | 5
4 < 0 : ▂ ▂▂▂▂▂▂ ▂ ▂▂▂▂ : >= 40 | 12
5 < 0 : ▂ ▂ ▂ ▂ ▂ : >= 40 | 5
6 < 0 : ▂ ▂ ▂ ▂ ▂ ▂ : >= 40 | 6
7 < 0 : ▂ ▂ ▂ ▂ ▂▂▂▂ : >= 40 | 8
key min .------------------------------------------. max | count
2 < 0 : X : >= 40 | 1
3 < 0 : X : >= 40 | 1
4 < 0 : X : >= 40 | 1
5 < 0 : X : >= 40 | 1
6 < 0 : X : >= 40 | 1
7 < 0 : X : >= 40 | 1
key min .------------------------------------------. max | count
2 < 0 : XX X X : >= 40 | 4
3 < 0 : X X XX XX : >= 40 | 6
4 < 0 : X X X XX X : >= 40 | 6
5 < 0 : XXXXXX X X : >= 40 | 8
6 < 0 : X X X X : >= 40 | 4
7 < 0 : X X X X : >= 40 | 4
key min .------------------------------------------. max | count
2 < 0 : X X XXXX XXXXX : >= 40 | 11
3 < 0 : XX X X X X : >= 40 | 6
4 < 0 : X X X X X X : >= 40 | 6
5 < 0 : X X X X X X : >= 40 | 6
6 < 0 : X XX X X X : >= 40 | 6
7 < 0 : X X XXXX X : >= 40 | 7
key min .------------------------------------------. max | count
2 < 0 : X X XXXXXX X X : >= 40 | 10
3 < 0 : X X X X X : >= 40 | 5
4 < 0 : X X XXXXX X X : >= 40 | 9
5 < 0 : X XX X X X X : >= 40 | 7
6 < 0 : XX XX X X X : >= 40 | 7
7 < 0 : X X XXXXXX XXXXXX XXXXXX : >= 40 | 20
key min .------------------------------------------. max | count
2 < 0 : ████ ██████ █ █ █████ : >= 40 | 17
3 < 0 : █ █ ██ █ █ █ : >= 40 | 7
4 < 0 : ████ █████ █ █ █ █ █ : >= 40 | 14
5 < 0 : █ █ █ █ █ █ █ : >= 40 | 7
6 < 0 : █ █ █ █ ██ █ █ : >= 40 | 8
7 < 0 : ████ ██████ █ █ █████ : >= 40 | 17
key min .------------------------------------------. max | count
2 < 0 : █ █ ██████ █ █████ : >= 40 | 14
3 < 0 : █ █ █ █ █ █ : >= 40 | 6
4 < 0 : ██████ █████ █ █ █ : >= 40 | 14
5 < 0 : █ █ █ █ █████ : >= 40 | 9
6 < 0 : █ █ █ █ █ : >= 40 | 5
7 < 0 : █ █ ██████ ██████ █ : >= 40 | 15

View file

@ -0,0 +1,43 @@
/*
* This file and its contents are supplied under the terms of the
* Common Development and Distribution License ("CDDL"), version 1.0.
* You may only use this file in accordance with the terms of version
* 1.0 of the CDDL.
*
* A full copy of the text of the CDDL should have accompanied this
* source. A copy of the CDDL is also available via the Internet at
* http://www.illumos.org/license/CDDL.
*/
/*
* Copyright (c) 2013 Joyent, Inc. All rights reserved.
*/
#pragma D option encoding=ascii
#pragma D option quiet
tick-1ms
/i++ < 30/
{
@[1] = lquantize(i, 0, 40, 1, 1000);
@[2] = lquantize(i, 0, 40, 1, 1000);
@[3] = lquantize(i, 0, 40, 1, 1000);
}
tick-1ms
/i == 40/
{
@[1] = lquantize(0, 0, 40, 1, 1);
@[1] = lquantize(i, 0, 40, 1, 2000);
@[2] = lquantize(0, 0, 40, 1, 1);
@[2] = lquantize(i, 0, 40, 1, 2000);
@[3] = lquantize(0, 0, 40, 1, 1);
@[3] = lquantize(i, 0, 40, 1, 2000);
printa(@);
setopt("aggpack");
printa(@);
setopt("aggzoom");
printa(@);
exit(0);
}

View file

@ -0,0 +1,149 @@
1
value ------------- Distribution ------------- count
< 0 | 0
0 | 1
1 |@ 1000
2 |@ 1000
3 |@ 1000
4 |@ 1000
5 |@ 1000
6 |@ 1000
7 |@ 1000
8 |@ 1000
9 |@ 1000
10 |@ 1000
11 |@ 1000
12 |@ 1000
13 |@ 1000
14 |@ 1000
15 |@ 1000
16 |@ 1000
17 |@ 1000
18 |@ 1000
19 |@ 1000
20 |@ 1000
21 |@ 1000
22 |@ 1000
23 |@ 1000
24 |@ 1000
25 |@ 1000
26 |@ 1000
27 |@ 1000
28 |@ 1000
29 |@ 1000
30 |@ 1000
31 | 0
32 | 0
33 | 0
34 | 0
35 | 0
36 | 0
37 | 0
38 | 0
39 | 0
>= 40 |@@ 2000
2
value ------------- Distribution ------------- count
< 0 | 0
0 | 1
1 |@ 1000
2 |@ 1000
3 |@ 1000
4 |@ 1000
5 |@ 1000
6 |@ 1000
7 |@ 1000
8 |@ 1000
9 |@ 1000
10 |@ 1000
11 |@ 1000
12 |@ 1000
13 |@ 1000
14 |@ 1000
15 |@ 1000
16 |@ 1000
17 |@ 1000
18 |@ 1000
19 |@ 1000
20 |@ 1000
21 |@ 1000
22 |@ 1000
23 |@ 1000
24 |@ 1000
25 |@ 1000
26 |@ 1000
27 |@ 1000
28 |@ 1000
29 |@ 1000
30 |@ 1000
31 | 0
32 | 0
33 | 0
34 | 0
35 | 0
36 | 0
37 | 0
38 | 0
39 | 0
>= 40 |@@ 2000
3
value ------------- Distribution ------------- count
< 0 | 0
0 | 1
1 |@ 1000
2 |@ 1000
3 |@ 1000
4 |@ 1000
5 |@ 1000
6 |@ 1000
7 |@ 1000
8 |@ 1000
9 |@ 1000
10 |@ 1000
11 |@ 1000
12 |@ 1000
13 |@ 1000
14 |@ 1000
15 |@ 1000
16 |@ 1000
17 |@ 1000
18 |@ 1000
19 |@ 1000
20 |@ 1000
21 |@ 1000
22 |@ 1000
23 |@ 1000
24 |@ 1000
25 |@ 1000
26 |@ 1000
27 |@ 1000
28 |@ 1000
29 |@ 1000
30 |@ 1000
31 | 0
32 | 0
33 | 0
34 | 0
35 | 0
36 | 0
37 | 0
38 | 0
39 | 0
>= 40 |@@ 2000
key min .------------------------------------------. max | count
1 < 0 : _______________________________ _: >= 40 | 32001
2 < 0 : _______________________________ _: >= 40 | 32001
3 < 0 : _______________________________ _: >= 40 | 32001
key min .------------------------------------------. max | count
1 < 0 : _xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx X: >= 40 | 32001
2 < 0 : _xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx X: >= 40 | 32001
3 < 0 : _xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx X: >= 40 | 32001

View file

@ -0,0 +1,35 @@
/*
* This file and its contents are supplied under the terms of the
* Common Development and Distribution License ("CDDL"), version 1.0.
* You may only use this file in accordance with the terms of version
* 1.0 of the CDDL.
*
* A full copy of the text of the CDDL should have accompanied this
* source. A copy of the CDDL is also available via the Internet at
* http://www.illumos.org/license/CDDL.
*/
/*
* Copyright (c) 2013 Joyent, Inc. All rights reserved.
*/
#pragma D option encoding=ascii
#pragma D option quiet
tick-1ms
/i++ < 90/
{
@ = lquantize(i, 0, 100, 1, 1000);
}
tick-1ms
/i == 100/
{
@ = lquantize(i++, 0, 100, 1, 2000);
@ = lquantize(i++, 0, 100, 1, 3000);
printa(@);
setopt("aggzoom");
printa(@);
exit(0);
}

View file

@ -0,0 +1,211 @@
value ------------- Distribution ------------- count
0 | 0
1 | 1000
2 | 1000
3 | 1000
4 | 1000
5 | 1000
6 | 1000
7 | 1000
8 | 1000
9 | 1000
10 | 1000
11 | 1000
12 | 1000
13 | 1000
14 | 1000
15 | 1000
16 | 1000
17 | 1000
18 | 1000
19 | 1000
20 | 1000
21 | 1000
22 | 1000
23 | 1000
24 | 1000
25 | 1000
26 | 1000
27 | 1000
28 | 1000
29 | 1000
30 | 1000
31 | 1000
32 | 1000
33 | 1000
34 | 1000
35 | 1000
36 | 1000
37 | 1000
38 | 1000
39 | 1000
40 | 1000
41 | 1000
42 | 1000
43 | 1000
44 | 1000
45 | 1000
46 | 1000
47 | 1000
48 | 1000
49 | 1000
50 | 1000
51 | 1000
52 | 1000
53 | 1000
54 | 1000
55 | 1000
56 | 1000
57 | 1000
58 | 1000
59 | 1000
60 | 1000
61 | 1000
62 | 1000
63 | 1000
64 | 1000
65 | 1000
66 | 1000
67 | 1000
68 | 1000
69 | 1000
70 | 1000
71 | 1000
72 | 1000
73 | 1000
74 | 1000
75 | 1000
76 | 1000
77 | 1000
78 | 1000
79 | 1000
80 | 1000
81 | 1000
82 | 1000
83 | 1000
84 | 1000
85 | 1000
86 | 1000
87 | 1000
88 | 1000
89 | 1000
90 | 1000
91 | 0
92 | 0
93 | 0
94 | 0
95 | 0
96 | 0
97 | 0
98 | 0
99 | 0
>= 100 |@@ 5000
value ------------- Distribution ------------- count
0 | 0
1 |@@@@@@@@ 1000
2 |@@@@@@@@ 1000
3 |@@@@@@@@ 1000
4 |@@@@@@@@ 1000
5 |@@@@@@@@ 1000
6 |@@@@@@@@ 1000
7 |@@@@@@@@ 1000
8 |@@@@@@@@ 1000
9 |@@@@@@@@ 1000
10 |@@@@@@@@ 1000
11 |@@@@@@@@ 1000
12 |@@@@@@@@ 1000
13 |@@@@@@@@ 1000
14 |@@@@@@@@ 1000
15 |@@@@@@@@ 1000
16 |@@@@@@@@ 1000
17 |@@@@@@@@ 1000
18 |@@@@@@@@ 1000
19 |@@@@@@@@ 1000
20 |@@@@@@@@ 1000
21 |@@@@@@@@ 1000
22 |@@@@@@@@ 1000
23 |@@@@@@@@ 1000
24 |@@@@@@@@ 1000
25 |@@@@@@@@ 1000
26 |@@@@@@@@ 1000
27 |@@@@@@@@ 1000
28 |@@@@@@@@ 1000
29 |@@@@@@@@ 1000
30 |@@@@@@@@ 1000
31 |@@@@@@@@ 1000
32 |@@@@@@@@ 1000
33 |@@@@@@@@ 1000
34 |@@@@@@@@ 1000
35 |@@@@@@@@ 1000
36 |@@@@@@@@ 1000
37 |@@@@@@@@ 1000
38 |@@@@@@@@ 1000
39 |@@@@@@@@ 1000
40 |@@@@@@@@ 1000
41 |@@@@@@@@ 1000
42 |@@@@@@@@ 1000
43 |@@@@@@@@ 1000
44 |@@@@@@@@ 1000
45 |@@@@@@@@ 1000
46 |@@@@@@@@ 1000
47 |@@@@@@@@ 1000
48 |@@@@@@@@ 1000
49 |@@@@@@@@ 1000
50 |@@@@@@@@ 1000
51 |@@@@@@@@ 1000
52 |@@@@@@@@ 1000
53 |@@@@@@@@ 1000
54 |@@@@@@@@ 1000
55 |@@@@@@@@ 1000
56 |@@@@@@@@ 1000
57 |@@@@@@@@ 1000
58 |@@@@@@@@ 1000
59 |@@@@@@@@ 1000
60 |@@@@@@@@ 1000
61 |@@@@@@@@ 1000
62 |@@@@@@@@ 1000
63 |@@@@@@@@ 1000
64 |@@@@@@@@ 1000
65 |@@@@@@@@ 1000
66 |@@@@@@@@ 1000
67 |@@@@@@@@ 1000
68 |@@@@@@@@ 1000
69 |@@@@@@@@ 1000
70 |@@@@@@@@ 1000
71 |@@@@@@@@ 1000
72 |@@@@@@@@ 1000
73 |@@@@@@@@ 1000
74 |@@@@@@@@ 1000
75 |@@@@@@@@ 1000
76 |@@@@@@@@ 1000
77 |@@@@@@@@ 1000
78 |@@@@@@@@ 1000
79 |@@@@@@@@ 1000
80 |@@@@@@@@ 1000
81 |@@@@@@@@ 1000
82 |@@@@@@@@ 1000
83 |@@@@@@@@ 1000
84 |@@@@@@@@ 1000
85 |@@@@@@@@ 1000
86 |@@@@@@@@ 1000
87 |@@@@@@@@ 1000
88 |@@@@@@@@ 1000
89 |@@@@@@@@ 1000
90 |@@@@@@@@ 1000
91 | 0
92 | 0
93 | 0
94 | 0
95 | 0
96 | 0
97 | 0
98 | 0
99 | 0
>= 100 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 5000

View file

@ -22,6 +22,7 @@
/*
* Copyright 2007 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
* Copyright (c) 2012, Joyent, Inc. All rights reserved.
*/
#pragma ident "%Z%%M% %I% %E% SMI"
@ -97,6 +98,9 @@ INTFUNC(ntohll(0x1234567890abcdefL))
STRFUNC(inet_ntoa((ipaddr_t *)alloca(sizeof (ipaddr_t))))
STRFUNC(inet_ntoa6((in6_addr_t *)alloca(sizeof (in6_addr_t))))
STRFUNC(inet_ntop(AF_INET, (void *)alloca(sizeof (ipaddr_t))))
INTFUNC(getf(0))
INTFUNC(strtoll("0x12EE5D5", 16))
STRFUNC(json("{\"systemtap\": false}", "systemtap"))
BEGIN
/subr == DIF_SUBR_MAX + 1/

View file

@ -0,0 +1,179 @@
/*
* This file and its contents are supplied under the terms of the
* Common Development and Distribution License ("CDDL"), version 1.0.
* You may only use this file in accordance with the terms of version
* 1.0 of the CDDL.
*
* A full copy of the text of the CDDL should have accompanied this
* source. A copy of the CDDL is also available via the Internet at
* http://www.illumos.org/license/CDDL.
*/
/*
* Copyright 2012, Joyent, Inc. All rights reserved.
*/
/*
* General functional tests of JSON parser for json().
*/
#pragma D option quiet
#pragma D option strsize=1k
#define TST(name) \
printf("\ntst |%s|\n", name)
#define IN2(vala, valb) \
in = strjoin(vala, valb); \
printf("in |%s|\n", in)
#define IN(val) \
in = val; \
printf("in |%s|\n", in)
#define SEL(ss) \
out = json(in, ss); \
printf("sel |%s|\nout |%s|\n", ss, \
out != NULL ? out : "<NULL>")
BEGIN
{
TST("empty array");
IN("[]");
SEL("0");
TST("one-element array: integer");
IN("[1]");
SEL("0");
SEL("1");
SEL("100");
SEL("-1");
TST("one-element array: hex integer (not in spec, not supported)");
IN("[0x1000]");
SEL("0");
TST("one-element array: float");
IN("[1.5001]");
SEL("0");
TST("one-element array: float + exponent");
IN("[16.3e10]");
SEL("0");
TST("one-element array: integer + whitespace");
IN("[ \t 5\t]");
SEL("0");
TST("one-element array: integer + exponent + whitespace");
IN("[ \t \t 16E10 \t ]");
SEL("0");
TST("one-element array: string");
IN("[\"alpha\"]");
SEL("0");
TST("alternative first-element indexing");
IN("[1,5,10,15,20]");
SEL("[0]");
SEL("[3]");
SEL("[4]");
SEL("[5]");
TST("one-element array: object");
IN("[ { \"first\": true, \"second\": false }]");
SEL("0.first");
SEL("0.second");
SEL("0.third");
TST("many-element array: integers");
IN("[0,1,1,2,3,5,8,13,21,34,55,89,144,233,377]");
SEL("10"); /* F(10) = 55 */
SEL("14"); /* F(14) = 377 */
SEL("19");
TST("many-element array: multiple types");
IN2("[\"string\",32,true,{\"a\":9,\"b\":false},100.3e10,false,200.5,",
"{\"key\":\"val\"},null]");
SEL("0");
SEL("0.notobject");
SEL("1");
SEL("2");
SEL("3");
SEL("3.a");
SEL("3.b");
SEL("3.c");
SEL("4");
SEL("5");
SEL("6");
SEL("7");
SEL("7.key");
SEL("7.key.notobject");
SEL("7.nonexist");
SEL("8");
SEL("9");
TST("many-element array: multiple types + whitespace");
IN2("\n[\t\"string\" ,\t32 , true\t,\t {\"a\": 9,\t\"b\": false},\t\t",
"100.3e10, false, 200.5,{\"key\" \t:\n \"val\"},\t\t null ]\t\t");
SEL("0");
SEL("0.notobject");
SEL("1");
SEL("2");
SEL("3");
SEL("3.a");
SEL("3.b");
SEL("3.c");
SEL("4");
SEL("5");
SEL("6");
SEL("7");
SEL("7.key");
SEL("7.key.notobject");
SEL("7.nonexist");
SEL("8");
SEL("9");
TST("two-element array: various string escape codes");
IN2("[\"abcd \\\" \\\\ \\/ \\b \\f \\n \\r \\t \\u0000 \\uf00F \", ",
"\"final\"]");
SEL("0");
SEL("1");
TST("three-element array: broken escape code");
IN("[\"fine here\", \"dodgey \\u00AZ\", \"wont get here\"]");
SEL("0");
SEL("1");
SEL("2");
TST("nested objects");
IN2("{ \"top\": { \"mid\" : { \"legs\": \"feet\" }, \"number\": 9, ",
"\"array\":[0,1,{\"a\":true,\"bb\":[1,2,false,{\"x\":\"yz\"}]}]}}");
SEL("top");
SEL("fargo");
SEL("top.mid");
SEL("top.centre");
SEL("top.mid.legs");
SEL("top.mid.number");
SEL("top.mid.array");
SEL("top.number");
SEL("top.array");
SEL("top.array[0]");
SEL("top.array[1]");
SEL("top.array[2]");
SEL("top.array[2].a");
SEL("top.array[2].b");
SEL("top.array[2].bb");
SEL("top.array[2].bb[0]");
SEL("top.array[2].bb[1]");
SEL("top.array[2].bb[2]");
SEL("top.array[2].bb[3]");
SEL("top.array[2].bb[3].x");
SEL("top.array[2].bb[3].x.nofurther");
SEL("top.array[2].bb[4]");
SEL("top.array[3]");
exit(0);
}
ERROR
{
exit(1);
}

View file

@ -0,0 +1,218 @@
tst |empty array|
in |[]|
sel |0|
out |<NULL>|
tst |one-element array: integer|
in |[1]|
sel |0|
out |1|
sel |1|
out |<NULL>|
sel |100|
out |<NULL>|
sel |-1|
out |<NULL>|
tst |one-element array: hex integer (not in spec, not supported)|
in |[0x1000]|
sel |0|
out |<NULL>|
tst |one-element array: float|
in |[1.5001]|
sel |0|
out |1.5001|
tst |one-element array: float + exponent|
in |[16.3e10]|
sel |0|
out |16.3e10|
tst |one-element array: integer + whitespace|
in |[ 5 ]|
sel |0|
out |5|
tst |one-element array: integer + exponent + whitespace|
in |[ 16E10 ]|
sel |0|
out |16E10|
tst |one-element array: string|
in |["alpha"]|
sel |0|
out |alpha|
tst |alternative first-element indexing|
in |[1,5,10,15,20]|
sel |[0]|
out |1|
sel |[3]|
out |15|
sel |[4]|
out |20|
sel |[5]|
out |<NULL>|
tst |one-element array: object|
in |[ { "first": true, "second": false }]|
sel |0.first|
out |true|
sel |0.second|
out |false|
sel |0.third|
out |<NULL>|
tst |many-element array: integers|
in |[0,1,1,2,3,5,8,13,21,34,55,89,144,233,377]|
sel |10|
out |55|
sel |14|
out |377|
sel |19|
out |<NULL>|
tst |many-element array: multiple types|
in |["string",32,true,{"a":9,"b":false},100.3e10,false,200.5,{"key":"val"},null]|
sel |0|
out |string|
sel |0.notobject|
out |<NULL>|
sel |1|
out |32|
sel |2|
out |true|
sel |3|
out |{"a":9,"b":false}|
sel |3.a|
out |9|
sel |3.b|
out |false|
sel |3.c|
out |<NULL>|
sel |4|
out |100.3e10|
sel |5|
out |false|
sel |6|
out |200.5|
sel |7|
out |{"key":"val"}|
sel |7.key|
out |val|
sel |7.key.notobject|
out |<NULL>|
sel |7.nonexist|
out |<NULL>|
sel |8|
out |null|
sel |9|
out |<NULL>|
tst |many-element array: multiple types + whitespace|
in |
[ "string" , 32 , true , {"a": 9, "b": false}, 100.3e10, false, 200.5,{"key" :
"val"}, null ] |
sel |0|
out |string|
sel |0.notobject|
out |<NULL>|
sel |1|
out |32|
sel |2|
out |true|
sel |3|
out |{"a": 9, "b": false}|
sel |3.a|
out |9|
sel |3.b|
out |false|
sel |3.c|
out |<NULL>|
sel |4|
out |100.3e10|
sel |5|
out |false|
sel |6|
out |200.5|
sel |7|
out |{"key" :
"val"}|
sel |7.key|
out |val|
sel |7.key.notobject|
out |<NULL>|
sel |7.nonexist|
out |<NULL>|
sel |8|
out |null|
sel |9|
out |<NULL>|
tst |two-element array: various string escape codes|
in |["abcd \" \\ \/ \b \f \n \r \t \u0000 \uf00F ", "final"]|
sel |0|
out |abcd \" \\ \/ \b \f \n \r \t \u0000 \uf00F |
sel |1|
out |final|
tst |three-element array: broken escape code|
in |["fine here", "dodgey \u00AZ", "wont get here"]|
sel |0|
out |fine here|
sel |1|
out |<NULL>|
sel |2|
out |<NULL>|
tst |nested objects|
in |{ "top": { "mid" : { "legs": "feet" }, "number": 9, "array":[0,1,{"a":true,"bb":[1,2,false,{"x":"yz"}]}]}}|
sel |top|
out |{ "mid" : { "legs": "feet" }, "number": 9, "array":[0,1,{"a":true,"bb":[1,2,false,{"x":"yz"}]}]}|
sel |fargo|
out |<NULL>|
sel |top.mid|
out |{ "legs": "feet" }|
sel |top.centre|
out |<NULL>|
sel |top.mid.legs|
out |feet|
sel |top.mid.number|
out |<NULL>|
sel |top.mid.array|
out |<NULL>|
sel |top.number|
out |9|
sel |top.array|
out |[0,1,{"a":true,"bb":[1,2,false,{"x":"yz"}]}]|
sel |top.array[0]|
out |0|
sel |top.array[1]|
out |1|
sel |top.array[2]|
out |{"a":true,"bb":[1,2,false,{"x":"yz"}]}|
sel |top.array[2].a|
out |true|
sel |top.array[2].b|
out |<NULL>|
sel |top.array[2].bb|
out |[1,2,false,{"x":"yz"}]|
sel |top.array[2].bb[0]|
out |1|
sel |top.array[2].bb[1]|
out |2|
sel |top.array[2].bb[2]|
out |false|
sel |top.array[2].bb[3]|
out |{"x":"yz"}|
sel |top.array[2].bb[3].x|
out |yz|
sel |top.array[2].bb[3].x.nofurther|
out |<NULL>|
sel |top.array[2].bb[4]|
out |<NULL>|
sel |top.array[3]|
out |<NULL>|

View file

@ -0,0 +1,51 @@
/*
* This file and its contents are supplied under the terms of the
* Common Development and Distribution License ("CDDL"), version 1.0.
* You may only use this file in accordance with the terms of version
* 1.0 of the CDDL.
*
* A full copy of the text of the CDDL should have accompanied this
* source. A copy of the CDDL is also available via the Internet at
* http://www.illumos.org/license/CDDL.
*/
/*
* Copyright 2012, Joyent, Inc. All rights reserved.
*/
/*
* ASSERTION:
* json() run time must be bounded above by strsize. This test makes strsize
* small and deliberately overflows it to prove we bail and return NULL in
* the event that we run off the end of the string.
*
*/
#pragma D option quiet
#pragma D option strsize=18
BEGIN
{
in = "{\"a\": 1024}"; /* length == 19 */
out = json(in, "a");
printf("|%s|\n%s\n\n", in, out != NULL ? out : "<NULL>");
in = "{\"a\": 1024}"; /* length == 11 */
out = json(in, "a");
printf("|%s|\n%s\n\n", in, out != NULL ? out : "<NULL>");
in = "{\"a\":false,\"b\":true}"; /* length == 20 */
out = json(in, "b");
printf("|%s|\n%s\n\n", in, out != NULL ? out : "<NULL>");
in = "{\"a\":false,\"b\":20}"; /* length == 18 */
out = json(in, "b");
printf("|%s|\n%s\n\n", in, out != NULL ? out : "<NULL>");
exit(0);
}
ERROR
{
exit(1);
}

View file

@ -0,0 +1,13 @@
|{"a": 1024|
<NULL>
|{"a": 1024}|
1024
|{"a":false,"b":tru|
<NULL>
|{"a":false,"b":20}|
20

View file

@ -0,0 +1,61 @@
/*
* This file and its contents are supplied under the terms of the
* Common Development and Distribution License ("CDDL"), version 1.0.
* You may only use this file in accordance with the terms of version
* 1.0 of the CDDL.
*
* A full copy of the text of the CDDL should have accompanied this
* source. A copy of the CDDL is also available via the Internet at
* http://www.illumos.org/license/CDDL.
*/
/*
* Copyright 2012 (c), Joyent, Inc. All rights reserved.
*/
#include <sys/sdt.h>
#include "usdt.h"
#define FMT "{" \
" \"sizes\": [ \"first\", 2, %f ]," \
" \"index\": %d," \
" \"facts\": {" \
" \"odd\": \"%s\"," \
" \"even\": \"%s\"" \
" }," \
" \"action\": \"%s\"" \
"}\n"
int
waiting(volatile int *a)
{
return (*a);
}
int
main(int argc, char **argv)
{
volatile int a = 0;
int idx;
double size = 250.5;
while (waiting(&a) == 0)
continue;
for (idx = 0; idx < 10; idx++) {
char *odd, *even, *json, *action;
size *= 1.78;
odd = idx % 2 == 1 ? "true" : "false";
even = idx % 2 == 0 ? "true" : "false";
action = idx == 7 ? "ignore" : "print";
asprintf(&json, FMT, size, idx, odd, even, action);
BUNYAN_FAKE_LOG_DEBUG(json);
free(json);
}
BUNYAN_FAKE_LOG_DEBUG("{\"finished\": true}");
return (0);
}

View file

@ -0,0 +1,65 @@
/*
* This file and its contents are supplied under the terms of the
* Common Development and Distribution License ("CDDL"), version 1.0.
* You may only use this file in accordance with the terms of version
* 1.0 of the CDDL.
*
* A full copy of the text of the CDDL should have accompanied this
* source. A copy of the CDDL is also available via the Internet at
* http://www.illumos.org/license/CDDL.
*/
/*
* Copyright (c) 2012, Joyent, Inc. All rights reserved.
*/
#pragma D option strsize=4k
#pragma D option quiet
#pragma D option destructive
/*
* This test reads a JSON string from a USDT probe, roughly simulating the
* primary motivating use case for the json() subroutine: filtering
* JSON-formatted log messages from a logging subsystem like node-bunyan.
*/
pid$1:a.out:waiting:entry
{
this->value = (int *)alloca(sizeof (int));
*this->value = 1;
copyout(this->value, arg0, sizeof (int));
}
bunyan*$1:::log-*
{
this->j = copyinstr(arg0);
}
bunyan*$1:::log-*
/json(this->j, "finished") == NULL && json(this->j, "action") != "ignore"/
{
this->index = strtoll(json(this->j, "index"));
this->size = json(this->j, "sizes[2]");
this->odd = json(this->j, "facts.odd");
this->even = json(this->j, "facts.even");
printf("[%d] sz %s odd %s even %s\n", this->index, this->size,
this->odd, this->even);
}
bunyan*$1:::log-*
/json(this->j, "finished") != NULL/
{
printf("FINISHED!\n");
exit(0);
}
tick-10s
{
printf("ERROR: Timed out before finish message!\n");
exit(1);
}
ERROR
{
exit(1);
}

View file

@ -0,0 +1,11 @@
[0] sz 445.890000 odd false even true
[1] sz 793.684200 odd true even false
[2] sz 1412.757876 odd false even true
[3] sz 2514.709019 odd true even false
[4] sz 4476.182054 odd false even true
[5] sz 7967.604057 odd true even false
[6] sz 14182.335221 odd false even true
[8] sz 44935.310914 odd false even true
[9] sz 79984.853427 odd true even false
FINISHED!

View file

@ -0,0 +1,27 @@
/*
* This file and its contents are supplied under the terms of the
* Common Development and Distribution License ("CDDL"), version 1.0.
* You may only use this file in accordance with the terms of version
* 1.0 of the CDDL.
*
* A full copy of the text of the CDDL should have accompanied this
* source. A copy of the CDDL is also available via the Internet at
* http://www.illumos.org/license/CDDL.
*/
/*
* Copyright 2012, Joyent, Inc. All rights reserved.
*/
/*
* Sets up a fake node-bunyan-like USDT provider for use from C.
*/
provider bunyan_fake {
probe log__trace(char *msg);
probe log__debug(char *msg);
probe log__info(char *msg);
probe log__warn(char *msg);
probe log__error(char *msg);
probe log__fatal(char *msg);
};

View file

@ -0,0 +1,91 @@
#
# CDDL HEADER START
#
# The contents of this file are subject to the terms of the
# Common Development and Distribution License (the "License").
# You may not use this file except in compliance with the License.
#
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
# or http://www.opensolaris.org/os/licensing.
# See the License for the specific language governing permissions
# and limitations under the License.
#
# When distributing Covered Code, include this CDDL HEADER in each
# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
# If applicable, add the following below this CDDL HEADER, with the
# fields enclosed by brackets "[]" replaced with your own identifying
# information: Portions Copyright [yyyy] [name of copyright owner]
#
# CDDL HEADER END
#
#
# Copyright (c) 2012, Joyent, Inc. All rights reserved.
#
tmpin=/tmp/tst.fds.$$.d
tmpout1=/tmp/tst.fds.$$.out1
tmpout2=/tmp/tst.fds.$$.out2
cat > $tmpin <<EOF
#define DUMPFIELD(fd, fmt, field) \
errmsg = "could not dump field"; \
printf("%d: field =fmt\n", fd, fds[fd].field);
/*
* Note that we are explicitly not looking at fi_mount -- it (by design) does
* not work if not running with kernel permissions.
*/
#define DUMP(fd) \
DUMPFIELD(fd, %s, fi_name); \
DUMPFIELD(fd, %s, fi_dirname); \
DUMPFIELD(fd, %s, fi_pathname); \
DUMPFIELD(fd, %d, fi_offset); \
DUMPFIELD(fd, %s, fi_fs); \
DUMPFIELD(fd, %o, fi_oflags);
BEGIN
{
DUMP(0);
DUMP(1);
DUMP(2);
DUMP(3);
DUMP(4);
exit(0);
}
ERROR
{
printf("error: %s\n", errmsg);
exit(1);
}
EOF
#
# First, with all privs
#
/usr/sbin/dtrace -q -Cs /dev/stdin < $tmpin > $tmpout2
mv $tmpout2 $tmpout1
#
# And now with only dtrace_proc and dtrace_user -- the output should be
# identical.
#
ppriv -s A=basic,dtrace_proc,dtrace_user $$
/usr/sbin/dtrace -q -Cs /dev/stdin < $tmpin > $tmpout2
echo ">>> $tmpout1"
cat $tmpout1
echo ">>> $tmpout2"
cat $tmpout2
rval=0
if ! cmp $tmpout1 $tmpout2 ; then
rval=1
fi
rm $tmpout1 $tmpout2 $tmpin
exit $rval

View file

@ -22,8 +22,8 @@
#
# Copyright 2006 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
# Copyright (c) 2012, Joyent, Inc. All rights reserved.
#
#ident "%Z%%M% %I% %E% SMI"
ppriv -s A=basic,dtrace_proc,dtrace_user $$
@ -31,7 +31,7 @@ ppriv -s A=basic,dtrace_proc,dtrace_user $$
BEGIN {
errorcount = 0;
expected_errorcount = 23;
expected_errorcount = 27;
}
BEGIN { trace(mutex_owned(&`pidlock)); }
@ -55,6 +55,8 @@ BEGIN { trace(strtok(`initname, "/")); }
BEGIN { trace(strtok(NULL, "/")); }
BEGIN { trace(strtok("foo/bar", `initname)); }
BEGIN { trace(strtok(NULL, `initname)); }
BEGIN { trace(strtoll(`initname)); }
BEGIN { trace(strtoll(`initname, 10)); }
BEGIN { trace(substr(`initname, 2, 3)); }
BEGIN { trace(ddi_pathname(`top_devinfo, 1)); }
@ -63,6 +65,9 @@ BEGIN { trace(strjoin("foo", `initname)); }
BEGIN { trace(dirname(`initname)); }
BEGIN { trace(cleanpath(`initname)); }
BEGIN { j = "{\"/sbin/init\":\"uh oh\"}"; trace(json(j, `initname)); }
BEGIN { trace(json(`initname, "x")); }
ERROR {
errorcount++;
}

View file

@ -0,0 +1,98 @@
#
# CDDL HEADER START
#
# The contents of this file are subject to the terms of the
# Common Development and Distribution License (the "License").
# You may not use this file except in compliance with the License.
#
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
# or http://www.opensolaris.org/os/licensing.
# See the License for the specific language governing permissions
# and limitations under the License.
#
# When distributing Covered Code, include this CDDL HEADER in each
# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
# If applicable, add the following below this CDDL HEADER, with the
# fields enclosed by brackets "[]" replaced with your own identifying
# information: Portions Copyright [yyyy] [name of copyright owner]
#
# CDDL HEADER END
#
#
# Copyright (c) 2012, Joyent, Inc. All rights reserved.
#
ppriv -s A=basic,dtrace_proc,dtrace_user $$
/usr/sbin/dtrace -q -Cs /dev/stdin <<EOF
#define CANREAD(field) \
BEGIN { this->fp = getf(0); errmsg = "can't read field"; \
printf("field: "); trace(this->fp->field); printf("\n"); }
#define CANTREAD(field) \
BEGIN { errmsg = ""; this->fp = getf(0); trace(this->fp->field); \
printf("\nable to successfully read field!"); exit(1); }
CANREAD(f_flag)
CANREAD(f_flag2)
CANREAD(f_vnode)
CANREAD(f_offset)
CANREAD(f_cred)
CANREAD(f_audit_data)
CANREAD(f_count)
/*
* We can potentially read parts of our cred, but we can't dereference
* through cr_zone.
*/
CANTREAD(f_cred->cr_zone->zone_id)
CANREAD(f_vnode->v_path)
CANREAD(f_vnode->v_op)
CANREAD(f_vnode->v_op->vnop_name)
CANTREAD(f_vnode->v_flag)
CANTREAD(f_vnode->v_count)
CANTREAD(f_vnode->v_pages)
CANTREAD(f_vnode->v_type)
CANTREAD(f_vnode->v_vfsmountedhere)
CANTREAD(f_vnode->v_op->vop_open)
BEGIN
{
errmsg = "";
this->fp = getf(0);
this->fp2 = getf(1);
trace(this->fp->f_vnode);
printf("\nable to successfully read this->fp!");
exit(1);
}
BEGIN
{
errmsg = "";
this->fp = getf(0);
}
BEGIN
{
trace(this->fp->f_vnode);
printf("\nable to successfully read this->fp from prior clause!");
}
BEGIN
{
exit(0);
}
ERROR
/errmsg != ""/
{
printf("fatal error: %s", errmsg);
exit(1);
}
EOF

View file

@ -0,0 +1,138 @@
#
# CDDL HEADER START
#
# The contents of this file are subject to the terms of the
# Common Development and Distribution License (the "License").
# You may not use this file except in compliance with the License.
#
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
# or http://www.opensolaris.org/os/licensing.
# See the License for the specific language governing permissions
# and limitations under the License.
#
# When distributing Covered Code, include this CDDL HEADER in each
# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
# If applicable, add the following below this CDDL HEADER, with the
# fields enclosed by brackets "[]" replaced with your own identifying
# information: Portions Copyright [yyyy] [name of copyright owner]
#
# CDDL HEADER END
#
#
# Copyright (c) 2012, Joyent, Inc. All rights reserved.
#
ppriv -s A=basic,dtrace_proc,dtrace_user $$
#
# When we have dtrace_proc (but lack dtrace_kernel), we expect to be able to
# read certain curpsinfo/curlwpsinfo/curcpu fields even though they require
# reading in-kernel state. However, there are other fields in these translated
# structures that we know we shouldn't be able to read, as they require reading
# in-kernel state that we cannot read with only dtrace_proc. Finally, there
# are a few fields that we may or may not be able to read depending on the
# specifics of context. This test therefore asserts that we can read what we
# think we should be able to, that we can't read what we think we shouldn't be
# able to, and (for purposes of completeness) that we are indifferent about
# what we cannot assert one way or the other.
#
/usr/sbin/dtrace -q -Cs /dev/stdin <<EOF
#define CANREAD(what, field) \
BEGIN { errmsg = "can't read field from what"; printf("field: "); \
trace(what->field); printf("\n"); }
#define CANTREAD(what, field) \
BEGIN { errmsg = ""; trace(what->field); \
printf("\nable to successfully read field from what!"); exit(1); }
#define MIGHTREAD(what, field) \
BEGIN { errmsg = ""; printf("field: "); trace(what->field); printf("\n"); }
#define CANREADVAR(vname) \
BEGIN { errmsg = "can't read vname"; printf("vname: "); \
trace(vname); printf("\n"); }
#define CANTREADVAR(vname) \
BEGIN { errmsg = ""; trace(vname); \
printf("\nable to successfully read vname!"); exit(1); }
#define MIGHTREADVAR(vname) \
BEGIN { errmsg = ""; printf("vname: "); trace(vname); printf("\n"); }
CANREAD(curpsinfo, pr_pid)
CANREAD(curpsinfo, pr_nlwp)
CANREAD(curpsinfo, pr_ppid)
CANREAD(curpsinfo, pr_uid)
CANREAD(curpsinfo, pr_euid)
CANREAD(curpsinfo, pr_gid)
CANREAD(curpsinfo, pr_egid)
CANREAD(curpsinfo, pr_addr)
CANREAD(curpsinfo, pr_start)
CANREAD(curpsinfo, pr_fname)
CANREAD(curpsinfo, pr_psargs)
CANREAD(curpsinfo, pr_argc)
CANREAD(curpsinfo, pr_argv)
CANREAD(curpsinfo, pr_envp)
CANREAD(curpsinfo, pr_dmodel)
/*
* If our p_pgidp points to the same pid structure as our p_pidp, we will
* be able to read pr_pgid -- but we won't if not.
*/
MIGHTREAD(curpsinfo, pr_pgid)
CANTREAD(curpsinfo, pr_sid)
CANTREAD(curpsinfo, pr_ttydev)
CANTREAD(curpsinfo, pr_projid)
CANTREAD(curpsinfo, pr_zoneid)
CANTREAD(curpsinfo, pr_contract)
CANREAD(curlwpsinfo, pr_flag)
CANREAD(curlwpsinfo, pr_lwpid)
CANREAD(curlwpsinfo, pr_addr)
CANREAD(curlwpsinfo, pr_wchan)
CANREAD(curlwpsinfo, pr_stype)
CANREAD(curlwpsinfo, pr_state)
CANREAD(curlwpsinfo, pr_sname)
CANREAD(curlwpsinfo, pr_syscall)
CANREAD(curlwpsinfo, pr_pri)
CANREAD(curlwpsinfo, pr_onpro)
CANREAD(curlwpsinfo, pr_bindpro)
CANREAD(curlwpsinfo, pr_bindpset)
CANTREAD(curlwpsinfo, pr_clname)
CANTREAD(curlwpsinfo, pr_lgrp)
CANREAD(curcpu, cpu_id)
CANTREAD(curcpu, cpu_pset)
CANTREAD(curcpu, cpu_chip)
CANTREAD(curcpu, cpu_lgrp)
CANTREAD(curcpu, cpu_info)
/*
* We cannot assert one thing or another about the variable "root": for those
* with only dtrace_proc, it will be readable in the global but not readable in
* the non-global.
*/
MIGHTREADVAR(root)
CANREADVAR(cpu)
CANTREADVAR(pset)
CANTREADVAR(cwd)
CANTREADVAR(chip)
CANTREADVAR(lgrp)
BEGIN
{
exit(0);
}
ERROR
/errmsg != ""/
{
printf("fatal error: %s", errmsg);
exit(1);
}

View file

@ -0,0 +1,126 @@
#
# CDDL HEADER START
#
# The contents of this file are subject to the terms of the
# Common Development and Distribution License (the "License").
# You may not use this file except in compliance with the License.
#
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
# or http://www.opensolaris.org/os/licensing.
# See the License for the specific language governing permissions
# and limitations under the License.
#
# When distributing Covered Code, include this CDDL HEADER in each
# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
# If applicable, add the following below this CDDL HEADER, with the
# fields enclosed by brackets "[]" replaced with your own identifying
# information: Portions Copyright [yyyy] [name of copyright owner]
#
# CDDL HEADER END
#
#
# Copyright (c) 2012, Joyent, Inc. All rights reserved.
#
#
# First, make sure that we can successfully enable the io provider
#
if ! dtrace -P io -n BEGIN'{exit(0)}' > /dev/null 2>&1 ; then
echo failed to enable io provider with full privs
exit 1
fi
ppriv -s A=basic,dtrace_proc,dtrace_user $$
#
# Now make sure that we cannot enable the io provider with reduced privs
#
if ! dtrace -x errtags -P io -n BEGIN'{exit(1)}' 2>&1 | \
grep D_PDESC_ZERO > /dev/null 2>&1 ; then
echo successfully enabled the io provider with reduced privs
exit 1
fi
#
# Keeping our reduced privs, we want to assure that we can see every provider
# that we think we should be able to see -- and that we can see curpsinfo
# state but can't otherwise see arguments.
#
/usr/sbin/dtrace -wq -Cs /dev/stdin <<EOF
int seen[string];
int err;
#define CANENABLE(provider) \
provider::: \
/err == 0 && progenyof(\$pid) && !seen["provider"]/ \
{ \
trace(arg0); \
printf("\nsuccessful trace of arg0 in %s:%s:%s:%s\n", \
probeprov, probemod, probefunc, probename); \
exit(++err); \
} \
\
provider::: \
/progenyof(\$pid)/ \
{ \
seen["provider"]++; \
} \
\
provider::: \
/progenyof(\$pid)/ \
{ \
errstr = "provider"; \
this->ignore = stringof(curpsinfo->pr_psargs); \
errstr = ""; \
} \
\
END \
/err == 0 && !seen["provider"]/ \
{ \
printf("no probes from provider\n"); \
exit(++err); \
} \
\
END \
/err == 0/ \
{ \
printf("saw %d probes from provider\n", seen["provider"]); \
}
CANENABLE(proc)
CANENABLE(sched)
CANENABLE(vminfo)
CANENABLE(sysinfo)
BEGIN
{
/*
* We'll kick off a system of a do-nothing command -- which should be
* enough to kick proc, sched, vminfo and sysinfo probes.
*/
system("echo > /dev/null");
}
ERROR
/err == 0 && errstr != ""/
{
printf("fatal error: couldn't read curpsinfo->pr_psargs in ");
printf("%s-provided probe\n", errstr);
exit(++err);
}
proc:::exit
/progenyof(\$pid)/
{
exit(0);
}
tick-10ms
/i++ > 500/
{
printf("exit probe did not seem to fire\n");
exit(++err);
}
EOF

View file

@ -0,0 +1,35 @@
/*
* This file and its contents are supplied under the terms of the
* Common Development and Distribution License ("CDDL"), version 1.0.
* You may only use this file in accordance with the terms of version
* 1.0 of the CDDL.
*
* A full copy of the text of the CDDL should have accompanied this
* source. A copy of the CDDL is also available via the Internet at
* http://www.illumos.org/license/CDDL.
*/
/*
* Copyright (c) 2012, Joyent, Inc. All rights reserved.
*/
/*
* ASSERTION:
* The largest base we will accept is Base 36 -- i.e. using all of 0-9 and
* A-Z as numerals.
*
* SECTION: Actions and Subroutines/strtoll()
*/
#pragma D option quiet
BEGIN
{
printf("%d\n", strtoll("0", 37));
exit(0);
}
ERROR
{
exit(1);
}

View file

@ -0,0 +1,34 @@
/*
* This file and its contents are supplied under the terms of the
* Common Development and Distribution License ("CDDL"), version 1.0.
* You may only use this file in accordance with the terms of version
* 1.0 of the CDDL.
*
* A full copy of the text of the CDDL should have accompanied this
* source. A copy of the CDDL is also available via the Internet at
* http://www.illumos.org/license/CDDL.
*/
/*
* Copyright (c) 2012, Joyent, Inc. All rights reserved.
*/
/*
* ASSERTION:
* The smallest base we will accept is Base 2.
*
* SECTION: Actions and Subroutines/strtoll()
*/
#pragma D option quiet
BEGIN
{
printf("%d\n", strtoll("0", 1));
exit(0);
}
ERROR
{
exit(1);
}

View file

@ -0,0 +1,66 @@
/*
* This file and its contents are supplied under the terms of the
* Common Development and Distribution License ("CDDL"), version 1.0.
* You may only use this file in accordance with the terms of version
* 1.0 of the CDDL.
*
* A full copy of the text of the CDDL should have accompanied this
* source. A copy of the CDDL is also available via the Internet at
* http://www.illumos.org/license/CDDL.
*/
/*
* Copyright (c) 2012, Joyent, Inc. All rights reserved.
*/
/*
* ASSERTION:
* Test the strtoll() subroutine.
*
* SECTION: Actions and Subroutines/strtoll()
*/
#pragma D option quiet
BEGIN
{
/* minimum base (2) and maximum base (36): */
printf("%d\n", strtoll("0", 2));
printf("%d\n", strtoll("1", 36));
/* simple tests: */
printf("%d\n", strtoll("0x20", 16));
printf("%d\n", strtoll("-32", 10));
printf("%d\n", strtoll("010", 8));
printf("%d\n", strtoll("101010", 2));
/* INT64_MIN and INT64_MAX: */
printf("%d\n", strtoll("9223372036854775807"));
printf("%d\n", strtoll("-9223372036854775808"));
printf("%d\n", strtoll("0777777777777777777777", 8));
printf("%d\n", strtoll("-01000000000000000000000", 8));
/* wrapping: */
printf("%d\n", strtoll("1000000000000000000000", 8));
printf("%d\n", strtoll("-1000000000000000000001", 8));
/* hex without prefix: */
printf("%d\n", strtoll("baddcafe", 16));
/* stopping at first out-of-base character: */
printf("%d\n", strtoll("12j", 10));
printf("%d\n", strtoll("102", 2));
/* base 36: */
printf("%d\n", strtoll("-0DTrace4EverZ", 36));
/* base 10 is assumed: */
printf("%d\n", strtoll("1985"));
printf("%d\n", strtoll("-2012"));
/* empty string: */
printf("%d\n", strtoll(""));
exit(0);
}

View file

@ -0,0 +1,20 @@
0
1
32
-32
8
42
9223372036854775807
-9223372036854775808
9223372036854775807
-9223372036854775808
-9223372036854775808
9223372036854775807
3135097598
12
2
-1819882045752187535
1985
-2012
0

View file

@ -0,0 +1,21 @@
/*
* This file and its contents are supplied under the terms of the
* Common Development and Distribution License ("CDDL"), version 1.0.
* You may only use this file in accordance with the terms of version
* 1.0 of the CDDL.
*
* A full copy of the text of the CDDL should have accompanied this
* source. A copy of the CDDL is also available via the Internet at
* http://www.illumos.org/license/CDDL.
*/
/*
* Copyright (c) 2013 Joyent, Inc. All rights reserved.
*/
#pragma D option quiet
BEGIN
{
trace((pidfoo`int)0);
}

View file

@ -0,0 +1,21 @@
/*
* This file and its contents are supplied under the terms of the
* Common Development and Distribution License ("CDDL"), version 1.0.
* You may only use this file in accordance with the terms of version
* 1.0 of the CDDL.
*
* A full copy of the text of the CDDL should have accompanied this
* source. A copy of the CDDL is also available via the Internet at
* http://www.illumos.org/license/CDDL.
*/
/*
* Copyright (c) 2013 Joyent, Inc. All rights reserved.
*/
#pragma D option quiet
BEGIN
{
trace((pid8foo`int)0);
}

View file

@ -0,0 +1,21 @@
/*
* This file and its contents are supplied under the terms of the
* Common Development and Distribution License ("CDDL"), version 1.0.
* You may only use this file in accordance with the terms of version
* 1.0 of the CDDL.
*
* A full copy of the text of the CDDL should have accompanied this
* source. A copy of the CDDL is also available via the Internet at
* http://www.illumos.org/license/CDDL.
*/
/*
* Copyright (c) 2013 Joyent, Inc. All rights reserved.
*/
#pragma D option quiet
BEGIN
{
trace((pid0`int)0);
}

View file

@ -0,0 +1,34 @@
#! /usr/bin/ksh
#
#
# This file and its contents are supplied under the terms of the
# Common Development and Distribution License ("CDDL"), version 1.0.
# You may only use this file in accordance with the terms of version
# 1.0 of the CDDL.
#
# A full copy of the text of the CDDL should have accompanied this
# source. A copy of the CDDL is also available via the Internet at
# http://www.illumos.org/license/CDDL.
#
#
# Copyright (c) 2013 Joyent, Inc. All rights reserved.
#
#
# While it's hard to be completely certain that a type of the name we want
# doesn't exist, we're going to try to pick a name which is rather unique.
#
if [ $# != 1 ]; then
echo expected one argument: '<'dtrace-path'>'
exit 2
fi
dtrace=$1
t="season_8_mountain_of_madness_t"
pid=$$
rc=`$dtrace -n "BEGIN{ trace(pid$pid`$t)0); }"`
exit $rc

View file

@ -0,0 +1,35 @@
#! /usr/bin/ksh
#
#
# This file and its contents are supplied under the terms of the
# Common Development and Distribution License ("CDDL"), version 1.0.
# You may only use this file in accordance with the terms of version
# 1.0 of the CDDL.
#
# A full copy of the text of the CDDL should have accompanied this
# source. A copy of the CDDL is also available via the Internet at
# http://www.illumos.org/license/CDDL.
#
#
# Copyright (c) 2013 Joyent, Inc. All rights reserved.
#
#
# While it's hard to be completely certain that a type of the name we want
# doesn't exist, we're going to try to pick a name which is rather
# unique. This time we're also going to use the pid$target alias.
#
if [ $# != 1 ]; then
echo expected one argument: '<'dtrace-path'>'
exit 2
fi
dtrace=$1
t="season_8_mountain_of_madness_t"
pid=$$
rc=`$dtrace -n "BEGIN{ trace(pid`$t)0); }"` -p $pid
exit $rc

View file

@ -0,0 +1,90 @@
#! /usr/bin/ksh
#
#
# This file and its contents are supplied under the terms of the
# Common Development and Distribution License ("CDDL"), version 1.0.
# You may only use this file in accordance with the terms of version
# 1.0 of the CDDL.
#
# A full copy of the text of the CDDL should have accompanied this
# source. A copy of the CDDL is also available via the Internet at
# http://www.illumos.org/license/CDDL.
#
#
# Copyright (c) 2013 Joyent, Inc. All rights reserved.
#
#
# This test is purposefully using a 64-bit DTrace and thus 64-bit types
# when compared with a 32-bit process. This test uses the userland
# keyword and so the implicit copyin should access illegal memory and
# thus exit.
#
if [ $# != 1 ]; then
echo expected one argument: '<'dtrace-path'>'
exit 2
fi
dtrace=$1
t="zelda_info_t"
exe="tst.chasestrings.exe"
elfdump "./$exe" | grep -q '.SUNW_ctf'
if [[ $? -ne 0 ]]; then
echo "CTF does not exist in $exe, that's a bug" >&2
exit 1
fi
./$exe &
pid=$!
$dtrace -64 -qs /dev/stdin <<EOF
typedef struct info {
char *zi_gamename;
int zi_ndungeons;
char *zi_villain;
int zi_haszelda;
} info_t;
pid$pid::has_princess:entry
/next == 0/
{
this->t = (userland info_t *)arg0;
printf("game: %s, dungeon: %d, villain: %s, zelda: %d\n",
stringof(this->t->zi_gamename), this->t->zi_ndungeons,
stringof(this->t->zi_villain), this->t->zi_haszelda);
next = 1;
}
pid$pid::has_dungeons:entry
/next == 1/
{
this->t = (userland info_t *)arg0;
printf("game: %s, dungeon: %d, villain: %s, zelda: %d\n",
stringof(this->t->zi_gamename), this->t->zi_ndungeons,
stringof(this->t->zi_villain), this->t->zi_haszelda);
next = 2;
}
pid$pid::has_villain:entry
/next == 2/
{
this->t = (userland info_t *)arg0;
printf("game: %s, dungeon: %d, villain: %s, zelda: %d\n",
stringof(this->t->zi_gamename), this->t->zi_ndungeons,
stringof(this->t->zi_villain), this->t->zi_haszelda);
exit(0);
}
ERROR
{
exit(1);
}
EOF
rc=$?
kill -9 $pid
exit $rc

View file

@ -0,0 +1,46 @@
/*
* This file and its contents are supplied under the terms of the
* Common Development and Distribution License ("CDDL"), version 1.0.
* You may only use this file in accordance with the terms of version
* 1.0 of the CDDL.
*
* A full copy of the text of the CDDL should have accompanied this
* source. A copy of the CDDL is also available via the Internet at
* http://www.illumos.org/license/CDDL.
*/
/*
* Copyright 2013 (c) Joyent, Inc. All rights reserved.
*/
/*
* This test tries to make sure that we have CTF data for a type that only this
* binary would reasonably have. In this case, the
* season_7_lisa_the_vegetarian_t.
*/
#include <unistd.h>
typedef struct season_7_lisa_the_vegetarian {
int fr_salad;
} season_7_lisa_the_vegetarian_t;
int
sleeper(season_7_lisa_the_vegetarian_t *lp)
{
for (;;) {
sleep(lp->fr_salad);
}
/*NOTREACHED*/
return (0);
}
int
main(void)
{
season_7_lisa_the_vegetarian_t l;
l.fr_salad = 100;
sleeper(&l);
return (0);
}

View file

@ -0,0 +1,44 @@
#! /usr/bin/ksh
#
#
# This file and its contents are supplied under the terms of the
# Common Development and Distribution License ("CDDL"), version 1.0.
# You may only use this file in accordance with the terms of version
# 1.0 of the CDDL.
#
# A full copy of the text of the CDDL should have accompanied this
# source. A copy of the CDDL is also available via the Internet at
# http://www.illumos.org/license/CDDL.
#
#
# Copyright (c) 2013 Joyent, Inc. All rights reserved.
#
#
# Lookup a type that is inside a.out.
#
if [ $# != 1 ]; then
echo expected one argument: '<'dtrace-path'>'
exit 2
fi
dtrace=$1
t="season_7_lisa_the_vegetrian_t *"
exe="tst.aouttype.exe"
elfdump "./$exe" | grep -q '.SUNW_ctf'
if [[ $? -ne 0 ]]; then
echo "CTF does not exist in $exe, that's a bug" >&2
exit 1
fi
./$exe &
pid=$!
rc=`$dtrace -n "BEGIN{ trace((pid$pid\`$t)0); exit(0); }"`
kill -9 $pid
exit $rc

View file

@ -0,0 +1,79 @@
/*
* This file and its contents are supplied under the terms of the
* Common Development and Distribution License ("CDDL"), version 1.0.
* You may only use this file in accordance with the terms of version
* 1.0 of the CDDL.
*
* A full copy of the text of the CDDL should have accompanied this
* source. A copy of the CDDL is also available via the Internet at
* http://www.illumos.org/license/CDDL.
*/
/*
* Copyright 2013 (c) Joyent, Inc. All rights reserved.
*/
/*
* This test takes data from the current binary which is basically running in a
* loop between two functions and our goal is to have two unique types that they
* contain which we can print.
*/
#include <unistd.h>
typedef struct zelda_info {
char *zi_gamename;
int zi_ndungeons;
char *zi_villain;
int zi_haszelda;
} zelda_info_t;
static int
has_princess(zelda_info_t *z)
{
return (z->zi_haszelda);
}
static int
has_dungeons(zelda_info_t *z)
{
return (z->zi_ndungeons != 0);
}
static const char *
has_villain(zelda_info_t *z)
{
return (z->zi_villain);
}
int
main(void)
{
zelda_info_t oot;
zelda_info_t la;
zelda_info_t lttp;
oot.zi_gamename = "Ocarina of Time";
oot.zi_ndungeons = 10;
oot.zi_villain = "Ganondorf";
oot.zi_haszelda = 1;
la.zi_gamename = "Link's Awakening";
la.zi_ndungeons = 9;
la.zi_villain = "Nightmare";
la.zi_haszelda = 0;
lttp.zi_gamename = "A Link to the Past";
lttp.zi_ndungeons = 12;
lttp.zi_villain = "Ganon";
lttp.zi_haszelda = 1;
for (;;) {
(void) has_princess(&oot);
(void) has_dungeons(&la);
(void) has_villain(&lttp);
sleep(1);
}
return (0);
}

View file

@ -0,0 +1,76 @@
#! /usr/bin/ksh
#
#
# This file and its contents are supplied under the terms of the
# Common Development and Distribution License ("CDDL"), version 1.0.
# You may only use this file in accordance with the terms of version
# 1.0 of the CDDL.
#
# A full copy of the text of the CDDL should have accompanied this
# source. A copy of the CDDL is also available via the Internet at
# http://www.illumos.org/license/CDDL.
#
#
# Copyright (c) 2013 Joyent, Inc. All rights reserved.
#
#
# This test is checking that we can read members and that pointers inside
# members point to valid data that is intelligible, eg. strings.
#
if [ $# != 1 ]; then
echo expected one argument: '<'dtrace-path'>'
exit 2
fi
dtrace=$1
t="zelda_info_t"
exe="tst.chasestrings.exe"
elfdump "./$exe" | grep -q '.SUNW_ctf'
if [[ $? -ne 0 ]]; then
echo "CTF does not exist in $exe, that's a bug" >&2
exit 1
fi
./$exe &
pid=$!
$dtrace -qs /dev/stdin <<EOF
pid$pid::has_princess:entry
/next == 0/
{
this->t = (pid$pid\`$t *)(copyin(arg0, sizeof (pid$pid\`$t)));
printf("game: %s, dungeon: %d, villain: %s, zelda: %d\n",
copyinstr((uintptr_t)this->t->zi_gamename), this->t->zi_ndungeons,
copyinstr((uintptr_t)this->t->zi_villain), this->t->zi_haszelda);
next = 1;
}
pid$pid::has_dungeons:entry
/next == 1/
{
this->t = (pid$pid\`$t *)(copyin(arg0, sizeof (pid$pid\`$t)));
printf("game: %s, dungeon: %d, villain: %s, zelda: %d\n",
copyinstr((uintptr_t)this->t->zi_gamename), this->t->zi_ndungeons,
copyinstr((uintptr_t)this->t->zi_villain), this->t->zi_haszelda);
next = 2;
}
pid$pid::has_villain:entry
/next == 2/
{
this->t = (pid$pid\`$t *)(copyin(arg0, sizeof (pid$pid\`$t)));
printf("game: %s, dungeon: %d, villain: %s, zelda: %d\n",
copyinstr((uintptr_t)this->t->zi_gamename), this->t->zi_ndungeons,
copyinstr((uintptr_t)this->t->zi_villain), this->t->zi_haszelda);
exit(0);
}
EOF
rc=$?
kill -9 $pid
exit $rc

View file

@ -0,0 +1,4 @@
game: Ocarina of Time, dungeon: 10, villain: Ganondorf, zelda: 1
game: Link's Awakening, dungeon: 9, villain: Nightmare, zelda: 0
game: A Link to the Past, dungeon: 12, villain: Ganon, zelda: 1

View file

@ -0,0 +1,29 @@
/*
* This file and its contents are supplied under the terms of the
* Common Development and Distribution License ("CDDL"), version 1.0.
* You may only use this file in accordance with the terms of version
* 1.0 of the CDDL.
*
* A full copy of the text of the CDDL should have accompanied this
* source. A copy of the CDDL is also available via the Internet at
* http://www.illumos.org/license/CDDL.
*/
/*
* Copyright 2013 (c) Joyent, Inc. All rights reserved.
*/
/*
* We're linked against libc which has types, though we do not.
*/
#include <unistd.h>
int
main(void)
{
for (;;) {
sleep(1000);
}
/*NOTREACHED*/
return (0);
}

View file

@ -0,0 +1,45 @@
#! /usr/bin/ksh
#
#
# This file and its contents are supplied under the terms of the
# Common Development and Distribution License ("CDDL"), version 1.0.
# You may only use this file in accordance with the terms of version
# 1.0 of the CDDL.
#
# A full copy of the text of the CDDL should have accompanied this
# source. A copy of the CDDL is also available via the Internet at
# http://www.illumos.org/license/CDDL.
#
#
# Copyright (c) 2013 Joyent, Inc. All rights reserved.
#
#
# Here we want to make sure that the program in question does not have ctf data
# in its a.out; however, we can get types out of a linked libc.
#
if [ $# != 1 ]; then
echo expected one argument: '<'dtrace-path'>'
exit 2
fi
dtrace=$1
t="int"
exe="tst.libtype.exe"
elfdump "./$exe" | grep -q '.SUNW_ctf'
if [[ $? -eq 0 ]]; then
echo "CTF exists in $exe, that's a bug" >&2
exit 1
fi
./$exe &
pid=$!
rc=`$dtrace -n "BEGIN{ trace((pid$pid\`$t)0); exit(0); }"`
kill -9 $pid
exit $rc

View file

@ -0,0 +1,44 @@
#! /usr/bin/ksh
#
#
# This file and its contents are supplied under the terms of the
# Common Development and Distribution License ("CDDL"), version 1.0.
# You may only use this file in accordance with the terms of version
# 1.0 of the CDDL.
#
# A full copy of the text of the CDDL should have accompanied this
# source. A copy of the CDDL is also available via the Internet at
# http://www.illumos.org/license/CDDL.
#
#
# Copyright (c) 2013 Joyent, Inc. All rights reserved.
#
#
# We should be able to see both strstr from libc and from ld on an
# alternate linkmap.
#
if [ $# != 1 ]; then
echo expected one argument: '<'dtrace-path'>'
exit 2
fi
dtrace=$1
$dtrace -q -p $$ -s /dev/stdin <<EOF
pid\$target:LM1\`ld.so.1:strstr:entry,
pid\$target:libc.so.1:strstr:entry
{
exit (0);
}
BEGIN
{
exit (0);
}
EOF
rc=$?
exit $rc

View file

@ -0,0 +1,69 @@
#! /usr/bin/ksh
#
#
# This file and its contents are supplied under the terms of the
# Common Development and Distribution License ("CDDL"), version 1.0.
# You may only use this file in accordance with the terms of version
# 1.0 of the CDDL.
#
# A full copy of the text of the CDDL should have accompanied this
# source. A copy of the CDDL is also available via the Internet at
# http://www.illumos.org/license/CDDL.
#
#
# Copyright (c) 2013 Joyent, Inc. All rights reserved.
#
#
# Use print() on userland CTF types and verify we get the data we expect.
#
if [ $# != 1 ]; then
echo expected one argument: '<'dtrace-path'>'
exit 2
fi
dtrace=$1
t="final_fantasy_info_t"
exe="tst.printtype.exe"
elfdump "./$exe" | grep -q '.SUNW_ctf'
if [[ $? -ne 0 ]]; then
echo "CTF does not exist in $exe, that's a bug" >&2
exit 1
fi
./$exe &
pid=$!
$dtrace -qs /dev/stdin <<EOF
pid$pid::ff_getgameid:entry
/next == 0/
{
print(*args[0]);
printf("\n");
next = 1;
}
pid$pid::ff_getpartysize:entry
/next == 1/
{
print(*args[0]);
printf("\n");
next = 2;
}
pid$pid::ff_getsummons:entry
/next == 2/
{
print(*args[0]);
printf("\n");
exit(0);
}
EOF
rc=$?
kill -9 $pid
exit $rc

View file

@ -0,0 +1,70 @@
#! /usr/bin/ksh
#
#
# This file and its contents are supplied under the terms of the
# Common Development and Distribution License ("CDDL"), version 1.0.
# You may only use this file in accordance with the terms of version
# 1.0 of the CDDL.
#
# A full copy of the text of the CDDL should have accompanied this
# source. A copy of the CDDL is also available via the Internet at
# http://www.illumos.org/license/CDDL.
#
#
# Copyright (c) 2013 Joyent, Inc. All rights reserved.
#
#
# Use print() on userland CTF types and verify we get the data we
# expect. This time, use $target to make sure that path works correctly.
#
if [ $# != 1 ]; then
echo expected one argument: '<'dtrace-path'>'
exit 2
fi
dtrace=$1
t="final_fantasy_info_t"
exe="tst.printtype.exe"
elfdump "./$exe" | grep -q '.SUNW_ctf'
if [[ $? -ne 0 ]]; then
echo "CTF does not exist in $exe, that's a bug" >&2
exit 1
fi
./$exe &
pid=$!
$dtrace -p $pid -qs /dev/stdin <<EOF
pid\$target::ff_getgameid:entry
/next == 0/
{
print(*args[0]);
printf("\n");
next = 1;
}
pid\$target::ff_getpartysize:entry
/next == 1/
{
print(*args[0]);
printf("\n");
next = 2;
}
pid\$target::ff_getsummons:entry
/next == 2/
{
print(*args[0]);
printf("\n");
exit(0);
}
EOF
rc=$?
kill -9 $pid
exit $rc

View file

@ -0,0 +1,72 @@
/*
* This file and its contents are supplied under the terms of the
* Common Development and Distribution License ("CDDL"), version 1.0.
* You may only use this file in accordance with the terms of version
* 1.0 of the CDDL.
*
* A full copy of the text of the CDDL should have accompanied this
* source. A copy of the CDDL is also available via the Internet at
* http://www.illumos.org/license/CDDL.
*/
/*
* Copyright 2013 (c) Joyent, Inc. All rights reserved.
*/
/*
* The point of this is to use print() on various functions to make sure that we
* can print basic structures. Note that we purposefully are making sure that
* there are no pointers here.
*/
#include <unistd.h>
typedef struct final_fantasy_info {
int ff_gameid;
int ff_partysize;
int ff_hassummons;
} final_fantasy_info_t;
static int
ff_getgameid(final_fantasy_info_t *f)
{
return (0);
}
static int
ff_getpartysize(final_fantasy_info_t *f)
{
return (0);
}
static int
ff_getsummons(final_fantasy_info_t *f)
{
return (0);
}
int
main(void)
{
final_fantasy_info_t ffiii, ffx, ffi;
ffi.ff_gameid = 1;
ffi.ff_partysize = 4;
ffi.ff_hassummons = 0;
ffiii.ff_gameid = 6;
ffiii.ff_partysize = 4;
ffiii.ff_hassummons = 1;
ffx.ff_gameid = 10;
ffx.ff_partysize = 3;
ffx.ff_hassummons = 1;
for (;;) {
ff_getgameid(&ffi);
ff_getpartysize(&ffx);
ff_getsummons(&ffiii);
sleep(1);
}
/*NOTREACHED*/
return (0);
}

View file

@ -0,0 +1,69 @@
#! /usr/bin/ksh
#
#
# This file and its contents are supplied under the terms of the
# Common Development and Distribution License ("CDDL"), version 1.0.
# You may only use this file in accordance with the terms of version
# 1.0 of the CDDL.
#
# A full copy of the text of the CDDL should have accompanied this
# source. A copy of the CDDL is also available via the Internet at
# http://www.illumos.org/license/CDDL.
#
#
# Copyright (c) 2013 Joyent, Inc. All rights reserved.
#
#
# Use print() on userland CTF types and verify we get the data we expect.
#
if [ $# != 1 ]; then
echo expected one argument: '<'dtrace-path'>'
exit 2
fi
dtrace=$1
t="final_fantasy_info_t"
exe="tst.printtype.exe"
elfdump "./$exe" | grep -q '.SUNW_ctf'
if [[ $? -ne 0 ]]; then
echo "CTF does not exist in $exe, that's a bug" >&2
exit 1
fi
./$exe &
pid=$!
$dtrace -qs /dev/stdin <<EOF
pid$pid::ff_getgameid:entry
/next == 0/
{
print(*(pid$pid\`$t *)(copyin(arg0, sizeof (pid$pid\`$t))));
printf("\n");
next = 1;
}
pid$pid::ff_getpartysize:entry
/next == 1/
{
print(*(pid$pid\`$t *)(copyin(arg0, sizeof (pid$pid\`$t))));
printf("\n");
next = 2;
}
pid$pid::ff_getsummons:entry
/next == 2/
{
print(*(pid$pid\`$t *)(copyin(arg0, sizeof (pid$pid\`$t))));
printf("\n");
exit(0);
}
EOF
rc=$?
kill -9 $pid
exit $rc

View file

@ -0,0 +1,16 @@
final_fantasy_info_t {
int ff_gameid = 0x1
int ff_partysize = 0x4
int ff_hassummons = 0
}
final_fantasy_info_t {
int ff_gameid = 0xa
int ff_partysize = 0x3
int ff_hassummons = 0x1
}
final_fantasy_info_t {
int ff_gameid = 0x6
int ff_partysize = 0x4
int ff_hassummons = 0x1
}

View file

@ -0,0 +1,70 @@
#! /usr/bin/ksh
#
#
# This file and its contents are supplied under the terms of the
# Common Development and Distribution License ("CDDL"), version 1.0.
# You may only use this file in accordance with the terms of version
# 1.0 of the CDDL.
#
# A full copy of the text of the CDDL should have accompanied this
# source. A copy of the CDDL is also available via the Internet at
# http://www.illumos.org/license/CDDL.
#
#
# Copyright (c) 2013 Joyent, Inc. All rights reserved.
#
#
# Use print() on userland CTF types and verify we get the data we
# expect. Use the pid` alias for $target.
#
if [ $# != 1 ]; then
echo expected one argument: '<'dtrace-path'>'
exit 2
fi
dtrace=$1
t="final_fantasy_info_t"
exe="tst.printtype.exe"
elfdump "./$exe" | grep -q '.SUNW_ctf'
if [[ $? -ne 0 ]]; then
echo "CTF does not exist in $exe, that's a bug" >&2
exit 1
fi
./$exe &
pid=$!
$dtrace -p $pid -qs /dev/stdin <<EOF
pid\$target::ff_getgameid:entry
/next == 0/
{
print(*(pid\`$t *)(copyin(arg0, sizeof (pid\`$t))));
printf("\n");
next = 1;
}
pid\$target::ff_getpartysize:entry
/next == 1/
{
print(*(pid\`$t *)(copyin(arg0, sizeof (pid\`$t))));
printf("\n");
next = 2;
}
pid\$target::ff_getsummons:entry
/next == 2/
{
print(*(pid\`$t *)(copyin(arg0, sizeof (pid\`$t))));
printf("\n");
exit(0);
}
EOF
rc=$?
kill -9 $pid
exit $rc

View file

@ -0,0 +1,83 @@
#! /usr/bin/ksh
#
#
# This file and its contents are supplied under the terms of the
# Common Development and Distribution License ("CDDL"), version 1.0.
# You may only use this file in accordance with the terms of version
# 1.0 of the CDDL.
#
# A full copy of the text of the CDDL should have accompanied this
# source. A copy of the CDDL is also available via the Internet at
# http://www.illumos.org/license/CDDL.
#
#
# Copyright (c) 2013 Joyent, Inc. All rights reserved.
#
#
# Simple test that if we manually use the userland keyword that it
# works.
#
if [ $# != 1 ]; then
echo expected one argument: '<'dtrace-path'>'
exit 2
fi
dtrace=$1
t="zelda_info_t"
exe="tst.chasestrings.exe"
elfdump "./$exe" | grep -q '.SUNW_ctf'
if [[ $? -ne 0 ]]; then
echo "CTF does not exist in $exe, that's a bug" >&2
exit 1
fi
./$exe &
pid=$!
$dtrace -32 -qs /dev/stdin <<EOF
typedef struct info {
char *zi_gamename;
int zi_ndungeons;
char *zi_villain;
int zi_haszelda;
} info_t;
pid$pid::has_princess:entry
/next == 0/
{
this->t = (userland info_t *)arg0;
printf("game: %s, dungeon: %d, villain: %s, zelda: %d\n",
stringof(this->t->zi_gamename), this->t->zi_ndungeons,
stringof(this->t->zi_villain), this->t->zi_haszelda);
next = 1;
}
pid$pid::has_dungeons:entry
/next == 1/
{
this->t = (userland info_t *)arg0;
printf("game: %s, dungeon: %d, villain: %s, zelda: %d\n",
stringof(this->t->zi_gamename), this->t->zi_ndungeons,
stringof(this->t->zi_villain), this->t->zi_haszelda);
next = 2;
}
pid$pid::has_villain:entry
/next == 2/
{
this->t = (userland info_t *)arg0;
printf("game: %s, dungeon: %d, villain: %s, zelda: %d\n",
stringof(this->t->zi_gamename), this->t->zi_ndungeons,
stringof(this->t->zi_villain), this->t->zi_haszelda);
exit(0);
}
EOF
rc=$?
kill -9 $pid
exit $rc

View file

@ -0,0 +1,4 @@
game: Ocarina of Time, dungeon: 10, villain: Ganondorf, zelda: 1
game: Link's Awakening, dungeon: 9, villain: Nightmare, zelda: 0
game: A Link to the Past, dungeon: 12, villain: Ganon, zelda: 1

View file

@ -0,0 +1,72 @@
#! /usr/bin/ksh
#
#
# This file and its contents are supplied under the terms of the
# Common Development and Distribution License ("CDDL"), version 1.0.
# You may only use this file in accordance with the terms of version
# 1.0 of the CDDL.
#
# A full copy of the text of the CDDL should have accompanied this
# source. A copy of the CDDL is also available via the Internet at
# http://www.illumos.org/license/CDDL.
#
#
# Copyright (c) 2013 Joyent, Inc. All rights reserved.
#
#
# This test is checking that we can read members and that pointers inside
# members point to valid data that is intelligible, eg. strings.
#
if [ $# != 1 ]; then
echo expected one argument: '<'dtrace-path'>'
exit 2
fi
dtrace=$1
exe="tst.chasestrings.exe"
elfdump "./$exe" | grep -q '.SUNW_ctf'
if [[ $? -ne 0 ]]; then
echo "CTF does not exist in $exe, that's a bug" >&2
exit 1
fi
./$exe &
pid=$!
$dtrace -qs /dev/stdin <<EOF
pid$pid::has_princess:entry
/next == 0/
{
printf("game: %s, dungeon: %d, villain: %s, zelda: %d\n",
stringof(args[0]->zi_gamename), args[0]->zi_ndungeons,
stringof(args[0]->zi_villain), args[0]->zi_haszelda);
next = 1;
}
pid$pid::has_dungeons:entry
/next == 1/
{
printf("game: %s, dungeon: %d, villain: %s, zelda: %d\n",
stringof(args[0]->zi_gamename), args[0]->zi_ndungeons,
stringof(args[0]->zi_villain), args[0]->zi_haszelda);
next = 2;
}
pid$pid::has_villain:entry
/next == 2/
{
printf("game: %s, dungeon: %d, villain: %s, zelda: %d\n",
stringof(args[0]->zi_gamename), args[0]->zi_ndungeons,
stringof(args[0]->zi_villain), args[0]->zi_haszelda);
exit(0);
}
EOF
rc=$?
kill -9 $pid
exit $rc

View file

@ -0,0 +1,4 @@
game: Ocarina of Time, dungeon: 10, villain: Ganondorf, zelda: 1
game: Link's Awakening, dungeon: 9, villain: Nightmare, zelda: 0
game: A Link to the Past, dungeon: 12, villain: Ganon, zelda: 1

View file

@ -0,0 +1,106 @@
#
# CDDL HEADER START
#
# The contents of this file are subject to the terms of the
# Common Development and Distribution License (the "License").
# You may not use this file except in compliance with the License.
#
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
# or http://www.opensolaris.org/os/licensing.
# See the License for the specific language governing permissions
# and limitations under the License.
#
# When distributing Covered Code, include this CDDL HEADER in each
# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
# If applicable, add the following below this CDDL HEADER, with the
# fields enclosed by brackets "[]" replaced with your own identifying
# information: Portions Copyright [yyyy] [name of copyright owner]
#
# CDDL HEADER END
#
#
# Copyright (c) 2013, Joyent, Inc. All rights reserved.
#
if [ $# != 1 ]; then
echo expected one argument: '<'dtrace-path'>'
exit 2
fi
dtrace=$1
DIR=/var/tmp/dtest.$$
mkdir $DIR
cd $DIR
echo '#pragma D option quiet' > test.d
echo '#pragma D option aggsortkey' >> test.d
cat > test.c <<EOF
#include <unistd.h>
void
main()
{
EOF
objs=
for oogle in doogle bagnoogle; do
cat > $oogle.c <<EOF
#include <sys/sdt.h>
void
$oogle()
{
DTRACE_PROBE($oogle, knows);
}
EOF
cat > $oogle.d <<EOF
provider $oogle {
probe knows();
};
EOF
cc -c $oogle.c
if [ $? -ne 0 ]; then
print -u2 "failed to compile $oogle.c"
exit 1
fi
$dtrace -G -32 -s $oogle.d $oogle.o -o $oogle.d.o
if [ $? -ne 0 ]; then
print -u2 "failed to process $oogle.d"
exit 1
fi
objs="$objs $oogle.o $oogle.d.o"
echo $oogle'();' >> test.c
echo $oogle'$target:::{@[probefunc] = count()}' >> test.d
done
echo "}" >> test.c
echo 'END{printa("%-10s %@d\\n", @)}' >> test.d
cc -o test test.c $objs
if [ $? -ne 0 ]; then
print -u2 "failed to compile test.c"
exit 1
fi
$dtrace -s ./test.d -Zc ./test
if [ $? -ne 0 ]; then
print -u2 "failed to execute test"
exit 1
fi
cd /
/usr/bin/rm -rf $DIR
exit 0

View file

@ -0,0 +1,3 @@
bagnoogle 1
doogle 1

View file

@ -0,0 +1,59 @@
#
# CDDL HEADER START
#
# The contents of this file are subject to the terms of the
# Common Development and Distribution License (the "License").
# You may not use this file except in compliance with the License.
#
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
# or http://www.opensolaris.org/os/licensing.
# See the License for the specific language governing permissions
# and limitations under the License.
#
# When distributing Covered Code, include this CDDL HEADER in each
# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
# If applicable, add the following below this CDDL HEADER, with the
# fields enclosed by brackets "[]" replaced with your own identifying
# information: Portions Copyright [yyyy] [name of copyright owner]
#
# CDDL HEADER END
#
#
# Copyright (c) 2013, Joyent, Inc. All rights reserved.
#
if [ $# != 1 ]; then
echo expected one argument: '<'dtrace-path'>'
exit 2
fi
dtrace=$1
DIR=/var/tmp/dtest.$$
mkdir $DIR
cd $DIR
cat > test.c <<EOF
void
foo()
{}
EOF
cat > doogle.d <<EOF
provider doogle {
probe bagnoogle();
};
EOF
cc -c test.c
$dtrace -G -32 -s doogle.d test.o -o doogle.d.o
if [ $? -eq 0 ]; then
print -u2 "dtrace succeeded despite having no probe sites"
exit 1
fi
cd /
/usr/bin/rm -rf $DIR
exit 0

View file

@ -14,12 +14,12 @@
.\"
.\" Copyright 2012, Richard Lowe.
.\" Copyright (c) 2012, Marcelo Araujo <araujo@FreeBSD.org>.
.\" Copyright (c) 2012 by Delphix. All rights reserved.
.\" Copyright (c) 2012, 2014 by Delphix. All rights reserved.
.\" All Rights Reserved.
.\"
.\" $FreeBSD$
.\"
.Dd March 20, 2014
.Dd July 1, 2014
.Dt ZDB 8
.Os
.Sh NAME
@ -32,6 +32,7 @@
.Op Fl t Ar txg
.Op Fl U Ar cache
.Op Fl M Ar inflight I/Os
.Op Fl x Ar dumpdir
.Ar poolname
.Op Ar object ...
.Nm
@ -217,6 +218,14 @@ Operate on an exported pool, not present in
The
.Fl p
flag specifies the path under which devices are to be searched.
.It Fl x Ar dumpdir
All blocks accessed will be copied to files in the specified directory.
The blocks will be placed in sparse files whose name is the same as
that of the file or device read. zdb can be then run on the generated files.
Note that the
.Fl bbc
flags are sufficient to access (and thus copy)
all metadata on the pool.
.It Fl F
Attempt to make an unreadable pool readable by trying progressively older
transactions.

View file

@ -21,7 +21,7 @@
/*
* Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2012, 2014 by Delphix. All rights reserved.
* Copyright (c) 2011, 2014 by Delphix. All rights reserved.
*/
#include <stdio.h>
@ -75,9 +75,9 @@
DMU_OT_ZAP_OTHER : DMU_OT_NUMTYPES))
#ifndef lint
extern int zfs_recover;
extern boolean_t zfs_recover;
#else
int zfs_recover;
boolean_t zfs_recover;
#endif
const char cmdname[] = "zdb";
@ -112,7 +112,7 @@ usage(void)
{
(void) fprintf(stderr,
"Usage: %s [-CumdibcsDvhLXFPA] [-t txg] [-e [-p path...]] "
"[-U config] [-M inflight I/Os] poolname [object...]\n"
"[-U config] [-M inflight I/Os] [-x dumpdir] poolname [object...]\n"
" %s [-divPA] [-e -p path...] [-U config] dataset "
"[object...]\n"
" %s -m [-LXFPA] [-t txg] [-e [-p path...]] [-U config] "
@ -150,7 +150,7 @@ usage(void)
(void) fprintf(stderr, " -R read and display block from a "
"device\n\n");
(void) fprintf(stderr, " Below options are intended for use "
"with other options (except -l):\n");
"with other options:\n");
(void) fprintf(stderr, " -A ignore assertions (-A), enable "
"panic recovery (-AA) or both (-AAA)\n");
(void) fprintf(stderr, " -F attempt automatic rewind within "
@ -163,11 +163,14 @@ usage(void)
"has altroot/not in a cachefile\n");
(void) fprintf(stderr, " -p <path> -- use one or more with "
"-e to specify path to vdev dir\n");
(void) fprintf(stderr, " -P print numbers in parseable form\n");
(void) fprintf(stderr, " -x <dumpdir> -- "
"dump all read blocks into specified directory\n");
(void) fprintf(stderr, " -P print numbers in parseable form\n");
(void) fprintf(stderr, " -t <txg> -- highest txg to use when "
"searching for uberblocks\n");
(void) fprintf(stderr, " -M <number of inflight I/Os> -- "
"specify the maximum number of checksumming I/Os [default is 200]");
"specify the maximum number of "
"checksumming I/Os [default is 200]\n");
(void) fprintf(stderr, "Specify an option more than once (e.g. -bb) "
"to make only that option verbose\n");
(void) fprintf(stderr, "Default is to dump everything non-verbosely\n");
@ -1032,7 +1035,8 @@ dump_dnode(objset_t *os, uint64_t object, void *data, size_t size)
}
static uint64_t
blkid2offset(const dnode_phys_t *dnp, const blkptr_t *bp, const zbookmark_t *zb)
blkid2offset(const dnode_phys_t *dnp, const blkptr_t *bp,
const zbookmark_phys_t *zb)
{
if (dnp == NULL) {
ASSERT(zb->zb_level < 0);
@ -1059,8 +1063,17 @@ snprintf_blkptr_compact(char *blkbuf, size_t buflen, const blkptr_t *bp)
return;
}
blkbuf[0] = '\0';
if (BP_IS_EMBEDDED(bp)) {
(void) sprintf(blkbuf,
"EMBEDDED et=%u %llxL/%llxP B=%llu",
(int)BPE_GET_ETYPE(bp),
(u_longlong_t)BPE_GET_LSIZE(bp),
(u_longlong_t)BPE_GET_PSIZE(bp),
(u_longlong_t)bp->blk_birth);
return;
}
blkbuf[0] = '\0';
for (int i = 0; i < ndvas; i++)
(void) snprintf(blkbuf + strlen(blkbuf),
buflen - strlen(blkbuf), "%llu:%llx:%llx ",
@ -1078,21 +1091,23 @@ snprintf_blkptr_compact(char *blkbuf, size_t buflen, const blkptr_t *bp)
"%llxL/%llxP F=%llu B=%llu/%llu",
(u_longlong_t)BP_GET_LSIZE(bp),
(u_longlong_t)BP_GET_PSIZE(bp),
(u_longlong_t)bp->blk_fill,
(u_longlong_t)BP_GET_FILL(bp),
(u_longlong_t)bp->blk_birth,
(u_longlong_t)BP_PHYSICAL_BIRTH(bp));
}
}
static void
print_indirect(blkptr_t *bp, const zbookmark_t *zb,
print_indirect(blkptr_t *bp, const zbookmark_phys_t *zb,
const dnode_phys_t *dnp)
{
char blkbuf[BP_SPRINTF_LEN];
int l;
ASSERT3U(BP_GET_TYPE(bp), ==, dnp->dn_type);
ASSERT3U(BP_GET_LEVEL(bp), ==, zb->zb_level);
if (!BP_IS_EMBEDDED(bp)) {
ASSERT3U(BP_GET_TYPE(bp), ==, dnp->dn_type);
ASSERT3U(BP_GET_LEVEL(bp), ==, zb->zb_level);
}
(void) printf("%16llx ", (u_longlong_t)blkid2offset(dnp, bp, zb));
@ -1112,7 +1127,7 @@ print_indirect(blkptr_t *bp, const zbookmark_t *zb,
static int
visit_indirect(spa_t *spa, const dnode_phys_t *dnp,
blkptr_t *bp, const zbookmark_t *zb)
blkptr_t *bp, const zbookmark_phys_t *zb)
{
int err = 0;
@ -1138,7 +1153,7 @@ visit_indirect(spa_t *spa, const dnode_phys_t *dnp,
/* recursively visit blocks below this */
cbp = buf->b_data;
for (i = 0; i < epb; i++, cbp++) {
zbookmark_t czb;
zbookmark_phys_t czb;
SET_BOOKMARK(&czb, zb->zb_objset, zb->zb_object,
zb->zb_level - 1,
@ -1146,10 +1161,10 @@ visit_indirect(spa_t *spa, const dnode_phys_t *dnp,
err = visit_indirect(spa, dnp, cbp, &czb);
if (err)
break;
fill += cbp->blk_fill;
fill += BP_GET_FILL(cbp);
}
if (!err)
ASSERT3U(fill, ==, bp->blk_fill);
ASSERT3U(fill, ==, BP_GET_FILL(bp));
(void) arc_buf_remove_ref(buf, &buf);
}
@ -1162,7 +1177,7 @@ dump_indirect(dnode_t *dn)
{
dnode_phys_t *dnp = dn->dn_phys;
int j;
zbookmark_t czb;
zbookmark_phys_t czb;
(void) printf("Indirect blocks:\n");
@ -1816,14 +1831,14 @@ dump_dir(objset_t *os)
if (dds.dds_type == DMU_OST_META) {
dds.dds_creation_txg = TXG_INITIAL;
usedobjs = os->os_rootbp->blk_fill;
usedobjs = BP_GET_FILL(os->os_rootbp);
refdbytes = os->os_spa->spa_dsl_pool->
dp_mos_dir->dd_phys->dd_used_bytes;
} else {
dmu_objset_space(os, &refdbytes, &scratch, &usedobjs, &scratch);
}
ASSERT3U(usedobjs, ==, os->os_rootbp->blk_fill);
ASSERT3U(usedobjs, ==, BP_GET_FILL(os->os_rootbp));
zdb_nicenum(refdbytes, numbuf);
@ -2108,6 +2123,8 @@ typedef struct zdb_blkstats {
uint64_t zb_lsize;
uint64_t zb_psize;
uint64_t zb_count;
uint64_t zb_gangs;
uint64_t zb_ditto_samevdev;
uint64_t zb_psize_histogram[PSIZE_HISTO_SIZE];
} zdb_blkstats_t;
@ -2132,6 +2149,9 @@ typedef struct zdb_cb {
zdb_blkstats_t zcb_type[ZB_TOTAL + 1][ZDB_OT_TOTAL + 1];
uint64_t zcb_dedup_asize;
uint64_t zcb_dedup_blocks;
uint64_t zcb_embedded_blocks[NUM_BP_EMBEDDED_TYPES];
uint64_t zcb_embedded_histogram[NUM_BP_EMBEDDED_TYPES]
[BPE_PAYLOAD_SIZE];
uint64_t zcb_start;
uint64_t zcb_lastprint;
uint64_t zcb_totalasize;
@ -2155,6 +2175,7 @@ zdb_count_block(zdb_cb_t *zcb, zilog_t *zilog, const blkptr_t *bp,
for (int i = 0; i < 4; i++) {
int l = (i < 2) ? BP_GET_LEVEL(bp) : ZB_TOTAL;
int t = (i & 1) ? type : ZDB_OT_TOTAL;
int equal;
zdb_blkstats_t *zb = &zcb->zcb_type[l][t];
zb->zb_asize += BP_GET_ASIZE(bp);
@ -2162,6 +2183,34 @@ zdb_count_block(zdb_cb_t *zcb, zilog_t *zilog, const blkptr_t *bp,
zb->zb_psize += BP_GET_PSIZE(bp);
zb->zb_count++;
zb->zb_psize_histogram[BP_GET_PSIZE(bp) >> SPA_MINBLOCKSHIFT]++;
zb->zb_gangs += BP_COUNT_GANG(bp);
switch (BP_GET_NDVAS(bp)) {
case 2:
if (DVA_GET_VDEV(&bp->blk_dva[0]) ==
DVA_GET_VDEV(&bp->blk_dva[1]))
zb->zb_ditto_samevdev++;
break;
case 3:
equal = (DVA_GET_VDEV(&bp->blk_dva[0]) ==
DVA_GET_VDEV(&bp->blk_dva[1])) +
(DVA_GET_VDEV(&bp->blk_dva[0]) ==
DVA_GET_VDEV(&bp->blk_dva[2])) +
(DVA_GET_VDEV(&bp->blk_dva[1]) ==
DVA_GET_VDEV(&bp->blk_dva[2]));
if (equal != 0)
zb->zb_ditto_samevdev++;
break;
}
}
if (BP_IS_EMBEDDED(bp)) {
zcb->zcb_embedded_blocks[BPE_GET_ETYPE(bp)]++;
zcb->zcb_embedded_histogram[BPE_GET_ETYPE(bp)]
[BPE_GET_PSIZE(bp)]++;
return;
}
if (dump_opt['L'])
@ -2200,7 +2249,7 @@ zdb_blkptr_done(zio_t *zio)
blkptr_t *bp = zio->io_bp;
int ioerr = zio->io_error;
zdb_cb_t *zcb = zio->io_private;
zbookmark_t *zb = &zio->io_bookmark;
zbookmark_phys_t *zb = &zio->io_bookmark;
zio_data_buf_free(zio->io_data, zio->io_size);
@ -2235,7 +2284,7 @@ zdb_blkptr_done(zio_t *zio)
/* ARGSUSED */
static int
zdb_blkptr_cb(spa_t *spa, zilog_t *zilog, const blkptr_t *bp,
const zbookmark_t *zb, const dnode_phys_t *dnp, void *arg)
const zbookmark_phys_t *zb, const dnode_phys_t *dnp, void *arg)
{
zdb_cb_t *zcb = arg;
dmu_object_type_t type;
@ -2263,7 +2312,8 @@ zdb_blkptr_cb(spa_t *spa, zilog_t *zilog, const blkptr_t *bp,
is_metadata = (BP_GET_LEVEL(bp) != 0 || DMU_OT_IS_METADATA(type));
if (dump_opt['c'] > 1 || (dump_opt['c'] && is_metadata)) {
if (!BP_IS_EMBEDDED(bp) &&
(dump_opt['c'] > 1 || (dump_opt['c'] && is_metadata))) {
size_t size = BP_GET_PSIZE(bp);
void *data = zio_data_buf_alloc(size);
int flags = ZIO_FLAG_CANFAIL | ZIO_FLAG_SCRUB | ZIO_FLAG_RAW;
@ -2455,7 +2505,7 @@ dump_block_stats(spa_t *spa)
zdb_blkstats_t *zb, *tzb;
uint64_t norm_alloc, norm_space, total_alloc, total_found;
int flags = TRAVERSE_PRE | TRAVERSE_PREFETCH_METADATA | TRAVERSE_HARD;
int leaks = 0;
boolean_t leaks = B_FALSE;
(void) printf("\nTraversing all blocks %s%s%s%s%s...\n\n",
(dump_opt['c'] || !dump_opt['L']) ? "to verify " : "",
@ -2543,7 +2593,7 @@ dump_block_stats(spa_t *spa)
(u_longlong_t)total_alloc,
(dump_opt['L']) ? "unreachable" : "leaked",
(longlong_t)(total_alloc - total_found));
leaks = 1;
leaks = B_TRUE;
}
if (tzb->zb_count == 0)
@ -2552,6 +2602,8 @@ dump_block_stats(spa_t *spa)
(void) printf("\n");
(void) printf("\tbp count: %10llu\n",
(u_longlong_t)tzb->zb_count);
(void) printf("\tganged count: %10llu\n",
(longlong_t)tzb->zb_gangs);
(void) printf("\tbp logical: %10llu avg: %6llu\n",
(u_longlong_t)tzb->zb_lsize,
(u_longlong_t)(tzb->zb_lsize / tzb->zb_count));
@ -2573,6 +2625,28 @@ dump_block_stats(spa_t *spa)
(void) printf("\tSPA allocated: %10llu used: %5.2f%%\n",
(u_longlong_t)norm_alloc, 100.0 * norm_alloc / norm_space);
for (bp_embedded_type_t i = 0; i < NUM_BP_EMBEDDED_TYPES; i++) {
if (zcb.zcb_embedded_blocks[i] == 0)
continue;
(void) printf("\n");
(void) printf("\tadditional, non-pointer bps of type %u: "
"%10llu\n",
i, (u_longlong_t)zcb.zcb_embedded_blocks[i]);
if (dump_opt['b'] >= 3) {
(void) printf("\t number of (compressed) bytes: "
"number of bps\n");
dump_histogram(zcb.zcb_embedded_histogram[i],
sizeof (zcb.zcb_embedded_histogram[i]) /
sizeof (zcb.zcb_embedded_histogram[i][0]), 0);
}
}
if (tzb->zb_ditto_samevdev != 0) {
(void) printf("\tDittoed blocks on same vdev: %llu\n",
(longlong_t)tzb->zb_ditto_samevdev);
}
if (dump_opt['b'] >= 2) {
int l, t, level;
(void) printf("\nBlocks\tLSIZE\tPSIZE\tASIZE"
@ -2580,7 +2654,7 @@ dump_block_stats(spa_t *spa)
for (t = 0; t <= ZDB_OT_TOTAL; t++) {
char csize[32], lsize[32], psize[32], asize[32];
char avg[32];
char avg[32], gang[32];
char *typename;
if (t < DMU_OT_NUMTYPES)
@ -2621,6 +2695,7 @@ dump_block_stats(spa_t *spa)
zdb_nicenum(zb->zb_psize, psize);
zdb_nicenum(zb->zb_asize, asize);
zdb_nicenum(zb->zb_asize / zb->zb_count, avg);
zdb_nicenum(zb->zb_gangs, gang);
(void) printf("%6s\t%5s\t%5s\t%5s\t%5s"
"\t%5.2f\t%6.2f\t",
@ -2634,6 +2709,11 @@ dump_block_stats(spa_t *spa)
(void) printf(" L%d %s\n",
level, typename);
if (dump_opt['b'] >= 3 && zb->zb_gangs > 0) {
(void) printf("\t number of ganged "
"blocks: %s\n", gang);
}
if (dump_opt['b'] >= 4) {
(void) printf("psize "
"(in 512-byte sectors): "
@ -2668,20 +2748,20 @@ typedef struct zdb_ddt_entry {
/* ARGSUSED */
static int
zdb_ddt_add_cb(spa_t *spa, zilog_t *zilog, const blkptr_t *bp,
const zbookmark_t *zb, const dnode_phys_t *dnp, void *arg)
const zbookmark_phys_t *zb, const dnode_phys_t *dnp, void *arg)
{
avl_tree_t *t = arg;
avl_index_t where;
zdb_ddt_entry_t *zdde, zdde_search;
if (BP_IS_HOLE(bp))
if (BP_IS_HOLE(bp) || BP_IS_EMBEDDED(bp))
return (0);
if (dump_opt['S'] > 1 && zb->zb_level == ZB_ROOT_LEVEL) {
(void) printf("traversing objset %llu, %llu objects, "
"%lu blocks so far\n",
(u_longlong_t)zb->zb_objset,
(u_longlong_t)bp->blk_fill,
(u_longlong_t)BP_GET_FILL(bp),
avl_numnodes(t));
}
@ -3279,7 +3359,8 @@ main(int argc, char **argv)
dprintf_setup(&argc, argv);
while ((c = getopt(argc, argv, "bcdhilmM:suCDRSAFLXevp:t:U:P")) != -1) {
while ((c = getopt(argc, argv,
"bcdhilmM:suCDRSAFLXx:evp:t:U:P")) != -1) {
switch (c) {
case 'b':
case 'c':
@ -3332,6 +3413,9 @@ main(int argc, char **argv)
}
searchdirs[nsearch++] = optarg;
break;
case 'x':
vn_dumpdir = optarg;
break;
case 't':
max_txg = strtoull(optarg, NULL, 0);
if (max_txg < TXG_INITIAL) {

View file

@ -24,7 +24,7 @@
*/
/*
* Copyright (c) 2013 by Delphix. All rights reserved.
* Copyright (c) 2013, 2014 by Delphix. All rights reserved.
*/
/*
@ -122,7 +122,7 @@ zil_prt_rec_write(zilog_t *zilog, int txtype, lr_write_t *lr)
{
char *data, *dlimit;
blkptr_t *bp = &lr->lr_blkptr;
zbookmark_t zb;
zbookmark_phys_t zb;
char buf[SPA_MAXBLOCKSIZE];
int verbose = MAX(dump_opt['d'], dump_opt['i']);
int error;

View file

@ -30,7 +30,7 @@
.\"
.\" $FreeBSD$
.\"
.Dd May 27, 2014
.Dd June 30, 2014
.Dt ZFS 8
.Os
.Sh NAME
@ -179,11 +179,12 @@
.Ar bookmark
.Nm
.Cm send
.Op Fl DnPpRv
.Op Fl DnPpRve
.Op Fl i Ar snapshot | Fl I Ar snapshot
.Ar snapshot
.Nm
.Cm send
.Op Fl e
.Op Fl i Ar snapshot Ns | Ns bookmark
.Ar filesystem Ns | Ns Ar volume Ns | Ns Ar snapshot
.Nm
@ -2476,7 +2477,7 @@ feature.
.It Xo
.Nm
.Cm send
.Op Fl DnPpRv
.Op Fl DnPpRve
.Op Fl i Ar snapshot | Fl I Ar snapshot
.Ar snapshot
.Xc
@ -2548,6 +2549,29 @@ be used regardless of the dataset's
property, but performance will be much better if the filesystem uses a
dedup-capable checksum (eg.
.Sy sha256 ) .
.It Fl e
Generate a more compact stream by using WRITE_EMBEDDED records for blocks
which are stored more compactly on disk by the
.Sy embedded_data
pool
feature.
This flag has no effect if the
.Sy embedded_data
feature is
disabled.
The receiving system must have the
.Sy embedded_data
feature
enabled.
If the
.Sy lz4_compress
feature is active on the sending system,
then the receiving system must have that feature enabled as well.
See
.Xr zpool-features 7
for details on ZFS feature flags and the
.Sy embedded_data
feature.
.It Fl p
Include the dataset's properties in the stream. This flag is implicit when
.Fl R
@ -2572,6 +2596,7 @@ on future versions of
.It Xo
.Nm
.Cm send
.Op Fl e
.Op Fl i Ar snapshot Ns | Ns Ar bookmark
.Ar filesystem Ns | Ns Ar volume Ns | Ns Ar snapshot
.Xc
@ -2597,6 +2622,29 @@ specified as the last component of the name
If the incremental target is a clone, the incremental source can
be the origin snapshot, or an earlier snapshot in the origin's filesystem,
or the origin's origin, etc.
.It Fl e
Generate a more compact stream by using WRITE_EMBEDDED records for blocks
which are stored more compactly on disk by the
.Sy embedded_data
pool
feature.
This flag has no effect if the
.Sy embedded_data
feature is
disabled.
The receiving system must have the
.Sy embedded_data
feature
enabled.
If the
.Sy lz4_compress
feature is active on the sending system,
then the receiving system must have that feature enabled as well.
See
.Xr zpool-features 7
for details on ZFS feature flags and the
.Sy embedded_data
feature.
.El
.It Xo
.Nm

View file

@ -21,7 +21,7 @@
/*
* Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2013 by Delphix. All rights reserved.
* Copyright (c) 2011, 2014 by Delphix. All rights reserved.
* Copyright 2012 Milan Jurik. All rights reserved.
* Copyright (c) 2012, Joyent, Inc. All rights reserved.
* Copyright (c) 2011-2012 Pawel Jakub Dawidek <pawel@dawidek.net>.
@ -274,9 +274,9 @@ get_usage(zfs_help_t idx)
case HELP_ROLLBACK:
return (gettext("\trollback [-rRf] <snapshot>\n"));
case HELP_SEND:
return (gettext("\tsend [-DnPpRv] [-[iI] snapshot] "
return (gettext("\tsend [-DnPpRve] [-[iI] snapshot] "
"<snapshot>\n"
"\tsend [-i snapshot|bookmark] "
"\tsend [-e] [-i snapshot|bookmark] "
"<filesystem|volume|snapshot>\n"));
case HELP_SET:
return (gettext("\tset <property=value> "
@ -590,6 +590,7 @@ finish_progress(char *done)
free(pt_header);
pt_header = NULL;
}
/*
* zfs clone [-p] [-o prop=value] ... <snap> <fs | vol>
*
@ -3368,6 +3369,7 @@ rollback_check_dependent(zfs_handle_t *zhp, void *data)
zfs_close(zhp);
return (0);
}
/*
* Report any snapshots more recent than the one specified. Used when '-r' is
* not specified. We reuse this same callback for the snapshot dependents - if
@ -3707,7 +3709,7 @@ zfs_do_send(int argc, char **argv)
boolean_t extraverbose = B_FALSE;
/* check options */
while ((c = getopt(argc, argv, ":i:I:RDpvnP")) != -1) {
while ((c = getopt(argc, argv, ":i:I:RDpvnPe")) != -1) {
switch (c) {
case 'i':
if (fromname)
@ -3742,6 +3744,9 @@ zfs_do_send(int argc, char **argv)
case 'n':
flags.dryrun = B_TRUE;
break;
case 'e':
flags.embed_data = B_TRUE;
break;
case ':':
(void) fprintf(stderr, gettext("missing argument for "
"'%c' option\n"), optopt);
@ -3780,6 +3785,7 @@ zfs_do_send(int argc, char **argv)
if (strchr(argv[0], '@') == NULL ||
(fromname && strchr(fromname, '#') != NULL)) {
char frombuf[ZFS_MAXNAMELEN];
enum lzc_send_flags lzc_flags = 0;
if (flags.replicate || flags.doall || flags.props ||
flags.dedup || flags.dryrun || flags.verbose ||
@ -3794,6 +3800,9 @@ zfs_do_send(int argc, char **argv)
if (zhp == NULL)
return (1);
if (flags.embed_data)
lzc_flags |= LZC_SEND_FLAG_EMBED_DATA;
if (fromname != NULL &&
(fromname[0] == '#' || fromname[0] == '@')) {
/*
@ -3807,7 +3816,7 @@ zfs_do_send(int argc, char **argv)
(void) strlcat(frombuf, fromname, sizeof (frombuf));
fromname = frombuf;
}
err = zfs_send_one(zhp, fromname, STDOUT_FILENO);
err = zfs_send_one(zhp, fromname, STDOUT_FILENO, lzc_flags);
zfs_close(zhp);
return (err != 0);
}
@ -6847,6 +6856,9 @@ zfs_do_bookmark(int argc, char **argv)
case ENOTSUP:
err_msg = "bookmark feature not enabled";
break;
case ENOSPC:
err_msg = "out of space";
break;
default:
err_msg = "unknown error";
break;
@ -6855,7 +6867,7 @@ zfs_do_bookmark(int argc, char **argv)
dgettext(TEXT_DOMAIN, err_msg));
}
return (ret);
return (ret != 0);
usage:
usage(B_FALSE);

View file

@ -20,7 +20,7 @@
*/
/*
* Copyright (c) 2013 by Delphix. All rights reserved.
* Copyright (c) 2011, 2014 by Delphix. All rights reserved.
* Copyright (c) 2013 Steven Hartland. All rights reserved.
*/
@ -362,7 +362,7 @@ zhack_do_feature_enable(int argc, char **argv)
feature.fi_guid);
VERIFY0(dsl_sync_task(spa_name(spa), NULL,
zhack_feature_enable_sync, &feature, 5));
zhack_feature_enable_sync, &feature, 5, ZFS_SPACE_CHECK_NORMAL));
spa_close(spa, FTAG);
@ -473,7 +473,8 @@ zhack_do_feature_ref(int argc, char **argv)
}
VERIFY0(dsl_sync_task(spa_name(spa), NULL,
decr ? feature_decr_sync : feature_incr_sync, &feature, 5));
decr ? feature_decr_sync : feature_incr_sync, &feature,
5, ZFS_SPACE_CHECK_NORMAL));
spa_close(spa, FTAG);
}

View file

@ -23,7 +23,7 @@
.\"
.\" $FreeBSD$
.\"
.Dd April 23, 2014
.Dd July 1, 2014
.Dt ZPOOL-FEATURES 7
.Os
.Sh NAME
@ -235,14 +235,11 @@ administrator can turn on
compression on any dataset on the
pool using the
.Xr zfs 8
command. Please note that doing so will
immediately activate the
.Sy lz4_compress
feature on the underlying
pool
.Pq even before any data is written ,
and the feature will not be
deactivated.
command.
Also, all newly written metadata
will be compressed with
.Sy lz4
algorithm.
Since this feature is not read-only compatible, this
operation will render the pool unimportable on systems without support
for the
@ -251,6 +248,12 @@ feature.
Booting off of
.Sy lz4
-compressed root pools is supported.
.Pp
This feature becomes
.Sy active
as soon as it is enabled and will
never return to being
.Sy enabled .
.It Sy multi_vdev_crash_dump
.Bl -column "READ\-ONLY COMPATIBLE" "com.joyent:multi_vdev_crash_dump"
.It GUID Ta com.joyent:multi_vdev_crash_dump
@ -396,6 +399,34 @@ This feature becomes
as soon as it is enabled and will
never return to being
.Sy enabled .
.It Sy embedded_data
.Bl -column "READ\-ONLY COMPATIBLE" "com.delphix:embedded_data"
.It GUID Ta com.delphix:embedded_data
.It READ\-ONLY COMPATIBLE Ta no
.It DEPENDENCIES Ta none
.El
.Pp
This feature improves the performance and compression ratio of
highly-compressible blocks.
Blocks whose contents can compress to 112 bytes
or smaller can take advantage of this feature.
.Pp
When this feature is enabled, the contents of highly-compressible blocks are
stored in the block "pointer" itself
.Po a misnomer in this case, as it contains
the compresseed data, rather than a pointer to its location on disk
.Pc .
Thus
the space of the block
.Pq one sector, typically 512 bytes or 4KB
is saved,
and no additional i/o is needed to read and write the data block.
.Pp
This feature becomes
.Sy active
as soon as it is enabled and will
never return to being
.Sy enabled .
.El
.Sh SEE ALSO
.Xr zpool 8

View file

@ -26,7 +26,7 @@
.\"
.\" $FreeBSD$
.\"
.Dd March 28, 2014
.Dd July 14, 2014
.Dt ZPOOL 8
.Os
.Sh NAME
@ -1041,7 +1041,6 @@ the following fields:
See the
.Qq Sx Properties
section for more information on the available pool properties.
.Pp
.It Fl H
Scripted mode. Do not display headers, and separate fields by a single tab
instead of arbitrary space.
@ -1665,7 +1664,8 @@ can change.
.It Fl x
Only display status for pools that are exhibiting errors or are otherwise
unavailable.
Warnings about pools not using the latest on-disk format will not be included.
Warnings about pools not using the latest on-disk format, having non-native
block size or disabled features will not be included.
.It Fl v
Displays verbose data error information, printing out a complete list of all
data errors since the last complete pool scrub.

View file

@ -22,7 +22,7 @@
/*
* Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright 2011 Nexenta Systems, Inc. All rights reserved.
* Copyright (c) 2013 by Delphix. All rights reserved.
* Copyright (c) 2011, 2014 by Delphix. All rights reserved.
* Copyright (c) 2012 by Frederik Wessels. All rights reserved.
* Copyright (c) 2012 Martin Matuska <mm@FreeBSD.org>. All rights reserved.
* Copyright (c) 2013 by Prasad Joshi (sTec). All rights reserved.
@ -2033,7 +2033,7 @@ zpool_do_import(int argc, char **argv)
break;
case 'T':
errno = 0;
txg = strtoull(optarg, &endptr, 10);
txg = strtoull(optarg, &endptr, 0);
if (errno != 0 || *endptr != '\0') {
(void) fprintf(stderr,
gettext("invalid txg value\n"));
@ -3076,17 +3076,10 @@ zpool_do_list(int argc, char **argv)
if (zprop_get_list(g_zfs, props, &cb.cb_proplist, ZFS_TYPE_POOL) != 0)
usage(B_FALSE);
if ((list = pool_list_get(argc, argv, &cb.cb_proplist, &ret)) == NULL)
return (1);
if (argc == 0 && !cb.cb_scripted && pool_list_count(list) == 0) {
(void) printf(gettext("no pools available\n"));
zprop_free_list(cb.cb_proplist);
return (0);
}
for (;;) {
pool_list_update(list);
if ((list = pool_list_get(argc, argv, &cb.cb_proplist,
&ret)) == NULL)
return (1);
if (pool_list_count(list) == 0)
break;
@ -3109,9 +3102,16 @@ zpool_do_list(int argc, char **argv)
if (count != 0 && --count == 0)
break;
pool_list_free(list);
(void) sleep(interval);
}
if (argc == 0 && !cb.cb_scripted && pool_list_count(list) == 0) {
(void) printf(gettext("no pools available\n"));
ret = 0;
}
pool_list_free(list);
zprop_free_list(cb.cb_proplist);
return (ret);
}
@ -4101,6 +4101,7 @@ status_callback(zpool_handle_t *zhp, void *data)
if (cbp->cb_explain &&
(reason == ZPOOL_STATUS_OK ||
reason == ZPOOL_STATUS_VERSION_OLDER ||
reason == ZPOOL_STATUS_NON_NATIVE_ASHIFT ||
reason == ZPOOL_STATUS_FEAT_DISABLED)) {
if (!cbp->cb_allpools) {
(void) printf(gettext("pool '%s' is healthy\n"),

View file

@ -49,7 +49,6 @@
*/
#define DUMP_GROUPING 4
uint64_t drr_record_count[DRR_NUMTYPES];
uint64_t total_write_size = 0;
uint64_t total_stream_len = 0;
FILE *send_stream = 0;
@ -123,7 +122,7 @@ print_block(char *buf, int length)
* Start printing ASCII characters at a constant offset, after
* the hex prints. Leave 3 characters per byte on a line (2 digit
* hex number plus 1 space) plus spaces between characters and
* groupings
* groupings.
*/
int ascii_start = BYTES_PER_LINE * 3 +
BYTES_PER_LINE / DUMP_GROUPING + 2;
@ -160,6 +159,8 @@ int
main(int argc, char *argv[])
{
char *buf = malloc(INITIAL_BUFLEN);
uint64_t drr_record_count[DRR_NUMTYPES] = { 0 };
uint64_t total_records = 0;
dmu_replay_record_t thedrr;
dmu_replay_record_t *drr = &thedrr;
struct drr_begin *drrb = &thedrr.drr_u.drr_begin;
@ -170,6 +171,7 @@ main(int argc, char *argv[])
struct drr_write_byref *drrwbr = &thedrr.drr_u.drr_write_byref;
struct drr_free *drrf = &thedrr.drr_u.drr_free;
struct drr_spill *drrs = &thedrr.drr_u.drr_spill;
struct drr_write_embedded *drrwe = &thedrr.drr_u.drr_write_embedded;
char c;
boolean_t verbose = B_FALSE;
boolean_t first = B_TRUE;
@ -264,6 +266,7 @@ main(int argc, char *argv[])
}
drr_record_count[drr->drr_type]++;
total_records++;
switch (drr->drr_type) {
case DRR_BEGIN:
@ -376,8 +379,8 @@ main(int argc, char *argv[])
drro->drr_bonuslen);
}
if (drro->drr_bonuslen > 0) {
(void) ssread(buf, P2ROUNDUP(drro->drr_bonuslen,
8), &zc);
(void) ssread(buf,
P2ROUNDUP(drro->drr_bonuslen, 8), &zc);
if (dump) {
print_block(buf,
P2ROUNDUP(drro->drr_bonuslen, 8));
@ -506,6 +509,38 @@ main(int argc, char *argv[])
print_block(buf, drrs->drr_length);
}
break;
case DRR_WRITE_EMBEDDED:
if (do_byteswap) {
drrwe->drr_object =
BSWAP_64(drrwe->drr_object);
drrwe->drr_offset =
BSWAP_64(drrwe->drr_offset);
drrwe->drr_length =
BSWAP_64(drrwe->drr_length);
drrwe->drr_toguid =
BSWAP_64(drrwe->drr_toguid);
drrwe->drr_lsize =
BSWAP_32(drrwe->drr_lsize);
drrwe->drr_psize =
BSWAP_32(drrwe->drr_psize);
}
if (verbose) {
(void) printf("WRITE_EMBEDDED object = %llu "
"offset = %llu length = %llu\n"
"toguid = %llx comp = %u etype = %u "
"lsize = %u psize = %u\n",
(u_longlong_t)drrwe->drr_object,
(u_longlong_t)drrwe->drr_offset,
(u_longlong_t)drrwe->drr_length,
(u_longlong_t)drrwe->drr_toguid,
drrwe->drr_compression,
drrwe->drr_etype,
drrwe->drr_lsize,
drrwe->drr_psize);
}
(void) ssread(buf,
P2ROUNDUP(drrwe->drr_psize, 8), &zc);
break;
}
pcksum = zc;
}
@ -524,18 +559,16 @@ main(int argc, char *argv[])
(u_longlong_t)drr_record_count[DRR_FREEOBJECTS]);
(void) printf("\tTotal DRR_WRITE records = %lld\n",
(u_longlong_t)drr_record_count[DRR_WRITE]);
(void) printf("\tTotal DRR_WRITE_BYREF records = %lld\n",
(u_longlong_t)drr_record_count[DRR_WRITE_BYREF]);
(void) printf("\tTotal DRR_WRITE_EMBEDDED records = %lld\n",
(u_longlong_t)drr_record_count[DRR_WRITE_EMBEDDED]);
(void) printf("\tTotal DRR_FREE records = %lld\n",
(u_longlong_t)drr_record_count[DRR_FREE]);
(void) printf("\tTotal DRR_SPILL records = %lld\n",
(u_longlong_t)drr_record_count[DRR_SPILL]);
(void) printf("\tTotal records = %lld\n",
(u_longlong_t)(drr_record_count[DRR_BEGIN] +
drr_record_count[DRR_OBJECT] +
drr_record_count[DRR_FREEOBJECTS] +
drr_record_count[DRR_WRITE] +
drr_record_count[DRR_FREE] +
drr_record_count[DRR_SPILL] +
drr_record_count[DRR_END]));
(u_longlong_t)total_records);
(void) printf("\tTotal write size = %lld (0x%llx)\n",
(u_longlong_t)total_write_size, (u_longlong_t)total_write_size);
(void) printf("\tTotal stream length = %lld (0x%llx)\n",

View file

@ -20,7 +20,7 @@
*/
/*
* Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2013 by Delphix. All rights reserved.
* Copyright (c) 2011, 2014 by Delphix. All rights reserved.
* Copyright 2011 Nexenta Systems, Inc. All rights reserved.
* Copyright (c) 2012 Martin Matuska <mm@FreeBSD.org>. All rights reserved.
* Copyright (c) 2013 Steven Hartland. All rights reserved.
@ -53,7 +53,7 @@
* At random times, the child self-immolates with a SIGKILL.
* This is the software equivalent of pulling the power cord.
* The parent then runs the test again, using the existing
* storage pool, as many times as desired. If backwards compatability
* storage pool, as many times as desired. If backwards compatibility
* testing is enabled ztest will sometimes run the "older" version
* of ztest after a SIGKILL.
*
@ -187,6 +187,7 @@ static const ztest_shared_opts_t ztest_opts_defaults = {
extern uint64_t metaslab_gang_bang;
extern uint64_t metaslab_df_alloc_threshold;
extern uint64_t zfs_deadman_synctime_ms;
extern int metaslab_preload_limit;
static ztest_shared_opts_t *ztest_shared_opts;
static ztest_shared_opts_t ztest_opts;
@ -1267,13 +1268,13 @@ static void
ztest_bt_verify(ztest_block_tag_t *bt, objset_t *os, uint64_t object,
uint64_t offset, uint64_t gen, uint64_t txg, uint64_t crtxg)
{
ASSERT(bt->bt_magic == BT_MAGIC);
ASSERT(bt->bt_objset == dmu_objset_id(os));
ASSERT(bt->bt_object == object);
ASSERT(bt->bt_offset == offset);
ASSERT(bt->bt_gen <= gen);
ASSERT(bt->bt_txg <= txg);
ASSERT(bt->bt_crtxg == crtxg);
ASSERT3U(bt->bt_magic, ==, BT_MAGIC);
ASSERT3U(bt->bt_objset, ==, dmu_objset_id(os));
ASSERT3U(bt->bt_object, ==, object);
ASSERT3U(bt->bt_offset, ==, offset);
ASSERT3U(bt->bt_gen, <=, gen);
ASSERT3U(bt->bt_txg, <=, txg);
ASSERT3U(bt->bt_crtxg, ==, crtxg);
}
static ztest_block_tag_t *
@ -3472,6 +3473,11 @@ ztest_dsl_dataset_promote_busy(ztest_ds_t *zd, uint64_t id)
if (error)
fatal(0, "dmu_objset_own(%s) = %d", snap2name, error);
error = dsl_dataset_promote(clone2name, NULL);
if (error == ENOSPC) {
dmu_objset_disown(os, FTAG);
ztest_record_enospc(FTAG);
goto out;
}
if (error != EBUSY)
fatal(0, "dsl_dataset_promote(%s), %d, not EBUSY", clone2name,
error);
@ -3627,11 +3633,19 @@ ztest_dmu_read_write(ztest_ds_t *zd, uint64_t id)
return;
}
dmu_object_set_checksum(os, bigobj,
(enum zio_checksum)ztest_random_dsl_prop(ZFS_PROP_CHECKSUM), tx);
enum zio_checksum cksum;
do {
cksum = (enum zio_checksum)
ztest_random_dsl_prop(ZFS_PROP_CHECKSUM);
} while (cksum >= ZIO_CHECKSUM_LEGACY_FUNCTIONS);
dmu_object_set_checksum(os, bigobj, cksum, tx);
dmu_object_set_compress(os, bigobj,
(enum zio_compress)ztest_random_dsl_prop(ZFS_PROP_COMPRESSION), tx);
enum zio_compress comp;
do {
comp = (enum zio_compress)
ztest_random_dsl_prop(ZFS_PROP_COMPRESSION);
} while (comp >= ZIO_COMPRESS_LEGACY_FUNCTIONS);
dmu_object_set_compress(os, bigobj, comp, tx);
/*
* For each index from n to n + s, verify that the existing bufwad
@ -4711,8 +4725,13 @@ ztest_dmu_snapshot_hold(ztest_ds_t *zd, uint64_t id)
error = dsl_dataset_user_hold(holds, 0, NULL);
fnvlist_free(holds);
if (error)
fatal(0, "dsl_dataset_user_hold(%s)", fullname, tag);
if (error == ENOSPC) {
ztest_record_enospc("dsl_dataset_user_hold");
goto out;
} else if (error) {
fatal(0, "dsl_dataset_user_hold(%s, %s) = %u",
fullname, tag, error);
}
error = dsl_destroy_snapshot(fullname, B_FALSE);
if (error != EBUSY) {
@ -5165,7 +5184,7 @@ ztest_run_zdb(char *pool)
isa = strdup(isa);
/* LINTED */
(void) sprintf(bin,
"/usr/sbin%.*s/zdb -bcc%s%s -U %s %s",
"/usr/sbin%.*s/zdb -bcc%s%s -d -U %s %s",
isalen,
isa,
ztest_opts.zo_verbose >= 3 ? "s" : "",
@ -5578,6 +5597,7 @@ ztest_run(ztest_shared_t *zs)
kernel_init(FREAD | FWRITE);
VERIFY0(spa_open(ztest_opts.zo_pool, &spa, FTAG));
spa->spa_debug = B_TRUE;
metaslab_preload_limit = ztest_random(20) + 1;
ztest_spa = spa;
VERIFY0(dmu_objset_own(ztest_opts.zo_pool,

View file

@ -25,7 +25,7 @@
* Use is subject to license terms.
*/
/*
* Copyright (c) 2012, Joyent, Inc. All rights reserved.
* Copyright (c) 2013, Joyent, Inc. All rights reserved.
*/
#include <ctf_impl.h>
@ -787,6 +787,92 @@ ctf_bufopen(const ctf_sect_t *ctfsect, const ctf_sect_t *symsect,
return (NULL);
}
/*
* Dupliate a ctf_file_t and its underlying section information into a new
* container. This works by copying the three ctf_sect_t's of the original
* container if they exist and passing those into ctf_bufopen. To copy those, we
* mmap anonymous memory with ctf_data_alloc and bcopy the data across. It's not
* the cheapest thing, but it's what we've got.
*/
ctf_file_t *
ctf_dup(ctf_file_t *ofp)
{
ctf_file_t *fp;
ctf_sect_t ctfsect, symsect, strsect;
ctf_sect_t *ctp, *symp, *strp;
void *cbuf, *symbuf, *strbuf;
int err;
cbuf = symbuf = strbuf = NULL;
/*
* The ctfsect isn't allowed to not exist, but the symbol and string
* section might not. We only need to copy the data of the section, not
* the name, as ctf_bufopen will take care of that.
*/
bcopy(&ofp->ctf_data, &ctfsect, sizeof (ctf_sect_t));
cbuf = ctf_data_alloc(ctfsect.cts_size);
if (cbuf == NULL) {
(void) ctf_set_errno(ofp, ECTF_MMAP);
return (NULL);
}
bcopy(ctfsect.cts_data, cbuf, ctfsect.cts_size);
ctf_data_protect(cbuf, ctfsect.cts_size);
ctfsect.cts_data = cbuf;
ctfsect.cts_offset = 0;
ctp = &ctfsect;
if (ofp->ctf_symtab.cts_data != NULL) {
bcopy(&ofp->ctf_symtab, &symsect, sizeof (ctf_sect_t));
symbuf = ctf_data_alloc(symsect.cts_size);
if (symbuf == NULL) {
(void) ctf_set_errno(ofp, ECTF_MMAP);
goto err;
}
bcopy(symsect.cts_data, symbuf, symsect.cts_size);
ctf_data_protect(symbuf, symsect.cts_size);
symsect.cts_data = symbuf;
symsect.cts_offset = 0;
symp = &symsect;
} else {
symp = NULL;
}
if (ofp->ctf_strtab.cts_data != NULL) {
bcopy(&ofp->ctf_strtab, &strsect, sizeof (ctf_sect_t));
strbuf = ctf_data_alloc(strsect.cts_size);
if (strbuf == NULL) {
(void) ctf_set_errno(ofp, ECTF_MMAP);
goto err;
}
bcopy(strsect.cts_data, strbuf, strsect.cts_size);
ctf_data_protect(strbuf, strsect.cts_size);
strsect.cts_data = strbuf;
strsect.cts_offset = 0;
strp = &strsect;
} else {
strp = NULL;
}
fp = ctf_bufopen(ctp, symp, strp, &err);
if (fp == NULL) {
(void) ctf_set_errno(ofp, err);
goto err;
}
fp->ctf_flags |= LCTF_MMAP;
return (fp);
err:
ctf_data_free(cbuf, ctfsect.cts_size);
if (symbuf != NULL)
ctf_data_free(symbuf, symsect.cts_size);
if (strbuf != NULL)
ctf_data_free(strbuf, strsect.cts_size);
return (NULL);
}
/*
* Close the specified CTF container and free associated data structures. Note
* that ctf_close() is a reference counted operation: if the specified file is

View file

@ -25,8 +25,6 @@
* Use is subject to license terms.
*/
#pragma ident "%Z%%M% %I% %E% SMI"
#include <ctf_impl.h>
ssize_t
@ -199,8 +197,9 @@ ctf_type_resolve(ctf_file_t *fp, ctf_id_t type)
* Lookup the given type ID and print a string name for it into buf. Return
* the actual number of bytes (not including \0) needed to format the name.
*/
ssize_t
ctf_type_lname(ctf_file_t *fp, ctf_id_t type, char *buf, size_t len)
static ssize_t
ctf_type_qlname(ctf_file_t *fp, ctf_id_t type, char *buf, size_t len,
const char *qname)
{
ctf_decl_t cd;
ctf_decl_node_t *cdp;
@ -255,6 +254,8 @@ ctf_type_lname(ctf_file_t *fp, ctf_id_t type, char *buf, size_t len)
case CTF_K_INTEGER:
case CTF_K_FLOAT:
case CTF_K_TYPEDEF:
if (qname != NULL)
ctf_decl_sprintf(&cd, "%s`", qname);
ctf_decl_sprintf(&cd, "%s", name);
break;
case CTF_K_POINTER:
@ -268,13 +269,22 @@ ctf_type_lname(ctf_file_t *fp, ctf_id_t type, char *buf, size_t len)
break;
case CTF_K_STRUCT:
case CTF_K_FORWARD:
ctf_decl_sprintf(&cd, "struct %s", name);
ctf_decl_sprintf(&cd, "struct ");
if (qname != NULL)
ctf_decl_sprintf(&cd, "%s`", qname);
ctf_decl_sprintf(&cd, "%s", name);
break;
case CTF_K_UNION:
ctf_decl_sprintf(&cd, "union %s", name);
ctf_decl_sprintf(&cd, "union ");
if (qname != NULL)
ctf_decl_sprintf(&cd, "%s`", qname);
ctf_decl_sprintf(&cd, "%s", name);
break;
case CTF_K_ENUM:
ctf_decl_sprintf(&cd, "enum %s", name);
ctf_decl_sprintf(&cd, "enum ");
if (qname != NULL)
ctf_decl_sprintf(&cd, "%s`", qname);
ctf_decl_sprintf(&cd, "%s", name);
break;
case CTF_K_VOLATILE:
ctf_decl_sprintf(&cd, "volatile");
@ -301,6 +311,12 @@ ctf_type_lname(ctf_file_t *fp, ctf_id_t type, char *buf, size_t len)
return (cd.cd_len);
}
ssize_t
ctf_type_lname(ctf_file_t *fp, ctf_id_t type, char *buf, size_t len)
{
return (ctf_type_qlname(fp, type, buf, len, NULL));
}
/*
* Lookup the given type ID and print a string name for it into buf. If buf
* is too small, return NULL: the ECTF_NAMELEN error is set on 'fp' for us.
@ -308,10 +324,19 @@ ctf_type_lname(ctf_file_t *fp, ctf_id_t type, char *buf, size_t len)
char *
ctf_type_name(ctf_file_t *fp, ctf_id_t type, char *buf, size_t len)
{
ssize_t rv = ctf_type_lname(fp, type, buf, len);
ssize_t rv = ctf_type_qlname(fp, type, buf, len, NULL);
return (rv >= 0 && rv < len ? buf : NULL);
}
char *
ctf_type_qname(ctf_file_t *fp, ctf_id_t type, char *buf, size_t len,
const char *qname)
{
ssize_t rv = ctf_type_qlname(fp, type, buf, len, qname);
return (rv >= 0 && rv < len ? buf : NULL);
}
/*
* Resolve the type down to a base type node, and then return the size
* of the type storage in bytes.

View file

@ -0,0 +1,79 @@
/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License (the "License").
* You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
* Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
/* Copyright (c) 1988 AT&T */
/* All Rights Reserved */
#ifndef _COMMON_UTIL_CTYPE_H
#define _COMMON_UTIL_CTYPE_H
#ifdef __cplusplus
extern "C" {
#endif
/*
* This header file contains a collection of macros that the strtou?ll?
* functions in common/util use to test characters. What we need is a kernel
* version of ctype.h.
*
* NOTE: These macros are used within several DTrace probe context functions.
* They must not be altered to make function calls or perform actions not
* safe in probe context.
*/
#if defined(sun) && (defined(_KERNEL) || defined(_BOOT))
#define isalnum(ch) (isalpha(ch) || isdigit(ch))
#define isalpha(ch) (isupper(ch) || islower(ch))
#define isdigit(ch) ((ch) >= '0' && (ch) <= '9')
#define islower(ch) ((ch) >= 'a' && (ch) <= 'z')
#define isspace(ch) (((ch) == ' ') || ((ch) == '\r') || ((ch) == '\n') || \
((ch) == '\t') || ((ch) == '\f'))
#define isupper(ch) ((ch) >= 'A' && (ch) <= 'Z')
#define isxdigit(ch) (isdigit(ch) || ((ch) >= 'a' && (ch) <= 'f') || \
((ch) >= 'A' && (ch) <= 'F'))
#endif /* _KERNEL || _BOOT */
#define DIGIT(x) \
(isdigit(x) ? (x) - '0' : islower(x) ? (x) + 10 - 'a' : (x) + 10 - 'A')
#define MBASE ('z' - 'a' + 1 + 10)
/*
* The following macro is a version of isalnum() that limits alphabetic
* characters to the ranges a-z and A-Z; locale dependent characters will not
* return 1. The members of a-z and A-Z are assumed to be in ascending order
* and contiguous.
*/
#define lisalnum(x) \
(isdigit(x) || ((x) >= 'a' && (x) <= 'z') || ((x) >= 'A' && (x) <= 'Z'))
#ifdef __cplusplus
}
#endif
#endif /* _COMMON_UTIL_CTYPE_H */

View file

@ -25,7 +25,7 @@
*/
/*
* Copyright (c) 2011, Joyent, Inc. All rights reserved.
* Copyright (c) 2013, Joyent, Inc. All rights reserved.
* Copyright (c) 2012 by Delphix. All rights reserved.
*/
@ -1300,6 +1300,231 @@ dtrace_aggregate_walk(dtrace_hdl_t *dtp, dtrace_aggregate_f *func, void *arg)
return (0);
}
static int
dt_aggregate_total(dtrace_hdl_t *dtp, boolean_t clear)
{
dt_ahashent_t *h;
dtrace_aggdata_t **total;
dtrace_aggid_t max = DTRACE_AGGVARIDNONE, id;
dt_aggregate_t *agp = &dtp->dt_aggregate;
dt_ahash_t *hash = &agp->dtat_hash;
uint32_t tflags;
tflags = DTRACE_A_TOTAL | DTRACE_A_HASNEGATIVES | DTRACE_A_HASPOSITIVES;
/*
* If we need to deliver per-aggregation totals, we're going to take
* three passes over the aggregate: one to clear everything out and
* determine our maximum aggregation ID, one to actually total
* everything up, and a final pass to assign the totals to the
* individual elements.
*/
for (h = hash->dtah_all; h != NULL; h = h->dtahe_nextall) {
dtrace_aggdata_t *aggdata = &h->dtahe_data;
if ((id = dt_aggregate_aggvarid(h)) > max)
max = id;
aggdata->dtada_total = 0;
aggdata->dtada_flags &= ~tflags;
}
if (clear || max == DTRACE_AGGVARIDNONE)
return (0);
total = dt_zalloc(dtp, (max + 1) * sizeof (dtrace_aggdata_t *));
if (total == NULL)
return (-1);
for (h = hash->dtah_all; h != NULL; h = h->dtahe_nextall) {
dtrace_aggdata_t *aggdata = &h->dtahe_data;
dtrace_aggdesc_t *agg = aggdata->dtada_desc;
dtrace_recdesc_t *rec;
caddr_t data;
int64_t val, *addr;
rec = &agg->dtagd_rec[agg->dtagd_nrecs - 1];
data = aggdata->dtada_data;
addr = (int64_t *)(uintptr_t)(data + rec->dtrd_offset);
switch (rec->dtrd_action) {
case DTRACEAGG_STDDEV:
val = dt_stddev((uint64_t *)addr, 1);
break;
case DTRACEAGG_SUM:
case DTRACEAGG_COUNT:
val = *addr;
break;
case DTRACEAGG_AVG:
val = addr[0] ? (addr[1] / addr[0]) : 0;
break;
default:
continue;
}
if (total[agg->dtagd_varid] == NULL) {
total[agg->dtagd_varid] = aggdata;
aggdata->dtada_flags |= DTRACE_A_TOTAL;
} else {
aggdata = total[agg->dtagd_varid];
}
if (val > 0)
aggdata->dtada_flags |= DTRACE_A_HASPOSITIVES;
if (val < 0) {
aggdata->dtada_flags |= DTRACE_A_HASNEGATIVES;
val = -val;
}
if (dtp->dt_options[DTRACEOPT_AGGZOOM] != DTRACEOPT_UNSET) {
val = (int64_t)((long double)val *
(1 / DTRACE_AGGZOOM_MAX));
if (val > aggdata->dtada_total)
aggdata->dtada_total = val;
} else {
aggdata->dtada_total += val;
}
}
/*
* And now one final pass to set everyone's total.
*/
for (h = hash->dtah_all; h != NULL; h = h->dtahe_nextall) {
dtrace_aggdata_t *aggdata = &h->dtahe_data, *t;
dtrace_aggdesc_t *agg = aggdata->dtada_desc;
if ((t = total[agg->dtagd_varid]) == NULL || aggdata == t)
continue;
aggdata->dtada_total = t->dtada_total;
aggdata->dtada_flags |= (t->dtada_flags & tflags);
}
dt_free(dtp, total);
return (0);
}
static int
dt_aggregate_minmaxbin(dtrace_hdl_t *dtp, boolean_t clear)
{
dt_ahashent_t *h;
dtrace_aggdata_t **minmax;
dtrace_aggid_t max = DTRACE_AGGVARIDNONE, id;
dt_aggregate_t *agp = &dtp->dt_aggregate;
dt_ahash_t *hash = &agp->dtat_hash;
for (h = hash->dtah_all; h != NULL; h = h->dtahe_nextall) {
dtrace_aggdata_t *aggdata = &h->dtahe_data;
if ((id = dt_aggregate_aggvarid(h)) > max)
max = id;
aggdata->dtada_minbin = 0;
aggdata->dtada_maxbin = 0;
aggdata->dtada_flags &= ~DTRACE_A_MINMAXBIN;
}
if (clear || max == DTRACE_AGGVARIDNONE)
return (0);
minmax = dt_zalloc(dtp, (max + 1) * sizeof (dtrace_aggdata_t *));
if (minmax == NULL)
return (-1);
for (h = hash->dtah_all; h != NULL; h = h->dtahe_nextall) {
dtrace_aggdata_t *aggdata = &h->dtahe_data;
dtrace_aggdesc_t *agg = aggdata->dtada_desc;
dtrace_recdesc_t *rec;
caddr_t data;
int64_t *addr;
int minbin = -1, maxbin = -1, i;
int start = 0, size;
rec = &agg->dtagd_rec[agg->dtagd_nrecs - 1];
size = rec->dtrd_size / sizeof (int64_t);
data = aggdata->dtada_data;
addr = (int64_t *)(uintptr_t)(data + rec->dtrd_offset);
switch (rec->dtrd_action) {
case DTRACEAGG_LQUANTIZE:
/*
* For lquantize(), we always display the entire range
* of the aggregation when aggpack is set.
*/
start = 1;
minbin = start;
maxbin = size - 1 - start;
break;
case DTRACEAGG_QUANTIZE:
for (i = start; i < size; i++) {
if (!addr[i])
continue;
if (minbin == -1)
minbin = i - start;
maxbin = i - start;
}
if (minbin == -1) {
/*
* If we have no data (e.g., due to a clear()
* or negative increments), we'll use the
* zero bucket as both our min and max.
*/
minbin = maxbin = DTRACE_QUANTIZE_ZEROBUCKET;
}
break;
default:
continue;
}
if (minmax[agg->dtagd_varid] == NULL) {
minmax[agg->dtagd_varid] = aggdata;
aggdata->dtada_flags |= DTRACE_A_MINMAXBIN;
aggdata->dtada_minbin = minbin;
aggdata->dtada_maxbin = maxbin;
continue;
}
if (minbin < minmax[agg->dtagd_varid]->dtada_minbin)
minmax[agg->dtagd_varid]->dtada_minbin = minbin;
if (maxbin > minmax[agg->dtagd_varid]->dtada_maxbin)
minmax[agg->dtagd_varid]->dtada_maxbin = maxbin;
}
/*
* And now one final pass to set everyone's minbin and maxbin.
*/
for (h = hash->dtah_all; h != NULL; h = h->dtahe_nextall) {
dtrace_aggdata_t *aggdata = &h->dtahe_data, *mm;
dtrace_aggdesc_t *agg = aggdata->dtada_desc;
if ((mm = minmax[agg->dtagd_varid]) == NULL || aggdata == mm)
continue;
aggdata->dtada_minbin = mm->dtada_minbin;
aggdata->dtada_maxbin = mm->dtada_maxbin;
aggdata->dtada_flags |= DTRACE_A_MINMAXBIN;
}
dt_free(dtp, minmax);
return (0);
}
static int
dt_aggregate_walk_sorted(dtrace_hdl_t *dtp,
dtrace_aggregate_f *func, void *arg,
@ -1309,6 +1534,23 @@ dt_aggregate_walk_sorted(dtrace_hdl_t *dtp,
dt_ahashent_t *h, **sorted;
dt_ahash_t *hash = &agp->dtat_hash;
size_t i, nentries = 0;
int rval = -1;
agp->dtat_flags &= ~(DTRACE_A_TOTAL | DTRACE_A_MINMAXBIN);
if (dtp->dt_options[DTRACEOPT_AGGHIST] != DTRACEOPT_UNSET) {
agp->dtat_flags |= DTRACE_A_TOTAL;
if (dt_aggregate_total(dtp, B_FALSE) != 0)
return (-1);
}
if (dtp->dt_options[DTRACEOPT_AGGPACK] != DTRACEOPT_UNSET) {
agp->dtat_flags |= DTRACE_A_MINMAXBIN;
if (dt_aggregate_minmaxbin(dtp, B_FALSE) != 0)
return (-1);
}
for (h = hash->dtah_all; h != NULL; h = h->dtahe_nextall)
nentries++;
@ -1316,7 +1558,7 @@ dt_aggregate_walk_sorted(dtrace_hdl_t *dtp,
sorted = dt_alloc(dtp, nentries * sizeof (dt_ahashent_t *));
if (sorted == NULL)
return (-1);
goto out;
for (h = hash->dtah_all, i = 0; h != NULL; h = h->dtahe_nextall)
sorted[i++] = h;
@ -1340,14 +1582,20 @@ dt_aggregate_walk_sorted(dtrace_hdl_t *dtp,
for (i = 0; i < nentries; i++) {
h = sorted[i];
if (dt_aggwalk_rval(dtp, h, func(&h->dtahe_data, arg)) == -1) {
dt_free(dtp, sorted);
return (-1);
}
if (dt_aggwalk_rval(dtp, h, func(&h->dtahe_data, arg)) == -1)
goto out;
}
rval = 0;
out:
if (agp->dtat_flags & DTRACE_A_TOTAL)
(void) dt_aggregate_total(dtp, B_TRUE);
if (agp->dtat_flags & DTRACE_A_MINMAXBIN)
(void) dt_aggregate_minmaxbin(dtp, B_TRUE);
dt_free(dtp, sorted);
return (0);
return (rval);
}
int
@ -1870,6 +2118,8 @@ dtrace_aggregate_print(dtrace_hdl_t *dtp, FILE *fp,
{
dt_print_aggdata_t pd;
bzero(&pd, sizeof (pd));
pd.dtpa_dtp = dtp;
pd.dtpa_fp = fp;
pd.dtpa_allunprint = 1;

View file

@ -23,8 +23,10 @@
* Copyright 2005 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
#pragma ident "%Z%%M% %I% %E% SMI"
/*
* Copyright (c) 2013 by Delphix. All rights reserved.
* Copyright (c) 2013 Joyent, Inc. All rights reserved.
*/
#include <sys/types.h>
#include <strings.h>
@ -125,7 +127,7 @@ dt_copyvar(dt_idhash_t *dhp, dt_ident_t *idp, void *data)
dvp->dtdv_flags |= DIFV_F_MOD;
bzero(&dn, sizeof (dn));
dt_node_type_assign(&dn, idp->di_ctfp, idp->di_type);
dt_node_type_assign(&dn, idp->di_ctfp, idp->di_type, B_FALSE);
dt_node_diftype(pcb->pcb_hdl, &dn, &dvp->dtdv_type);
idp->di_flags &= ~(DT_IDFLG_DIFR | DT_IDFLG_DIFW);

View file

@ -21,7 +21,7 @@
/*
* Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2011, Joyent Inc. All rights reserved.
* Copyright (c) 2013, Joyent Inc. All rights reserved.
* Copyright (c) 2012 by Delphix. All rights reserved.
*/
@ -663,6 +663,8 @@ dt_action_printflike(dtrace_hdl_t *dtp, dt_node_t *dnp, dtrace_stmtdesc_t *sdp,
static void
dt_action_trace(dtrace_hdl_t *dtp, dt_node_t *dnp, dtrace_stmtdesc_t *sdp)
{
int ctflib;
dtrace_actdesc_t *ap = dt_stmt_action(dtp, sdp);
boolean_t istrace = (dnp->dn_ident->di_id == DT_ACT_TRACE);
const char *act = istrace ? "trace" : "print";
@ -694,7 +696,10 @@ dt_action_trace(dtrace_hdl_t *dtp, dt_node_t *dnp, dtrace_stmtdesc_t *sdp)
* like arrays and function pointers that can't be resolved by
* ctf_type_lookup(). This is later processed by dtrace_dof_create()
* and turned into a reference into the string table so that we can
* get the type information when we process the data after the fact.
* get the type information when we process the data after the fact. In
* the case where we are referring to userland CTF data, we also need to
* to identify which ctf container in question we care about and encode
* that within the name.
*/
if (dnp->dn_ident->di_id == DT_ACT_PRINT) {
dt_node_t *dret;
@ -705,11 +710,27 @@ dt_action_trace(dtrace_hdl_t *dtp, dt_node_t *dnp, dtrace_stmtdesc_t *sdp)
dmp = dt_module_lookup_by_ctf(dtp, dret->dn_ctfp);
n = snprintf(NULL, 0, "%s`%ld", dmp->dm_name, dret->dn_type) + 1;
if (dmp->dm_pid != 0) {
ctflib = dt_module_getlibid(dtp, dmp, dret->dn_ctfp);
assert(ctflib >= 0);
n = snprintf(NULL, 0, "%s`%d`%ld", dmp->dm_name,
ctflib, dret->dn_type) + 1;
} else {
n = snprintf(NULL, 0, "%s`%ld", dmp->dm_name,
dret->dn_type) + 1;
}
sdp->dtsd_strdata = dt_alloc(dtp, n);
if (sdp->dtsd_strdata == NULL)
longjmp(yypcb->pcb_jmpbuf, EDT_NOMEM);
(void) snprintf(sdp->dtsd_strdata, n, "%s`%ld", dmp->dm_name,
dret->dn_type);
if (dmp->dm_pid != 0) {
(void) snprintf(sdp->dtsd_strdata, n, "%s`%d`%ld",
dmp->dm_name, ctflib, dret->dn_type);
} else {
(void) snprintf(sdp->dtsd_strdata, n, "%s`%ld",
dmp->dm_name, dret->dn_type);
}
}
ap->dtad_difo = dt_as(yypcb);
@ -2268,12 +2289,15 @@ dt_load_libs_dir(dtrace_hdl_t *dtp, const char *path)
dt_dprintf("skipping library %s, already processed "
"library with the same name: %s", dp->d_name,
dld->dtld_library);
(void) fclose(fp);
continue;
}
dtp->dt_filetag = fname;
if (dt_lib_depend_add(dtp, &dtp->dt_lib_dep, fname) != 0)
if (dt_lib_depend_add(dtp, &dtp->dt_lib_dep, fname) != 0) {
(void) fclose(fp);
return (-1); /* preserve dt_errno */
}
rv = dt_compile(dtp, DT_CTX_DPROG,
DTRACE_PROBESPEC_NAME, NULL,
@ -2281,8 +2305,10 @@ dt_load_libs_dir(dtrace_hdl_t *dtp, const char *path)
if (rv != NULL && dtp->dt_errno &&
(dtp->dt_errno != EDT_COMPILER ||
dtp->dt_errtag != dt_errtag(D_PRAGMA_DEPEND)))
dtp->dt_errtag != dt_errtag(D_PRAGMA_DEPEND))) {
(void) fclose(fp);
return (-1); /* preserve dt_errno */
}
if (dtp->dt_errno)
dt_dprintf("error parsing library %s: %s\n",

View file

@ -24,7 +24,7 @@
*/
/*
* Copyright (c) 2011, Joyent, Inc. All rights reserved.
* Copyright (c) 2013, Joyent, Inc. All rights reserved.
* Copyright (c) 2012 by Delphix. All rights reserved.
*/
@ -59,6 +59,25 @@ dt_fabsl(long double x)
return (x);
}
static int
dt_ndigits(long long val)
{
int rval = 1;
long long cmp = 10;
if (val < 0) {
val = val == INT64_MIN ? INT64_MAX : -val;
rval++;
}
while (val > cmp && cmp > 0) {
rval++;
cmp *= 10;
}
return (rval < 4 ? 4 : rval);
}
/*
* 128-bit arithmetic functions needed to support the stddev() aggregating
* action.
@ -487,7 +506,125 @@ dt_nullrec()
return (DTRACE_CONSUME_NEXT);
}
int
static void
dt_quantize_total(dtrace_hdl_t *dtp, int64_t datum, long double *total)
{
long double val = dt_fabsl((long double)datum);
if (dtp->dt_options[DTRACEOPT_AGGZOOM] == DTRACEOPT_UNSET) {
*total += val;
return;
}
/*
* If we're zooming in on an aggregation, we want the height of the
* highest value to be approximately 95% of total bar height -- so we
* adjust up by the reciprocal of DTRACE_AGGZOOM_MAX when comparing to
* our highest value.
*/
val *= 1 / DTRACE_AGGZOOM_MAX;
if (*total < val)
*total = val;
}
static int
dt_print_quanthdr(dtrace_hdl_t *dtp, FILE *fp, int width)
{
return (dt_printf(dtp, fp, "\n%*s %41s %-9s\n",
width ? width : 16, width ? "key" : "value",
"------------- Distribution -------------", "count"));
}
static int
dt_print_quanthdr_packed(dtrace_hdl_t *dtp, FILE *fp, int width,
const dtrace_aggdata_t *aggdata, dtrace_actkind_t action)
{
int min = aggdata->dtada_minbin, max = aggdata->dtada_maxbin;
int minwidth, maxwidth, i;
assert(action == DTRACEAGG_QUANTIZE || action == DTRACEAGG_LQUANTIZE);
if (action == DTRACEAGG_QUANTIZE) {
if (min != 0 && min != DTRACE_QUANTIZE_ZEROBUCKET)
min--;
if (max < DTRACE_QUANTIZE_NBUCKETS - 1)
max++;
minwidth = dt_ndigits(DTRACE_QUANTIZE_BUCKETVAL(min));
maxwidth = dt_ndigits(DTRACE_QUANTIZE_BUCKETVAL(max));
} else {
maxwidth = 8;
minwidth = maxwidth - 1;
max++;
}
if (dt_printf(dtp, fp, "\n%*s %*s .",
width, width > 0 ? "key" : "", minwidth, "min") < 0)
return (-1);
for (i = min; i <= max; i++) {
if (dt_printf(dtp, fp, "-") < 0)
return (-1);
}
return (dt_printf(dtp, fp, ". %*s | count\n", -maxwidth, "max"));
}
/*
* We use a subset of the Unicode Block Elements (U+2588 through U+258F,
* inclusive) to represent aggregations via UTF-8 -- which are expressed via
* 3-byte UTF-8 sequences.
*/
#define DTRACE_AGGUTF8_FULL 0x2588
#define DTRACE_AGGUTF8_BASE 0x258f
#define DTRACE_AGGUTF8_LEVELS 8
#define DTRACE_AGGUTF8_BYTE0(val) (0xe0 | ((val) >> 12))
#define DTRACE_AGGUTF8_BYTE1(val) (0x80 | (((val) >> 6) & 0x3f))
#define DTRACE_AGGUTF8_BYTE2(val) (0x80 | ((val) & 0x3f))
static int
dt_print_quantline_utf8(dtrace_hdl_t *dtp, FILE *fp, int64_t val,
uint64_t normal, long double total)
{
uint_t len = 40, i, whole, partial;
long double f = (dt_fabsl((long double)val) * len) / total;
const char *spaces = " ";
whole = (uint_t)f;
partial = (uint_t)((f - (long double)(uint_t)f) *
(long double)DTRACE_AGGUTF8_LEVELS);
if (dt_printf(dtp, fp, "|") < 0)
return (-1);
for (i = 0; i < whole; i++) {
if (dt_printf(dtp, fp, "%c%c%c",
DTRACE_AGGUTF8_BYTE0(DTRACE_AGGUTF8_FULL),
DTRACE_AGGUTF8_BYTE1(DTRACE_AGGUTF8_FULL),
DTRACE_AGGUTF8_BYTE2(DTRACE_AGGUTF8_FULL)) < 0)
return (-1);
}
if (partial != 0) {
partial = DTRACE_AGGUTF8_BASE - (partial - 1);
if (dt_printf(dtp, fp, "%c%c%c",
DTRACE_AGGUTF8_BYTE0(partial),
DTRACE_AGGUTF8_BYTE1(partial),
DTRACE_AGGUTF8_BYTE2(partial)) < 0)
return (-1);
i++;
}
return (dt_printf(dtp, fp, "%s %-9lld\n", spaces + i,
(long long)val / normal));
}
static int
dt_print_quantline(dtrace_hdl_t *dtp, FILE *fp, int64_t val,
uint64_t normal, long double total, char positives, char negatives)
{
@ -505,6 +642,11 @@ dt_print_quantline(dtrace_hdl_t *dtp, FILE *fp, int64_t val,
if (!negatives) {
if (positives) {
if (dtp->dt_encoding == DT_ENCODING_UTF8) {
return (dt_print_quantline_utf8(dtp, fp, val,
normal, total));
}
f = (dt_fabsl((long double)val) * len) / total;
depth = (uint_t)(f + 0.5);
} else {
@ -547,6 +689,73 @@ dt_print_quantline(dtrace_hdl_t *dtp, FILE *fp, int64_t val,
}
}
/*
* As with UTF-8 printing of aggregations, we use a subset of the Unicode
* Block Elements (U+2581 through U+2588, inclusive) to represent our packed
* aggregation.
*/
#define DTRACE_AGGPACK_BASE 0x2581
#define DTRACE_AGGPACK_LEVELS 8
static int
dt_print_packed(dtrace_hdl_t *dtp, FILE *fp,
long double datum, long double total)
{
static boolean_t utf8_checked = B_FALSE;
static boolean_t utf8;
char *ascii = "__xxxxXX";
char *neg = "vvvvVV";
unsigned int len;
long double val;
if (!utf8_checked) {
char *term;
/*
* We want to determine if we can reasonably emit UTF-8 for our
* packed aggregation. To do this, we will check for terminals
* that are known to be primitive to emit UTF-8 on these.
*/
utf8_checked = B_TRUE;
if (dtp->dt_encoding == DT_ENCODING_ASCII) {
utf8 = B_FALSE;
} else if (dtp->dt_encoding == DT_ENCODING_UTF8) {
utf8 = B_TRUE;
} else if ((term = getenv("TERM")) != NULL &&
(strcmp(term, "sun") == 0 ||
strcmp(term, "sun-color") == 0) ||
strcmp(term, "dumb") == 0) {
utf8 = B_FALSE;
} else {
utf8 = B_TRUE;
}
}
if (datum == 0)
return (dt_printf(dtp, fp, " "));
if (datum < 0) {
len = strlen(neg);
val = dt_fabsl(datum * (len - 1)) / total;
return (dt_printf(dtp, fp, "%c", neg[(uint_t)(val + 0.5)]));
}
if (utf8) {
int block = DTRACE_AGGPACK_BASE + (unsigned int)(((datum *
(DTRACE_AGGPACK_LEVELS - 1)) / total) + 0.5);
return (dt_printf(dtp, fp, "%c%c%c",
DTRACE_AGGUTF8_BYTE0(block),
DTRACE_AGGUTF8_BYTE1(block),
DTRACE_AGGUTF8_BYTE2(block)));
}
len = strlen(ascii);
val = (datum * (len - 1)) / total;
return (dt_printf(dtp, fp, "%c", ascii[(uint_t)(val + 0.5)]));
}
int
dt_print_quantize(dtrace_hdl_t *dtp, FILE *fp, const void *addr,
size_t size, uint64_t normal)
@ -564,9 +773,9 @@ dt_print_quantize(dtrace_hdl_t *dtp, FILE *fp, const void *addr,
if (first_bin == DTRACE_QUANTIZE_NBUCKETS - 1) {
/*
* There isn't any data. This is possible if (and only if)
* negative increment values have been used. In this case,
* we'll print the buckets around 0.
* There isn't any data. This is possible if the aggregation
* has been clear()'d or if negative increment values have been
* used. Regardless, we'll print the buckets around 0.
*/
first_bin = DTRACE_QUANTIZE_ZEROBUCKET - 1;
last_bin = DTRACE_QUANTIZE_ZEROBUCKET + 1;
@ -584,11 +793,10 @@ dt_print_quantize(dtrace_hdl_t *dtp, FILE *fp, const void *addr,
for (i = first_bin; i <= last_bin; i++) {
positives |= (data[i] > 0);
negatives |= (data[i] < 0);
total += dt_fabsl((long double)data[i]);
dt_quantize_total(dtp, data[i], &total);
}
if (dt_printf(dtp, fp, "\n%16s %41s %-9s\n", "value",
"------------- Distribution -------------", "count") < 0)
if (dt_print_quanthdr(dtp, fp, 0) < 0)
return (-1);
for (i = first_bin; i <= last_bin; i++) {
@ -604,6 +812,48 @@ dt_print_quantize(dtrace_hdl_t *dtp, FILE *fp, const void *addr,
return (0);
}
int
dt_print_quantize_packed(dtrace_hdl_t *dtp, FILE *fp, const void *addr,
size_t size, const dtrace_aggdata_t *aggdata)
{
const int64_t *data = addr;
long double total = 0, count = 0;
int min = aggdata->dtada_minbin, max = aggdata->dtada_maxbin, i;
int64_t minval, maxval;
if (size != DTRACE_QUANTIZE_NBUCKETS * sizeof (uint64_t))
return (dt_set_errno(dtp, EDT_DMISMATCH));
if (min != 0 && min != DTRACE_QUANTIZE_ZEROBUCKET)
min--;
if (max < DTRACE_QUANTIZE_NBUCKETS - 1)
max++;
minval = DTRACE_QUANTIZE_BUCKETVAL(min);
maxval = DTRACE_QUANTIZE_BUCKETVAL(max);
if (dt_printf(dtp, fp, " %*lld :", dt_ndigits(minval),
(long long)minval) < 0)
return (-1);
for (i = min; i <= max; i++) {
dt_quantize_total(dtp, data[i], &total);
count += data[i];
}
for (i = min; i <= max; i++) {
if (dt_print_packed(dtp, fp, data[i], total) < 0)
return (-1);
}
if (dt_printf(dtp, fp, ": %*lld | %lld\n",
-dt_ndigits(maxval), (long long)maxval, (long long)count) < 0)
return (-1);
return (0);
}
int
dt_print_lquantize(dtrace_hdl_t *dtp, FILE *fp, const void *addr,
size_t size, uint64_t normal)
@ -651,7 +901,7 @@ dt_print_lquantize(dtrace_hdl_t *dtp, FILE *fp, const void *addr,
for (i = first_bin; i <= last_bin; i++) {
positives |= (data[i] > 0);
negatives |= (data[i] < 0);
total += dt_fabsl((long double)data[i]);
dt_quantize_total(dtp, data[i], &total);
}
if (dt_printf(dtp, fp, "\n%16s %41s %-9s\n", "value",
@ -663,8 +913,7 @@ dt_print_lquantize(dtrace_hdl_t *dtp, FILE *fp, const void *addr,
int err;
if (i == 0) {
(void) snprintf(c, sizeof (c), "< %d",
base / (uint32_t)normal);
(void) snprintf(c, sizeof (c), "< %d", base);
err = dt_printf(dtp, fp, "%16s ", c);
} else if (i == levels + 1) {
(void) snprintf(c, sizeof (c), ">= %d",
@ -683,6 +932,59 @@ dt_print_lquantize(dtrace_hdl_t *dtp, FILE *fp, const void *addr,
return (0);
}
/*ARGSUSED*/
int
dt_print_lquantize_packed(dtrace_hdl_t *dtp, FILE *fp, const void *addr,
size_t size, const dtrace_aggdata_t *aggdata)
{
const int64_t *data = addr;
long double total = 0, count = 0;
int min, max, base, err;
uint64_t arg;
uint16_t step, levels;
char c[32];
unsigned int i;
if (size < sizeof (uint64_t))
return (dt_set_errno(dtp, EDT_DMISMATCH));
arg = *data++;
size -= sizeof (uint64_t);
base = DTRACE_LQUANTIZE_BASE(arg);
step = DTRACE_LQUANTIZE_STEP(arg);
levels = DTRACE_LQUANTIZE_LEVELS(arg);
if (size != sizeof (uint64_t) * (levels + 2))
return (dt_set_errno(dtp, EDT_DMISMATCH));
min = 0;
max = levels + 1;
if (min == 0) {
(void) snprintf(c, sizeof (c), "< %d", base);
err = dt_printf(dtp, fp, "%8s :", c);
} else {
err = dt_printf(dtp, fp, "%8d :", base + (min - 1) * step);
}
if (err < 0)
return (-1);
for (i = min; i <= max; i++) {
dt_quantize_total(dtp, data[i], &total);
count += data[i];
}
for (i = min; i <= max; i++) {
if (dt_print_packed(dtp, fp, data[i], total) < 0)
return (-1);
}
(void) snprintf(c, sizeof (c), ">= %d", base + (levels * step));
return (dt_printf(dtp, fp, ": %-8s | %lld\n", c, (long long)count));
}
int
dt_print_llquantize(dtrace_hdl_t *dtp, FILE *fp, const void *addr,
size_t size, uint64_t normal)
@ -740,7 +1042,7 @@ dt_print_llquantize(dtrace_hdl_t *dtp, FILE *fp, const void *addr,
for (i = first_bin; i <= last_bin; i++) {
positives |= (data[i] > 0);
negatives |= (data[i] < 0);
total += dt_fabsl((long double)data[i]);
dt_quantize_total(dtp, data[i], &total);
}
if (dt_printf(dtp, fp, "\n%16s %41s %-9s\n", "value",
@ -823,7 +1125,7 @@ dt_print_stddev(dtrace_hdl_t *dtp, FILE *fp, caddr_t addr,
}
/*ARGSUSED*/
int
static int
dt_print_bytes(dtrace_hdl_t *dtp, FILE *fp, caddr_t addr,
size_t nbytes, int width, int quiet, int forceraw)
{
@ -876,10 +1178,12 @@ dt_print_bytes(dtrace_hdl_t *dtp, FILE *fp, caddr_t addr,
if (j != nbytes)
break;
if (quiet)
if (quiet) {
return (dt_printf(dtp, fp, "%s", c));
else
return (dt_printf(dtp, fp, " %-*s", width, c));
} else {
return (dt_printf(dtp, fp, " %s%*s",
width < 0 ? " " : "", width, c));
}
}
break;
@ -1793,10 +2097,83 @@ dt_trunc(dtrace_hdl_t *dtp, caddr_t base, dtrace_recdesc_t *rec)
static int
dt_print_datum(dtrace_hdl_t *dtp, FILE *fp, dtrace_recdesc_t *rec,
caddr_t addr, size_t size, uint64_t normal)
caddr_t addr, size_t size, const dtrace_aggdata_t *aggdata,
uint64_t normal, dt_print_aggdata_t *pd)
{
int err;
int err, width;
dtrace_actkind_t act = rec->dtrd_action;
boolean_t packed = pd->dtpa_agghist || pd->dtpa_aggpack;
dtrace_aggdesc_t *agg = aggdata->dtada_desc;
static struct {
size_t size;
int width;
int packedwidth;
} *fmt, fmttab[] = {
{ sizeof (uint8_t), 3, 3 },
{ sizeof (uint16_t), 5, 5 },
{ sizeof (uint32_t), 8, 8 },
{ sizeof (uint64_t), 16, 16 },
{ 0, -50, 16 }
};
if (packed && pd->dtpa_agghisthdr != agg->dtagd_varid) {
dtrace_recdesc_t *r;
width = 0;
/*
* To print our quantization header for either an agghist or
* aggpack aggregation, we need to iterate through all of our
* of our records to determine their width.
*/
for (r = rec; !DTRACEACT_ISAGG(r->dtrd_action); r++) {
for (fmt = fmttab; fmt->size &&
fmt->size != r->dtrd_size; fmt++)
continue;
width += fmt->packedwidth + 1;
}
if (pd->dtpa_agghist) {
if (dt_print_quanthdr(dtp, fp, width) < 0)
return (-1);
} else {
if (dt_print_quanthdr_packed(dtp, fp,
width, aggdata, r->dtrd_action) < 0)
return (-1);
}
pd->dtpa_agghisthdr = agg->dtagd_varid;
}
if (pd->dtpa_agghist && DTRACEACT_ISAGG(act)) {
char positives = aggdata->dtada_flags & DTRACE_A_HASPOSITIVES;
char negatives = aggdata->dtada_flags & DTRACE_A_HASNEGATIVES;
int64_t val;
assert(act == DTRACEAGG_SUM || act == DTRACEAGG_COUNT);
val = (long long)*((uint64_t *)addr);
if (dt_printf(dtp, fp, " ") < 0)
return (-1);
return (dt_print_quantline(dtp, fp, val, normal,
aggdata->dtada_total, positives, negatives));
}
if (pd->dtpa_aggpack && DTRACEACT_ISAGG(act)) {
switch (act) {
case DTRACEAGG_QUANTIZE:
return (dt_print_quantize_packed(dtp,
fp, addr, size, aggdata));
case DTRACEAGG_LQUANTIZE:
return (dt_print_lquantize_packed(dtp,
fp, addr, size, aggdata));
default:
break;
}
}
switch (act) {
case DTRACEACT_STACK:
@ -1839,28 +2216,33 @@ dt_print_datum(dtrace_hdl_t *dtp, FILE *fp, dtrace_recdesc_t *rec,
break;
}
for (fmt = fmttab; fmt->size && fmt->size != size; fmt++)
continue;
width = packed ? fmt->packedwidth : fmt->width;
switch (size) {
case sizeof (uint64_t):
err = dt_printf(dtp, fp, " %16lld",
err = dt_printf(dtp, fp, " %*lld", width,
/* LINTED - alignment */
(long long)*((uint64_t *)addr) / normal);
break;
case sizeof (uint32_t):
/* LINTED - alignment */
err = dt_printf(dtp, fp, " %8d", *((uint32_t *)addr) /
err = dt_printf(dtp, fp, " %*d", width, *((uint32_t *)addr) /
(uint32_t)normal);
break;
case sizeof (uint16_t):
/* LINTED - alignment */
err = dt_printf(dtp, fp, " %5d", *((uint16_t *)addr) /
err = dt_printf(dtp, fp, " %*d", width, *((uint16_t *)addr) /
(uint32_t)normal);
break;
case sizeof (uint8_t):
err = dt_printf(dtp, fp, " %3d", *((uint8_t *)addr) /
err = dt_printf(dtp, fp, " %*d", width, *((uint8_t *)addr) /
(uint32_t)normal);
break;
default:
err = dt_print_bytes(dtp, fp, addr, size, 50, 0, 0);
err = dt_print_bytes(dtp, fp, addr, size, width, 0, 0);
break;
}
@ -1881,6 +2263,9 @@ dt_print_aggs(const dtrace_aggdata_t **aggsdata, int naggvars, void *arg)
caddr_t addr;
size_t size;
pd->dtpa_agghist = (aggdata->dtada_flags & DTRACE_A_TOTAL);
pd->dtpa_aggpack = (aggdata->dtada_flags & DTRACE_A_MINMAXBIN);
/*
* Iterate over each record description in the key, printing the traced
* data, skipping the first datum (the tuple member created by the
@ -1897,7 +2282,8 @@ dt_print_aggs(const dtrace_aggdata_t **aggsdata, int naggvars, void *arg)
break;
}
if (dt_print_datum(dtp, fp, rec, addr, size, 1) < 0)
if (dt_print_datum(dtp, fp, rec, addr,
size, aggdata, 1, pd) < 0)
return (-1);
if (dt_buffered_flush(dtp, NULL, rec, aggdata,
@ -1920,7 +2306,8 @@ dt_print_aggs(const dtrace_aggdata_t **aggsdata, int naggvars, void *arg)
assert(DTRACEACT_ISAGG(act));
normal = aggdata->dtada_normal;
if (dt_print_datum(dtp, fp, rec, addr, size, normal) < 0)
if (dt_print_datum(dtp, fp, rec, addr,
size, aggdata, normal, pd) < 0)
return (-1);
if (dt_buffered_flush(dtp, NULL, rec, aggdata,
@ -1931,8 +2318,10 @@ dt_print_aggs(const dtrace_aggdata_t **aggsdata, int naggvars, void *arg)
agg->dtagd_flags |= DTRACE_AGD_PRINTED;
}
if (dt_printf(dtp, fp, "\n") < 0)
return (-1);
if (!pd->dtpa_agghist && !pd->dtpa_aggpack) {
if (dt_printf(dtp, fp, "\n") < 0)
return (-1);
}
if (dt_buffered_flush(dtp, NULL, NULL, aggdata,
DTRACE_BUFDATA_AGGFORMAT | DTRACE_BUFDATA_AGGLAST) < 0)
@ -2401,7 +2790,7 @@ dt_consume_cpu(dtrace_hdl_t *dtp, FILE *fp, int cpu,
}
n = dt_print_bytes(dtp, fp, addr,
tracememsize, 33, quiet, 1);
tracememsize, -33, quiet, 1);
tracememsize = 0;
@ -2434,7 +2823,7 @@ dt_consume_cpu(dtrace_hdl_t *dtp, FILE *fp, int cpu,
break;
default:
n = dt_print_bytes(dtp, fp, addr,
rec->dtrd_size, 33, quiet, 0);
rec->dtrd_size, -33, quiet, 0);
break;
}

View file

@ -21,7 +21,8 @@
*/
/*
* Copyright 2005 Sun Microsystems, Inc. All rights reserved.
* Copyright (c) 2012 by Delphix. All rights reserved.
* Copyright (c) 2013 by Delphix. All rights reserved.
* Copyright (c) 2013 Joyent, Inc. All rights reserved.
* Use is subject to license terms.
*/
@ -779,7 +780,7 @@ dt_decl_enumerator(char *s, dt_node_t *dnp)
yyintdecimal = 0;
dnp = dt_node_int(value);
dt_node_type_assign(dnp, dsp->ds_ctfp, dsp->ds_type);
dt_node_type_assign(dnp, dsp->ds_ctfp, dsp->ds_type, B_FALSE);
if ((inp = malloc(sizeof (dt_idnode_t))) == NULL)
longjmp(yypcb->pcb_jmpbuf, EDT_NOMEM);
@ -821,6 +822,8 @@ dt_decl_type(dt_decl_t *ddp, dtrace_typeinfo_t *tip)
char *name;
int rv;
tip->dtt_flags = 0;
/*
* Based on our current #include depth and decl stack depth, determine
* which dynamic CTF module and scope to use when adding any new types.
@ -828,6 +831,9 @@ dt_decl_type(dt_decl_t *ddp, dtrace_typeinfo_t *tip)
dmp = yypcb->pcb_idepth ? dtp->dt_cdefs : dtp->dt_ddefs;
flag = yypcb->pcb_dstack.ds_next ? CTF_ADD_NONROOT : CTF_ADD_ROOT;
if (ddp->dd_attr & DT_DA_USER)
tip->dtt_flags = DTT_FL_USER;
/*
* If we have already cached a CTF type for this decl, then we just
* return the type information for the cached type.

View file

@ -23,12 +23,14 @@
* Copyright 2005 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
/*
* Copyright (c) 2013 by Delphix. All rights reserved.
* Copyright (c) 2013 Joyent, Inc. All rights reserved.
*/
#ifndef _DT_DECL_H
#define _DT_DECL_H
#pragma ident "%Z%%M% %I% %E% SMI"
#include <sys/types.h>
#include <libctf.h>
#include <dtrace.h>
@ -59,6 +61,7 @@ typedef struct dt_decl {
#define DT_DA_RESTRICT 0x0040 /* qualify type as restrict */
#define DT_DA_VOLATILE 0x0080 /* qualify type as volatile */
#define DT_DA_PAREN 0x0100 /* parenthesis tag */
#define DT_DA_USER 0x0200 /* user-land type specifier */
typedef enum dt_dclass {
DT_DC_DEFAULT, /* no storage class specified */

View file

@ -26,7 +26,8 @@
*/
/*
* Copyright (c) 2012 by Delphix. All rights reserved.
* Copyright (c) 2013 by Delphix. All rights reserved.
* Copyright (c) 2013 Joyent, Inc. All rights reserved.
*/
#include <strings.h>
@ -312,9 +313,10 @@ dt_dis_typestr(const dtrace_diftype_t *t, char *buf, size_t len)
(void) snprintf(ckind, sizeof (ckind), "0x%x", t->dtdt_ckind);
}
if (t->dtdt_flags & DIF_TF_BYREF) {
(void) snprintf(buf, len, "%s (%s) by ref (size %lu)",
kind, ckind, (ulong_t)t->dtdt_size);
if (t->dtdt_flags & (DIF_TF_BYREF | DIF_TF_BYUREF)) {
(void) snprintf(buf, len, "%s (%s) by %sref (size %lu)",
kind, ckind, (t->dtdt_flags & DIF_TF_BYUREF) ? "user " : "",
(ulong_t)t->dtdt_size);
} else {
(void) snprintf(buf, len, "%s (%s) (size %lu)",
kind, ckind, (ulong_t)t->dtdt_size);

View file

@ -111,7 +111,8 @@ static const struct {
{ EDT_BADAGGVAR, "Invalid aggregation variable identifier" },
{ EDT_OVERSION, "Client requested deprecated version of library" },
{ EDT_ENABLING_ERR, "Failed to enable probe" },
{ EDT_NOPROBES, "No probe sites found for declared provider" }
{ EDT_NOPROBES, "No probe sites found for declared provider" },
{ EDT_CANTLOAD, "Failed to load module" },
};
static const int _dt_nerr = sizeof (_dt_errlist) / sizeof (_dt_errlist[0]);

View file

@ -23,8 +23,10 @@
* Copyright 2006 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
#pragma ident "%Z%%M% %I% %E% SMI"
/*
* Copyright (c) 2013 by Delphix. All rights reserved.
* Copyright (c) 2013, Joyent, Inc. All rights reserved.
*/
#include <dt_impl.h>
@ -102,6 +104,7 @@
%token DT_KEY_TYPEDEF
%token DT_KEY_UNION
%token DT_KEY_UNSIGNED
%token DT_KEY_USERLAND
%token DT_KEY_VOID
%token DT_KEY_VOLATILE
%token DT_KEY_WHILE
@ -633,6 +636,7 @@ type_specifier: DT_KEY_VOID { $$ = dt_decl_spec(CTF_K_INTEGER, DUP("void")); }
| DT_KEY_DOUBLE { $$ = dt_decl_spec(CTF_K_FLOAT, DUP("double")); }
| DT_KEY_SIGNED { $$ = dt_decl_attr(DT_DA_SIGNED); }
| DT_KEY_UNSIGNED { $$ = dt_decl_attr(DT_DA_UNSIGNED); }
| DT_KEY_USERLAND { $$ = dt_decl_attr(DT_DA_USER); }
| DT_KEY_STRING {
$$ = dt_decl_spec(CTF_K_TYPEDEF, DUP("string"));
}

Some files were not shown because too many files have changed in this diff Show more