changeset 27357:9c4d0ff7fbab

Extract FTP code from urlwrite.cc to __ftp__.cc for clarity. * libinterp/corefcn/urlwrite.cc: Extract FTP related functions. * libinterp/corefcn/__ftp__.cc: New file containing FTP related functions. * libinterp/corefcn/module.mk: Add __ftp__.cc to build system.
author Kai T. Ohlhus <k.ohlhus@gmail.com>
date Fri, 23 Aug 2019 14:47:48 +0900
parents b00ddc40b89a
children f59c8cd2eead
files libinterp/corefcn/__ftp__.cc libinterp/corefcn/module.mk libinterp/corefcn/urlwrite.cc
diffstat 3 files changed, 530 insertions(+), 469 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libinterp/corefcn/__ftp__.cc	Fri Aug 23 14:47:48 2019 +0900
@@ -0,0 +1,529 @@
+/*
+
+Copyright (C) 2006-2019 Alexander Barth
+Copyright (C) 2009 David Bateman
+
+This file is part of Octave.
+
+Octave is free software: you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Octave is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Octave; see the file COPYING.  If not, see
+<https://www.gnu.org/licenses/>.
+
+*/
+
+// Author: Alexander Barth <abarth@marine.usf.edu>
+// Adapted-By: jwe
+
+#if defined (HAVE_CONFIG_H)
+#  include "config.h"
+#endif
+
+#include <string>
+#include <fstream>
+#include <iomanip>
+
+#include "dir-ops.h"
+#include "file-ops.h"
+#include "file-stat.h"
+#include "lo-sysdep.h"
+#include "oct-env.h"
+#include "oct-handle.h"
+#include "glob-match.h"
+#include "url-transfer.h"
+
+#include "defun.h"
+#include "error.h"
+#include "interpreter.h"
+#include "oct-map.h"
+#include "oct-refcount.h"
+#include "ov-cell.h"
+#include "ov-classdef.h"
+#include "ovl.h"
+#include "pager.h"
+#include "unwind-prot.h"
+#include "url-handle-manager.h"
+
+static void
+delete_file (const std::string& file)
+{
+  octave::sys::unlink (file);
+}
+
+DEFMETHOD (__ftp__, interp, args, ,
+           doc: /* -*- texinfo -*-
+@deftypefn  {} {@var{handle} =} __ftp__ (@var{host})
+@deftypefnx {} {@var{handle} =} __ftp__ (@var{host}, @var{username}, @var{password})
+Undocumented internal function
+@end deftypefn */)
+{
+  int nargin = args.length ();
+
+  if (nargin < 1 || nargin > 3)
+    print_usage ();
+
+  std::string host = args(0).xstring_value ("__ftp__: HOST must be a string");
+
+  std::string user = (nargin > 1)
+    ? args(1).xstring_value ("__ftp__: USER must be a string")
+    : "anonymous";
+
+  std::string passwd = (nargin > 2)
+    ? args(2).xstring_value ("__ftp__: PASSWD must be a string")
+    : "";
+
+  octave::url_handle_manager& uhm = interp.get_url_handle_manager ();
+
+  octave::url_handle uh = uhm.make_url_handle (host, user, passwd,
+                                               octave_stdout);
+
+  return ovl (uh.value ());
+}
+
+DEFMETHOD (__ftp_pwd__, interp, args, ,
+           doc: /* -*- texinfo -*-
+@deftypefn {} {} __ftp_pwd__ (@var{handle})
+Undocumented internal function
+@end deftypefn */)
+{
+  if (args.length () != 1)
+    error ("__ftp_pwd__: incorrect number of arguments");
+
+  octave::url_handle_manager& uhm = interp.get_url_handle_manager ();
+
+  octave::url_transfer url_xfer = uhm.get_object (args(0));
+
+  if (! url_xfer.is_valid ())
+    error ("__ftp_pwd__: invalid ftp handle");
+
+  return ovl (url_xfer.pwd ());
+}
+
+DEFMETHOD (__ftp_cwd__, interp, args, ,
+           doc: /* -*- texinfo -*-
+@deftypefn {} {} __ftp_cwd__ (@var{handle}, @var{path})
+Undocumented internal function
+@end deftypefn */)
+{
+  int nargin = args.length ();
+
+  if (nargin != 1 && nargin != 2)
+    error ("__ftp_cwd__: incorrect number of arguments");
+
+  std::string path = "";
+  if (nargin > 1)
+    path = args(1).xstring_value ("__ftp_cwd__: PATH must be a string");
+
+  octave::url_handle_manager& uhm = interp.get_url_handle_manager ();
+
+  octave::url_transfer url_xfer = uhm.get_object (args(0));
+
+  if (! url_xfer.is_valid ())
+    error ("__ftp_cwd__: invalid ftp handle");
+
+  url_xfer.cwd (path);
+
+  return ovl ();
+}
+
+DEFMETHOD (__ftp_dir__, interp, args, nargout,
+           doc: /* -*- texinfo -*-
+@deftypefn {} {} __ftp_dir__ (@var{handle})
+Undocumented internal function
+@end deftypefn */)
+{
+  if (args.length () != 1)
+    error ("__ftp_dir__: incorrect number of arguments");
+
+  octave::url_handle_manager& uhm = interp.get_url_handle_manager ();
+
+  octave::url_transfer url_xfer = uhm.get_object (args(0));
+
+  if (! url_xfer.is_valid ())
+    error ("__ftp_dir__: invalid ftp handle");
+
+  octave_value retval;
+
+  if (nargout == 0)
+    url_xfer.dir ();
+  else
+    {
+      string_vector sv = url_xfer.list ();
+      octave_idx_type n = sv.numel ();
+
+      if (n == 0)
+        {
+          string_vector flds (5);
+
+          flds(0) = "name";
+          flds(1) = "date";
+          flds(2) = "bytes";
+          flds(3) = "isdir";
+          flds(4) = "datenum";
+
+          retval = octave_map (flds);
+        }
+      else
+        {
+          octave_map st;
+
+          Cell filectime (dim_vector (n, 1));
+          Cell filesize (dim_vector (n, 1));
+          Cell fileisdir (dim_vector (n, 1));
+          Cell filedatenum (dim_vector (n, 1));
+
+          st.assign ("name", Cell (sv));
+
+          for (octave_idx_type i = 0; i < n; i++)
+            {
+              time_t ftime;
+              bool fisdir;
+              double fsize;
+
+              url_xfer.get_fileinfo (sv(i), fsize, ftime, fisdir);
+
+              fileisdir (i) = fisdir;
+              filectime (i) = ctime (&ftime);
+              filesize (i) = fsize;
+              filedatenum (i) = double (ftime);
+            }
+
+          st.assign ("date", filectime);
+          st.assign ("bytes", filesize);
+          st.assign ("isdir", fileisdir);
+          st.assign ("datenum", filedatenum);
+
+          retval = st;
+        }
+    }
+
+  return retval;
+}
+
+DEFMETHOD (__ftp_ascii__, interp, args, ,
+           doc: /* -*- texinfo -*-
+@deftypefn {} {} __ftp_ascii__ (@var{handle})
+Undocumented internal function
+@end deftypefn */)
+{
+  if (args.length () != 1)
+    error ("__ftp_ascii__: incorrect number of arguments");
+
+  octave::url_handle_manager& uhm = interp.get_url_handle_manager ();
+
+  octave::url_transfer url_xfer = uhm.get_object (args(0));
+
+  if (! url_xfer.is_valid ())
+    error ("__ftp_ascii__: invalid ftp handle");
+
+  url_xfer.ascii ();
+
+  return ovl ();
+}
+
+DEFMETHOD (__ftp_binary__, interp, args, ,
+           doc: /* -*- texinfo -*-
+@deftypefn {} {} __ftp_binary__ (@var{handle})
+Undocumented internal function
+@end deftypefn */)
+{
+  if (args.length () != 1)
+    error ("__ftp_binary__: incorrect number of arguments");
+
+  octave::url_handle_manager& uhm = interp.get_url_handle_manager ();
+
+  octave::url_transfer url_xfer = uhm.get_object (args(0));
+
+  if (! url_xfer.is_valid ())
+    error ("__ftp_binary__: invalid ftp handle");
+
+  url_xfer.binary ();
+
+  return ovl ();
+}
+
+DEFMETHOD (__ftp_close__, interp, args, ,
+           doc: /* -*- texinfo -*-
+@deftypefn {} {} __ftp_close__ (@var{handle})
+Undocumented internal function
+@end deftypefn */)
+{
+  if (args.length () != 1)
+    error ("__ftp_close__: incorrect number of arguments");
+
+  octave::url_handle_manager& uhm = interp.get_url_handle_manager ();
+
+  octave::url_handle h = uhm.lookup (args(0));
+
+  if (! h.ok ())
+    error ("__ftp_close__: invalid ftp handle");
+
+  uhm.free (h);
+
+  return ovl ();
+}
+
+DEFMETHOD (__ftp_mode__, interp, args, ,
+           doc: /* -*- texinfo -*-
+@deftypefn {} {} __ftp_mode__ (@var{handle})
+Undocumented internal function
+@end deftypefn */)
+{
+  if (args.length () != 1)
+    error ("__ftp_mode__: incorrect number of arguments");
+
+  octave::url_handle_manager& uhm = interp.get_url_handle_manager ();
+
+  octave::url_transfer url_xfer = uhm.get_object (args(0));
+
+  if (! url_xfer.is_valid ())
+    error ("__ftp_binary__: invalid ftp handle");
+
+  return ovl (url_xfer.is_ascii () ? "ascii" : "binary");
+}
+
+DEFMETHOD (__ftp_delete__, interp, args, ,
+           doc: /* -*- texinfo -*-
+@deftypefn {} {} __ftp_delete__ (@var{handle}, @var{path})
+Undocumented internal function
+@end deftypefn */)
+{
+  if (args.length () != 2)
+    error ("__ftp_delete__: incorrect number of arguments");
+
+  std::string file = args(1).xstring_value ("__ftp_delete__: FILE must be a string");
+
+  octave::url_handle_manager& uhm = interp.get_url_handle_manager ();
+
+  octave::url_transfer url_xfer = uhm.get_object (args(0));
+
+  if (! url_xfer.is_valid ())
+    error ("__ftp_delete__: invalid ftp handle");
+
+  url_xfer.del (file);
+
+  return ovl ();
+}
+
+DEFMETHOD (__ftp_rmdir__, interp, args, ,
+           doc: /* -*- texinfo -*-
+@deftypefn {} {} __ftp_rmdir__ (@var{handle}, @var{path})
+Undocumented internal function
+@end deftypefn */)
+{
+  if (args.length () != 2)
+    error ("__ftp_rmdir__: incorrect number of arguments");
+
+  std::string dir = args(1).xstring_value ("__ftp_rmdir__: DIR must be a string");
+
+  octave::url_handle_manager& uhm = interp.get_url_handle_manager ();
+
+  octave::url_transfer url_xfer = uhm.get_object (args(0));
+
+  if (! url_xfer.is_valid ())
+    error ("__ftp_rmdir__: invalid ftp handle");
+
+  url_xfer.rmdir (dir);
+
+  return ovl ();
+}
+
+DEFMETHOD (__ftp_mkdir__, interp, args, ,
+           doc: /* -*- texinfo -*-
+@deftypefn {} {} __ftp_mkdir__ (@var{handle}, @var{path})
+Undocumented internal function
+@end deftypefn */)
+{
+  if (args.length () != 2)
+    error ("__ftp_mkdir__: incorrect number of arguments");
+
+  std::string dir = args(1).xstring_value ("__ftp_mkdir__: DIR must be a string");
+
+  octave::url_handle_manager& uhm = interp.get_url_handle_manager ();
+
+  octave::url_transfer url_xfer = uhm.get_object (args(0));
+
+  if (! url_xfer.is_valid ())
+    error ("__ftp_mkdir__: invalid ftp handle");
+
+  url_xfer.mkdir (dir);
+
+  return ovl ();
+}
+
+DEFMETHOD (__ftp_rename__, interp, args, ,
+           doc: /* -*- texinfo -*-
+@deftypefn {} {} __ftp_rename__ (@var{handle}, @var{path})
+Undocumented internal function
+@end deftypefn */)
+{
+  if (args.length () != 3)
+    error ("__ftp_rename__: incorrect number of arguments");
+
+  std::string oldname = args(1).xstring_value ("__ftp_rename__: OLDNAME must be a string");
+  std::string newname = args(2).xstring_value ("__ftp_rename__: NEWNAME must be a string");
+
+  octave::url_handle_manager& uhm = interp.get_url_handle_manager ();
+
+  octave::url_transfer url_xfer = uhm.get_object (args(0));
+
+  if (url_xfer.is_valid ())
+    error ("__ftp_rename__: invalid ftp handle");
+
+  url_xfer.rename (oldname, newname);
+
+  return ovl ();
+}
+
+DEFMETHOD (__ftp_mput__, interp, args, nargout,
+           doc: /* -*- texinfo -*-
+@deftypefn {} {} __ftp_mput__ (@var{handle}, @var{files})
+Undocumented internal function
+@end deftypefn */)
+{
+  if (args.length () != 2)
+    error ("__ftp_mput__: incorrect number of arguments");
+
+  std::string pat = args(1).xstring_value ("__ftp_mput__: PATTERN must be a string");
+
+  octave::url_handle_manager& uhm = interp.get_url_handle_manager ();
+
+  octave::url_transfer url_xfer = uhm.get_object (args(0));
+
+  if (! url_xfer.is_valid ())
+    error ("__ftp_mput__: invalid ftp handle");
+
+  string_vector file_list;
+
+  glob_match pattern (octave::sys::file_ops::tilde_expand (pat));
+  string_vector files = pattern.glob ();
+
+  for (octave_idx_type i = 0; i < files.numel (); i++)
+    {
+      std::string file = files(i);
+
+      octave::sys::file_stat fs (file);
+
+      if (! fs.exists ())
+        error ("__ftp__mput: file does not exist");
+
+      if (fs.is_dir ())
+        {
+          file_list.append (url_xfer.mput_directory ("", file));
+
+          if (! url_xfer.good ())
+            error ("__ftp_mput__: %s", url_xfer.lasterror ().c_str ());
+        }
+      else
+        {
+          std::string ascii_fname = octave::sys::get_ASCII_filename (file);
+
+          // FIXME: Does ascii mode need to be flagged here?
+          std::ifstream ifile (ascii_fname.c_str (),
+                               std::ios::in | std::ios::binary);
+
+          if (! ifile.is_open ())
+            error ("__ftp_mput__: unable to open file");
+
+          url_xfer.put (file, ifile);
+
+          ifile.close ();
+
+          if (! url_xfer.good ())
+            error ("__ftp_mput__: %s", url_xfer.lasterror ().c_str ());
+
+          file_list.append (file);
+        }
+    }
+
+  if (nargout > 0)
+    return ovl (file_list);
+  else
+    return ovl ();
+}
+
+DEFMETHOD (__ftp_mget__, interp, args, ,
+           doc: /* -*- texinfo -*-
+@deftypefn  {} {} __ftp_mget__ (@var{handle}, @var{pattern})
+@deftypefnx {} {} __ftp_mget__ (@var{handle}, @var{pattern}, @var{target})
+Undocumented internal function
+@end deftypefn */)
+{
+  int nargin = args.length ();
+
+  if (nargin != 2 && nargin != 3)
+    error ("__ftp_mget__: incorrect number of arguments");
+
+  std::string file = args(1).xstring_value ("__ftp_mget__: PATTERN must be a string");
+
+  std::string target;
+
+  if (nargin == 3 && ! args(2).isempty ())
+    target = args(2).xstring_value ("__ftp_mget__: TARGET must be a string")
+                        + octave::sys::file_ops::dir_sep_str ();
+
+  octave::url_handle_manager& uhm = interp.get_url_handle_manager ();
+
+  octave::url_transfer url_xfer = uhm.get_object (args(0));
+
+  if (! url_xfer.is_valid ())
+    error ("__ftp_mget__: invalid ftp handle");
+
+  string_vector sv = url_xfer.list ();
+  octave_idx_type n = 0;
+  glob_match pattern (file);
+
+  for (octave_idx_type i = 0; i < sv.numel (); i++)
+    {
+      if (pattern.match (sv(i)))
+        {
+          n++;
+
+          time_t ftime;
+          bool fisdir;
+          double fsize;
+
+          url_xfer.get_fileinfo (sv(i), fsize, ftime, fisdir);
+
+          if (fisdir)
+            url_xfer.mget_directory (sv(i), target);
+          else
+            {
+              std::ofstream ofile ((target + sv(i)).c_str (),
+                                   std::ios::out |
+                                   std::ios::binary);
+
+              if (! ofile.is_open ())
+                error ("__ftp_mget__: unable to open file");
+
+              octave::unwind_protect_safe frame;
+
+              frame.add_fcn (delete_file, target + sv(i));
+
+              url_xfer.get (sv(i), ofile);
+
+              ofile.close ();
+
+              if (url_xfer.good ())
+                frame.discard ();
+            }
+
+          if (! url_xfer.good ())
+            error ("__ftp_mget__: %s", url_xfer.lasterror().c_str());
+        }
+    }
+
+  if (n == 0)
+    error ("__ftp_mget__: file not found");
+
+  return ovl ();
+}
--- a/libinterp/corefcn/module.mk	Thu Aug 22 12:25:55 2019 -0400
+++ b/libinterp/corefcn/module.mk	Fri Aug 23 14:47:48 2019 +0900
@@ -117,6 +117,7 @@
   %reldir%/__contourc__.cc \
   %reldir%/__dsearchn__.cc \
   %reldir%/__expint__.cc \
+  %reldir%/__ftp__.cc \
   %reldir%/__gammainc__.cc \
   %reldir%/__ichol__.cc \
   %reldir%/__ilu__.cc \
--- a/libinterp/corefcn/urlwrite.cc	Thu Aug 22 12:25:55 2019 -0400
+++ b/libinterp/corefcn/urlwrite.cc	Fri Aug 23 14:47:48 2019 +0900
@@ -272,475 +272,6 @@
   return retval;
 }
 
-DEFMETHOD (__ftp__, interp, args, ,
-           doc: /* -*- texinfo -*-
-@deftypefn  {} {@var{handle} =} __ftp__ (@var{host})
-@deftypefnx {} {@var{handle} =} __ftp__ (@var{host}, @var{username}, @var{password})
-Undocumented internal function
-@end deftypefn */)
-{
-  int nargin = args.length ();
-
-  if (nargin < 1 || nargin > 3)
-    print_usage ();
-
-  std::string host = args(0).xstring_value ("__ftp__: HOST must be a string");
-
-  std::string user = (nargin > 1)
-    ? args(1).xstring_value ("__ftp__: USER must be a string")
-    : "anonymous";
-
-  std::string passwd = (nargin > 2)
-    ? args(2).xstring_value ("__ftp__: PASSWD must be a string")
-    : "";
-
-  octave::url_handle_manager& uhm = interp.get_url_handle_manager ();
-
-  octave::url_handle uh = uhm.make_url_handle (host, user, passwd,
-                                               octave_stdout);
-
-  return ovl (uh.value ());
-}
-
-DEFMETHOD (__ftp_pwd__, interp, args, ,
-           doc: /* -*- texinfo -*-
-@deftypefn {} {} __ftp_pwd__ (@var{handle})
-Undocumented internal function
-@end deftypefn */)
-{
-  if (args.length () != 1)
-    error ("__ftp_pwd__: incorrect number of arguments");
-
-  octave::url_handle_manager& uhm = interp.get_url_handle_manager ();
-
-  octave::url_transfer url_xfer = uhm.get_object (args(0));
-
-  if (! url_xfer.is_valid ())
-    error ("__ftp_pwd__: invalid ftp handle");
-
-  return ovl (url_xfer.pwd ());
-}
-
-DEFMETHOD (__ftp_cwd__, interp, args, ,
-           doc: /* -*- texinfo -*-
-@deftypefn {} {} __ftp_cwd__ (@var{handle}, @var{path})
-Undocumented internal function
-@end deftypefn */)
-{
-  int nargin = args.length ();
-
-  if (nargin != 1 && nargin != 2)
-    error ("__ftp_cwd__: incorrect number of arguments");
-
-  std::string path = "";
-  if (nargin > 1)
-    path = args(1).xstring_value ("__ftp_cwd__: PATH must be a string");
-
-  octave::url_handle_manager& uhm = interp.get_url_handle_manager ();
-
-  octave::url_transfer url_xfer = uhm.get_object (args(0));
-
-  if (! url_xfer.is_valid ())
-    error ("__ftp_cwd__: invalid ftp handle");
-
-  url_xfer.cwd (path);
-
-  return ovl ();
-}
-
-DEFMETHOD (__ftp_dir__, interp, args, nargout,
-           doc: /* -*- texinfo -*-
-@deftypefn {} {} __ftp_dir__ (@var{handle})
-Undocumented internal function
-@end deftypefn */)
-{
-  if (args.length () != 1)
-    error ("__ftp_dir__: incorrect number of arguments");
-
-  octave::url_handle_manager& uhm = interp.get_url_handle_manager ();
-
-  octave::url_transfer url_xfer = uhm.get_object (args(0));
-
-  if (! url_xfer.is_valid ())
-    error ("__ftp_dir__: invalid ftp handle");
-
-  octave_value retval;
-
-  if (nargout == 0)
-    url_xfer.dir ();
-  else
-    {
-      string_vector sv = url_xfer.list ();
-      octave_idx_type n = sv.numel ();
-
-      if (n == 0)
-        {
-          string_vector flds (5);
-
-          flds(0) = "name";
-          flds(1) = "date";
-          flds(2) = "bytes";
-          flds(3) = "isdir";
-          flds(4) = "datenum";
-
-          retval = octave_map (flds);
-        }
-      else
-        {
-          octave_map st;
-
-          Cell filectime (dim_vector (n, 1));
-          Cell filesize (dim_vector (n, 1));
-          Cell fileisdir (dim_vector (n, 1));
-          Cell filedatenum (dim_vector (n, 1));
-
-          st.assign ("name", Cell (sv));
-
-          for (octave_idx_type i = 0; i < n; i++)
-            {
-              time_t ftime;
-              bool fisdir;
-              double fsize;
-
-              url_xfer.get_fileinfo (sv(i), fsize, ftime, fisdir);
-
-              fileisdir (i) = fisdir;
-              filectime (i) = ctime (&ftime);
-              filesize (i) = fsize;
-              filedatenum (i) = double (ftime);
-            }
-
-          st.assign ("date", filectime);
-          st.assign ("bytes", filesize);
-          st.assign ("isdir", fileisdir);
-          st.assign ("datenum", filedatenum);
-
-          retval = st;
-        }
-    }
-
-  return retval;
-}
-
-DEFMETHOD (__ftp_ascii__, interp, args, ,
-           doc: /* -*- texinfo -*-
-@deftypefn {} {} __ftp_ascii__ (@var{handle})
-Undocumented internal function
-@end deftypefn */)
-{
-  if (args.length () != 1)
-    error ("__ftp_ascii__: incorrect number of arguments");
-
-  octave::url_handle_manager& uhm = interp.get_url_handle_manager ();
-
-  octave::url_transfer url_xfer = uhm.get_object (args(0));
-
-  if (! url_xfer.is_valid ())
-    error ("__ftp_ascii__: invalid ftp handle");
-
-  url_xfer.ascii ();
-
-  return ovl ();
-}
-
-DEFMETHOD (__ftp_binary__, interp, args, ,
-           doc: /* -*- texinfo -*-
-@deftypefn {} {} __ftp_binary__ (@var{handle})
-Undocumented internal function
-@end deftypefn */)
-{
-  if (args.length () != 1)
-    error ("__ftp_binary__: incorrect number of arguments");
-
-  octave::url_handle_manager& uhm = interp.get_url_handle_manager ();
-
-  octave::url_transfer url_xfer = uhm.get_object (args(0));
-
-  if (! url_xfer.is_valid ())
-    error ("__ftp_binary__: invalid ftp handle");
-
-  url_xfer.binary ();
-
-  return ovl ();
-}
-
-DEFMETHOD (__ftp_close__, interp, args, ,
-           doc: /* -*- texinfo -*-
-@deftypefn {} {} __ftp_close__ (@var{handle})
-Undocumented internal function
-@end deftypefn */)
-{
-  if (args.length () != 1)
-    error ("__ftp_close__: incorrect number of arguments");
-
-  octave::url_handle_manager& uhm = interp.get_url_handle_manager ();
-
-  octave::url_handle h = uhm.lookup (args(0));
-
-  if (! h.ok ())
-    error ("__ftp_close__: invalid ftp handle");
-
-  uhm.free (h);
-
-  return ovl ();
-}
-
-DEFMETHOD (__ftp_mode__, interp, args, ,
-           doc: /* -*- texinfo -*-
-@deftypefn {} {} __ftp_mode__ (@var{handle})
-Undocumented internal function
-@end deftypefn */)
-{
-  if (args.length () != 1)
-    error ("__ftp_mode__: incorrect number of arguments");
-
-  octave::url_handle_manager& uhm = interp.get_url_handle_manager ();
-
-  octave::url_transfer url_xfer = uhm.get_object (args(0));
-
-  if (! url_xfer.is_valid ())
-    error ("__ftp_binary__: invalid ftp handle");
-
-  return ovl (url_xfer.is_ascii () ? "ascii" : "binary");
-}
-
-DEFMETHOD (__ftp_delete__, interp, args, ,
-           doc: /* -*- texinfo -*-
-@deftypefn {} {} __ftp_delete__ (@var{handle}, @var{path})
-Undocumented internal function
-@end deftypefn */)
-{
-  if (args.length () != 2)
-    error ("__ftp_delete__: incorrect number of arguments");
-
-  std::string file = args(1).xstring_value ("__ftp_delete__: FILE must be a string");
-
-  octave::url_handle_manager& uhm = interp.get_url_handle_manager ();
-
-  octave::url_transfer url_xfer = uhm.get_object (args(0));
-
-  if (! url_xfer.is_valid ())
-    error ("__ftp_delete__: invalid ftp handle");
-
-  url_xfer.del (file);
-
-  return ovl ();
-}
-
-DEFMETHOD (__ftp_rmdir__, interp, args, ,
-           doc: /* -*- texinfo -*-
-@deftypefn {} {} __ftp_rmdir__ (@var{handle}, @var{path})
-Undocumented internal function
-@end deftypefn */)
-{
-  if (args.length () != 2)
-    error ("__ftp_rmdir__: incorrect number of arguments");
-
-  std::string dir = args(1).xstring_value ("__ftp_rmdir__: DIR must be a string");
-
-  octave::url_handle_manager& uhm = interp.get_url_handle_manager ();
-
-  octave::url_transfer url_xfer = uhm.get_object (args(0));
-
-  if (! url_xfer.is_valid ())
-    error ("__ftp_rmdir__: invalid ftp handle");
-
-  url_xfer.rmdir (dir);
-
-  return ovl ();
-}
-
-DEFMETHOD (__ftp_mkdir__, interp, args, ,
-           doc: /* -*- texinfo -*-
-@deftypefn {} {} __ftp_mkdir__ (@var{handle}, @var{path})
-Undocumented internal function
-@end deftypefn */)
-{
-  if (args.length () != 2)
-    error ("__ftp_mkdir__: incorrect number of arguments");
-
-  std::string dir = args(1).xstring_value ("__ftp_mkdir__: DIR must be a string");
-
-  octave::url_handle_manager& uhm = interp.get_url_handle_manager ();
-
-  octave::url_transfer url_xfer = uhm.get_object (args(0));
-
-  if (! url_xfer.is_valid ())
-    error ("__ftp_mkdir__: invalid ftp handle");
-
-  url_xfer.mkdir (dir);
-
-  return ovl ();
-}
-
-DEFMETHOD (__ftp_rename__, interp, args, ,
-           doc: /* -*- texinfo -*-
-@deftypefn {} {} __ftp_rename__ (@var{handle}, @var{path})
-Undocumented internal function
-@end deftypefn */)
-{
-  if (args.length () != 3)
-    error ("__ftp_rename__: incorrect number of arguments");
-
-  std::string oldname = args(1).xstring_value ("__ftp_rename__: OLDNAME must be a string");
-  std::string newname = args(2).xstring_value ("__ftp_rename__: NEWNAME must be a string");
-
-  octave::url_handle_manager& uhm = interp.get_url_handle_manager ();
-
-  octave::url_transfer url_xfer = uhm.get_object (args(0));
-
-  if (url_xfer.is_valid ())
-    error ("__ftp_rename__: invalid ftp handle");
-
-  url_xfer.rename (oldname, newname);
-
-  return ovl ();
-}
-
-DEFMETHOD (__ftp_mput__, interp, args, nargout,
-           doc: /* -*- texinfo -*-
-@deftypefn {} {} __ftp_mput__ (@var{handle}, @var{files})
-Undocumented internal function
-@end deftypefn */)
-{
-  if (args.length () != 2)
-    error ("__ftp_mput__: incorrect number of arguments");
-
-  std::string pat = args(1).xstring_value ("__ftp_mput__: PATTERN must be a string");
-
-  octave::url_handle_manager& uhm = interp.get_url_handle_manager ();
-
-  octave::url_transfer url_xfer = uhm.get_object (args(0));
-
-  if (! url_xfer.is_valid ())
-    error ("__ftp_mput__: invalid ftp handle");
-
-  string_vector file_list;
-
-  glob_match pattern (octave::sys::file_ops::tilde_expand (pat));
-  string_vector files = pattern.glob ();
-
-  for (octave_idx_type i = 0; i < files.numel (); i++)
-    {
-      std::string file = files(i);
-
-      octave::sys::file_stat fs (file);
-
-      if (! fs.exists ())
-        error ("__ftp__mput: file does not exist");
-
-      if (fs.is_dir ())
-        {
-          file_list.append (url_xfer.mput_directory ("", file));
-
-          if (! url_xfer.good ())
-            error ("__ftp_mput__: %s", url_xfer.lasterror ().c_str ());
-        }
-      else
-        {
-          std::string ascii_fname = octave::sys::get_ASCII_filename (file);
-
-          // FIXME: Does ascii mode need to be flagged here?
-          std::ifstream ifile (ascii_fname.c_str (),
-                               std::ios::in | std::ios::binary);
-
-          if (! ifile.is_open ())
-            error ("__ftp_mput__: unable to open file");
-
-          url_xfer.put (file, ifile);
-
-          ifile.close ();
-
-          if (! url_xfer.good ())
-            error ("__ftp_mput__: %s", url_xfer.lasterror ().c_str ());
-
-          file_list.append (file);
-        }
-    }
-
-  if (nargout > 0)
-    return ovl (file_list);
-  else
-    return ovl ();
-}
-
-DEFMETHOD (__ftp_mget__, interp, args, ,
-           doc: /* -*- texinfo -*-
-@deftypefn  {} {} __ftp_mget__ (@var{handle}, @var{pattern})
-@deftypefnx {} {} __ftp_mget__ (@var{handle}, @var{pattern}, @var{target})
-Undocumented internal function
-@end deftypefn */)
-{
-  int nargin = args.length ();
-
-  if (nargin != 2 && nargin != 3)
-    error ("__ftp_mget__: incorrect number of arguments");
-
-  std::string file = args(1).xstring_value ("__ftp_mget__: PATTERN must be a string");
-
-  std::string target;
-
-  if (nargin == 3 && ! args(2).isempty ())
-    target = args(2).xstring_value ("__ftp_mget__: TARGET must be a string")
-                        + octave::sys::file_ops::dir_sep_str ();
-
-  octave::url_handle_manager& uhm = interp.get_url_handle_manager ();
-
-  octave::url_transfer url_xfer = uhm.get_object (args(0));
-
-  if (! url_xfer.is_valid ())
-    error ("__ftp_mget__: invalid ftp handle");
-
-  string_vector sv = url_xfer.list ();
-  octave_idx_type n = 0;
-  glob_match pattern (file);
-
-  for (octave_idx_type i = 0; i < sv.numel (); i++)
-    {
-      if (pattern.match (sv(i)))
-        {
-          n++;
-
-          time_t ftime;
-          bool fisdir;
-          double fsize;
-
-          url_xfer.get_fileinfo (sv(i), fsize, ftime, fisdir);
-
-          if (fisdir)
-            url_xfer.mget_directory (sv(i), target);
-          else
-            {
-              std::ofstream ofile ((target + sv(i)).c_str (),
-                                   std::ios::out |
-                                   std::ios::binary);
-
-              if (! ofile.is_open ())
-                error ("__ftp_mget__: unable to open file");
-
-              octave::unwind_protect_safe frame;
-
-              frame.add_fcn (delete_file, target + sv(i));
-
-              url_xfer.get (sv(i), ofile);
-
-              ofile.close ();
-
-              if (url_xfer.good ())
-                frame.discard ();
-            }
-
-          if (! url_xfer.good ())
-            error ("__ftp_mget__: %s", url_xfer.lasterror().c_str());
-        }
-    }
-
-  if (n == 0)
-    error ("__ftp_mget__: file not found");
-
-  return ovl ();
-}
-
 DEFUN (__restful_service__, args, nargout,
        doc: /* -*- texinfo -*-
 @deftypefn  {} {@var{response} =} __restful_service__ (@var{url}, @var{param}, @var{weboptions})