about summary refs log tree commit diff
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
+# }