# 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
        -R|--name-resolve)
            _samba_resolve_order
            return
            ;;
        -t)
            COMPREPLY=( $( compgen -W 'SJIS EUC JIS7 JIS8 JUNET HEX CAP' \
                -- "$cur" ) )
            return
            ;;
        -s|--configfile|-A|--authentication-file)
            _filedir
            return
            ;;
        -l|--log-basename|-D|--directory)
            _filedir -d
            return
            ;;
        -O|--socket-options)
            _samba_sockopts
            return
            ;;
        -T)
            COMPREPLY=( $( compgen -W 'c x I X F b g q r N a' -- "$cur" ) )
            return
            ;;
        -W|--workgroup)
            _samba_domains
            return
            ;;
        -d|--debuglevel)
            _samba_debuglevel
            return
            ;;
        -L|--list)
            _samba_hosts
            return
            ;;
        -S|--signing)
            _samba_signing
            return
            ;;
        -p|--port|-M|--message|-I|--ip-address|-b|--send-buffer|-U|--user|-n|\
        --netbiosname|-i|--scope|-T|--tar|-c|--command|-m|--max-protocol)
            # argument required but no completions available
            return
            ;;
        -\?|--help|-V|--version)
            # all other arguments are noop with these
            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
        -o|--outputfile|-f|--rcfile)
            _filedir
            return
            ;;
        -d|--debuglevel)
            _samba_debuglevel
            return
            ;;
        -w|--workgroup)
            _samba_domains
            return
            ;;
        -u|--username|-p|--password|-b|--blocksize)
            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
        -s|--configfile|-A|--authentication-file)
            _filedir
            return
            ;;
        -l|--log-basename)
            _filedir -d
            return
            ;;
        -d|--debuglevel)
            _samba_debuglevel
            return
            ;;
        --signing)
            _samba_signing
            return
            ;;
        -O|--socket-options)
            _samba_sockopts
            return
            ;;
        -W|--workgroup)
            _samba_domains
            return
            ;;
        -\?|--help|--usage|-D|--delete|-M|--modify|-a|--add|-S|--set|-C|\
        --chown|-G|--chgrp|-n|--netbiosname|-i|--scope|-U|--user)
            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
        -s|--configfile|-A|--authentication-file)
            _filedir
            return
            ;;
        -l|--log-basename)
            _filedir -d
            return
            ;;
        -d|--debuglevel)
            _samba_debuglevel
            return
            ;;
        --signing)
            _samba_signing
            return
            ;;
        -\?|--help|--usage|-U|-u|--user|-S|--set)
            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
            ;;
        -U|-h|-w)
            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
        -r|-t)
            _filedir tar
            return
            ;;
        -s)
            _samba_hosts
            return
            ;;
        -l)
            _samba_debuglevel
            return
            ;;
        -N)
            _filedir
            return
            ;;
        -p|-x|-b|-d|-u)
            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
        -s|--configfile|-A|--authentication-file)
            _filedir
            return
            ;;
        -l|--log-basename)
            _filedir -d
            return
            ;;
        -d|--debuglevel)
            _samba_debuglevel
            return
            ;;
        -S|--signing)
            _samba_signing
            return
            ;;
        -\?|--help|--usage|-U|--user)
            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
