#autoload

# This function completes POSIX capabilities for Linux.
# Many command line utilities expect different syntax to encode various kinds
# of capability names or sets, so this function tries to be as generic as
# possible. It accepts compadd options to allow variations on the exact
# generated completion matches.
#
# Usage examples:
#
# Complete full capability names:
#   _capabilities -p cap_
# Sort the completion list by capability number:
#   _capabilities -o nosort

# The list of Linux capabilities is taken from include/uapi/linux/capability.h
# and subject to the following pipe filter:
# grep 'define CAP' | sed -r 's/^[[:space:]]*#define[[:space:]]+CAP_//; s/[[:space:]]+[0-9]+$//' | tr '[[:upper:]]' '[[:lower:]]'
local -a caplist=(
  chown
  dac_override
  dac_read_search
  fowner
  fsetid
  kill
  setgid
  setuid
  setpcap
  linux_immutable
  net_bind_service
  net_broadcast
  net_admin
  net_raw
  ipc_lock
  ipc_owner
  sys_module
  sys_rawio
  sys_chroot
  sys_ptrace
  sys_pacct
  sys_admin
  sys_boot
  sys_nice
  sys_resource
  sys_time
  sys_tty_config
  mknod
  lease
  audit_write
  audit_control
  setfcap
  mac_override
  mac_admin
  syslog
  wake_alarm
  block_suspend
  audit_read
  perfmon
  bpf
  checkpoint_restore
)
local -a expl

_description capabilities expl "Linux capability"
compadd "${(@)expl}" "$@" -a - caplist
