#compdef mknod gmknod

# - @todo Major/minor device numbers could be completed using /proc/devices on
#   Linux and e.g. `stat -f %Hr /dev/*` on BSD/Darwin
# - @todo Device numbers should not be completed given p or w types

local -a aopts args

if _pick_variant gnu='(Free Soft|uutils)' $OSTYPE --version; then
  args=(
    '(: * -)--help[display help information]'
    '(: * -)--version[display version information]'
    '(-m --mode)'{-m+,--mode=}'[specify file mode]: :_file_modes'
    '1:special file:_files'
    '2:special file type:((
      b\:"block (buffered) special file"
      {c,u}\:"character (unbuffered) special file"
      p\:FIFO
    ))'
    '3:major device number'
    '4:minor device number'
  )
  [[ $OSTYPE == linux* ]] && args+=(
    '(--context)-Z[set SELinux security context to default]'
    '(-Z)--context=-[like -Z, or specify SELinux security context]::SELinux security context:_selinux_contexts'
  )
else
  aopts=( -A '-*' )
  args=(
    '-F+[specify device-number format]:device-number format:(
      native 386bsd 4bsd bsdos freebsd hpux isc linux netbsd osf1 sco solaris
      sunos svr3 svr4 ultrix
    )'
    '1:special file:_files'
    '2:special file type:((
      b\:"block-type device"
      c\:"character-type device"
      w\:"whiteout node"
    ))'
    '3:major device number'
    '4:minor device number'
  )
fi

_arguments -s -S $aopts : $args
