mirror of
https://github.com/freebsd/freebsd-src
synced 2024-10-15 12:54:27 +00:00
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:
commit
cb1afb58c2
|
@ -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
|
||||
|
|
7
Makefile
7
Makefile
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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/
|
||||
|
|
37
UPDATING
37
UPDATING
|
@ -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
|
||||
|
|
|
@ -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 .
|
||||
|
|
|
@ -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 .
|
||||
|
|
17
bin/mv/mv.c
17
bin/mv/mv.c
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 .
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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 .
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
4
bin/sh/tests/parameters/positional3.0
Normal file
4
bin/sh/tests/parameters/positional3.0
Normal file
|
@ -0,0 +1,4 @@
|
|||
# $FreeBSD$
|
||||
|
||||
r=$(${SH} -c 'echo ${01:+yes}${010:+yes}' '' a '' '' '' '' '' '' '' '' b)
|
||||
[ "$r" = yesyes ]
|
4
bin/sh/tests/parameters/positional4.0
Normal file
4
bin/sh/tests/parameters/positional4.0
Normal file
|
@ -0,0 +1,4 @@
|
|||
# $FreeBSD$
|
||||
|
||||
set -- "x$0" 2 3 4 5 6 7 8 9 "y$0"
|
||||
[ "${01}.${010}" = "$1.${10}" ]
|
14
bin/sh/tests/parameters/positional5.0
Normal file
14
bin/sh/tests/parameters/positional5.0
Normal 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
|
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
}
|
|
@ -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
|
||||
|
||||
|
|
@ -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);
|
||||
}
|
||||
|
|
@ -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
|
||||
|
|
@ -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);
|
||||
}
|
|
@ -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
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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);
|
||||
}
|
|
@ -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
|
||||
|
|
@ -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);
|
||||
}
|
|
@ -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
|
||||
|
||||
|
|
@ -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/
|
||||
|
|
|
@ -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);
|
||||
}
|
|
@ -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>|
|
||||
|
|
@ -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);
|
||||
}
|
|
@ -0,0 +1,13 @@
|
|||
|{"a": 1024|
|
||||
<NULL>
|
||||
|
||||
|{"a": 1024}|
|
||||
1024
|
||||
|
||||
|{"a":false,"b":tru|
|
||||
<NULL>
|
||||
|
||||
|{"a":false,"b":20}|
|
||||
20
|
||||
|
||||
|
|
@ -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);
|
||||
}
|
|
@ -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);
|
||||
}
|
|
@ -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!
|
||||
|
|
@ -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);
|
||||
};
|
|
@ -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
|
|
@ -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++;
|
||||
}
|
||||
|
|
|
@ -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
|
|
@ -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);
|
||||
}
|
|
@ -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
|
|
@ -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);
|
||||
}
|
|
@ -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);
|
||||
}
|
|
@ -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);
|
||||
}
|
|
@ -0,0 +1,20 @@
|
|||
0
|
||||
1
|
||||
32
|
||||
-32
|
||||
8
|
||||
42
|
||||
9223372036854775807
|
||||
-9223372036854775808
|
||||
9223372036854775807
|
||||
-9223372036854775808
|
||||
-9223372036854775808
|
||||
9223372036854775807
|
||||
3135097598
|
||||
12
|
||||
2
|
||||
-1819882045752187535
|
||||
1985
|
||||
-2012
|
||||
0
|
||||
|
|
@ -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);
|
||||
}
|
|
@ -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);
|
||||
}
|
|
@ -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);
|
||||
}
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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);
|
||||
}
|
|
@ -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
|
|
@ -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(<tp);
|
||||
sleep(1);
|
||||
}
|
||||
|
||||
return (0);
|
||||
}
|
|
@ -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
|
|
@ -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
|
||||
|
|
@ -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);
|
||||
}
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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);
|
||||
}
|
|
@ -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
|
|
@ -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
|
||||
}
|
||||
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
||||
|
|
@ -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
|
|
@ -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
|
||||
|
|
@ -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
|
|
@ -0,0 +1,3 @@
|
|||
bagnoogle 1
|
||||
doogle 1
|
||||
|
|
@ -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
|
|
@ -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.
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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"),
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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.
|
||||
|
|
79
cddl/contrib/opensolaris/common/util/strtolctype.h
Normal file
79
cddl/contrib/opensolaris/common/util/strtolctype.h
Normal 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 */
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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]);
|
||||
|
|
|
@ -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
Loading…
Reference in a new issue