changeset 460:075f89b4395c

2004-4-14 Brian Masney <masneyb@gftp.org> * lib/sshv2.c lib/gftp.h src/text/textui.c src/gtk/gtkui.c - when connecting with the SSH protocol, if the user is asked a question, relay that question back to the user and allow them to answer it. * doc/gftp-faq.sgml - moved the SSH troubleshooting section to the issues for older releases section. All of the issues that this talks about have been fixed in CVS. * src/gtk/gftp-gtk.c (main) - call gdk_threads_init() on startup * lib/cache.c lib/config_file.c lib/misc.c lib/protocols.c lib/rfc2068.c lib/rfc959.c - removed some uses of strlen() so that they only occur once on a string instead of multiple times in some cases * lib/sslcommon.c - fixed typo * configure.in lib/gftp.h - added configure check for inttypes.h * docs/gftp.lsm - updated with 2.0.17 information
author masneyb
date Thu, 15 Apr 2004 00:59:23 +0000
parents b4abf70c6425
children c4f5f158ff39
files ChangeLog configure.in docs/gftp-faq.sgml docs/gftp.lsm lib/cache.c lib/config_file.c lib/gftp.h lib/misc.c lib/protocols.c lib/rfc2068.c lib/rfc959.c lib/sshv2.c lib/sslcommon.c src/gtk/gftp-gtk.c src/gtk/gtkui.c src/text/textui.c
diffstat 16 files changed, 232 insertions(+), 102 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Sat Apr 10 20:39:06 2004 +0000
+++ b/ChangeLog	Thu Apr 15 00:59:23 2004 +0000
@@ -1,3 +1,25 @@
+2004-4-14 Brian Masney <masneyb@gftp.org>
+	* lib/sshv2.c lib/gftp.h src/text/textui.c src/gtk/gtkui.c - when
+	connecting with the SSH protocol, if the user is asked a question,
+	relay that question back to the user and allow them to answer it.
+
+	* doc/gftp-faq.sgml - moved the SSH troubleshooting section to the
+	issues for older releases section. All of the issues that this talks
+	about have been fixed in CVS.
+
+	* src/gtk/gftp-gtk.c (main) - call gdk_threads_init() on startup
+
+	* lib/cache.c lib/config_file.c lib/misc.c lib/protocols.c
+	lib/rfc2068.c lib/rfc959.c - removed some uses of strlen() so that
+	they only occur once on a string instead of multiple times in some
+	cases
+
+	* lib/sslcommon.c - fixed typo
+
+	* configure.in lib/gftp.h - added configure check for inttypes.h
+
+	* docs/gftp.lsm - updated with 2.0.17 information
+
 2004-04-10  Adam Weinberger  <adamw@gnome.rog>
 
 	* en_CA.po: Added en_CA to ALL_LINGUAS.
@@ -2423,7 +2445,7 @@
 
 	* cvsclean - added this script
 
-	* *.[ch] - added $Id: ChangeLog,v 1.258 2004/04/10 20:39:06 adamw Exp $ tags
+	* *.[ch] - added $Id: ChangeLog,v 1.259 2004/04/15 00:59:22 masneyb Exp $ tags
 
 	* debian/* - updated files from Debian maintainer
 
--- a/configure.in	Sat Apr 10 20:39:06 2004 +0000
+++ b/configure.in	Thu Apr 15 00:59:23 2004 +0000
@@ -53,7 +53,7 @@
 AC_HEADER_DIRENT
 AC_HEADER_STDC
 AC_HEADER_SYS_WAIT
-AC_CHECK_HEADERS(fcntl.h libutil.h limits.h malloc.h pty.h strings.h sys/ioctl.h sys/time.h unistd.h stdint.h sys/mkdev.h)
+AC_CHECK_HEADERS(fcntl.h libutil.h limits.h malloc.h pty.h strings.h sys/ioctl.h sys/time.h unistd.h stdint.h sys/mkdev.h inttypes.h)
 
 AC_TYPE_SOCKLEN_T
 AC_TYPE_MODE_T
--- a/docs/gftp-faq.sgml	Sat Apr 10 20:39:06 2004 +0000
+++ b/docs/gftp-faq.sgml	Thu Apr 15 00:59:23 2004 +0000
@@ -6,7 +6,7 @@
 <book>
 
 <bookinfo>
-  <date>$Date: 2004/03/17 13:44:41 $</date>
+  <date>$Date: 2004/04/15 00:59:23 $</date>
   <title>gFTP FAQ</title>
   <authorgroup>
     <author>
@@ -318,52 +318,6 @@
 <!-- ***************************************************************** -->
 
 <chapter>
-<title>SSH Protocol</title>
-
-<sect1>
-<title>I'm having problems getting SSH2 transfers to work. I keep getting the
-error: <emphasis>Error: Message size XXXXXXXX too big from server</emphasis>
-</title>
-
-<para>What probably is the problem, sftp-server isn't in your path on the
-remote server. When you try to connect to the remote server, you'll see the
-command gFTP is trying to run, and it'll look something like:</para>
-
-<para><literallayout><literal>ssh -e none -l username hostname "echo -n xsftp ;  sftp-server"</literal></literallayout</para>
-
-<para>Try running this command. If you get a prompt asking:</para>
-
-<para><literallayout>
-<literal>The authenticity of host 'hostname (###.###.###.###)' can't be established.</literal>
-<literal>RSA key fingerprint is xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx.</literal>
-<literal>Are you sure you want to continue connecting (yes/no)?</literal>
-</literallayout></para>
-
-<para>Tell it yes. gFTP won't even try to answer this question for you at the
-moment. Then, if you get the following output:</para>
-
-<para><literallayout>
-<literal>Enter passphrase for key '/home/brian/.ssh/id_dsa':</literal>
-<literal>xsftp</literal>
-<literal>bash: sftp-server: command not found</literal>
-</literallayout></para>
-
-<para>You'll have to set the path to the sftp-server program. Alternatively
-you could go under FTP->Options->SSH and enable Use sftp subsys. If you enable
-this, then you don't have to know the remote path to your sftp executable.
-But if you enable this, gFTP won't be able to send your password over to
-the ssh client. So if you're not using ssh-agent, then ssh will spawn the
-ssh-askpass program to grab your password.</para>
-
-</sect1>
-
-<!-- ----------------------------------------------------------------- -->
-
-</chapter>
-
-<!-- ***************************************************************** -->
-
-<chapter>
 <title>HTTP Protocol</title>
 
 <sect1>
@@ -444,7 +398,44 @@
 <title>Issues for older releases</title>
 
 <sect1>
-<title>What is the difference between the SSH and SSH2 protocols?</title>
+<title>I'm having problems getting SSH2 transfers to work. I keep getting the
+error: <emphasis>Error: Message size XXXXXXXX too big from server (only relevant for versions <= 2.0.17)</emphasis>
+</title>
+
+<para>What probably is the problem, sftp-server isn't in your path on the
+remote server. When you try to connect to the remote server, you'll see the
+command gFTP is trying to run, and it'll look something like:</para>
+
+<para><literallayout><literal>ssh -e none -l username hostname "echo -n xsftp ;  sftp-server"</literal></literallayout</para>
+
+<para>Try running this command. If you get a prompt asking:</para>
+
+<para><literallayout>
+<literal>The authenticity of host 'hostname (###.###.###.###)' can't be established.</literal>
+<literal>RSA key fingerprint is xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx.</literal>
+<literal>Are you sure you want to continue connecting (yes/no)?</literal>
+</literallayout></para>
+
+<para>Tell it yes. gFTP won't even try to answer this question for you at the
+moment. Then, if you get the following output:</para>
+
+<para><literallayout>
+<literal>Enter passphrase for key '/home/brian/.ssh/id_dsa':</literal>
+<literal>xsftp</literal>
+<literal>bash: sftp-server: command not found</literal>
+</literallayout></para>
+
+<para>You'll have to set the path to the sftp-server program. Alternatively
+you could go under FTP->Options->SSH and enable Use sftp subsys. If you enable
+this, then you don't have to know the remote path to your sftp executable.
+But if you enable this, gFTP won't be able to send your password over to
+the ssh client. So if you're not using ssh-agent, then ssh will spawn the
+ssh-askpass program to grab your password.</para>
+
+</sect1>
+
+<sect1>
+<title>What is the difference between the SSH and SSH2 protocols? (only relevant for versions <= 2.0.15)</title>
 
 <para>The SSH protocol uses sftp >= 0.7 from 
 <ulink url="http://www.xbill.org/sftp">http://www.xbill.org/sftp</ulink>.
--- a/docs/gftp.lsm	Sat Apr 10 20:39:06 2004 +0000
+++ b/docs/gftp.lsm	Thu Apr 15 00:59:23 2004 +0000
@@ -1,15 +1,17 @@
 Begin3
 Title:		gFTP
-Version:	2.0.6
-Entered-date:	20NOV99
-Description:	gFTP is a multithreaded FTP client for X Windows written
-                using Gtk. It features simultaneous downloads, resuming of 
-		interrupted file transfers, file transfer queues, downloading 
-		of entire directories, ftp and http proxy support, remote 
-		directory caching, passive and non-passive file transfers,
-		drag-n-drop support, bookmarks menu, stop button, and many 
-		more features.
-Keywords:	ftp x windows gtk
+Version:	2.0.17
+Entered-date:	28MAR04
+Description:	gFTP is a free multithreaded file transfer client for *NIX
+		based machines running X11R6 or later. It has text and GTK+
+		1.2/2.x interfaces and supports the FTP, FTPS (control
+		connection only), HTTP, HTTPS, and SSH protocols and has FTP
+		and HTTP proxy server support. It supports UNIX, EPLF, Novell,
+		MacOS, VMS, MVS, and NT (DOS) style directory listings, and
+		has a bookmarks menu that allows you to quickly connect to
+		remote sites. The code is fully internationalized and there
+		are currently 40 translations available.
+Keywords:	ftp x windows gtk gftp
 Author: 	masneyb@gftp.org (Brian Masney)
 Maintained-by:	masneyb@gftp.org (Brian Masney)
 Primary-site:	http://www.gftp.org/
--- a/lib/cache.c	Sat Apr 10 20:39:06 2004 +0000
+++ b/lib/cache.c	Thu Apr 15 00:59:23 2004 +0000
@@ -299,6 +299,7 @@
   gftp_getline_buffer * rbuf;
   gftp_cache_entry centry;
   int indexfd, newfd;
+  size_t len;
   time_t now;
   int remove;
  
@@ -366,9 +367,10 @@
 
           /* Make sure when we call gftp_get_line() that we pass the read size
              as sizeof(buf) - 1 so that we'll have room to put the newline */
-          buf[strlen (buf)] = '\n';
+          len = strlen (buf);
+          buf[len--] = '\n';
 
-          if (gftp_fd_write (NULL, buf, strlen (buf), newfd) < 0)
+          if (gftp_fd_write (NULL, buf, len, newfd) < 0)
             break;
         }
     }
--- a/lib/config_file.c	Sat Apr 10 20:39:06 2004 +0000
+++ b/lib/config_file.c	Thu Apr 15 00:59:23 2004 +0000
@@ -201,7 +201,7 @@
   newentry = NULL;
   while (fgets (buf, sizeof (buf), bmfile))
     {
-     len = strlen (buf);
+      len = strlen (buf);
       if (len > 0 && buf[len - 1] == '\n')
 	buf[--len] = '\0';
       if (len > 0 && buf[len - 1] == '\r')
--- a/lib/gftp.h	Sat Apr 10 20:39:06 2004 +0000
+++ b/lib/gftp.h	Thu Apr 15 00:59:23 2004 +0000
@@ -70,6 +70,10 @@
 #include <stdint.h>
 #endif
 
+#ifdef HAVE_INTTYPES_H
+#include <inttypes.h>
+#endif
+
 #ifdef HAVE_STRING_H
 #include <string.h>
 #else
@@ -1031,5 +1035,10 @@
 					  int fd );
 #endif /* USE_SSL */
 
+/* UI dependent functions that must be implemented */
+int gftpui_protocol_ask_yes_no 		( gftp_request * request,
+					  char *title,
+					  char *question );
+
 #endif
 
--- a/lib/misc.c	Sat Apr 10 20:39:06 2004 +0000
+++ b/lib/misc.c	Thu Apr 15 00:59:23 2004 +0000
@@ -53,7 +53,8 @@
 insert_commas (off_t number, char *dest_str, size_t dest_len)
 {
   char *frompos, *topos, src[50], *dest;
-  int len, num, rem, i;
+  size_t num, rem, srclen;
+  int len, i;
 
 #if defined (_LARGEFILE_SOURCE)
   g_snprintf (src, sizeof (src), "%lld", (long long) number);
@@ -93,8 +94,10 @@
   else
     dest = dest_str;
 
-  num = strlen (src) / 3 - 1;
-  rem = strlen (src) % 3;
+  srclen = strlen (src);
+  num = srclen / 3 - 1;
+  rem = srclen % 3;
+
   frompos = src;
   topos = dest;
   for (i = 0; i < rem; i++)
@@ -1018,7 +1021,8 @@
 
   char *newstr, *newpos, *fillpos, *pos;
   unsigned char table[64], encode[3];
-  int i, num;
+  size_t slen, num;
+  int i;
 
   for (i = 0; i < 26; i++)
     {
@@ -1032,9 +1036,11 @@
   table[62] = '+';
   table[63] = '/';
 
-  num = strlen (str) / 3;
-  if (strlen (str) % 3 > 0)
+  slen = strlen (str);
+  num = slen / 3;
+  if (slen % 3 > 0)
     num++;
+
   newstr = g_malloc (num * 4 + 1);
   newstr[num * 4] = '\0';
   newpos = newstr;
@@ -1266,7 +1272,7 @@
   if (strcmp (password, "@EMAIL@") == 0)
     return (g_strdup (password));
 
-  newstr = g_malloc (strlen(password) * 2 + 2);
+  newstr = g_malloc (strlen (password) * 2 + 2);
   newpos = newstr;
   
   *newpos++ = '$';
--- a/lib/protocols.c	Sat Apr 10 20:39:06 2004 +0000
+++ b/lib/protocols.c	Thu Apr 15 00:59:23 2004 +0000
@@ -1009,6 +1009,7 @@
 {
   gftp_config_list_vars * proxy_hosts;
   gftp_proxy_hosts * hostname;
+  size_t hostlen, domlen;
   unsigned char addy[4];
   struct sockaddr *addr;
   GList * templist;
@@ -1077,13 +1078,16 @@
   while (templist != NULL)
     {
       hostname = templist->data;
-      if (hostname->domain && 
-          strlen (request->hostname) > strlen (hostname->domain))
+      if (hostname->domain != NULL)
         {
-          pos = request->hostname + strlen (request->hostname) -
-                                 strlen (hostname->domain);
-          if (strcmp (hostname->domain, pos) == 0)
-            return (0);
+           hostlen = strlen (request->hostname);
+           domlen = strlen (hostname->domain);
+           if (hostlen > domlen)
+             {
+                pos = request->hostname + hostlen - domlen;
+                if (strcmp (hostname->domain, pos) == 0)
+                  return (0);
+             }
         }
 
       if (hostname->ipv4_network_address != 0)
@@ -1151,11 +1155,14 @@
   struct tm curtime, *loctime;
   time_t t, ret;
   char *tmppos;
+  size_t slen;
   int i, num;
 
+  slen = strlen (str);
   memset (&curtime, 0, sizeof (curtime));
   curtime.tm_isdst = -1;
-  if (strlen (str) > 4 && isdigit ((int) str[0]) && str[2] == '-' && 
+
+  if (slen > 4 && isdigit ((int) str[0]) && str[2] == '-' && 
       isdigit ((int) str[3]))
     {
       /* This is how DOS will return the date/time */
@@ -1163,13 +1170,13 @@
 
       tmppos = strptime (str, "%m-%d-%y %I:%M%p", &curtime);
     }
-  else if (strlen (str) > 4 && isdigit ((int) str[0]) && str[2] == '-' && 
+  else if (slen > 4 && isdigit ((int) str[0]) && str[2] == '-' && 
            isalpha (str[3]))
     {
       /* 10-Jan-2003 09:14 */
       tmppos = strptime (str, "%d-%h-%Y %H:%M", &curtime);
     }
-  else if (strlen (str) > 4 && isdigit ((int) str[0]) && str[4] == '/')
+  else if (slen > 4 && isdigit ((int) str[0]) && str[4] == '/')
     {
       /* 2003/12/25 */
       tmppos = strptime (str, "%Y/%m/%d", &curtime);
@@ -1404,13 +1411,14 @@
 
 
 static int
-gftp_parse_ls_unix (gftp_request * request, char *str, gftp_file * fle)
+gftp_parse_ls_unix (gftp_request * request, char *str, size_t slen,
+                    gftp_file * fle)
 {
   char *endpos, *startpos, *pos;
   int cols;
 
   /* If there is no space between the attribs and links field, just make one */
-  if (strlen (str) > 10)
+  if (slen > 10)
     str[10] = ' ';
 
   /* Determine the number of columns */
@@ -1615,7 +1623,7 @@
     {
       case GFTP_DIRTYPE_CRAY:
       case GFTP_DIRTYPE_UNIX:
-        result = gftp_parse_ls_unix (request, str, fle);
+        result = gftp_parse_ls_unix (request, str, len, fle);
         break;
       case GFTP_DIRTYPE_EPLF:
         result = gftp_parse_ls_eplf (str, fle);
@@ -1656,7 +1664,7 @@
             if (is_vms)
               result = gftp_parse_ls_vms (str, fle);
             else
-              result = gftp_parse_ls_unix (request, str, fle);
+              result = gftp_parse_ls_unix (request, str, len, fle);
           }
         break;
     }
--- a/lib/rfc2068.c	Sat Apr 10 20:39:06 2004 +0000
+++ b/lib/rfc2068.c	Thu Apr 15 00:59:23 2004 +0000
@@ -272,9 +272,10 @@
                   off_t startsize)
 {
   char *tempstr, *oldstr, *hf;
-  int restarted;
+  rfc2068_params * params;
   intptr_t use_http11;
-  rfc2068_params * params;
+  int restarted;
+  size_t len;
   off_t size;
 
   g_return_val_if_fail (request != NULL, GFTP_EFATAL);
@@ -326,11 +327,10 @@
     return (size);
 
   restarted = 0;
-  if (strlen (request->last_ftp_response) > 9 
-      && strncmp (request->last_ftp_response + 9, "206", 3) == 0)
+  len = strlen (request->last_ftp_response);
+  if (len  > 9 && strncmp (request->last_ftp_response + 9, "206", 3) == 0)
     restarted = 1;
-  else if (strlen (request->last_ftp_response) < 9 ||
-           strncmp (request->last_ftp_response + 9, "200", 3) != 0)
+  else if (len < 9 || strncmp (request->last_ftp_response + 9, "200", 3) != 0)
     {
       request->logging_function (gftp_logging_error, request,
 			         _("Cannot retrieve file %s\n"), filename);
--- a/lib/rfc959.c	Sat Apr 10 20:39:06 2004 +0000
+++ b/lib/rfc959.c	Thu Apr 15 00:59:23 2004 +0000
@@ -1514,7 +1514,7 @@
   if (!request->cached)
     {
       request->last_dir_entry = g_strdup_printf ("%s\n", tempstr);
-      request->last_dir_entry_len = strlen (tempstr) + 1;
+      request->last_dir_entry_len = len + 1;
     }
   return (len);
 }
--- a/lib/sshv2.c	Sat Apr 10 20:39:06 2004 +0000
+++ b/lib/sshv2.c	Thu Apr 15 00:59:23 2004 +0000
@@ -260,12 +260,13 @@
 static int
 sshv2_start_login_sequence (gftp_request * request, int fdm, int ptymfd)
 {
+  char *tempstr, *pwstr, *tmppos, *yesstr = "yes\n", *question_pos;
   size_t rem, len, diff, lastdiff;
-  char *tempstr, *pwstr, *tmppos;
   int wrotepw, ok, maxfd, ret;
   fd_set rset, eset;
   ssize_t rd;
 
+  question_pos = NULL;
   rem = len = SSH_LOGIN_BUFSIZE;
   tempstr = g_malloc0 (len + 1);
   diff = lastdiff = 0;
@@ -385,13 +386,23 @@
         }
       else if (diff > 10 && strcmp (tempstr + diff - 10, "(yes/no)? ") == 0)
         {
-          ok = SSH_ERROR_QUESTION;
-          break;
+          question_pos = tempstr + diff;
+          if (!gftpui_protocol_ask_yes_no (request, request->hostname, tempstr))
+            {
+              ok = SSH_ERROR_QUESTION;
+              break;
+            }
+          else
+            {
+              if (gftp_fd_write (request, yesstr, strlen (yesstr), ptymfd) < 0)
+                {
+                  ok = 0;
+                  break;
+                }
+            }
         }
       else if (rem <= 1)
         {
-          request->logging_function (gftp_logging_recv, request,
-                                     "%s", tempstr + lastdiff);
           len += SSH_LOGIN_BUFSIZE;
           rem += SSH_LOGIN_BUFSIZE;
           lastdiff = diff;
@@ -402,9 +413,14 @@
 
   g_free (pwstr);
 
-  if (*(tempstr + lastdiff) != '\0')
-    request->logging_function (gftp_logging_recv, request,
-                               "%s\n", tempstr + lastdiff);
+  if (question_pos != NULL)
+    {
+      if (*question_pos != '\0')
+        request->logging_function (gftp_logging_recv, request, "%s\n",
+                                   question_pos);
+    }
+  else if (*tempstr != '\0')
+    request->logging_function (gftp_logging_recv, request, "%s\n", tempstr);
 
   g_free (tempstr);
 
@@ -413,13 +429,11 @@
       if (ok == SSH_ERROR_BADPASS)
         request->logging_function (gftp_logging_error, request,
                                _("Error: An incorrect password was entered\n"));
-      else if (ok == SSH_ERROR_QUESTION)
-        request->logging_function (gftp_logging_error, request,
-                               _("Please connect to this host with the command line SSH utility and answer this question appropriately.\n"));
       else if (ok == SSH_WARNING)
         request->logging_function (gftp_logging_error, request,
                                    _("Please correct the above warning to connect to this host.\n"));
 
+      gftp_disconnect (request);
       return (GFTP_EFATAL);
     }
  
--- a/lib/sslcommon.c	Sat Apr 10 20:39:06 2004 +0000
+++ b/lib/sslcommon.c	Thu Apr 15 00:59:23 2004 +0000
@@ -292,7 +292,7 @@
   if (!SSL_library_init ())
     {
       request->logging_function (gftp_logging_error, request,
-                                 _("Cannot initialized the OpenSSL library\n"));
+                                 _("Cannot initialize the OpenSSL library\n"));
       return (GFTP_EFATAL);
     }
 
--- a/src/gtk/gftp-gtk.c	Sat Apr 10 20:39:06 2004 +0000
+++ b/src/gtk/gftp-gtk.c	Thu Apr 15 00:59:23 2004 +0000
@@ -1229,6 +1229,8 @@
   gftpui_common_init (&argc, &argv, ftp_log);
 
   g_thread_init (NULL);
+  gdk_threads_init();
+
   main_thread_id = pthread_self ();
   gtk_set_locale ();
   gtk_init (&argc, &argv);
--- a/src/gtk/gtkui.c	Sat Apr 10 20:39:06 2004 +0000
+++ b/src/gtk/gtkui.c	Thu Apr 15 00:59:23 2004 +0000
@@ -453,3 +453,55 @@
   return (pos);
 }
 
+
+static void
+_protocol_yes_answer (gpointer answer, gftp_dialog_data * ddata)
+{
+  *(int *) answer = 1;
+}
+
+
+static void
+_protocol_no_answer (gpointer answer, gftp_dialog_data * ddata)
+{
+  *(int *) answer = 0;
+}
+
+
+int
+gftpui_protocol_ask_yes_no (gftp_request * request, char *title,
+                            char *question)
+{
+  int answer = -1;
+
+  GDK_THREADS_ENTER ();
+
+  MakeYesNoDialog (title, question, _protocol_yes_answer, &answer,
+                   _protocol_no_answer, &answer);
+
+  if (gftp_protocols[request->protonum].use_threads)
+    {
+      /* Otherwise let the main loop in the main thread run the events */
+      GDK_THREADS_LEAVE ();
+
+      while (answer == -1)
+        {
+          sleep (1);
+        }
+    }
+  else
+    {
+      while (answer == -1)
+        {
+          GDK_THREADS_LEAVE ();
+#if GTK_MAJOR_VERSION == 1
+          g_main_iteration (TRUE);
+#else
+          g_main_context_iteration (NULL, TRUE);
+#endif
+        }
+    }
+
+  return (answer);
+}
+
--- a/src/text/textui.c	Sat Apr 10 20:39:06 2004 +0000
+++ b/src/text/textui.c	Thu Apr 15 00:59:23 2004 +0000
@@ -243,3 +243,25 @@
   gftp_disconnect (request);
 }
 
+
+int
+gftpui_protocol_ask_yes_no (gftp_request * request, char *title, char *question)
+{
+  char buf[10];
+  int ret;
+
+  do
+    {
+      gftp_text_ask_question (question, 1, buf, sizeof (buf));
+      if (strcasecmp (buf, "yes") == 0)
+        ret = 1;
+      else if (strcasecmp (buf, "no") == 0)
+        ret = 0;
+      else
+        ret = -1;
+    }
+  while (ret == -1);
+
+  return (ret);
+}
+