Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

[PATCH 2/2] Add _kdump and _ktrace completers and supporting _ktrace_points type



The kdump completer parses the ktrace file to show available pids and
which process names were associated with that pid. If there's a better
way to compute/show that I'm all ears.

OpenBSD's kdump uses -R and -T for showing elapsed timestamps. Is there
a way to change an option's description depending on if another option
has been specified? I.e. if -T has been specified the description for -R
should change from "display relative timestamps" to "display elapsed
timestamps". Even without this I think it's ok to go in as is.

In case anyone is very closely reviewing, while the DragonFly BSD man
page claims that * is used for the default set of check points, it lies.
https://github.com/DragonFlyBSD/DragonFlyBSD/blob/master/usr.bin/ktrace/subr.c#L67


---
 Completion/BSD/Command/_kdump      | 84 ++++++++++++++++++++++++++++++
 Completion/BSD/Command/_ktrace     | 30 +++++++++++
 Completion/BSD/Type/_ktrace_points | 50 ++++++++++++++++++
 3 files changed, 164 insertions(+)
 create mode 100644 Completion/BSD/Command/_kdump
 create mode 100644 Completion/BSD/Command/_ktrace
 create mode 100644 Completion/BSD/Type/_ktrace_points

diff --git a/Completion/BSD/Command/_kdump b/Completion/BSD/Command/_kdump
new file mode 100644
index 000000000..669260eee
--- /dev/null
+++ b/Completion/BSD/Command/_kdump
@@ -0,0 +1,84 @@
+#compdef kdump
+
+_kdump_pid() {
+  local -a args pids
+  local -A assoc_pids
+
+  if (( $+opt_args[-f] )); then
+    args=(-f $opt_args[-f])
+  fi
+  pids=(${${${(f)"$(_call_program kdump-pids kdump $args)"}:#($'\t'|       )*}## #})
+  [[ $OSTYPE == netbsd* ]] && pids=(${pids/ ##[0-9]##/})
+  pids=(${(u)${pids/ /:}%% *})
+  for 1 in $pids; do
+    local pid=${1%%:*} process=${1#*:}
+    if (( $+assoc_pids[$pid] )); then
+      assoc_pids[$pid]+=", $process"
+    else
+      assoc_pids[$pid]=$process
+    fi
+  done
+  pids=()
+  for pid procs in ${(kv)assoc_pids}; do
+    pids+=($pid:$procs)
+  done
+  _describe -t kdump-pids 'kdump pid' pids
+}
+
+local args=(
+  '-d[display numbers in decimal]'
+  '-f+[use the specified file (- for stdin)]:dump file:_files'
+  '-l[loop reading the trace file]'
+  '-m+[maximum I/O bytes to display]:max data bytes:'
+  '-n[supress ad hoc translations]'
+  '-p+[show output only for the specified pid]: :_kdump_pid'
+  '(-E    -T)-R[display relative timestamps]'
+  '(-E -R   )-T[display absolute timestamps]'
+  '-t[select which tracepoints to display]: :_ktrace_points'
+)
+
+case $OSTYPE; in
+  freebsd*|netbsd*)
+    args+=(
+      '(-R -T)-E[display elapsed timestamps]'
+    )
+    ;|
+  freebsd*|openbsd*)
+    args+=(
+      '-H[display thread identifiers]'
+    )
+    ;|
+  dragonfly*)
+    args+=(
+      '(-c -R)-a[display full human readable output]'
+      '-c[display the CPU the thread is running on]'
+      '-j[use a fixed format output]'
+    )
+    ;;
+  freebsd*)
+    args+=(
+      '-A[display description of the ABI of traced process]'
+      '-r[symbolically display structure members]'
+      '-S[display system call numbers]'
+      '-s[suppress display of I/O data]'
+    )
+    ;;
+  netbsd*)
+    args+=(
+      '-e[interpret system call maps using the specified emulation]:emulation:'
+      '-N[suppress system call name translation]'
+      '-X[Display GIO data in hex and ascii in groups of specified size]:size:(1 2 4 8 16)'
+      '-x[Display GIO data in hex and ascii]
+      '1:dump file:_files'
+    )
+    ;;
+  openbsd*)
+    args+=(
+      # XXX handle -TR
+      '-X[display I/O data in hex and ASCII]'
+      '-x[display I/O data in hex]'
+    )
+    ;;
+esac
+
+_arguments -s -S -A '-*' : $args
diff --git a/Completion/BSD/Command/_ktrace b/Completion/BSD/Command/_ktrace
new file mode 100644
index 000000000..13c11f15d
--- /dev/null
+++ b/Completion/BSD/Command/_ktrace
@@ -0,0 +1,30 @@
+#compdef ktrace
+
+local args=(
+  '-a[append to the trace file]'
+  '(*)-C[disable tracing on all user owned processes or all processes if executed by root]'
+  '-c[clear the trace points]'
+  '-d[trace current decendants]'
+  '-f+[log trace to specified file]:trace file:_files'
+  '(-p *)-g+[enable/disable tracing on specified process group]:pgid:_pgids'
+  '-i[inherit trace flags on future children]'
+  '(-g *)-p+[enable/disable tracing on specified PID]: :_pids'
+  '-t+[select information to include in dump]:trace string:_ktrace_points'
+  '*:: : _normal -p ktrace'
+)
+
+case $OSTYPE; in
+  openbsd*)
+    args+=(
+      '-B[process relocations immediately]'
+    )
+    ;;
+  netbsd*)
+    args+=(
+      '-n[stop tracing if writes to the trace file would block]'
+      '-s[write to the trace file with synchronized I/O]'
+    )
+    ;;
+esac
+
+_arguments -s -S -A '-*' : $args
diff --git a/Completion/BSD/Type/_ktrace_points b/Completion/BSD/Type/_ktrace_points
new file mode 100644
index 000000000..1993c8d7b
--- /dev/null
+++ b/Completion/BSD/Type/_ktrace_points
@@ -0,0 +1,50 @@
+#autoload
+
+local points=(
+  'c[trace system calls]'
+  'i[trace I/O]'
+  'n[trace namei translations]'
+  's[trace signal processing]'
+  'u[trace user data]'
+  '+[trace the default points]'
+)
+
+case $OSTYPE in
+  dragonfly*|freebsd*|netbsd*)
+    points+=(
+      'w[context switches]'
+    )
+    ;|
+  freebsd*|openbsd*)
+    points+=(
+      't[trace various structures]'
+    )
+    ;|
+  freebsd*)
+    points+=(
+      'f[trace page faults]'
+      'p[trace capability check failures]'
+      'y[trace sysctl(3) requests]'
+    )
+    ;;
+  netbsd*)
+    points+=(
+      'A[trace all tracepoints]'
+      'a[trace exec arguments]'
+      'e[trace emulation changes]'
+      'f[trace open file descriptors after exec]'
+      'S[trace MIB access (sysctl)]'
+      'v[trace exec environment]'
+      '-[do not trace following trace points]'
+    )
+    ;;
+  openbsd*)
+    points+=(
+      'p[trace violation of pledge(2) restrictions]'
+      'x[trace argument vector in execve(2)]'
+      'X[trace environment in execve(2)]'
+    )
+    ;;
+easc
+
+_values -s '' 'ktrace point' $points
-- 
2.26.2



Messages sorted by: Reverse Date, Date, Thread, Author