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