diff options
Diffstat (limited to 'Functions/Zftp')
-rw-r--r-- | Functions/Zftp/zfanon | 44 | ||||
-rw-r--r-- | Functions/Zftp/zfcd | 13 | ||||
-rw-r--r-- | Functions/Zftp/zfcget | 31 | ||||
-rw-r--r-- | Functions/Zftp/zfclose | 1 | ||||
-rw-r--r-- | Functions/Zftp/zfcput | 1 | ||||
-rw-r--r-- | Functions/Zftp/zfdir | 35 | ||||
-rw-r--r-- | Functions/Zftp/zfgcp | 34 | ||||
-rw-r--r-- | Functions/Zftp/zfget | 50 | ||||
-rw-r--r-- | Functions/Zftp/zfgoto | 81 | ||||
-rw-r--r-- | Functions/Zftp/zfhere | 1 | ||||
-rw-r--r-- | Functions/Zftp/zfls | 1 | ||||
-rw-r--r-- | Functions/Zftp/zfmark | 51 | ||||
-rw-r--r-- | Functions/Zftp/zfopen | 51 | ||||
-rw-r--r-- | Functions/Zftp/zfparams | 23 | ||||
-rw-r--r-- | Functions/Zftp/zfpcp | 6 | ||||
-rw-r--r-- | Functions/Zftp/zfput | 59 | ||||
-rw-r--r-- | Functions/Zftp/zfsession | 1 | ||||
-rw-r--r-- | Functions/Zftp/zfstat | 30 | ||||
-rw-r--r-- | Functions/Zftp/zftransfer | 7 | ||||
-rw-r--r-- | Functions/Zftp/zftype | 1 | ||||
-rw-r--r-- | Functions/Zftp/zfuget | 51 | ||||
-rw-r--r-- | Functions/Zftp/zfuput | 43 |
22 files changed, 387 insertions, 228 deletions
diff --git a/Functions/Zftp/zfanon b/Functions/Zftp/zfanon index d8a9d06a3..5dc22617c 100644 --- a/Functions/Zftp/zfanon +++ b/Functions/Zftp/zfanon @@ -2,31 +2,20 @@ emulate -L zsh -local opt optlist once +[[ $curcontext = :zf* ]] || local curcontext=:zfanon +local opt opt_1 dir -while [[ $1 = -* ]]; do - if [[ $1 = - || $1 = -- ]]; then - shift; - break; - fi - optlist=${1#-} - for (( i = 1; i <= $#optlist; i++)); do - opt=$optlist[$i] - case $optlist[$i] in - 1) once=1 - ;; - *) print option $opt not recognised >&2 - ;; - esac - done - shift +while getopts :1 opt; do + [[ $opt = "?" ]] && print "zfanon: bad option: -$OPTARG" >&2 && return 1 + eval "opt_$opt=1" done +(( OPTIND > 1 )) && shift $(( OPTIND - 1 )) if [[ -z $EMAIL_ADDR ]]; then # Exercise in futility. There's a poem by Wallace Stevens # called something like `N ways of looking at a blackbird', # where N is somewhere around 0x14 to 0x18. Now zftp is - # ashamed to prsent `N ways of looking at a hostname'. + # ashamed to present `N ways of looking at a hostname'. local domain host # First, maybe we've already got it. Zen-like. if [[ $HOST = *.* ]]; then @@ -38,7 +27,8 @@ if [[ -z $EMAIL_ADDR ]]; then [[ -n $domain ]] && host=$HOST.$domain fi # Next, maybe we've got nlsookup. May not work on LINUX. - [[ -z $host ]] && host=$(nslookup $HOST | awk '/Name:/ { print $2 }') + [[ -z $host ]] && host=$(nslookup $HOST 2>/dev/null | + awk '/Name:/ { print $2 }') if [[ -z $host ]]; then # we're running out of ideas, but this should work. # after all, i wrote it... @@ -61,10 +51,20 @@ if [[ -z $EMAIL_ADDR ]]; then print "Using $EMAIL_ADDR as anonymous FTP password." fi -if [[ $once = 1 ]]; then - zftp open $1 anonymous $EMAIL_ADDR +if [[ $1 = */* ]]; then + 1=${1##ftp://} + dir=${1#*/} + 1=${1%%/*} +fi + +if [[ $opt_1 = 1 ]]; then + zftp open $1 anonymous $EMAIL_ADDR || return 1 else zftp params $1 anonymous $EMAIL_ADDR - zftp open + zftp open || return 1 +fi + +if [[ -n $dir ]]; then + zfcd $dir fi # } diff --git a/Functions/Zftp/zfcd b/Functions/Zftp/zfcd index b726d9f55..05b7dc998 100644 --- a/Functions/Zftp/zfcd +++ b/Functions/Zftp/zfcd @@ -20,11 +20,12 @@ # work just as long as the directory structures under the home match. emulate -L zsh +[[ $curcontext = :zf* ]] || local curcontext=:zfcd if [[ $1 = /* ]]; then - zfautocheck -dn + zfautocheck -dn || return 1 else - zfautocheck -d + zfautocheck -d || return 1 fi if [[ $1 = $HOME || $1 = $HOME/* ]]; then @@ -36,7 +37,7 @@ if (( $# == 0 )); then set -- '~' elif [[ $# -eq 1 && $1 = - ]]; then # Emulate `cd -' behaviour. - set -- $zflastdir + set -- $zfconfig[lastdir_$ZFTP_SESSION] elif [[ $# -eq 2 ]]; then # Emulate `cd old new' behaviour. # We have to find a character not in $1 or $2; ! is a good bet. @@ -47,6 +48,8 @@ fi # if we want to keep it. local lastdir=$ZFTP_PWD -zftp cd "$@" && zflastdir=$lastdir -print $zflastsession +zftp cd "$@" && [[ $lastdir != $ZFTP_PWD ]] && +zfconfig[lastdir_$ZFTP_SESSION]=$lastdir + +print $zfconfig[lastloc_$ZFTP_SESSION] # } diff --git a/Functions/Zftp/zfcget b/Functions/Zftp/zfcget index fd6accfed..476a730a6 100644 --- a/Functions/Zftp/zfcget +++ b/Functions/Zftp/zfcget @@ -12,35 +12,22 @@ emulate -L zsh -local loc rem stat=0 optlist opt nglob remlist locst remst -local tmpfile=${TMPPREFIX}zfcget$$ rstat tsize time +[[ $curcontext = :zf* ]] || local curcontext=:zfcget +local loc rem stat=0 opt opt_G opt_t remlist locst remst +local tmpfile=${TMPPREFIX}zfcget$$ rstat tsize -while [[ $1 = -* ]]; do - if [[ $1 = - || $1 = -- ]]; then - shift; - break; - fi - optlist=${1#-} - for (( i = 1; i <= $#optlist; i++)); do - opt=$optlist[$i] - case $optlist[$i] in - G) nglob=1 - ;; - t) time=1 - ;; - *) print option $opt not recognised >&2 - ;; - esac - done - shift +while getopts :Gt opt; do + [[ $opt = '?' ]] && print "zfcget: bad option: -$OPTARG" && return 1 + eval "opt_$opt=1" done +(( OPTIND > 1 )) && shift $(( OPTIND - 1 )) for remlist in $*; do # zfcd directory hack to put the front back to ~ if [[ $remlist = $HOME || $remlist = $HOME/* ]]; then remlist="~${remlist#$HOME}" fi - if [[ $nglob != 1 ]]; then + if [[ $opt_G != 1 ]]; then zfrglob remlist fi if (( $#remlist )); then @@ -73,7 +60,7 @@ for remlist in $*; do continue else if zftp getat $rem $locst[1] >>$loc; then - [[ $time = 1 ]] && zfrtime $loc $rem $remst[2] + [[ $opt_t = 1 ]] && zfrtime $loc $rem $remst[2] else stat=1 fi diff --git a/Functions/Zftp/zfclose b/Functions/Zftp/zfclose index fb49efd51..b1823fb49 100644 --- a/Functions/Zftp/zfclose +++ b/Functions/Zftp/zfclose @@ -1,3 +1,4 @@ # function zfclose { +[[ $curcontext = :zf* ]] || local curcontext=:zfclose zftp close # } diff --git a/Functions/Zftp/zfcput b/Functions/Zftp/zfcput index fad5c3f86..d8a8a60a3 100644 --- a/Functions/Zftp/zfcput +++ b/Functions/Zftp/zfcput @@ -12,6 +12,7 @@ emulate -L zsh +[[ $curcontext = :zf* ]] || local curcontext=:zfcput local loc rem stat=0 locst remst offs tailtype local tmpfile=${TMPPREFIX}zfcget$$ rstat diff --git a/Functions/Zftp/zfdir b/Functions/Zftp/zfdir index 55befe000..4818dc973 100644 --- a/Functions/Zftp/zfdir +++ b/Functions/Zftp/zfdir @@ -22,7 +22,10 @@ emulate -L zsh setopt extendedglob +[[ $curcontext = :zf* ]] || local curcontext=:zfdir local file opt optlist redir i newargs force +local curdir=$zfconfig[curdir_$ZFTP_SESSION] +local otherdir=$zfconfig[otherdir_$ZFTP_SESSION] while [[ $1 = -* ]]; do if [[ $1 = - || $1 = -- ]]; then @@ -40,9 +43,9 @@ while [[ $1 = -* ]]; do ;; f) force=1 ;; - d) [[ -n $zfcurdir && -f $zfcurdir ]] && rm -f $zfcurdir - [[ -n $zfotherdir && -f $zfotherdir ]] && rm -f $zfotherdir - zftp_fcache=() + d) [[ -n $curdir && -f $curdir ]] && rm -f $curdir + [[ -n $otherdir && -f $otherdir ]] && rm -f $otherdir + zffcache -d return 0 ;; esac @@ -50,7 +53,7 @@ while [[ $1 = -* ]]; do shift done -zfautocheck -d +zfautocheck -d || return 1 # directory hack, see zfcd for (( i = 1; i <= $#argv; i++ )); do @@ -62,26 +65,32 @@ done if [[ $# -eq 0 ]]; then # Cache it in the current directory file. This means that repeated # calls to zfdir with no arguments always use a cached file. - [[ -z $zfcurdir ]] && zfcurdir=${TMPPREFIX}zfcurdir$$ - file=$zfcurdir + if [[ -z $curdir ]]; then + curdir=${TMPPREFIX}zfcurdir_${ZFTP_SESSION}_$$ + zfconfig[curdir_$ZFTP_SESSION]=$curdir + fi + file=$curdir else # Last directly looked at was not the current one, or at least # had non-standard arguments. - [[ -z $zfotherdir ]] && zfotherdir=${TMPPREFIX}zfotherdir$$ - file=$zfotherdir + if [[ -z $otherdir ]]; then + otherdir=${TMPPREFIX}zfotherdir_${ZFTP_SESSION}_$$ + zfconfig[otherdir_$ZFTP_SESSION]=$otherdir + fi + file=$otherdir newargs="$*" if [[ -f $file && $redir != 1 && $force -ne 1 ]]; then # Don't use the cached file if the arguments changed. - [[ $newargs = $zfotherargs ]] || rm -f $file + [[ $newargs = $zfconfig[otherargs_$ZFTP_SESSION] ]] || rm -f $file fi - zfotherargs=$newargs + zfconfig[otherargs_$ZFTP_SESSION]=$newargs fi if [[ $force -eq 1 ]]; then rm -f $file # if it looks like current directory has changed, better invalidate # the filename cache, too. - (( $# == 0 )) && zftp_fcache=() + (( $# == 0 )) && zffcache -d fi if [[ -n $file && -f $file ]]; then @@ -89,11 +98,11 @@ if [[ -n $file && -f $file ]]; then else if (zftp test); then # Works OK in subshells - zftp dir $* | tee $file | eval ${PAGER-:more} + zftp dir $* | tee $file | eval ${PAGER:-more} else # Doesn't work in subshells (IRIX 6.2 --- why?) zftp dir $* >$file - eval ${PAGER-:more} $file + eval ${PAGER:-more} $file fi fi # } diff --git a/Functions/Zftp/zfgcp b/Functions/Zftp/zfgcp index 26a08697d..c9045c951 100644 --- a/Functions/Zftp/zfgcp +++ b/Functions/Zftp/zfgcp @@ -16,30 +16,17 @@ emulate -L zsh -local opt optlist nglob remlist rem loc time +[[ $curcontext = :zf* ]] || local curcontext=:zfgcp +local opt remlist rem loc opt_G opt_t integer stat do_close -while [[ $1 == -* ]]; do - if [[ $1 == - || $1 == -- ]]; then - shift; - break; - fi - optlist=${1#-} - for (( i = 1; i <= $#optlist; i++)); do - opt=$optlist[$i] - case $opt in - G) nglob=1 - ;; - t) time=1 - ;; - *) print option $opt not recognised >&2 - ;; - esac - done - shift +while getopts :Gt opt; do + [[ $opt = '?' ]] && print "zfgcp: bad option: -$OPTARG" >&2 && return 1 + eval "opt_$opt=1" done +(( OPTIND > 1 )) && shift $(( OPTIND - 1 )) -zfautocheck +zfautocheck || return 1 # hmm, we should really check this after expanding the glob, # but we shouldn't expand the last argument remotely anyway. @@ -59,14 +46,14 @@ if [[ -d $argv[-1] ]]; then if [[ $remlist = $HOME || $remlist = $HOME/* ]]; then remlist="~${remlist#$HOME}" fi - if [[ $nglob != 1 ]]; then + if [[ $opt_G != 1 ]]; then zfrglob remlist fi if (( $#remlist )); then for rem in $remlist; do loc=$dir/${rem:t} if zftp get $rem >$loc; then - [[ $time = 1 ]] && zfrtime $rem $loc + [[ $opt_t = 1 ]] && zfrtime $rem $loc else stat=1 fi @@ -74,6 +61,9 @@ if [[ -d $argv[-1] ]]; then fi done else + if [[ $1 = $HOME || $1 = $HOME/* ]]; then + 1="~${1#$HOME}" + fi zftp get $1 >$2 || stat=$? fi diff --git a/Functions/Zftp/zfget b/Functions/Zftp/zfget index 878a36346..ad9658ec3 100644 --- a/Functions/Zftp/zfget +++ b/Functions/Zftp/zfget @@ -1,10 +1,16 @@ # function zfget { # Get files from remote server. Options: +# -c cat: dump files to stdout. +# alias zfcat="zfget -c" +# zfpage() { zfget -c "$@" | eval $PAGER } +# are sensible things to do, but aren't done for you. Note the +# second doesn't work on all OS's. # -G don't to remote globbing, else do # -t update the local file times to the same time as the remote. # Currently this only works if you have the `perl' command, # and that perl is version 5 with the standard library. -# See the function zfrtime for more gory details. +# See the function zfrtime for more gory details. This has +# no effect with the -c option. # # If the connection is not currently open, try to open it with the current # parameters (set by a previous zfopen or zfparams), then close it after @@ -13,46 +19,38 @@ emulate -L zsh -local loc rem optlist opt nglob remlist time +[[ $curcontext = :zf* ]] || local curcontext=:zfget +local loc rem opt remlist opt_G opt_t opt_c integer stat do_close -while [[ $1 == -* ]]; do - if [[ $1 == - || $1 == -- ]]; then - shift; - break; - fi - optlist=${1#-} - for (( i = 1; i <= $#optlist; i++)); do - opt=$optlist[$i] - case $opt in - G) nglob=1 - ;; - t) time=1 - ;; - *) print option $opt not recognised >&2 - ;; - esac - done - shift +while getopts :Gtc opt; do + [[ $opt = '?' ]] && print "zfget: bad option: -$OPTARG" && return 1 + eval "opt_$opt=1" done +(( OPTIND > 1 )) && shift $(( OPTIND - 1 )) -zfautocheck +zfautocheck || return 1 for remlist in $*; do # zfcd directory hack to put the front back to ~ if [[ $remlist == $HOME || $remlist == $HOME/* ]]; then remlist="~${remlist#$HOME}" fi - if [[ $nglob != 1 ]]; then + if [[ $opt_G != 1 ]]; then zfrglob remlist fi if (( $#remlist )); then for rem in $remlist; do - loc=${rem:t} - if zftp get $rem >$loc; then - [[ $time = 1 ]] && zfrtime $rem $loc + if [[ -n $opt_c ]]; then + zftp get $rem + stat=$? else - stat=1 + loc=${rem:t} + if zftp get $rem >$loc; then + [[ $opt_t = 1 ]] && zfrtime $rem $loc + else + stat=1 + fi fi done fi diff --git a/Functions/Zftp/zfgoto b/Functions/Zftp/zfgoto index e69de29bb..86942721c 100644 --- a/Functions/Zftp/zfgoto +++ b/Functions/Zftp/zfgoto @@ -0,0 +1,81 @@ +# zfgoto bname +# Go to bookmark bname, a location on a remote FTP host. Unless +# this was the last session or is for anonymous FTP, prompt for +# the user's password. +# +# Maybe this should try and look for an appropriate session to use +# for the transfer. + +emulate -L zsh +setopt extendedglob +[[ $curcontext = :zf* ]] || local curcontext=:zfgoto + +# Set ZFTP_BMFILE if not already set. This should agree with +# the corresponding line in zfmark. +: ${ZFTP_BMFILE:=${ZFDOTDIR:-$HOME}/.zfbkmarks} + +typeset -A bkmarks +local line opt_n opt + +while getopts :n opt; do + [[ $opt = '?' ]] && print "zfgoto: bad option: -$OPTARG" && return 1 + eval "opt_$opt=1" +done +(( OPTIND > 1 )) && shift $(( OPTIND - 1 )) + +if (( $# != 1 )); then + print "Usage: zfgoto bookmark" >&2 + return 1 +fi + +if [[ -n $opt_n && -f ~/.ncftp/bookmarks ]]; then + local oldifs=$IFS + IFS=, + while read -rA line; do + bkmarks[$line[1]]="${line[3]:-anonymous}@${line[2]}:${line[6]}" + done < ~/.ncftp/bookmarks + IFS=$oldifs +elif [[ -f $ZFTP_BMFILE ]]; then + # read in file: could optimise this by recording last read time + # comparing with file + while read -r line; do + # ignore blank and comment lines + [[ $line = [[:blank:]]# || $line = [[:blank:]]#'#'* ]] && continue + bkmarks[${line%% *}]="${line#* }" + done <$ZFTP_BMFILE +fi + +line=${bkmarks[$1]} + +if [[ -z $line ]]; then + print "Bookmark \`$1' not found" >&2 + return 1 +fi + +local user host dir +user=${line%%@*} +line=${line#*@} +host=${line%%:*} +dir=${line#*:} + +if [[ $ZFTP_USER = $user && $ZFTP_HOST = $host ]]; then + # We're already there, just change directory + zfcd ${dir:-~} +elif [[ $user = ftp || $user = anonymous ]]; then + # Anonymous ftp, so we don't need password etc. + zfanon $host && [[ -n $dir ]] && zfcd $dir +elif [[ $zfconfig[lastloc_$ZFTP_SESSION] = ${host}:* && + $user = $zfconfig[lastuser_$ZFTP_SESSION] ]]; then + # This was the last session, so assume it's still setup in the + # open parameters + zfopen && [[ -n $dir ]] && zfcd $dir +else + # Last try: see if it's in the parameters. + local params + params=($(zftp params)) + if [[ $host = $params[1] && $user = $params[2] ]]; then + zfopen && [[ -n $dir ]] && zfcd $dir + else + zfopen $host $user && [[ -n $dir ]] && zfcd $dir + fi +fi diff --git a/Functions/Zftp/zfhere b/Functions/Zftp/zfhere index 43e599d3a..8fa607e28 100644 --- a/Functions/Zftp/zfhere +++ b/Functions/Zftp/zfhere @@ -1,5 +1,6 @@ # function zfhere { # Change to the directory corresponding to $PWD on the server. # See zfcd for how this works. +[[ $curcontext = :zf* ]] || local curcontext=:zfhere zfcd $PWD # } diff --git a/Functions/Zftp/zfls b/Functions/Zftp/zfls index e8d3cfb28..73211b46a 100644 --- a/Functions/Zftp/zfls +++ b/Functions/Zftp/zfls @@ -1,6 +1,7 @@ # function zfls { emulate -L zsh +[[ $curcontext = :zf* ]] || local curcontext=:zfls # directory hack, see zfcd if [[ $1 = $HOME || $1 = $HOME/* ]]; then diff --git a/Functions/Zftp/zfmark b/Functions/Zftp/zfmark index e69de29bb..e81cc27d8 100644 --- a/Functions/Zftp/zfmark +++ b/Functions/Zftp/zfmark @@ -0,0 +1,51 @@ +# zfmark [bname] +# Set a bookmark for the current zftp connection, or use the +# information about the last session if there isn't one. +# A bookmark includes both the host *and* the directory on that host. +# +# Without bname, list the current bookmarks and their locations. + +emulate -L zsh +setopt extendedglob +[[ $curcontext = :zf* ]] || local curcontext=:zfmark + +# Set ZFTP_BMFILE if not already set. This should agree with +# the corresponding line in zfgoto. +: ${ZFTP_BMFILE:=${ZDOTDIR:-$HOME}/.zfbkmarks} + +typeset -A bkmarks +local line + +if [[ -f $ZFTP_BMFILE ]]; then + # read in file: could optimise this by recording last read time + # comparing with file + while read -r line; do + # ignore blank and comment lines + [[ $line = [[:blank:]]# || $line = [[:blank:]]#'#'* ]] && continue + bkmarks[${line%% *}]="${line#* }" + done <$ZFTP_BMFILE +fi + +if (( $# == 0 )); then + for line in ${(ko)bkmarks}; do + print -r- "$line ${bkmarks[$line]}" + done + return 0 +elif (( $# > 1 )); then + print "Usage: zfmark [bookmark]" >&2 + return 1 +fi + +if [[ -n $ZFTP_HOST ]]; then + bkmarks[$1]="${ZFTP_USER}@${ZFTP_HOST}:${ZFTP_PWD}" +elif [[ -n $zfconfig[lastloc_$ZFTP_SESSION] ]]; then + bkmarks[$1]="${zfconig[lastuser_$ZFTP_SESSION]}@\ +${zfconfig[lastloc_$ZFTP_SESSION]}" +else + print "No current or recent ZFTP session to bookmark." >&2 + return 1 +fi + +for line in ${(ko)bkmarks}; do + print -r- "$line ${bkmarks[$line]}" +done >$ZFTP_BMFILE diff --git a/Functions/Zftp/zfopen b/Functions/Zftp/zfopen index fa9b4f81d..30e9cbfc9 100644 --- a/Functions/Zftp/zfopen +++ b/Functions/Zftp/zfopen @@ -7,36 +7,45 @@ emulate -L zsh -local optlist opt once +[[ $curcontext = :zf* ]] || local curcontext=:zfopen +local opt dir opt_1 setparams -while [[ $1 = -* ]]; do - if [[ $1 = - || $1 = -- ]]; then - shift; - break; - fi - optlist=${1#-} - for (( i = 1; i <= $#optlist; i++)); do - opt=$optlist[$i] - case $optlist[$i] in - 1) once=1 - ;; - *) print option $opt not recognised >&2 - ;; - esac - done - shift +while getopts :1 opt; do + [[ $opt = "?" ]] && print "zfopen: bad option: -$OPTARG" >&2 && return 1 + eval "opt_$opt=1" done +(( OPTIND > 1 )) && shift $(( OPTIND - 1 )) # This is where we should try and do same name-lookupage in # both .netrc and .ncftp/bookmarks . We could even try saving # the info in their for new hosts, like ncftp does. -if [[ $once = 1 ]]; then - zftp open $* +if [[ $1 = */* ]]; then + 1=${1##ftp://} + dir=${1#*/} + 1=${1%%/*} +fi + +if [[ $opt_1 = 1 ]]; then + zftp open $* || return 1 + if [[ $# = 1 ]]; then + if ! zftp login; then + zftp close + return 1 + fi + fi else # set parameters, but only if there was at least a host - (( $# > 0 )) && zfparams $* + (( $# > 0 )) && zfparams $* && setparams=1 # now call with no parameters - zftp open + if ! zftp open; then + [[ -n $ZFTP_HOST ]] && zftp close + [[ -n $setparams ]] && zfparams - + return 1 + fi +fi + +if [[ -n $dir ]]; then + zfcd $dir fi # } diff --git a/Functions/Zftp/zfparams b/Functions/Zftp/zfparams index 5c5262c52..59fea0ed4 100644 --- a/Functions/Zftp/zfparams +++ b/Functions/Zftp/zfparams @@ -1,12 +1,27 @@ # function zfparams { emulate -L zsh +[[ $curcontext = :zf* ]] || local curcontext=:zfparams -# Set to prompt for any user or password if not given. -# Don't worry about accounts here. -if (( $# > 0 )); then +if [[ $# -eq 1 && $1 = - ]]; then + # Delete existing parameter set. + local sess=$ZFTP_SESSION key + key=${zfconfig[fcache_$sess]} + [[ -n $key ]] && unset $key + for key in fcache lastloc lastdir curdir otherdir otherargs lastuser; do + unset "zfconfig[${key}_${sess}]" + done +elif (( $# > 0 )); then + # Set to prompt for any user or password if not given. + # Don't worry about accounts here. (( $# < 2 )) && 2='?' - (( $# < 3 )) && 3='?' + if (( $# < 3 )); then + if [[ $2 = '?'* ]]; then + 3="?Password on ${1}: " + else + 3="?Password for ${2##\\?} on ${1}: " + fi + fi fi zftp params $* # } diff --git a/Functions/Zftp/zfpcp b/Functions/Zftp/zfpcp index ddd570e59..e74ee34f8 100644 --- a/Functions/Zftp/zfpcp +++ b/Functions/Zftp/zfpcp @@ -14,10 +14,11 @@ emulate -L zsh +[[ $curcontext = :zf* ]] || local curcontext=:zfpcp local rem loc integer stat do_close -zfautocheck +zfautocheck || return 1 if [[ $# -gt 2 || $2 = (.|..) || $2 = */ ]]; then local dir=$argv[-1] @@ -32,6 +33,9 @@ if [[ $# -gt 2 || $2 = (.|..) || $2 = */ ]]; then zftp put $rem <$loc || stat=1 done else + if [[ $2 = $HOME || $2 = $HOME/* ]]; then + 2="~${2#$HOME}" + fi zftp put $2 <$1 stat=$? if [[ stat -ne 0 && $ZFTP_CODE = 553 && $ZFTP_REPLY = *'Is a directory'* ]] diff --git a/Functions/Zftp/zfput b/Functions/Zftp/zfput index 0687163f0..68ef5be5c 100644 --- a/Functions/Zftp/zfput +++ b/Functions/Zftp/zfput @@ -3,19 +3,64 @@ # off any directory parts to get the remote filename (i.e. always # goes into current remote directory). Use zfpcp to specify new # file name or new directory at remote end. +# +# -r means put recursively: any directories encountered will have +# all their contents to arbitrary depth transferred. Note that +# this creates the required directories. Any files in subdirectories +# whose names begin with a `.' will also be included. emulate -L zsh -local loc rem -integer stat do_close +[[ $curcontext = :zf* ]] || local curcontext=:zfput +local opt opt_r +integer stat do_close abort + +while getopts :r opt; do + [[ $opt = '?' ]] && print "zfget: bad option: -$OPTARG" && return 1 + eval "opt_$opt=1" +done +(( OPTIND > 1 )) && shift $(( OPTIND - 1 )) zfautocheck -for loc in $*; do - rem=${loc:t} - zftp put $rem <$loc - [[ $? == 0 ]] || stat=$? -done +zfput_sub() { + local subdirs loc rem + integer stat + subdirs=() + + for loc in $*; do + if [[ -n $opt_r ]]; then + if [[ -d $loc ]]; then + subdirs=($subdirs $loc) + continue + else + rem=$loc + fi + else + rem=${loc:t} + fi + + zftp put $rem <$loc + (( $? )) && stat=$? + if ! zftp test; then + abort=1 + (( stat )) || stat=1 + break; + fi + done + + while (( $#subdirs && ! abort )); do + zftp mkdir ${subdirs[1]} + zfput_sub ${subdirs[1]}/*(ND) + (( $? )) && stat=$? + shift subdirs + done + + return $stat +} + +zfput_sub $* +stat=$? (( $do_close )) && zfclose diff --git a/Functions/Zftp/zfsession b/Functions/Zftp/zfsession index 9cd0d918f..79d4da93c 100644 --- a/Functions/Zftp/zfsession +++ b/Functions/Zftp/zfsession @@ -3,6 +3,7 @@ emulate -L zsh +[[ $curcontext = :zf* ]] || local curcontext=:zfsession local opt opt_l opt_v opt_o opt_d hadopts while getopts ":lovd" opt; do diff --git a/Functions/Zftp/zfstat b/Functions/Zftp/zfstat index 0ca755d03..033e6976b 100644 --- a/Functions/Zftp/zfstat +++ b/Functions/Zftp/zfstat @@ -6,25 +6,16 @@ setopt localoptions unset unsetopt ksharrays -local i stat=0 opt optlist verbose +[[ $curcontext = :zf* ]] || local curcontext=:zfstat +local i stat=0 opt opt_v -while [[ $1 = -* ]]; do - if [[ $1 = - || $1 = -- ]]; then - shift; - break; - fi - optlist=${1#-} - for (( i = 1; i <= $#optlist; i++)); do - opt=$optlist[$i] - case $opt in - v) verbose=1 - ;; - *) print option $opt not recognised >&2 - ;; - esac - done - shift +while getopts :v opt; do + [[ $opt = "?" ]] && print "zfstat: bad option: -$OPTARG" >&2 && return 1 + eval "opt_$opt=1" done +(( OPTIND > 1 )) && shift $(( OPTIND - 1 )) + +[[ -n $ZFTP_SESSION ]] && print "Session:\t$ZFTP_SESSION" if [[ -n $ZFTP_HOST ]]; then print "Host:\t\t$ZFTP_HOST" @@ -55,7 +46,8 @@ if [[ -n $ZFTP_HOST ]]; then fi else print "Not connected." - [[ -n $zflastsession ]] && print "Last session:\t$zflastsession" + [[ -n $zfconfig[lastloc_$ZFTP_SESSION] ]] && + print "Last location:\t$zfconfig[lastloc_$ZFTP_SESSION]" stat=1 fi @@ -77,7 +69,7 @@ for (( i = 1; i <= ${#ZFTP_PREFS}; i++ )); do done print -if [[ -n $ZFTP_HOST && $verbose = 1 ]]; then +if [[ -n $ZFTP_HOST && $opt_v = 1 ]]; then zfautocheck -d print "Status of remote server:" # make sure we print the reply diff --git a/Functions/Zftp/zftransfer b/Functions/Zftp/zftransfer index 929f099d2..c70bf7248 100644 --- a/Functions/Zftp/zftransfer +++ b/Functions/Zftp/zftransfer @@ -4,6 +4,7 @@ emulate -L zsh +[[ $curcontext = :zf* ]] || local curcontext=:zftransfer local sess1 sess2 file1 file2 oldsess=${ZFTP_SESSION} if [[ $# -ne 2 ]]; then @@ -39,7 +40,9 @@ zfautocheck || return 1 # the size from the pipe --- and if it does, it's probably wrong. # To avoid that, try to get the size and set it for the progress to # see. -if [[ $zfconfig[progress] != none ]]; then +local style +zstyle -s ':zftp:zftransfer' progress style +if [[ -n $style && $style != none ]]; then local ZFTP_TSIZE array tmpfile=${TMPPREFIX}zft$$ zftp remote $file1 >$tmpfile 2>/dev/null array=($(<$tmpfile)) @@ -49,7 +52,7 @@ fi # We do the RHS of the pipeline in a subshell, too, so that # the LHS can get SIGPIPE when it exits. -{ zfconfig[progress]=none +{ zstyle '*' progress none zftp get $file1 } | ( zftp session $sess2 zfautocheck && zftp put $file2 ) diff --git a/Functions/Zftp/zftype b/Functions/Zftp/zftype index c3b93b7a0..0cdf7e2aa 100644 --- a/Functions/Zftp/zftype +++ b/Functions/Zftp/zftype @@ -1,5 +1,6 @@ # function zftype { local type zftmp=${TMPPREFIX}zftype$$ +[[ $curcontext = :zf* ]] || local curcontext=:zftype zfautocheck -d diff --git a/Functions/Zftp/zfuget b/Functions/Zftp/zfuget index 482da42e9..c1033c930 100644 --- a/Functions/Zftp/zfuget +++ b/Functions/Zftp/zfuget @@ -25,8 +25,9 @@ emulate -L zsh +[[ $curcontext = :zf* ]] || local curcontext=:zfuget local loc rem locstats remstats doit tmpfile=${TMPPREFIX}zfuget$$ -local rstat remlist verbose optlist opt bad i silent nglob time +local rstat remlist opt opt_v opt_s opt_G opt_t integer stat do_close zfuget_print_time() { @@ -43,40 +44,20 @@ zfuget_print () { print ", $locstats[1] bytes)" } -while [[ $1 = -* ]]; do - if [[ $1 = - || $1 = -- ]]; then - shift; - break; - fi - optlist=${1#-} - for (( i = 1; i <= $#optlist; i++)); do - opt=$optlist[$i] - case $optlist[$i] in - v) verbose=1 - ;; - s) silent=1 - ;; - G) nglob=1 - ;; - t) time=1 - ;; - *) print option $opt not recognised >&2 - ;; - esac - done - shift +while getopts :vsGt opt; do + [[ $opt = "?" ]] && print "zfuget: bad option: -$OPTARG" >&2 && return 1 + eval "opt_$opt=1" done +(( OPTIND > 1 )) && shift $(( OPTIND - 1 )) -[[ -n $bad ]] && return 1 - -zfautocheck +zfautocheck || return 1 for remlist in $*; do # zfcd directory hack to put the front back to ~ if [[ $remlist == $HOME || $remlist == $HOME/* ]]; then remlist="~${remlist#$HOME}" fi - if [[ $nglob != 1 ]]; then + if [[ $opt_n != 1 ]]; then zfrglob remlist fi if (( $#remlist )); then @@ -99,11 +80,11 @@ for remlist in $*; do stat=1 continue fi - [[ $verbose = 1 ]] && zfuget_print + [[ $opt_v = 1 ]] && zfuget_print if (( $locstats[1] != $remstats[1] )); then # Files have different sizes - if [[ $locstats[2] > $remstats[2] && $silent != 1 ]]; then - [[ $verbose != 1 ]] && zfuget_print + if [[ $locstats[2] > $remstats[2] && $opt_s != 1 ]]; then + [[ $opt_v != 1 ]] && zfuget_print print "Local file $loc more recent than remote," 1>&2 print -n "but sizes are different. Transfer anyway [y/n]? " 1>&2 read -q doit @@ -111,24 +92,24 @@ for remlist in $*; do else # Files have same size if [[ $locstats[2] < $remstats[2] ]]; then - if [[ $silent != 1 ]]; then - [[ $verbose != 1 ]] && zfuget_print + if [[ $opt_s != 1 ]]; then + [[ $opt_v != 1 ]] && zfuget_print print "Local file $loc has same size as remote," 1>&2 print -n "but local file is older. Transfer anyway [y/n]? " 1>&2 read -q doit fi else # presumably same file, so don't get it. - [[ $verbose = 1 ]] && print Not transferring + [[ $opt_v = 1 ]] && print Not transferring doit=n fi fi else - [[ $verbose = 1 ]] && print New file $loc + [[ $opt_v = 1 ]] && print New file $loc fi if [[ $doit = y ]]; then if zftp get $rem >$loc; then - if [[ $time = 1 ]]; then + if [[ $opt_t = 1 ]]; then # if $remstats is set, it's second element is the remote time zfrtime $loc $rem $remstats[2] fi diff --git a/Functions/Zftp/zfuput b/Functions/Zftp/zfuput index b54d0d0d4..4e0e42dcd 100644 --- a/Functions/Zftp/zfuput +++ b/Functions/Zftp/zfuput @@ -11,8 +11,9 @@ emulate -L zsh +[[ $curcontext = :zf* ]] || local curcontext=:zfuput local loc rem locstats remstats doit tmpfile=${TMPPREFIX}zfuput$$ -local rstat verbose optlist opt bad i silent +local rstat opt opt_v opt_s integer stat do_close zfuput_print_time() { @@ -29,29 +30,13 @@ zfuput_print () { print ", $locstats[1] bytes)" } -while [[ $1 = -* ]]; do - if [[ $1 = - || $1 = -- ]]; then - shift; - break; - fi - optlist=${1#-} - for (( i = 1; i <= $#optlist; i++)); do - opt=$optlist[$i] - case $optlist[$i] in - v) verbose=1 - ;; - s) silent=1 - ;; - *) print option $opt not recognised >&2 - ;; - esac - done - shift +while getopts :vs opt; do + [[ $opt = "?" ]] && print "zfuget: bad option: -$OPTARG" >&2 && return 1 + eval "opt_$opt=1" done +(( OPTIND > 1 )) && shift $(( OPTIND - 1 )) -[[ -n $bad ]] && return 1 - -zfautocheck +zfautocheck || return 1 if [[ $ZFTP_VERBOSE = *5* ]]; then # should we turn it off locally? @@ -77,13 +62,13 @@ for rem in $*; do print "Server does not implement full command set required." 1>&2 return 1 elif [[ $rstat = 1 ]]; then - [[ $verbose = 1 ]] && print New file $loc + [[ $opt_v = 1 ]] && print New file $loc else - [[ $verbose = 1 ]] && zfuput_print + [[ $opt_v = 1 ]] && zfuput_print if (( $locstats[1] != $remstats[1] )); then # Files have different sizes - if [[ $locstats[2] < $remstats[2] && $silent != 1 ]]; then - [[ $verbose != 1 ]] && zfuput_print + if [[ $locstats[2] < $remstats[2] && $opt_s != 1 ]]; then + [[ $opt_v != 1 ]] && zfuput_print print "Remote file $rem more recent than local," 1>&2 print -n "but sizes are different. Transfer anyway [y/n]? " 1>&2 read -q doit @@ -91,15 +76,15 @@ for rem in $*; do else # Files have same size if [[ $locstats[2] > $remstats[2] ]]; then - if [[ $silent != 1 ]]; then - [[ $verbose != 1 ]] && zfuput_print + if [[ $opt_s != 1 ]]; then + [[ $opt_v != 1 ]] && zfuput_print print "Remote file $rem has same size as local," 1>&2 print -n "but remote file is older. Transfer anyway [y/n]? " 1>&2 read -q doit fi else # presumably same file, so don't get it. - [[ $verbose = 1 ]] && print Not transferring + [[ $opt_v = 1 ]] && print Not transferring doit=n fi fi |