xref: /freebsd/cddl/usr.sbin/dwatch/libexec/vop_rename (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_RENAME(9) [or similar] entry $
65bf5ca77SDevin Teske# $Copyright: 2014-2018 Devin Teske. All rights reserved. $
75bf5ca77SDevin Teske#
85bf5ca77SDevin Teske############################################################ DESCRIPTION
95bf5ca77SDevin Teske#
105bf5ca77SDevin Teske# Print filesystem paths being renamed by VOP_RENAME(9) [or similar]
115bf5ca77SDevin Teske# NB: All paths are shown even if error prevents their rename.
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->fvp = args[1] ? args[1]->a_fdvp : NULL;
245bf5ca77SDevin Teske	this->fncp = this->fvp != NULL ?
255bf5ca77SDevin Teske		this->fvp->v_cache_dst.tqh_first : 0;
265bf5ca77SDevin Teske	this->ffi_name = args[1] ? (
275bf5ca77SDevin Teske		args[1]->a_fcnp != NULL ?
285bf5ca77SDevin Teske			stringof(args[1]->a_fcnp->cn_nameptr) : ""
295bf5ca77SDevin Teske	) : "";
305bf5ca77SDevin Teske	this->fmount = this->fvp != NULL ?
315bf5ca77SDevin Teske		this->fvp->v_mount : NULL; /* ptr to vfs we are in */
325bf5ca77SDevin Teske	this->ffi_fs = this->fmount != NULL ?
335bf5ca77SDevin Teske		stringof(this->fmount->mnt_stat.f_fstypename) : "";
345bf5ca77SDevin Teske	this->ffi_mount = this->fmount != NULL ?
355bf5ca77SDevin Teske		stringof(this->fmount->mnt_stat.f_mntonname) : "";
365bf5ca77SDevin Teske	this->fd_name = args[0]->v_cache_dd != NULL ?
375bf5ca77SDevin Teske		stringof(args[0]->v_cache_dd->nc_name) : "";
385bf5ca77SDevin Teske
395bf5ca77SDevin Teske	this->tvp = args[1] ? args[1]->a_tdvp : NULL;
405bf5ca77SDevin Teske	this->tncp = this->tvp != NULL ?
415bf5ca77SDevin Teske		this->tvp->v_cache_dst.tqh_first : 0;
425bf5ca77SDevin Teske	this->tfi_name = args[1] ? (
435bf5ca77SDevin Teske		args[1]->a_tcnp != NULL ?
445bf5ca77SDevin Teske			stringof(args[1]->a_tcnp->cn_nameptr) : ""
455bf5ca77SDevin Teske	) : "";
465bf5ca77SDevin Teske	this->tmount = this->tvp != NULL ?
475bf5ca77SDevin Teske		this->tvp->v_mount : NULL; /* ptr to vfs we are in */
485bf5ca77SDevin Teske	this->tfi_fs = this->tmount != NULL ?
495bf5ca77SDevin Teske		stringof(this->tmount->mnt_stat.f_fstypename) : "";
505bf5ca77SDevin Teske	this->tfi_mount = this->tmount != NULL ?
515bf5ca77SDevin Teske		stringof(this->tmount->mnt_stat.f_mntonname) : "";
525bf5ca77SDevin Teske	this->td_name = this->tvp != NULL ? (
535bf5ca77SDevin Teske		this->tvp->v_cache_dd != NULL ?
545bf5ca77SDevin Teske			stringof(this->tvp->v_cache_dd->nc_name) : ""
555bf5ca77SDevin Teske	) : "";
565bf5ca77SDevin Teske
575bf5ca77SDevin Teske	$( awk -v MAX_DEPTH=$MAX_DEPTH '
585bf5ca77SDevin Teske		{ sub(/^\\\t/, "\t") }
595bf5ca77SDevin Teske		{ buf = buf "\t" $0 "\n" }
605bf5ca77SDevin Teske		END {
615bf5ca77SDevin Teske			sub(/\n$/, "", buf)
625bf5ca77SDevin Teske			$0 = buf
635bf5ca77SDevin Teske			sub(/^[[:space:]]*/, "")
645bf5ca77SDevin Teske			for (DEPTH = 1; DEPTH <= MAX_DEPTH + 1; DEPTH++) {
655bf5ca77SDevin Teske				gsub(/DEPTH/, DEPTH)
665bf5ca77SDevin Teske				print
675bf5ca77SDevin Teske				$0 = buf
685bf5ca77SDevin Teske			}
695bf5ca77SDevin Teske		}
705bf5ca77SDevin Teske	' <<-EOFDEPTH
715bf5ca77SDevin Teske	this->fnameDEPTH = this->tnameDEPTH = "";
725bf5ca77SDevin Teske	EOFDEPTH
735bf5ca77SDevin Teske	)
745bf5ca77SDevin Teske}
755bf5ca77SDevin Teske
765bf5ca77SDevin Teske$PROBE /this->fvp == 0 || this->ffi_fs == 0 ||
775bf5ca77SDevin Teske	this->ffi_fs == "devfs" || this->ffi_fs == "" ||
785bf5ca77SDevin Teske	this->ffi_name == ""/ /* probe ID $(( $ID + 1 )) */
795bf5ca77SDevin Teske{${TRACE:+
805bf5ca77SDevin Teske	printf("<$(( $ID + 1 ))>");}
815bf5ca77SDevin Teske	this->fncp = 0;
825bf5ca77SDevin Teske}
835bf5ca77SDevin Teske
845bf5ca77SDevin Teske$PROBE /this->tvp == 0 || this->tfi_fs == 0 ||
855bf5ca77SDevin Teske	this->tfi_fs == "devfs" || this->tfi_fs == "" ||
865bf5ca77SDevin Teske	this->tfi_name == ""/ /* probe ID $(( $ID + 2 )) */
875bf5ca77SDevin Teske{${TRACE:+
885bf5ca77SDevin Teske	printf("<$(( $ID + 2 ))>");}
895bf5ca77SDevin Teske	this->tncp = 0;
905bf5ca77SDevin Teske}
915bf5ca77SDevin Teske
925bf5ca77SDevin Teske/*********************************************************/
935bf5ca77SDevin Teske
945bf5ca77SDevin Teske$PROBE /this->fncp/ /* probe ID $(( $ID + 3 )) (depth 1) */
955bf5ca77SDevin Teske{${TRACE:+
965bf5ca77SDevin Teske	printf("<$(( $ID + 3 ))>");}
975bf5ca77SDevin Teske	this->fdvp = this->fncp->nc_dvp != NULL ?
985bf5ca77SDevin Teske		this->fncp->nc_dvp->v_cache_dst.tqh_first : 0;
995bf5ca77SDevin Teske	this->fname1 = this->fdvp != 0 ? (
1005bf5ca77SDevin Teske		this->fdvp->nc_name != 0 ? stringof(this->fdvp->nc_name) : ""
1015bf5ca77SDevin Teske	) : "";
1025bf5ca77SDevin Teske}
1035bf5ca77SDevin Teske
1045bf5ca77SDevin Teske$PROBE /this->tncp/ /* probe ID $(( $ID + 4 )) (depth 1) */
1055bf5ca77SDevin Teske{${TRACE:+
1065bf5ca77SDevin Teske	printf("<$(( $ID + 4 ))>");}
1075bf5ca77SDevin Teske	this->tdvp = this->tncp->nc_dvp != NULL ?
1085bf5ca77SDevin Teske		this->tncp->nc_dvp->v_cache_dst.tqh_first : 0;
1095bf5ca77SDevin Teske	this->tname1 = this->tdvp != 0 ? (
1105bf5ca77SDevin Teske		this->tdvp->nc_name != 0 ? stringof(this->tdvp->nc_name) : ""
1115bf5ca77SDevin Teske	) : "";
1125bf5ca77SDevin Teske}
1135bf5ca77SDevin Teske
1145bf5ca77SDevin Teske$PROBE /this->fname1 == 0 || this->ffi_fs == 0 ||
1155bf5ca77SDevin Teske	this->ffi_fs == "devfs" || this->ffi_fs == "" ||
1165bf5ca77SDevin Teske	this->fname1 == "/" || this->fname1 == ""/ /* probe ID $((
1175bf5ca77SDevin Teske		$ID + 5
1185bf5ca77SDevin Teske	)) */
1195bf5ca77SDevin Teske{${TRACE:+
1205bf5ca77SDevin Teske	printf("<$(( $ID + 5 ))>");}
1215bf5ca77SDevin Teske	this->fdvp = 0;
1225bf5ca77SDevin Teske}
1235bf5ca77SDevin Teske
1245bf5ca77SDevin Teske$PROBE /this->tname1 == 0 || this->tfi_fs == 0 ||
1255bf5ca77SDevin Teske	this->tfi_fs == "devfs" || this->tfi_fs == "" ||
1265bf5ca77SDevin Teske	this->tname1 == "/" || this->tname1 == ""/ /* probe ID $((
1275bf5ca77SDevin Teske		$ID + 6
1285bf5ca77SDevin Teske	)) */
1295bf5ca77SDevin Teske{${TRACE:+
1305bf5ca77SDevin Teske	printf("<$(( $ID + 6 ))>");}
1315bf5ca77SDevin Teske	this->tdvp = 0;
1325bf5ca77SDevin Teske}
1335bf5ca77SDevin Teske
1345bf5ca77SDevin Teske/*********************************************************/
1355bf5ca77SDevin Teske
1365bf5ca77SDevin Teske/*
1375bf5ca77SDevin Teske * BEGIN Pathname-depth iterators
1385bf5ca77SDevin Teske */
1395bf5ca77SDevin Teske
1405bf5ca77SDevin Teske$( awk -v ID=$(( $ID + 7 )) -v MAX_DEPTH=$MAX_DEPTH '
1415bf5ca77SDevin Teske	{ buf = buf $0 "\n" }
1425bf5ca77SDevin Teske	END {
1435bf5ca77SDevin Teske		sub(/\n$/, "", buf)
1445bf5ca77SDevin Teske		for (DEPTH = 2; DEPTH <= MAX_DEPTH; DEPTH++) {
1455bf5ca77SDevin Teske			$0 = buf
1465bf5ca77SDevin Teske			gsub(/DEPTH/, DEPTH)
1475bf5ca77SDevin Teske			gsub(/IDNUM1/, ID)
1485bf5ca77SDevin Teske			gsub(/IDNUM2/, ID + 1)
1495bf5ca77SDevin Teske			print
1505bf5ca77SDevin Teske			ID = ID + 2
1515bf5ca77SDevin Teske		}
1525bf5ca77SDevin Teske	}
1535bf5ca77SDevin Teske' <<EOFDEPTH
1545bf5ca77SDevin Teske$PROBE /this->fdvp/ /* probe ID IDNUM1 (depth DEPTH) */
1555bf5ca77SDevin Teske{${TRACE:+
1565bf5ca77SDevin Teske	printf("<IDNUM1>");}
1575bf5ca77SDevin Teske	this->fdvp = this->fdvp->nc_dvp != NULL ?
1585bf5ca77SDevin Teske		this->fdvp->nc_dvp->v_cache_dst.tqh_first : 0;
1595bf5ca77SDevin Teske	this->fnameDEPTH = this->fdvp != 0 ? (
1605bf5ca77SDevin Teske		this->fdvp->nc_name != 0 ? stringof(this->fdvp->nc_name) : ""
1615bf5ca77SDevin Teske	) : "";
1625bf5ca77SDevin Teske}
1635bf5ca77SDevin Teske$PROBE /this->tdvp/ /* probe ID IDNUM2 (depth DEPTH) */
1645bf5ca77SDevin Teske{${TRACE:+
1655bf5ca77SDevin Teske	printf("<IDNUM2>");}
1665bf5ca77SDevin Teske	this->tdvp = this->tdvp->nc_dvp != NULL ?
1675bf5ca77SDevin Teske		this->tdvp->nc_dvp->v_cache_dst.tqh_first : 0;
1685bf5ca77SDevin Teske	this->tnameDEPTH = this->tdvp != 0 ? (
1695bf5ca77SDevin Teske		this->tdvp->nc_name != 0 ? stringof(this->tdvp->nc_name) : ""
1705bf5ca77SDevin Teske	) : "";
1715bf5ca77SDevin Teske}
1725bf5ca77SDevin Teske
1735bf5ca77SDevin TeskeEOFDEPTH
1745bf5ca77SDevin Teske)
1755bf5ca77SDevin Teske
1765bf5ca77SDevin Teske$PROBE /this->fdvp/ /* probe ID $(( $ID + $MAX_DEPTH * 2 + 5 )) */
1775bf5ca77SDevin Teske{${TRACE:+
1785bf5ca77SDevin Teske	printf("<$(( $ID + $MAX_DEPTH * 2 + 5 ))>");}
1795bf5ca77SDevin Teske	this->fdvp = this->fdvp->nc_dvp != NULL ?
1805bf5ca77SDevin Teske		this->fdvp->nc_dvp->v_cache_dst.tqh_first : 0;
1815bf5ca77SDevin Teske	this->fname$(( $MAX_DEPTH + 1 )) = this->fdvp != 0 ? (
1825bf5ca77SDevin Teske		this->fdvp->nc_dvp != NULL ? "..." : ""
1835bf5ca77SDevin Teske	) : "";
1845bf5ca77SDevin Teske}
1855bf5ca77SDevin Teske$PROBE /this->tdvp/ /* probe ID $(( $ID + $MAX_DEPTH * 2 + 6 )) */
1865bf5ca77SDevin Teske{${TRACE:+
1875bf5ca77SDevin Teske	printf("<$(( $ID + $MAX_DEPTH * 2 + 6 ))>");}
1885bf5ca77SDevin Teske	this->tdvp = this->tdvp->nc_dvp != NULL ?
1895bf5ca77SDevin Teske		this->tdvp->nc_dvp->v_cache_dst.tqh_first : 0;
1905bf5ca77SDevin Teske	this->tname$(( $MAX_DEPTH + 1 )) = this->tdvp != 0 ? (
1915bf5ca77SDevin Teske		this->tdvp->nc_dvp != NULL ? "..." : ""
1925bf5ca77SDevin Teske	) : "";
1935bf5ca77SDevin Teske}
1945bf5ca77SDevin Teske
1955bf5ca77SDevin Teske/*
1965bf5ca77SDevin Teske * END Pathname-depth iterators
1975bf5ca77SDevin Teske */
1985bf5ca77SDevin Teske
1995bf5ca77SDevin Teske/*********************************************************/
2005bf5ca77SDevin Teske
2015bf5ca77SDevin Teske$PROBE /this->ffi_mount != 0 && this->tfi_mount != 0/ /* probe ID $((
2025bf5ca77SDevin Teske	$ID + $MAX_DEPTH * 2 + 7
2035bf5ca77SDevin Teske)) */
2045bf5ca77SDevin Teske{${TRACE:+
2055bf5ca77SDevin Teske	printf("<$(( $ID + $MAX_DEPTH * 2 + 7 ))>");
2065bf5ca77SDevin Teske}
2075bf5ca77SDevin Teske	/*
2085bf5ca77SDevin Teske	 * Join 'from' full path
2095bf5ca77SDevin Teske	 * NB: Up-to but not including the parent directory (joined below)
2105bf5ca77SDevin Teske	 */
2115bf5ca77SDevin Teske	this->fpath = this->ffi_mount;
2125bf5ca77SDevin Teske	this->fpath = strjoin(this->fpath, this->ffi_mount != 0 ? (
2135bf5ca77SDevin Teske		this->ffi_mount == "/" ? "" : "/"
2145bf5ca77SDevin Teske	) : "/");
2155bf5ca77SDevin Teske	$( awk -v MAX_DEPTH=$MAX_DEPTH '
2165bf5ca77SDevin Teske		{ sub(/^\\\t/, "\t") }
2175bf5ca77SDevin Teske		{ buf = buf "\t" $0 "\n" }
2185bf5ca77SDevin Teske		END {
2195bf5ca77SDevin Teske			sub(/\n$/, "", buf)
2205bf5ca77SDevin Teske			$0 = buf
2215bf5ca77SDevin Teske			sub(/^[[:space:]]*/, "")
2225bf5ca77SDevin Teske			for (N = MAX_DEPTH + 1; N > 0; N--) {
2235bf5ca77SDevin Teske				gsub(/N/, N)
2245bf5ca77SDevin Teske				print
2255bf5ca77SDevin Teske				$0 = buf
2265bf5ca77SDevin Teske			}
2275bf5ca77SDevin Teske		}
2285bf5ca77SDevin Teske	' <<-EOFDEPTH
2295bf5ca77SDevin Teske	this->fpath = strjoin(this->fpath,
2305bf5ca77SDevin Teske	\	strjoin(this->fnameN, this->fnameN != "" ? "/" : ""));
2315bf5ca77SDevin Teske	EOFDEPTH
2325bf5ca77SDevin Teske	)
2335bf5ca77SDevin Teske
2345bf5ca77SDevin Teske	/* Join the 'from' parent directory name */
2355bf5ca77SDevin Teske	this->fpath = strjoin(this->fpath, strjoin(this->fname =
2365bf5ca77SDevin Teske		(this->fd_name != 0 ? this->fd_name : ""),
2375bf5ca77SDevin Teske		this->fname != "" ? "/" : ""));
2385bf5ca77SDevin Teske
2395bf5ca77SDevin Teske	/* Join the 'from' entry name */
2405bf5ca77SDevin Teske	this->fpath = strjoin(this->fpath,
2415bf5ca77SDevin Teske		this->fname = (this->ffi_name != 0 ? this->ffi_name : ""));
2425bf5ca77SDevin Teske
2435bf5ca77SDevin Teske	/*
2445bf5ca77SDevin Teske	 * Join 'to' full path
2455bf5ca77SDevin Teske	 * NB: Up-to but not including the parent directory (joined below)
2465bf5ca77SDevin Teske	 */
2475bf5ca77SDevin Teske	this->tpath = this->tfi_mount;
2485bf5ca77SDevin Teske	this->tpath = strjoin(this->tpath, this->tfi_mount != 0 ? (
2495bf5ca77SDevin Teske		this->tfi_mount == "/" ? "" : "/"
2505bf5ca77SDevin Teske	) : "/");
2515bf5ca77SDevin Teske	$( awk -v MAX_DEPTH=$MAX_DEPTH '
2525bf5ca77SDevin Teske		{ sub(/^\\\t/, "\t") }
2535bf5ca77SDevin Teske		{ buf = buf "\t" $0 "\n" }
2545bf5ca77SDevin Teske		END {
2555bf5ca77SDevin Teske			sub(/\n$/, "", buf)
2565bf5ca77SDevin Teske			$0 = buf
2575bf5ca77SDevin Teske			sub(/^[[:space:]]*/, "")
2585bf5ca77SDevin Teske			for (N = MAX_DEPTH + 1; N > 0; N--) {
2595bf5ca77SDevin Teske				gsub(/N/, N)
2605bf5ca77SDevin Teske				print
2615bf5ca77SDevin Teske				$0 = buf
2625bf5ca77SDevin Teske			}
2635bf5ca77SDevin Teske		}
2645bf5ca77SDevin Teske	' <<-EOFDEPTH
2655bf5ca77SDevin Teske	this->tpath = strjoin(this->tpath,
2665bf5ca77SDevin Teske	\	strjoin(this->tnameN, this->tnameN != "" ? "/" : ""));
2675bf5ca77SDevin Teske	EOFDEPTH
2685bf5ca77SDevin Teske	)
2695bf5ca77SDevin Teske
2705bf5ca77SDevin Teske	/* Join the 'to' parent directory name */
2715bf5ca77SDevin Teske	this->tpath = strjoin(this->tpath, strjoin(this->tname =
2725bf5ca77SDevin Teske		(this->td_name != 0 ? this->td_name : ""),
2735bf5ca77SDevin Teske		this->tname != "" ? "/" : ""));
2745bf5ca77SDevin Teske
2755bf5ca77SDevin Teske	/* Join the 'to' entry name */
2765bf5ca77SDevin Teske	this->tpath = strjoin(this->tpath,
2775bf5ca77SDevin Teske		this->tname = (this->tfi_name != 0 ? this->tfi_name : ""));
2785bf5ca77SDevin Teske}
2795bf5ca77SDevin TeskeEOF
2805bf5ca77SDevin TeskeACTIONS=$( cat <&9 )
2815bf5ca77SDevin TeskeID=$(( $ID + $MAX_DEPTH * 2 + 8 ))
2825bf5ca77SDevin Teske
2835bf5ca77SDevin Teske############################################################ EVENT ACTION
2845bf5ca77SDevin Teske
2855bf5ca77SDevin TeskeEVENT_TEST="this->ffi_mount != 0 && this->tfi_mount != 0"
2865bf5ca77SDevin Teske
2875bf5ca77SDevin Teske############################################################ EVENT DETAILS
2885bf5ca77SDevin Teske
289*a061d970SDevin Teskeif [ ! "$CUSTOM_DETAILS" ]; then
2905bf5ca77SDevin Teskeexec 9<<EOF
2915bf5ca77SDevin Teske	/*
2925bf5ca77SDevin Teske	 * Print 'from' and 'to' full paths
2935bf5ca77SDevin Teske	 */
2945bf5ca77SDevin Teske	printf("%s -> %s", this->fpath, this->tpath);
2955bf5ca77SDevin TeskeEOF
2965bf5ca77SDevin TeskeEVENT_DETAILS=$( cat <&9 )
297*a061d970SDevin Teskefi
2985bf5ca77SDevin Teske
2995bf5ca77SDevin Teske################################################################################
3005bf5ca77SDevin Teske# END
3015bf5ca77SDevin Teske################################################################################
302