Changeset View
Changeset View
Standalone View
Standalone View
cddl/usr.sbin/dwatch/libexec/rw
- This file was added.
Property | Old Value | New Value |
---|---|---|
svn:keywords | null | FreeBSD=%H \ No newline at end of property |
# -*- tab-width: 4 -*- ;; Emacs | |||||
# vi: set filetype=sh tabstop=8 shiftwidth=8 noexpandtab :: Vi/ViM | |||||
############################################################ IDENT(1) | |||||
# | |||||
# $Title: dwatch(8) module for read(2), write(2), or similar entry $ | |||||
# $Copyright: 2014-2018 Devin Teske. All rights reserved. $ | |||||
# $FreeBSD$ | |||||
# | |||||
############################################################ DESCRIPTION | |||||
# | |||||
# Display data sent/received when read(2)/write(2) occurs | |||||
# | |||||
############################################################ PROBE | |||||
case "$PROFILE" in | |||||
rw) : ${PROBE:=syscall::read:entry, syscall::write:entry} ;; | |||||
*) : ${PROBE:=syscall::$PROFILE:entry} | |||||
esac | |||||
############################################################ ACTIONS | |||||
exec 9<<EOF | |||||
this size_t nbytes; | |||||
this string bufstr; | |||||
this string flow; | |||||
this void * buf; | |||||
this void * data; | |||||
$PROBE /* probe ID $ID */ | |||||
{${TRACE:+ | |||||
printf("<$ID>"); | |||||
} | |||||
/* | |||||
* R/W | |||||
*/ | |||||
this->flow = probefunc == "read" ? "<-" : "->"; | |||||
this->buf = (void *)arg1; | |||||
this->nbytes = (size_t)arg2; | |||||
/* | |||||
* Allocate temporary memory for, copy, and NUL-terminate the data | |||||
*/ | |||||
this->data = alloca(this->nbytes + 1); | |||||
copyinto((uintptr_t)this->buf, this->nbytes, this->data); | |||||
bcopy("\0", (void *)((uintptr_t)this->data + this->nbytes), 1); | |||||
/* | |||||
* Extract string from temporary memory | |||||
*/ | |||||
this->bufstr = stringof(this->data); | |||||
} | |||||
EOF | |||||
ACTIONS=$( cat <&9 ) | |||||
ID=$(( $ID + 1 )) | |||||
############################################################ EVENT DETAILS | |||||
exec 9<<EOF | |||||
/* | |||||
* Print read/write details | |||||
*/ | |||||
printf("%s \"%s\" %d byte%s", | |||||
this->flow, | |||||
this->bufstr, | |||||
this->nbytes, | |||||
this->nbytes == 1 ? "" : "s"); | |||||
EOF | |||||
EVENT_DETAILS=$( cat <&9 ) | |||||
################################################################################ | |||||
# END | |||||
################################################################################ |