aboutsummaryrefslogtreecommitdiff
path: root/Functions/Zftp/zfpcp
diff options
context:
space:
mode:
Diffstat (limited to 'Functions/Zftp/zfpcp')
-rw-r--r--Functions/Zftp/zfpcp47
1 files changed, 47 insertions, 0 deletions
diff --git a/Functions/Zftp/zfpcp b/Functions/Zftp/zfpcp
new file mode 100644
index 000000000..ddd570e59
--- /dev/null
+++ b/Functions/Zftp/zfpcp
@@ -0,0 +1,47 @@
+# function zfpcp {
+# ZFTP put as copy: i.e. first arguments are remote, last is local.
+# Currently only supports
+# zfcp lfile rfile
+# if there are two arguments, or the second one is . or .., or ends
+# with a slash
+# or
+# zfcp lfile1 lfile2 lfile3 ... rdir
+# if there are more than two (because otherwise it doesn't
+# know if the last argument is a directory on the remote machine).
+# However, if the remote machine plays ball by telling us `Is a directory'
+# when we try to copy to a directory, zfpcp will then try to do the correct
+# thing.
+
+emulate -L zsh
+
+local rem loc
+integer stat do_close
+
+zfautocheck
+
+if [[ $# -gt 2 || $2 = (.|..) || $2 = */ ]]; then
+ local dir=$argv[-1]
+ argv[-1]=
+ # zfcd directory hack to put the front back to ~
+ if [[ $dir = $HOME || $dir = $HOME/* ]]; then
+ dir="~${dir#$HOME}"
+ fi
+ [[ -n $dir && $dir != */ ]] || dir="$dir/"
+ for loc in $*; do
+ rem=$dir${loc:t}
+ zftp put $rem <$loc || stat=1
+ done
+else
+ zftp put $2 <$1
+ stat=$?
+ if [[ stat -ne 0 && $ZFTP_CODE = 553 && $ZFTP_REPLY = *'Is a directory'* ]]
+ then
+ zftp put $2/$1:t <$1
+ stat=$?
+ fi
+fi
+
+(( $do_close )) && zfclose
+
+return $stat
+# }