1*434283fdSDevin Teske# -*- tab-width: 4 -*- ;; Emacs 2*434283fdSDevin Teske# vi: set filetype=sh tabstop=8 shiftwidth=8 noexpandtab :: Vi/ViM 3*434283fdSDevin Teske############################################################ IDENT(1) 4*434283fdSDevin Teske# 5*434283fdSDevin Teske# $Title: dwatch(8) module for namei(9) pathname resolution $ 6*434283fdSDevin Teske# $Copyright: 2026 Devin Teske. All rights reserved. $ 7*434283fdSDevin Teske# 8*434283fdSDevin Teske############################################################ DESCRIPTION 9*434283fdSDevin Teske# 10*434283fdSDevin Teske# Print pathnames given to namei(9) for resolution, exactly as the process 11*434283fdSDevin Teske# requested them, together with the lookup result. Unlike the vop_lookup 12*434283fdSDevin Teske# profile, which reconstructs paths from the name cache one component at a 13*434283fdSDevin Teske# time, this rides the vfs:namei:lookup probes and so sees the whole path 14*434283fdSDevin Teske# in one piece. Use namei-failure to show only failed lookups or 15*434283fdSDevin Teske# namei-enoent to hunt file-not-found storms (the single most common 16*434283fdSDevin Teske# use of truss(1), without stopping the victim). 17*434283fdSDevin Teske# 18*434283fdSDevin Teske############################################################ PROBE 19*434283fdSDevin Teske 20*434283fdSDevin Teskecase "$PROFILE" in 21*434283fdSDevin Teskenamei|namei-enoent|namei-failure) 22*434283fdSDevin Teske : ${PROBE:=vfs:namei:lookup:return} ;; 23*434283fdSDevin Teskenamei-entry) 24*434283fdSDevin Teske : ${PROBE:=vfs:namei:lookup:entry} ;; 25*434283fdSDevin Teske*) 26*434283fdSDevin Teske : ${PROBE:=vfs:namei:lookup:${PROFILE#namei-}} 27*434283fdSDevin Teskeesac 28*434283fdSDevin Teske 29*434283fdSDevin Teske############################################################ EVENT ACTION 30*434283fdSDevin Teske 31*434283fdSDevin Teske[ "$CUSTOM_TEST" ] || case "$PROFILE" in 32*434283fdSDevin Teskenamei-enoent) EVENT_TEST="this->namei_error == ENOENT" ;; 33*434283fdSDevin Teskenamei-failure) EVENT_TEST="this->namei_error != 0" ;; 34*434283fdSDevin Teskeesac 35*434283fdSDevin Teske 36*434283fdSDevin Teske############################################################ ACTIONS 37*434283fdSDevin Teske 38*434283fdSDevin Teskeexec 9<<EOF 39*434283fdSDevin Teskeself string namei_path; 40*434283fdSDevin Teskethis int namei_error; 41*434283fdSDevin Teskethis string namei_pathstr; 42*434283fdSDevin Teske 43*434283fdSDevin Teskevfs:namei:lookup:entry /* probe ID $ID */ 44*434283fdSDevin Teske{${TRACE:+ 45*434283fdSDevin Teske printf("<$ID>"); 46*434283fdSDevin Teske} 47*434283fdSDevin Teske /* 48*434283fdSDevin Teske * char * (kernel copy of the path being resolved) 49*434283fdSDevin Teske */ 50*434283fdSDevin Teske this->namei_pathstr = self->namei_path = stringof(arg1); 51*434283fdSDevin Teske this->namei_error = 0; 52*434283fdSDevin Teske} 53*434283fdSDevin Teske 54*434283fdSDevin Teskevfs:namei:lookup:return /* probe ID $(( $ID + 1 )) */ 55*434283fdSDevin Teske{${TRACE:+ 56*434283fdSDevin Teske printf("<$(( $ID + 1 ))>"); 57*434283fdSDevin Teske} 58*434283fdSDevin Teske /* NB: path was recorded at entry by the clause above */ 59*434283fdSDevin Teske this->namei_pathstr = self->namei_path; 60*434283fdSDevin Teske this->namei_error = (int)arg0; 61*434283fdSDevin Teske self->namei_path = 0; 62*434283fdSDevin Teske} 63*434283fdSDevin TeskeEOF 64*434283fdSDevin TeskeACTIONS=$( cat <&9 ) 65*434283fdSDevin TeskeID=$(( $ID + 2 )) 66*434283fdSDevin Teske 67*434283fdSDevin Teske############################################################ EVENT DETAILS 68*434283fdSDevin Teske 69*434283fdSDevin Teskeif [ ! "$CUSTOM_DETAILS" ]; then 70*434283fdSDevin Teskeexec 9<<EOF 71*434283fdSDevin Teske /* 72*434283fdSDevin Teske * Print pathname resolution details 73*434283fdSDevin Teske */ 74*434283fdSDevin Teske printf("%s%s", this->namei_pathstr, 75*434283fdSDevin Teske this->namei_error == 0 ? "" : strjoin(": ", 76*434283fdSDevin Teske strjoin(strerror[this->namei_error], 77*434283fdSDevin Teske strjoin(" (", strjoin(lltostr(this->namei_error), ")"))))); 78*434283fdSDevin TeskeEOF 79*434283fdSDevin TeskeEVENT_DETAILS=$( cat <&9 ) 80*434283fdSDevin Teskefi 81*434283fdSDevin Teske 82*434283fdSDevin Teske################################################################################ 83*434283fdSDevin Teske# END 84*434283fdSDevin Teske################################################################################ 85