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