xref: /freebsd/cddl/usr.sbin/dwatch/libexec/namei (revision 434283fda99e89af20c3fe95fde427624ae96d04)
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