# bash completion for samba                                -*- shell-script -*-

_samba_resolve_order()
{
    COMPREPLY=($(compgen -W 'lmhosts host wins bcast' -- "$cur"))
}

_samba_domains()
{
    if [[ -n ${COMP_SAMBA_SCAN:-} ]]; then
        COMPREPLY=($(compgen -W '$(smbtree -N -D)' -- "$cur"))
    fi
}

_samba_hosts()
{
    if [[ -n ${COMP_SAMBA_SCAN:-} ]]; then
        COMPREPLY=($(compgen -W "$(
            smbtree -N -S |
                command sed -ne 's/^[[:space:]]*\\\\*\([^[:space:]]*\).*/\1/p'
        )" -- "$cur"))
    fi
}

_samba_debuglevel()
{
    COMPREPLY=($(compgen -W '{0..10}' -- "$cur"))
}

_samba_sockopts()
{
    COMPREPLY=($(compgen -W 'SO_KEEPALIVE SO_REUSEADDR SO_BROADCAST
        TCP_NODELAY IPTOS_LOWDELAY IPTOS_THROUGHPUT SO_SNDBUF SO_RCVBUF
        SO_SNDLOWAT SO_RCVLOWAT' -- "$cur"))
}

_samba_signing()
{
    COMPREPLY=($(compgen -W 'on off required' -- "$cur"))
}

_smbclient()
{
    local cur prev words cword split
    _init_completion -s || return

    case $prev in
        --name-resolve | -!(-*)R)
            _samba_resolve_order
            return
            ;;
        -!(-*)t)
            COMPREPLY=($(compgen -W 'SJIS EUC JIS7 JIS8 JUNET HEX CAP' \
                -- "$cur"))
            return
            ;;
        --configfile | --authentication-file | -!(-*)[sA])
            _filedir
            return
            ;;
        --log-basename | --directory | -!(-*)[lD])
            _filedir -d
            return
            ;;
        --socket-options | -!(-*)O)
            _samba_sockopts
            return
            ;;
        -!(-*)T)
            COMPREPLY=($(compgen -W 'c x I X F b g q r N a' -- "$cur"))
            return
            ;;
        --workgroup | -!(-*)W)
            _samba_domains
            return
            ;;
        --debuglevel | -!(-*)d)
            _samba_debuglevel
            return
            ;;
        --list | -!(-*)L)
            _samba_hosts
            return
            ;;
        --signing | -!(-*)S)
            _samba_signing
            return
            ;;
        --port | --message | --ip-address | --send-buffer | --user | --netbiosname | \
            --scope | --tar | --command | --max-protocol | -!(-*)[pMIbUniTcm])
            return
            ;;
        --help | --version | -!(-*)[?V])
            return
            ;;
    esac

    $split && return

    if [[ $cur == -* ]]; then
        COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur"))
        [[ ${COMPREPLY-} == *= ]] && compopt -o nospace
    fi
} &&
    complete -F _smbclient smbclient

_smbget()
{
    local cur prev words cword split
    _init_completion -s || return

    case $prev in
        --outputfile | --rcfile | -!(-*)[of])
            _filedir
            return
            ;;
        --debuglevel | -!(-*)d)
            _samba_debuglevel
            return
            ;;
        --workgroup | -!(-*)w)
            _samba_domains
            return
            ;;
        --username | --password | --blocksize | -!(-*)[upb])
            return
            ;;
    esac

    $split && return

    if [[ $cur == -* ]]; then
        COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur"))
        [[ ${COMPREPLY-} == *= ]] && compopt -o nospace
    fi
} &&
    complete -F _smbget smbget

_smbcacls()
{
    local cur prev words cword split
    _init_completion -s || return

    case $prev in
        --configfile | --authentication-file | -!(-*)[As])
            _filedir
            return
            ;;
        --log-basename | -!(-*)l)
            _filedir -d
            return
            ;;
        --debuglevel | -!(-*)d)
            _samba_debuglevel
            return
            ;;
        --signing)
            _samba_signing
            return
            ;;
        --socket-options | -!(-*)O)
            _samba_sockopts
            return
            ;;
        --workgroup | -!(-*)W)
            _samba_domains
            return
            ;;
        --help | --usage | --delete | --modify | --add | --set | --chown | --chgrp | \
            --netbiosname | --scope | --user | -!(-*)[?DMaSCGniU])
            return
            ;;
    esac

    $split && return

    if [[ $cur == -* ]]; then
        COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur"))
        [[ ${COMPREPLY-} == *= ]] && compopt -o nospace
    fi
} &&
    complete -F _smbcacls smbcacls

_smbcquotas()
{
    local cur prev words cword split
    _init_completion -s || return

    case $prev in
        --configfile | --authentication-file | -!(-*)[sA])
            _filedir
            return
            ;;
        --log-basename | -!(-*)l)
            _filedir -d
            return
            ;;
        --debuglevel | -!(-*)d)
            _samba_debuglevel
            return
            ;;
        --signing)
            _samba_signing
            return
            ;;
        --help | --usage | --user | --set | -!(-*)[?UuS])
            return
            ;;
    esac

    $split && return

    if [[ $cur == -* ]]; then
        COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur"))
        [[ ${COMPREPLY-} == *= ]] && compopt -o nospace
    fi
} &&
    complete -F _smbcquotas smbcquotas

_smbpasswd()
{
    local cur prev words cword
    _init_completion || return

    case $prev in
        -*r)
            _samba_hosts
            return
            ;;
        -*R)
            _samba_resolve_order
            return
            ;;
        -*c)
            _filedir
            return
            ;;
        -*D)
            _samba_debuglevel
            return
            ;;
        -*[Uhw])
            return
            ;;
    esac

    if [[ $cur == -* ]]; then
        COMPREPLY=($(compgen -W '$(_parse_help "$1" -h)' -- "$cur"))
    fi
} &&
    complete -F _smbpasswd smbpasswd

_smbtar()
{
    local cur prev words cword
    _init_completion || return

    case $prev in
        -*[rt])
            _filedir tar
            return
            ;;
        -*s)
            _samba_hosts
            return
            ;;
        -*l)
            _samba_debuglevel
            return
            ;;
        -*N)
            _filedir
            return
            ;;
        -*[pxbdu])
            return
            ;;
    esac

    if [[ $cur == -* ]]; then
        COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur"))
    fi
} &&
    complete -F _smbtar smbtar

_smbtree()
{
    local cur prev words cword split
    _init_completion -s || return

    case $prev in
        --configfile | --authentication-file | -!(-*)[sA])
            _filedir
            return
            ;;
        --log-basename | -!(-*)l)
            _filedir -d
            return
            ;;
        --debuglevel | -!(-*)d)
            _samba_debuglevel
            return
            ;;
        --signing | -!(-*)S)
            _samba_signing
            return
            ;;
        --help | --usage | --user | -!(-*)[?U])
            return
            ;;
    esac

    $split && return

    if [[ $cur == -* ]]; then
        COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur"))
        [[ ${COMPREPLY-} == *= ]] && compopt -o nospace
    fi
} &&
    complete -F _smbtree smbtree

# ex: filetype=sh
