zsh-workers
 help / Atom feed
* [PATCH] update _iostat and _vmstat for BSD
@ 2019-06-01  6:55 Jun. T
  0 siblings, 0 replies; 1+ messages in thread
From: Jun. T @ 2019-06-01  6:55 UTC (permalink / raw)
  To: zsh-workers

_iostat contained an action '->devicetype' but didn't have the handler for it.
_vmstat had the handler, so I separated it into _fbsd_device_type (with slight
improvements).

On the other hand, _vmstat didn't complete disk device names properly on BSDs.
I gathered the corresponding lines from _iostat and put them in _bsd_disks
(and added support for netbsd).

Also included a few option updates and fixed a trivial bug (args= --> args+=).

Linux (and Solaris, AIX) branches are not modified.



diff --git a/Completion/BSD/Type/_bsd_disks b/Completion/BSD/Type/_bsd_disks
new file mode 100644
index 000000000..986d36e45
--- /dev/null
+++ b/Completion/BSD/Type/_bsd_disks
@@ -0,0 +1,26 @@
+#autoload
+# disk device names on BSDs
+local -a disks
+
+case $OSTYPE in
+  freebsd*)
+    disks=( ${${(M)${(f)"$(geom disk list)"}\:#Geom name\:*}#*\: } )
+  ;;
+  dragonfly*)
+    disks=( $(sysctl -n kern.disks) )
+  ;;
+  openbsd*)
+    disks=( ${${(s.,.)"$(sysctl -n hw.disknames)"}%\:*} )
+  ;;
+  netbsd*)
+    disks=( $(sysctl -n hw.disknames) )
+  ;;
+esac
+
+if (( $#disks )); then
+  local expl
+  _wanted disk-devices expl 'disk device' compadd "$@" $disks
+  return
+fi
+
+return 1
diff --git a/Completion/BSD/Type/_fbsd_device_types b/Completion/BSD/Type/_fbsd_device_types
new file mode 100644
index 000000000..f1897f6a7
--- /dev/null
+++ b/Completion/BSD/Type/_fbsd_device_types
@@ -0,0 +1,31 @@
+#autoload
+#
+# device types on FreeBSD/DragonFly
+# (for commands using devstat_buildmatch(), such as iostat and vmstat)
+#
+local -a d i types
+
+d=( da sa printer proc worm cd scanner optical changer
+    comm array enclosure floppy)
+i=( IDE SCSI other )
+types=(
+  "($d)da[direct access devices]"
+  "($d)sa[sequential access devices]"
+  "($d)printer[printers]"
+  "($d)proc[processor devices]"
+  "($d)worm[write once read multiple devices]"
+  "($d)cd[CD devices]"
+  "($d)scanner[scanner devices]"
+  "($d)optical[optical memory devices]"
+  "($d)changer[medium changer devices]"
+  "($d)comm[communication devices]"
+  "($d)array[storage array devices]"
+  "($d)enclosure[enclosure services devices]"
+  "($d)floppy[floppy devices]"
+  "($i)IDE[Integrated Drive Electronics devices]"
+  "($i)SCSI[Small Computer System Interface devices]"
+  "($i)other[any other device interface]"
+  'pass[passthrough devices]'
+)
+
+_values -s , 'device type' $types
diff --git a/Completion/Unix/Command/_iostat b/Completion/Unix/Command/_iostat
index 8909ae311..f5291a19b 100644
--- a/Completion/Unix/Command/_iostat
+++ b/Completion/Unix/Command/_iostat
@@ -4,42 +4,53 @@ local -a args parser
 parser=( -s -S -A '-*' )
 
 case $OSTYPE:l in
-  *bsd*)
+  *bsd*|dragonfly*)
     args+=(
-      '-c[repeat the display N times]:count'
+      '-c+[repeat the display N times]:count'
       '-C[display CPU statistics]'
       '-d[display only device statistics]'
       '-I[display total statistics for a given period, rather than average]'
-      '-M[extract values of the name list from specified file]:core:_files'
-      '-N[extract the name list from the specified file]:system:_files'
       '-T[display TTY statistics]'
-      '-w[specify the duration of pauses between each display]:duration'
+      '-w+[specify the duration of pauses between each display]:duration'
+      '*: :_bsd_disks'
     )
     ;|
-  freebsd*)
+  freebsd*|openbsd*|dragonfly*)
+    args+=(
+      '-M+[extract values of the name list from specified file]:core:_files'
+      '-N+[extract the name list from the specified file]:system:_files'
+    )
+    ;|
+  freebsd*|dragonfly*)
     args+=(
       '-h[top mode]'
       '-K[display block count in kilobytes, not block size]'
+      '-n+[display up to the specified number fo devices]:number of disks'
       '-o[display old-style iostat device statistics]'
-      '-t[specify which type of device to display]: :->devicetype'
+      '*-t+[specify which type of device to display]: :_fbsd_device_types'
+    )
+    ;|
+  freebsd*)
+    args+=(
       '-x[show extended disk statistics]'
       '-z[omit lines for devices with no activity]'
-      '-?[display a usage statement and exit]'
-      '*:drives:( ${${(M)${(f)"$(geom disk list)"}\:#Geom name\:*}#*\: } )'
+      '(* -)-?[display a usage statement and exit]'
     )
     ;;
-  openbsd*)
+  dragonfly*)
     args+=(
-      '-D[display alternate disk statistics]'
-      '*:drives:( ${${(s.,.)"$(sysctl -n hw.disknames)"}%\:*} )'
+      '-D[display more details]'
     )
     ;;
-  netbsd*)
+  openbsd*|netbsd*)
     args+=(
       '-D[display alternate disk statistics]'
+    )
+    ;|
+  netbsd*)
+    args+=(
       '-x[show extended disk statistics]'
       '-y[report data on waiting and active requests]'
-      '*:drives:( $(sysctl -n hw.disknames) )'
     )
     ;;
   aix*)
@@ -97,16 +108,17 @@ case $OSTYPE:l in
     ;;
   darwin*)
     args=(
+      '(- *)-?[display usage statement and exit]'
       '-C[display CPU statistics]'
-      '-c[number of times to display statistics]'
+      '-c+[number of times to display statistics]:count'
       '-d[display only device statistics]'
-      '-l[total statistics for a given time period]'
+      '-I[display total statistics for a given period, rather than average]'
       '-K[display block count in kilobytes]'
-      '-n[limit the number of disks included in the report]:number of disks'
+      '-n+[limit the number of disks included in the report]:number of disks'
       '-o[display old-style iostat device statistics]'
       '-T[display TTY statistics]'
       '-U[display system load averages]'
-      '-w[specify the duration of pauses between each display]:duration'
+      '-w+[specify the duration of pauses between each display]:duration'
       '*::device:_files -W /dev -g "disk*"'
     )
     ;;
diff --git a/Completion/Unix/Command/_vmstat b/Completion/Unix/Command/_vmstat
index bc13a5505..f3ac1af14 100644
--- a/Completion/Unix/Command/_vmstat
+++ b/Completion/Unix/Command/_vmstat
@@ -28,11 +28,11 @@ case $OSTYPE in
       '-M+[specify core file to extract values associated with the name list from]:core:_files'
       '-N+[specify file to extract the name list from]:system:_files'
       '-w+[specify delay between each display]:delay (seconds)'
-      '*:disk:_files'
+      '*: :_bsd_disks'
     )
   ;|
   *bsd*)
-    specs=(
+    specs+=(
       '-f[report on the number fork syscalls since boot and pages of virtual memory for each]'
     )
   ;|
@@ -89,12 +89,6 @@ case $OSTYPE in
       '-v[include IRQ numbers and IRQ target CPU numbers before device names (with -i)]'
     )
   ;;
-  freebsd*|solaris*)
-    specs+=(
-      '::disk:_files -W /dev -g "*(-%b)"'
-      ': :_guard "[0-9]#" "interval (seconds)"' ':count'
-    )
-  ;|
   solaris2.<11->)
     specs+=( '(-i -s)-T+[specify time format]:time format:((u\:seconds\ since\ epoch d\:standard\ date\ format))' )
   ;&
@@ -106,30 +100,20 @@ case $OSTYPE in
       '-p[report paging activity]'
       '(-T)-s[display the total number of system events since boot]'
       '-S[report on swapping rather than paging activity]'
+      '::disk:_files -W /dev -g "*(-%b)"'
+      ': :_guard "[0-9]#" "interval (seconds)"' '::count'
     )
   ;;
 esac
 
 if (( $#specs )); then
   local curcontext=$curcontext state state_descr line ret=1
-  typeset -A {opt,val}_args
+  typeset -A opt_args
 
   _arguments -C -s -w -A '-*' : "$specs[@]" && ret=0
 
   if [[ $state == devices ]]; then
-    local -a types
-    types=(
-      'da[direct access devices]' 'sa[sequential access devices]'
-      'printer[printers]' 'proc[processor devices]'
-      'worm[write once read multiple devices]' 'cd[CD devices]'
-      'scanner[scanner devices]' 'optical[optical memory devices]'
-      'changer[medium changer devices]' 'comm[communication devices]'
-      'array[storage array devices]' 'enclosure[enclosure services devices]'
-      'floppy[floppy devices]' 'IDE[Integrated Drive Electronics devices]'
-      'SCSI[Small Computer System Interface devices]'
-      'other[any other device interface]' 'pass[passthrough devices]'
-    )
-    _values -s , 'device type' "$types[@]" && ret=0
+    _fbsd_device_types && ret=0
   elif [[ $state == hashes ]]; then
    local -a tables
    tables=( ${${${(f)"$(_call_program hashes $words[1] -L)"}[2,-1]#?}/ ##/:} )




^ permalink raw reply	[flat|nested] 1+ messages in thread

only message in thread, back to index

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-06-01  6:55 [PATCH] update _iostat and _vmstat for BSD Jun. T

zsh-workers

Archives are clonable: git clone --mirror http://inbox.vuxu.org/zsh-workers

Newsgroup available over NNTP:
	nntp://inbox.vuxu.org/vuxu.archive.zsh.workers


AGPL code for this site: git clone https://public-inbox.org/ public-inbox