#compdef ldconfig ldconfig.real

local ret=1
local -a args context line state state_descr
local -A opt_args

case $OSTYPE in
  linux*)
    args=(
      '(x -v --verbose)'{-v,--verbose}'[output verbosely]' \
      + x \
      '(: -)'{-\?,--help}'[display help information]'
      '(: -)'{-p,--print-cache}'[display libraries in current cache]'
      '(: -)--usage[display brief usage information]'
      '(: -)'{-V,--version}'[display version information]'
      + l
      '(x o)-l[manually link individual libraries (library mode)]'
      + o
      '(x l -c --format)'{-c+,--format=}'[specify cache format]:cache format:(old new compat)'
      '(x l)-C+[specify cache file to use instead of /etc/ld.so.cache]:cache file:_files'
      '(x l)-f+[specify configuration file to use instead of /etc/ld.so.conf]:configuration file:_files'
      '(x l -i --ignore-aux-cache)'{-i,--ignore-aux-cache}'[ignore auxiliary cache file]'
      '(x l -N)-n[process only directories specified on command line (implies -N)]'
      '(x l)-N[do not rebuild cache]'
      '(x l)-r+[specify root directory]:root directory:_directories'
      '(x l)-X[do not update symbolic links]'
    )
    ;;
  *bsd*|dragonfly*)
    args=(
      '(-U)-m[merge into the existing hints file]'
      '(: -)-r[list the current contents of the hints file]'
    );|
  dragonfly*|freebsd*|openbsd*)
    args+=(
      '(-U)-R[rescan previously configured directories]'
    );|
  dragonfly*|freebsd*)
    args+=(
      '(-aout)-elf[generate hints for elf format shared libraries]'
      '-f+[specify hints file]:hints file:_files'
      '-i[run in insecure mode]'
    );|
  freebsd*|netbsd*|openbsd*)
    args+=(
      '-v[switch on verbose mode]'
    );|
  freebsd*|openbsd*)
    args+=(
      '-s[do not scan /usr/lib for shared libraries]'
    );|
  freebsd*)
    args+=(
      '-32[generate hints for 32-bit ABI shared libraries]'
      '(-elf)-aout[generate hints for a.out format shared libraries]'
    );|
  netbsd*)
    args+=(
      '(-s)-c[do not scan directories in /etc/ls.so.conf]'
      '(-s)-S[do not scan /usr/lib for shared libraries]'
      '-s[do not scan /usr/lib or directories in /etc/ld.so.conf for shared libraries]'
    );|
  openbsd*)
    args+=(
      '(-m)-U[unconfigure specified directories or inaccessable directories if none specified]'
    );|
esac

_arguments -s -S : \
  '(x)*: :->files' \
  $args \
&& ret=0

[[ $state == files ]] &&
if [[ -n ${opt_args[(I)l--l]} ]]; then
  _object_files && ret=0
else
  _directories && ret=0
fi

return ret
