# -*- 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. $ # ############################################################ 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 if [ ! "$CUSTOM_DETAILS" ]; then 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 ) fi ################################################################################ # END ################################################################################