15bf5ca77SDevin Teske# -*- tab-width: 4 -*- ;; Emacs 25bf5ca77SDevin Teske# vi: set filetype=sh tabstop=8 shiftwidth=8 noexpandtab :: Vi/ViM 35bf5ca77SDevin Teske############################################################ IDENT(1) 45bf5ca77SDevin Teske# 55bf5ca77SDevin Teske# $Title: dwatch(8) module for read(2), write(2), or similar entry $ 65bf5ca77SDevin Teske# $Copyright: 2014-2018 Devin Teske. All rights reserved. $ 75bf5ca77SDevin Teske# $FreeBSD$ 85bf5ca77SDevin Teske# 95bf5ca77SDevin Teske############################################################ DESCRIPTION 105bf5ca77SDevin Teske# 115bf5ca77SDevin Teske# Display data sent/received when read(2)/write(2) occurs 125bf5ca77SDevin Teske# 135bf5ca77SDevin Teske############################################################ PROBE 145bf5ca77SDevin Teske 155bf5ca77SDevin Teskecase "$PROFILE" in 165bf5ca77SDevin Teskerw) : ${PROBE:=syscall::read:entry, syscall::write:entry} ;; 175bf5ca77SDevin Teske *) : ${PROBE:=syscall::$PROFILE:entry} 185bf5ca77SDevin Teskeesac 195bf5ca77SDevin Teske 205bf5ca77SDevin Teske############################################################ ACTIONS 215bf5ca77SDevin Teske 225bf5ca77SDevin Teskeexec 9<<EOF 235bf5ca77SDevin Teskethis size_t nbytes; 245bf5ca77SDevin Teskethis string bufstr; 255bf5ca77SDevin Teskethis string flow; 265bf5ca77SDevin Teskethis void * buf; 275bf5ca77SDevin Teskethis void * data; 285bf5ca77SDevin Teske 295bf5ca77SDevin Teske$PROBE /* probe ID $ID */ 305bf5ca77SDevin Teske{${TRACE:+ 315bf5ca77SDevin Teske printf("<$ID>"); 325bf5ca77SDevin Teske} 335bf5ca77SDevin Teske /* 345bf5ca77SDevin Teske * R/W 355bf5ca77SDevin Teske */ 365bf5ca77SDevin Teske this->flow = probefunc == "read" ? "<-" : "->"; 375bf5ca77SDevin Teske this->buf = (void *)arg1; 385bf5ca77SDevin Teske this->nbytes = (size_t)arg2; 395bf5ca77SDevin Teske 405bf5ca77SDevin Teske /* 415bf5ca77SDevin Teske * Allocate temporary memory for, copy, and NUL-terminate the data 425bf5ca77SDevin Teske */ 435bf5ca77SDevin Teske this->data = alloca(this->nbytes + 1); 445bf5ca77SDevin Teske copyinto((uintptr_t)this->buf, this->nbytes, this->data); 455bf5ca77SDevin Teske bcopy("\0", (void *)((uintptr_t)this->data + this->nbytes), 1); 465bf5ca77SDevin Teske 475bf5ca77SDevin Teske /* 485bf5ca77SDevin Teske * Extract string from temporary memory 495bf5ca77SDevin Teske */ 505bf5ca77SDevin Teske this->bufstr = stringof(this->data); 515bf5ca77SDevin Teske} 525bf5ca77SDevin TeskeEOF 535bf5ca77SDevin TeskeACTIONS=$( cat <&9 ) 545bf5ca77SDevin TeskeID=$(( $ID + 1 )) 555bf5ca77SDevin Teske 565bf5ca77SDevin Teske############################################################ EVENT DETAILS 575bf5ca77SDevin Teske 58*a061d970SDevin Teskeif [ ! "$CUSTOM_DETAILS" ]; then 595bf5ca77SDevin Teskeexec 9<<EOF 605bf5ca77SDevin Teske /* 615bf5ca77SDevin Teske * Print read/write details 625bf5ca77SDevin Teske */ 635bf5ca77SDevin Teske printf("%s \"%s\" %d byte%s", 645bf5ca77SDevin Teske this->flow, 655bf5ca77SDevin Teske this->bufstr, 665bf5ca77SDevin Teske this->nbytes, 675bf5ca77SDevin Teske this->nbytes == 1 ? "" : "s"); 685bf5ca77SDevin TeskeEOF 695bf5ca77SDevin TeskeEVENT_DETAILS=$( cat <&9 ) 70*a061d970SDevin Teskefi 715bf5ca77SDevin Teske 725bf5ca77SDevin Teske################################################################################ 735bf5ca77SDevin Teske# END 745bf5ca77SDevin Teske################################################################################ 75