Changeset View
Changeset View
Standalone View
Standalone View
cddl/usr.sbin/dwatch/libexec/vop_rename
- This file was added.
| Property | Old Value | New Value |
|---|---|---|
| svn:keywords | null | FreeBSD=%H \ No newline at end of property |
| # -*- tab-width: 4 -*- ;; Emacs | |||||
| # vi: set filetype=sh tabstop=8 shiftwidth=8 noexpandtab :: Vi/ViM | |||||
| ############################################################ IDENT(1) | |||||
| # | |||||
| # $Title: dwatch(8) module for VOP_RENAME(9) [or similar] entry $ | |||||
| # $Copyright: 2014-2017 Devin Teske. All rights reserved. $ | |||||
| # $FreeBSD$ | |||||
| # | |||||
| ############################################################ DESCRIPTION | |||||
| # | |||||
| # Print filesystem paths being renamed by VOP_RENAME(9) [or similar] | |||||
| # NB: All paths are shown even if error prevents their rename. | |||||
| # | |||||
| ############################################################ PROBE | |||||
| : ${PROBE:="vfs:vop:$PROFILE:entry"} | |||||
| ############################################################ ACTIONS | |||||
| exec 9<<EOF | |||||
| $PROBE /* probe ID 1 */ | |||||
| {${TRACE:+ | |||||
| printf("<1>");} | |||||
| this->fvp = args[1] ? args[1]->a_fdvp : NULL; | |||||
| this->fncp = this->fvp != NULL ? | |||||
| this->fvp->v_cache_dst.tqh_first : 0; | |||||
| this->ffi_name = args[1] ? ( | |||||
| args[1]->a_fcnp != NULL ? | |||||
| stringof(args[1]->a_fcnp->cn_nameptr) : "" | |||||
| ) : ""; | |||||
| this->fmount = this->fvp != NULL ? | |||||
| this->fvp->v_mount : NULL; /* ptr to vfs we are in */ | |||||
| this->ffi_fs = this->fmount != NULL ? | |||||
| stringof(this->fmount->mnt_stat.f_fstypename) : ""; | |||||
| this->ffi_mount = this->fmount != NULL ? | |||||
| stringof(this->fmount->mnt_stat.f_mntonname) : ""; | |||||
| this->fd_name = args[0]->v_cache_dd != NULL ? | |||||
| stringof(args[0]->v_cache_dd->nc_name) : ""; | |||||
| this->tvp = args[1] ? args[1]->a_tdvp : NULL; | |||||
| this->tncp = this->tvp != NULL ? | |||||
| this->tvp->v_cache_dst.tqh_first : 0; | |||||
| this->tfi_name = args[1] ? ( | |||||
| args[1]->a_tcnp != NULL ? | |||||
| stringof(args[1]->a_tcnp->cn_nameptr) : "" | |||||
| ) : ""; | |||||
| this->tmount = this->tvp != NULL ? | |||||
| this->tvp->v_mount : NULL; /* ptr to vfs we are in */ | |||||
| this->tfi_fs = this->tmount != NULL ? | |||||
| stringof(this->tmount->mnt_stat.f_fstypename) : ""; | |||||
| this->tfi_mount = this->tmount != NULL ? | |||||
| stringof(this->tmount->mnt_stat.f_mntonname) : ""; | |||||
| this->td_name = this->tvp != NULL ? ( | |||||
| this->tvp->v_cache_dd != NULL ? | |||||
| stringof(this->tvp->v_cache_dd->nc_name) : "" | |||||
| ) : ""; | |||||
| $( awk -v MAX_DEPTH=$MAX_DEPTH ' | |||||
| buf = buf $0 "\n" { } | |||||
| END { | |||||
| for (DEPTH = 1; DEPTH <= MAX_DEPTH + 1; DEPTH++) { | |||||
| $0 = buf | |||||
| gsub(/DEPTH/, DEPTH) | |||||
| sub(/\n$/, "") | |||||
| } | |||||
| } | |||||
| ' <<EOFDEPTH | |||||
| this->fnameDEPTH = this->tnameDEPTH = ""; | |||||
| EOFDEPTH | |||||
| ) | |||||
| } | |||||
| $PROBE /this->fvp == 0 || this->ffi_fs == 0 || | |||||
| this->ffi_fs == "devfs" || this->ffi_fs == "" || | |||||
| this->ffi_name == ""/ /* probe ID 2 */ | |||||
| {${TRACE:+ | |||||
| printf("<2>");} | |||||
| this->fncp = 0; | |||||
| } | |||||
| $PROBE /this->tvp == 0 || this->tfi_fs == 0 || | |||||
| this->tfi_fs == "devfs" || this->tfi_fs == "" || | |||||
| this->tfi_name == ""/ /* probe ID 3 */ | |||||
| {${TRACE:+ | |||||
| printf("<3>");} | |||||
| this->tncp = 0; | |||||
| } | |||||
| /*********************************************************/ | |||||
| $PROBE /this->fncp/ /* probe ID 4 (depth 1) */ | |||||
| {${TRACE:+ | |||||
| printf("<4>");} | |||||
| this->fdvp = this->fncp->nc_dvp != NULL ? | |||||
| this->fncp->nc_dvp->v_cache_dst.tqh_first : 0; | |||||
| this->fname1 = this->fdvp != 0 ? ( | |||||
| this->fdvp->nc_name != 0 ? stringof(this->fdvp->nc_name) : "" | |||||
| ) : ""; | |||||
| } | |||||
| $PROBE /this->tncp/ /* probe ID 5 (depth 1) */ | |||||
| {${TRACE:+ | |||||
| printf("<5>");} | |||||
| this->tdvp = this->tncp->nc_dvp != NULL ? | |||||
| this->tncp->nc_dvp->v_cache_dst.tqh_first : 0; | |||||
| this->tname1 = this->tdvp != 0 ? ( | |||||
| this->tdvp->nc_name != 0 ? stringof(this->tdvp->nc_name) : "" | |||||
| ) : ""; | |||||
| } | |||||
| $PROBE /this->fname1 == 0 || this->ffi_fs == 0 || | |||||
| this->ffi_fs == "devfs" || this->ffi_fs == "" || | |||||
| this->fname1 == "/" || this->fname1 == ""/ /* probe ID 6 */ | |||||
| {${TRACE:+ | |||||
| printf("<6>");} | |||||
| this->fdvp = 0; | |||||
| } | |||||
| $PROBE /this->tname1 == 0 || this->tfi_fs == 0 || | |||||
| this->tfi_fs == "devfs" || this->tfi_fs == "" || | |||||
| this->tname1 == "/" || this->tname1 == ""/ /* probe ID 7 */ | |||||
| {${TRACE:+ | |||||
| printf("<7>");} | |||||
| this->tdvp = 0; | |||||
| } | |||||
| /*********************************************************/ | |||||
| /* | |||||
| * BEGIN Pathname-depth iterators | |||||
| */ | |||||
| $( awk -v ID=8 -v MAX_DEPTH=$MAX_DEPTH ' | |||||
| buf = buf $0 "\n" { } | |||||
| END { | |||||
| for (DEPTH = 2; DEPTH <= MAX_DEPTH; DEPTH++) { | |||||
| $0 = buf | |||||
| gsub(/DEPTH/, DEPTH) | |||||
| gsub(/IDNUM1/, ID) | |||||
| gsub(/IDNUM2/, ID + 1) | |||||
| sub(/\n$/, "") | |||||
| ID = ID + 2 | |||||
| } | |||||
| } | |||||
| ' <<EOFDEPTH | |||||
| $PROBE /this->fdvp/ /* probe ID IDNUM1 (depth DEPTH) */ | |||||
| {${TRACE:+ | |||||
| printf("<IDNUM1>");} | |||||
| this->fdvp = this->fdvp->nc_dvp != NULL ? | |||||
| this->fdvp->nc_dvp->v_cache_dst.tqh_first : 0; | |||||
| this->fnameDEPTH = this->fdvp != 0 ? ( | |||||
| this->fdvp->nc_name != 0 ? stringof(this->fdvp->nc_name) : "" | |||||
| ) : ""; | |||||
| } | |||||
| $PROBE /this->tdvp/ /* probe ID IDNUM2 (depth DEPTH) */ | |||||
| {${TRACE:+ | |||||
| printf("<IDNUM2>");} | |||||
| this->tdvp = this->tdvp->nc_dvp != NULL ? | |||||
| this->tdvp->nc_dvp->v_cache_dst.tqh_first : 0; | |||||
| this->tnameDEPTH = this->tdvp != 0 ? ( | |||||
| this->tdvp->nc_name != 0 ? stringof(this->tdvp->nc_name) : "" | |||||
| ) : ""; | |||||
| } | |||||
| EOFDEPTH | |||||
| ) | |||||
| $PROBE /this->fdvp/ /* probe ID $(( $MAX_DEPTH * 2 + 6 )) */ | |||||
| {${TRACE:+ | |||||
| printf("<$(( $MAX_DEPTH * 2 + 6 ))>");} | |||||
| this->fdvp = this->fdvp->nc_dvp != NULL ? | |||||
| this->fdvp->nc_dvp->v_cache_dst.tqh_first : 0; | |||||
| this->fname$(( $MAX_DEPTH + 1 )) = this->fdvp != 0 ? ( | |||||
| this->fdvp->nc_dvp != NULL ? "..." : "" | |||||
| ) : ""; | |||||
| } | |||||
| $PROBE /this->tdvp/ /* probe ID $(( $MAX_DEPTH * 2 + 7 )) */ | |||||
| {${TRACE:+ | |||||
| printf("<$(( $MAX_DEPTH * 2 + 7 ))>");} | |||||
| this->tdvp = this->tdvp->nc_dvp != NULL ? | |||||
| this->tdvp->nc_dvp->v_cache_dst.tqh_first : 0; | |||||
| this->tname$(( $MAX_DEPTH + 1 )) = this->tdvp != 0 ? ( | |||||
| this->tdvp->nc_dvp != NULL ? "..." : "" | |||||
| ) : ""; | |||||
| } | |||||
| /* | |||||
| * END Pathname-depth iterators | |||||
| */ | |||||
| EOF | |||||
| ACTIONS=$( cat <&9 ) | |||||
| ID=$(( $MAX_DEPTH * 2 + 8 )) | |||||
| ############################################################ EVENT ACTION | |||||
| EVENT_TEST="this->ffi_mount != 0 && this->tfi_mount != 0" | |||||
| ############################################################ EVENT DETAILS | |||||
| exec 9<<EOF | |||||
| /* | |||||
| * Print 'from' full path | |||||
| * NB: Up-to but not including the parent directory (printed below) | |||||
| */ | |||||
| printf("%s%s", this->ffi_mount, this->ffi_mount != 0 ? ( | |||||
| this->ffi_mount == "/" ? "" : "/" | |||||
| ) : "/"); | |||||
| $( awk -v MAX_DEPTH=$MAX_DEPTH ' | |||||
| buf = buf $0 "\n" { } | |||||
| END { | |||||
| for (N = MAX_DEPTH + 1; N > 0; N--) { | |||||
| $0 = (N <= MAX_DEPTH ? "\t" : "") buf | |||||
| gsub(/N/, N) | |||||
| sub(/\n$/, "") | |||||
| } | |||||
| } | |||||
| ' <<-EOFDEPTH | |||||
| printf("%s%s", this->fname = this->fnameN, this->fname != "" ? "/" : ""); | |||||
| EOFDEPTH | |||||
| ) | |||||
| /* Print the 'from' parent directory name */ | |||||
| this->fname = this->fd_name != 0 ? this->fd_name : ""; | |||||
| printf("%s%s", this->fname, this->fname != "" ? "/" : ""); | |||||
| /* Print the 'from' entry name */ | |||||
| this->fname = this->ffi_name != 0 ? this->ffi_name : ""; | |||||
| printf("%s", this->fname); | |||||
| printf(" -> "); | |||||
| /* | |||||
| * Print 'to' full path | |||||
| * NB: Up-to but not including the parent directory (printed below) | |||||
| */ | |||||
| printf("%s%s", this->tfi_mount, this->tfi_mount != 0 ? ( | |||||
| this->tfi_mount == "/" ? "" : "/" | |||||
| ) : "/"); | |||||
| $( awk -v MAX_DEPTH=$MAX_DEPTH ' | |||||
| buf = buf $0 "\n" { } | |||||
| END { | |||||
| for (N = MAX_DEPTH + 1; N > 0; N--) { | |||||
| $0 = (N <= MAX_DEPTH ? "\t" : "") buf | |||||
| gsub(/N/, N) | |||||
| sub(/\n$/, "") | |||||
| } | |||||
| } | |||||
| ' <<-EOFDEPTH | |||||
| printf("%s%s", this->tname = this->tnameN, this->tname != "" ? "/" : ""); | |||||
| EOFDEPTH | |||||
| ) | |||||
| /* Print the 'to' parent directory name */ | |||||
| this->tname = this->td_name != 0 ? this->td_name : ""; | |||||
| printf("%s%s", this->tname, this->tname != "" ? "/" : ""); | |||||
| /* Print the 'to' entry name */ | |||||
| this->tname = this->tfi_name != 0 ? this->tfi_name : ""; | |||||
| printf("%s", this->tname); | |||||
| EOF | |||||
| EVENT_DETAILS=$( cat <&9 ) | |||||
| ################################################################################ | |||||
| # END | |||||
| ################################################################################ | |||||