xref: /freebsd/cddl/usr.sbin/dwatch/libexec/vop_readdir (revision d0b2dbfa0ecf2bbc9709efc5e20baf8e4b44bbbf)
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 VOP_READDIR(9) [or similar] entry $
65bf5ca77SDevin Teske# $Copyright: 2014-2018 Devin Teske. All rights reserved. $
75bf5ca77SDevin Teske#
85bf5ca77SDevin Teske############################################################ DESCRIPTION
95bf5ca77SDevin Teske#
105bf5ca77SDevin Teske# Print directory paths being read by VOP_READDIR(9) [or similar]
115bf5ca77SDevin Teske# NB: All paths are shown even if error prevents their reading.
125bf5ca77SDevin Teske#
135bf5ca77SDevin Teske############################################################ PROBE
145bf5ca77SDevin Teske
155bf5ca77SDevin Teske: ${PROBE:=vfs:vop:$PROFILE:entry}
165bf5ca77SDevin Teske
175bf5ca77SDevin Teske############################################################ ACTIONS
185bf5ca77SDevin Teske
195bf5ca77SDevin Teskeexec 9<<EOF
205bf5ca77SDevin Teske$PROBE /* probe ID $ID */
215bf5ca77SDevin Teske{${TRACE:+
225bf5ca77SDevin Teske	printf("<$ID>");}
235bf5ca77SDevin Teske	this->vp = (struct vnode *)arg0;
245bf5ca77SDevin Teske	this->ncp = this->vp != NULL ?
255bf5ca77SDevin Teske		this->vp->v_cache_dst.tqh_first : 0;
265bf5ca77SDevin Teske	this->mount = this->vp != NULL ?
275bf5ca77SDevin Teske		this->vp->v_mount : NULL; /* ptr to vfs we are in */
285bf5ca77SDevin Teske	this->fi_fs = this->mount != NULL ?
295bf5ca77SDevin Teske		stringof(this->mount->mnt_stat.f_fstypename) : "";
305bf5ca77SDevin Teske	this->fi_mount = this->mount != NULL ?
315bf5ca77SDevin Teske		stringof(this->mount->mnt_stat.f_mntonname) : "";
325bf5ca77SDevin Teske	this->d_name = args[0]->v_cache_dd != NULL ?
335bf5ca77SDevin Teske		stringof(args[0]->v_cache_dd->nc_name) : "";
345bf5ca77SDevin Teske
355bf5ca77SDevin Teske	$( awk -v MAX_DEPTH=$MAX_DEPTH '
365bf5ca77SDevin Teske		{ sub(/^\\\t/, "\t") }
375bf5ca77SDevin Teske		{ buf = buf "\t" $0 "\n" }
385bf5ca77SDevin Teske		END {
395bf5ca77SDevin Teske			sub(/\n$/, "", buf)
405bf5ca77SDevin Teske			$0 = buf
415bf5ca77SDevin Teske			sub(/^[[:space:]]*/, "")
425bf5ca77SDevin Teske			for (DEPTH = 1; DEPTH <= MAX_DEPTH + 1; DEPTH++) {
435bf5ca77SDevin Teske				gsub(/DEPTH/, DEPTH)
445bf5ca77SDevin Teske				print
455bf5ca77SDevin Teske				$0 = buf
465bf5ca77SDevin Teske			}
475bf5ca77SDevin Teske		}
485bf5ca77SDevin Teske	' <<-EOFDEPTH
495bf5ca77SDevin Teske	this->nameDEPTH = "";
505bf5ca77SDevin Teske	EOFDEPTH
515bf5ca77SDevin Teske	)
525bf5ca77SDevin Teske}
535bf5ca77SDevin Teske
545bf5ca77SDevin Teske$PROBE /this->vp == 0 || this->fi_fs == 0 ||
555bf5ca77SDevin Teske	this->fi_fs == "devfs" || this->fi_fs == ""/ /* probe ID $((
565bf5ca77SDevin Teske		$ID + 1
575bf5ca77SDevin Teske	)) */
585bf5ca77SDevin Teske{${TRACE:+
595bf5ca77SDevin Teske	printf("<$(( $ID + 1 ))>");}
605bf5ca77SDevin Teske	this->ncp = 0;
615bf5ca77SDevin Teske}
625bf5ca77SDevin Teske
635bf5ca77SDevin Teske/*********************************************************/
645bf5ca77SDevin Teske
655bf5ca77SDevin Teske$PROBE /this->ncp/ /* probe ID $(( $ID + 2 )) (depth 1) */
665bf5ca77SDevin Teske{${TRACE:+
675bf5ca77SDevin Teske	printf("<$(( $ID + 2 ))>");}
685bf5ca77SDevin Teske	this->dvp = this->ncp->nc_dvp != NULL ?
695bf5ca77SDevin Teske		this->ncp->nc_dvp->v_cache_dst.tqh_first : 0;
705bf5ca77SDevin Teske	this->name1 = this->dvp != 0 ? (
715bf5ca77SDevin Teske		this->dvp->nc_name != 0 ? stringof(this->dvp->nc_name) : ""
725bf5ca77SDevin Teske	) : "";
735bf5ca77SDevin Teske}
745bf5ca77SDevin Teske
755bf5ca77SDevin Teske$PROBE /this->name1 == 0 || this->fi_fs == 0 ||
765bf5ca77SDevin Teske	this->fi_fs == "devfs" || this->fi_fs == "" ||
775bf5ca77SDevin Teske	this->name1 == "/" || this->name1 == ""/ /* probe ID $(( $ID + 3 )) */
785bf5ca77SDevin Teske{${TRACE:+
795bf5ca77SDevin Teske	printf("<$(( $ID + 3 ))>");}
805bf5ca77SDevin Teske	this->dvp = 0;
815bf5ca77SDevin Teske}
825bf5ca77SDevin Teske
835bf5ca77SDevin Teske/*********************************************************/
845bf5ca77SDevin Teske
855bf5ca77SDevin Teske/*
865bf5ca77SDevin Teske * BEGIN Pathname-depth iterators
875bf5ca77SDevin Teske */
885bf5ca77SDevin Teske
895bf5ca77SDevin Teske$( awk -v ID=$(( $ID + 4 )) -v MAX_DEPTH=$MAX_DEPTH '
905bf5ca77SDevin Teske	{ buf = buf $0 "\n" }
915bf5ca77SDevin Teske	END {
925bf5ca77SDevin Teske		sub(/\n$/, "", buf)
935bf5ca77SDevin Teske		for (DEPTH = 2; DEPTH <= MAX_DEPTH; DEPTH++) {
945bf5ca77SDevin Teske			$0 = buf
955bf5ca77SDevin Teske			gsub(/DEPTH/, DEPTH)
965bf5ca77SDevin Teske			gsub(/IDNUM/, ID++)
975bf5ca77SDevin Teske			print
985bf5ca77SDevin Teske		}
995bf5ca77SDevin Teske	}
1005bf5ca77SDevin Teske' <<EOFDEPTH
1015bf5ca77SDevin Teske$PROBE /this->dvp/ /* probe ID IDNUM (depth DEPTH) */
1025bf5ca77SDevin Teske{${TRACE:+
1035bf5ca77SDevin Teske	printf("<IDNUM>");}
1045bf5ca77SDevin Teske	this->dvp = this->dvp->nc_dvp != NULL ?
1055bf5ca77SDevin Teske		this->dvp->nc_dvp->v_cache_dst.tqh_first : 0;
1065bf5ca77SDevin Teske	this->nameDEPTH = this->dvp != 0 ? (
1075bf5ca77SDevin Teske		this->dvp->nc_name != 0 ? stringof(this->dvp->nc_name) : ""
1085bf5ca77SDevin Teske	) : "";
1095bf5ca77SDevin Teske}
1105bf5ca77SDevin Teske
1115bf5ca77SDevin TeskeEOFDEPTH
1125bf5ca77SDevin Teske)
1135bf5ca77SDevin Teske
1145bf5ca77SDevin Teske$PROBE /this->dvp/ /* probe ID $(( $ID + $MAX_DEPTH + 3 )) */
1155bf5ca77SDevin Teske{${TRACE:+
1165bf5ca77SDevin Teske	printf("<$(( $ID + $MAX_DEPTH + 3 ))>");}
1175bf5ca77SDevin Teske	this->dvp = this->dvp->nc_dvp != NULL ?
1185bf5ca77SDevin Teske		this->dvp->nc_dvp->v_cache_dst.tqh_first : 0;
1195bf5ca77SDevin Teske	this->name$(( $MAX_DEPTH + 1 )) = this->dvp != 0 ? (
1205bf5ca77SDevin Teske		this->dvp->nc_dvp != NULL ? "..." : ""
1215bf5ca77SDevin Teske	) : "";
1225bf5ca77SDevin Teske}
1235bf5ca77SDevin Teske
1245bf5ca77SDevin Teske/*
1255bf5ca77SDevin Teske * END Pathname-depth iterators
1265bf5ca77SDevin Teske */
1275bf5ca77SDevin Teske
1285bf5ca77SDevin Teske/*********************************************************/
1295bf5ca77SDevin Teske
1305bf5ca77SDevin Teske$PROBE /this->fi_mount != 0/ /* probe ID $(( $ID + $MAX_DEPTH + 4 )) */
1315bf5ca77SDevin Teske{${TRACE:+
1325bf5ca77SDevin Teske	printf("<$(( $ID + $MAX_DEPTH + 4 ))>");
1335bf5ca77SDevin Teske}
1345bf5ca77SDevin Teske	/*
1355bf5ca77SDevin Teske	 * Join full path
1365bf5ca77SDevin Teske	 * NB: Up-to but not including the parent directory (joined below)
1375bf5ca77SDevin Teske	 */
1385bf5ca77SDevin Teske	this->path = this->fi_mount;
1395bf5ca77SDevin Teske	this->path = strjoin(this->path, this->fi_mount != 0 ? (
1405bf5ca77SDevin Teske		this->fi_mount == "/" ? "" : "/"
1415bf5ca77SDevin Teske	) : "/");
1425bf5ca77SDevin Teske	$( awk -v MAX_DEPTH=$MAX_DEPTH '
1435bf5ca77SDevin Teske		{ sub(/^\\\t/, "\t") }
1445bf5ca77SDevin Teske		{ buf = buf "\t" $0 "\n" }
1455bf5ca77SDevin Teske		END {
1465bf5ca77SDevin Teske			sub(/\n$/, "", buf)
1475bf5ca77SDevin Teske			$0 = buf
1485bf5ca77SDevin Teske			sub(/^[[:space:]]*/, "")
1495bf5ca77SDevin Teske			for (N = MAX_DEPTH + 1; N > 0; N--) {
1505bf5ca77SDevin Teske				gsub(/N/, N)
1515bf5ca77SDevin Teske				print
1525bf5ca77SDevin Teske				$0 = buf
1535bf5ca77SDevin Teske			}
1545bf5ca77SDevin Teske		}
1555bf5ca77SDevin Teske	' <<-EOFDEPTH
1565bf5ca77SDevin Teske	this->path = strjoin(this->path,
1575bf5ca77SDevin Teske	\	strjoin(this->nameN, this->nameN != "" ? "/" : ""));
1585bf5ca77SDevin Teske	EOFDEPTH
1595bf5ca77SDevin Teske	)
1605bf5ca77SDevin Teske
1615bf5ca77SDevin Teske	/* Join the parent directory name */
1625bf5ca77SDevin Teske	this->path = strjoin(this->path, strjoin(this->name =
1635bf5ca77SDevin Teske		(this->d_name != 0 ? this->d_name : ""),
1645bf5ca77SDevin Teske		this->name != "" ? "/" : ""));
165*22827565SDevin Teske}
1665bf5ca77SDevin TeskeEOF
1675bf5ca77SDevin TeskeACTIONS=$( cat <&9 )
1685bf5ca77SDevin TeskeID=$(( $ID + $MAX_DEPTH + 5 ))
1695bf5ca77SDevin Teske
1705bf5ca77SDevin Teske############################################################ EVENT ACTION
1715bf5ca77SDevin Teske
1725bf5ca77SDevin TeskeEVENT_TEST="this->fi_mount != 0"
1735bf5ca77SDevin Teske
1745bf5ca77SDevin Teske############################################################ EVENT DETAILS
1755bf5ca77SDevin Teske
176a061d970SDevin Teskeif [ ! "$CUSTOM_DETAILS" ]; then
1775bf5ca77SDevin Teskeexec 9<<EOF
1785bf5ca77SDevin Teske	/*
1795bf5ca77SDevin Teske	 * Print full path
1805bf5ca77SDevin Teske	 */
1815bf5ca77SDevin Teske	printf("%s", this->path);
1825bf5ca77SDevin TeskeEOF
1835bf5ca77SDevin TeskeEVENT_DETAILS=$( cat <&9 )
184a061d970SDevin Teskefi
1855bf5ca77SDevin Teske
1865bf5ca77SDevin Teske################################################################################
1875bf5ca77SDevin Teske# END
1885bf5ca77SDevin Teske################################################################################
189