1*434283fdSDevin Teske# -*- tab-width: 4 -*- ;; Emacs 2*434283fdSDevin Teske# vi: set filetype=sh tabstop=8 shiftwidth=8 noexpandtab :: Vi/ViM 3*434283fdSDevin Teske############################################################ IDENT(1) 4*434283fdSDevin Teske# 5*434283fdSDevin Teske# $Title: dwatch(8) module for jail(2) management syscalls $ 6*434283fdSDevin Teske# $Copyright: 2026 Devin Teske. All rights reserved. $ 7*434283fdSDevin Teske# 8*434283fdSDevin Teske############################################################ DESCRIPTION 9*434283fdSDevin Teske# 10*434283fdSDevin Teske# Print jail management activity -- jail(2), jail_set(2), jail_get(2), 11*434283fdSDevin Teske# jail_attach(2), and jail_remove(2) -- naming the syscall, the jail id 12*434283fdSDevin Teske# operated on, and any errno returned. Answers "who is creating, 13*434283fdSDevin Teske# entering, or destroying jails?" Complements the dwatch `-j jail' 14*434283fdSDevin Teske# filter, which scopes any profile to processes inside one jail; this 15*434283fdSDevin Teske# profile watches the management plane itself, from any jail or none. 16*434283fdSDevin Teske# Use jail-attach, jail-get, jail-remove, or jail-set to watch a 17*434283fdSDevin Teske# single operation by name. 18*434283fdSDevin Teske# 19*434283fdSDevin Teske############################################################ PROBE 20*434283fdSDevin Teske 21*434283fdSDevin Teskecase "$PROFILE" in 22*434283fdSDevin Teskejail) 23*434283fdSDevin Teske : ${PROBE:=$( echo \ 24*434283fdSDevin Teske syscall::jail:return, \ 25*434283fdSDevin Teske syscall::jail_set:return, \ 26*434283fdSDevin Teske syscall::jail_get:return, \ 27*434283fdSDevin Teske syscall::jail_attach:return, \ 28*434283fdSDevin Teske syscall::jail_remove:return )} ;; 29*434283fdSDevin Teske*) 30*434283fdSDevin Teske : ${PROBE:=syscall::jail_${PROFILE#jail-}:return} 31*434283fdSDevin Teskeesac 32*434283fdSDevin Teske 33*434283fdSDevin Teske# 34*434283fdSDevin Teske# Derive the matching entry probes from the return probes being watched 35*434283fdSDevin Teske# 36*434283fdSDevin TeskeENTRY_PROBE=$( echo "$PROBE" | awk 'gsub(/:return/, ":entry") || 1' ) 37*434283fdSDevin Teske 38*434283fdSDevin Teske############################################################ ACTIONS 39*434283fdSDevin Teske 40*434283fdSDevin Teskeexec 9<<EOF 41*434283fdSDevin Teskeself int jail_arg; 42*434283fdSDevin Teskethis int jail_jid; 43*434283fdSDevin Teske 44*434283fdSDevin Teske$ENTRY_PROBE /* probe ID $ID */ 45*434283fdSDevin Teske{${TRACE:+ 46*434283fdSDevin Teske printf("<$ID>");} 47*434283fdSDevin Teske self->jail_arg = -1; 48*434283fdSDevin Teske} 49*434283fdSDevin Teske 50*434283fdSDevin Teskesyscall::jail_attach:entry, 51*434283fdSDevin Teskesyscall::jail_remove:entry /* probe ID $(( $ID + 1 )) */ 52*434283fdSDevin Teske{${TRACE:+ 53*434283fdSDevin Teske printf("<$(( $ID + 1 ))>");} 54*434283fdSDevin Teske /* arg0 is the jail id being attached-to or removed */ 55*434283fdSDevin Teske self->jail_arg = (int)arg0; 56*434283fdSDevin Teske} 57*434283fdSDevin Teske 58*434283fdSDevin Teske$PROBE /* probe ID $(( $ID + 2 )) */ 59*434283fdSDevin Teske{${TRACE:+ 60*434283fdSDevin Teske printf("<$(( $ID + 2 ))>"); 61*434283fdSDevin Teske} 62*434283fdSDevin Teske /* 63*434283fdSDevin Teske * jail(2), jail_set(2), and jail_get(2) return the jail id; 64*434283fdSDevin Teske * jail_attach(2) and jail_remove(2) were given it at entry 65*434283fdSDevin Teske */ 66*434283fdSDevin Teske this->jail_jid = self->jail_arg >= 0 ? 67*434283fdSDevin Teske self->jail_arg : (int)arg0; 68*434283fdSDevin Teske self->jail_arg = 0; 69*434283fdSDevin Teske} 70*434283fdSDevin TeskeEOF 71*434283fdSDevin TeskeACTIONS=$( cat <&9 ) 72*434283fdSDevin TeskeID=$(( $ID + 3 )) 73*434283fdSDevin Teske 74*434283fdSDevin Teske############################################################ EVENT DETAILS 75*434283fdSDevin Teske 76*434283fdSDevin Teskeif [ ! "$CUSTOM_DETAILS" ]; then 77*434283fdSDevin Teskeexec 9<<EOF 78*434283fdSDevin Teske /* 79*434283fdSDevin Teske * Print jail management details 80*434283fdSDevin Teske */ 81*434283fdSDevin Teske printf("%s(2) jid %d%s%s", 82*434283fdSDevin Teske probefunc, 83*434283fdSDevin Teske this->jail_jid, 84*434283fdSDevin Teske errno > 0 ? " -- " : "", 85*434283fdSDevin Teske errno > 0 ? strerror[errno] : ""); 86*434283fdSDevin TeskeEOF 87*434283fdSDevin TeskeEVENT_DETAILS=$( cat <&9 ) 88*434283fdSDevin Teskefi 89*434283fdSDevin Teske 90*434283fdSDevin Teske################################################################################ 91*434283fdSDevin Teske# END 92*434283fdSDevin Teske################################################################################ 93