Hi,
we got some complaints about lynx not doing passive mode ftp transfers
(wasn't compiled with -DNOPORT), causing problems with
some firewalls.

Since some servers don't like passive mode, we didn't want to enforce
passive mode on our users by adding -DNOPORT either.

I've patched lynx to deal with this; this patch adds a PASSIVE:TRUE /
PASSIVE:FALSE option in lynx.cfg.

LLaP
bero

-- 
The first time Microsoft makes something that doesn't suck is when they
start making vacuum cleaners.
--- lynx2-8-2/WWW/Library/Implementation/HTFTP.c.passive        Mon Jan 31 13:20:57 
2000
+++ lynx2-8-2/WWW/Library/Implementation/HTFTP.c        Mon Jan 31 13:20:57 2000
@@ -38,11 +38,6 @@
 **                     and code to parse dates and sizes on most hosts.
 **     27 Mar 93 (FM)  Added code for getting dates and sizes on VMS hosts.
 **
-** Options:
-**     LISTEN          We listen, the other guy connects for data.
-**                     Otherwise, other way round, but problem finding our
-**                     internet address!
-**
 ** Notes:
 **                     Portions Copyright 1994 Trustees of Dartmouth College
 **                     Code for recognizing different FTP servers and
@@ -52,15 +47,6 @@
 */
 
 /*
-** If LISTEN is not defined, PASV is used instead of PORT, and not
-** all FTP servers support PASV, so define it unless there is no
-** alternative for your system.
-*/
-#ifndef NOPORT
-#define LISTEN  /* @@@@ Test LJM */
-#endif /* !NOPORT */
-
-/*
 BUGS:  @@@     Limit connection cache size!
                Error reporting to user.
                400 & 500 errors are ack'ed by user with windows.
@@ -188,14 +174,11 @@
 PRIVATE unsigned short port_number = FIRST_TCP_PORT;
 #endif /* POLL_PORTS */
 
-#ifdef LISTEN
 PRIVATE int    master_socket = -1;     /* Listening socket = invalid   */
 PRIVATE char   port_command[255];      /* Command for setting the port */
 PRIVATE fd_set open_sockets;           /* Mask of active channels */
 PRIVATE int    num_sockets;            /* Number of sockets to scan */
-#else
 PRIVATE unsigned short passive_port;   /* Port server specified for data */
-#endif /* LISTEN */
 
 
 #define NEXT_CHAR HTGetCharacter()     /* Use function in HTFormat.c */
@@ -1012,8 +995,6 @@
 }
 
 
-#ifdef LISTEN
-
 /*     Close Master (listening) socket
 **     -------------------------------
 **
@@ -1169,7 +1150,7 @@
 #ifdef REPEAT_LISTEN
     if (master_socket >= 0)
        (void) close_master_socket();
-#endif /* REPEAD_LISTEN */
+#endif /* REPEAT_LISTEN */
 
     master_socket = new_socket;
 
@@ -1209,7 +1190,6 @@
     return master_socket;              /* Good */
 
 } /* get_listen_socket */
-#endif /* LISTEN */
 
 PRIVATE char * months[12] = {
     "Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"
@@ -2616,11 +2596,12 @@
 **     returns         Socket number for file if good.
 **                     <0 if bad.
 */
-PUBLIC int HTFTPLoad ARGS4(
+PUBLIC int HTFTPLoad ARGS5(
        CONST char *,           name,
        HTParentAnchor *,       anchor,
        HTFormat,               format_out,
-       HTStream *,             sink)
+       HTStream *,             sink,
+       BOOL,                   passive)
 {
     BOOL isDirectory = NO;
     HTAtom * encoding = NULL;
@@ -2640,86 +2621,86 @@
        if (status < 0)
            return status;
 
-#ifdef LISTEN
-       status = get_listen_socket();
-       if (status < 0) {
-           NETCLOSE (control->socket);
-           control->socket = -1;
-           close_master_socket ();
-           /* HT_INTERRUPTED would fall through, if we could interrupt
-              somehow in the middle of it, which we currently can't. */
-           return status;
-       }
+       if(!passive) {
+               status = get_listen_socket();
+               if (status < 0) {
+                   NETCLOSE (control->socket);
+                   control->socket = -1;
+                   close_master_socket ();
+                   /* HT_INTERRUPTED would fall through, if we could interrupt
+                      somehow in the middle of it, which we currently can't. */
+                   return status;
+               }
 
 #ifdef REPEAT_PORT
 /*     Inform the server of the port number we will listen on
 */
-       {
-           status = response(port_command);
-           if (status == HT_INTERRUPTED) {
-               CTRACE (tfp, "HTFTP: Interrupted in response (port_command)\n");
-               _HTProgress (CONNECTION_INTERRUPTED);
-               NETCLOSE (control->socket);
-               control->socket = -1;
-               close_master_socket ();
-               return HT_INTERRUPTED;
-           }
-           if (status != 2) {          /* Could have timed out */
-               if (status < 0)
-                   continue;           /* try again - net error*/
-               return -status;         /* bad reply */
-           }
-           CTRACE(tfp, "HTFTP: Port defined.\n");
-       }
+               {
+                   status = response(port_command);
+                   if (status == HT_INTERRUPTED) {
+                       CTRACE (tfp, "HTFTP: Interrupted in response 
+(port_command)\n");
+                       _HTProgress (CONNECTION_INTERRUPTED);
+                       NETCLOSE (control->socket);
+                       control->socket = -1;
+                       close_master_socket ();
+                       return HT_INTERRUPTED;
+                   }
+                   if (status != 2) {          /* Could have timed out */
+                       if (status < 0)
+                           continue;           /* try again - net error*/
+                       return -status;         /* bad reply */
+                   }
+                   CTRACE(tfp, "HTFTP: Port defined.\n");
+               }
 #endif /* REPEAT_PORT */
-#else  /* Use PASV */
+       } else { /* passive mode */
 /*     Tell the server to be passive
 */
-       {
-           char command[LINE_LENGTH+1];
-           char *p;
-           int reply, h0, h1, h2, h3, p0, p1;  /* Parts of reply */
-           int status;
-           data_soc = status;
+               {
+                   char command[LINE_LENGTH+1];
+                   char *p;
+                   int reply, h0, h1, h2, h3, p0, p1;  /* Parts of reply */
+                   int status;
+                   data_soc = status;
 
-           status = send_cmd_1("PASV");
-           if (status != 2) {
-               if (status < 0)
-                   continue;           /* retry or Bad return */
-               return -status;         /* bad reply */
-           }
-           for (p = response_text; *p && *p != ','; p++)
-               ; /* null body */
-
-           while (--p > response_text && '0' <= *p && *p <= '9')
-               ; /* null body */
-
-          status = sscanf(p+1, "%d,%d,%d,%d,%d,%d",
-                  &h0, &h1, &h2, &h3, &p0, &p1);
-          if (status < 4) {
-              fprintf(tfp, "HTFTP: PASV reply has no inet address!\n");
-              return -99;
-          }
-          passive_port = (p0<<8) + p1;
-          CTRACE(tfp, "HTFTP: Server is listening on port %d\n",
-                       passive_port);
+                   status = send_cmd_1("PASV");
+                   if (status != 2) {
+                       if (status < 0)
+                           continue;           /* retry or Bad return */
+                       return -status;         /* bad reply */
+                   }
+                   for (p = response_text; *p && *p != ','; p++)
+                       ; /* null body */
+       
+                   while (--p > response_text && '0' <= *p && *p <= '9')
+                       ; /* null body */
+       
+                  status = sscanf(p+1, "%d,%d,%d,%d,%d,%d",
+                          &h0, &h1, &h2, &h3, &p0, &p1);
+                  if (status < 4) {
+                      fprintf(tfp, "HTFTP: PASV reply has no inet address!\n");
+                      return -99;
+                  }
+                  passive_port = (p0<<8) + p1;
+                  CTRACE(tfp, "HTFTP: Server is listening on port %d\n",
+                               passive_port);
 
 
 /*     Open connection for data:
 */
-           sprintf(command,
-                   "ftp://%d.%d.%d.%d:%d/",h0,h1,h2,h3,passive_port);
-           status = HTDoConnect(name, "FTP", passive_port, &data_soc);
-
-           if (status < 0) {
-               (void) HTInetStatus(gettext("connect for data"));
-               NETCLOSE(data_soc);
-               return status;                  /* Bad return */
-           }
+                   sprintf(command,
+                           "ftp://%d.%d.%d.%d:%d/",h0,h1,h2,h3,passive_port);
+                   status = HTDoConnect(name, "FTP", passive_port, &data_soc);
+
+                   if (status < 0) {
+                       (void) HTInetStatus(gettext("connect for data"));
+                       NETCLOSE(data_soc);
+                       return status;                  /* Bad return */
+                   }
 
-           CTRACE(tfp, "FTP data connected, socket %d\n", data_soc);
+                   CTRACE(tfp, "FTP data connected, socket %d\n", data_soc);
+               }
        }
-#endif /* use PASV */
        status = 0;
        break;  /* No more retries */
 
@@ -3209,32 +3190,30 @@
     }
 
 listen:
-#ifdef LISTEN
+    if(!passive) {
 /*     Wait for the connection
 */
-    {
-       struct sockaddr_in soc_address;
-       int     soc_addrlen=sizeof(soc_address);
+           {
+               struct sockaddr_in soc_address;
+               int     soc_addrlen=sizeof(soc_address);
 #ifdef SOCKS
-       if (socks_flag)
-           status = Raccept(master_socket,
-                            (struct sockaddr *)&soc_address,
-                            (void *)&soc_addrlen);
-       else
+               if (socks_flag)
+                   status = Raccept(master_socket,
+                                    (struct sockaddr *)&soc_address,
+                                    (void *)&soc_addrlen);
+               else
 #endif /* SOCKS */
-       status = accept(master_socket,
-                       (struct sockaddr *)&soc_address,
-                       (void *)&soc_addrlen);
-       if (status < 0) {
-           init_help_message_cache();  /* to free memory */
-           return HTInetStatus("accept");
-       }
-       CTRACE(tfp, "TCP: Accepted new socket %d\n", status);
-       data_soc = status;
-    }
-#else
-/* @@ */
-#endif /* LISTEN */
+               status = accept(master_socket,
+                               (struct sockaddr *)&soc_address,
+                               (void *)&soc_addrlen);
+               if (status < 0) {
+                   init_help_message_cache();  /* to free memory */
+                   return HTInetStatus("accept");
+               }
+               CTRACE(tfp, "TCP: Accepted new socket %d\n", status);
+               data_soc = status;
+       }
+    } /* !passive */
     if (isDirectory) {
        status = read_directory (anchor, name, format_out, sink);
        NETCLOSE(data_soc);
--- lynx2-8-2/WWW/Library/Implementation/HTFile.c.passive       Mon May 24 21:00:53 
1999
+++ lynx2-8-2/WWW/Library/Implementation/HTFile.c       Mon Jan 31 13:20:57 2000
@@ -20,6 +20,7 @@
 **                     the device or top directory.
 */
 
+#include <dirent.h>
 #include <HTUtils.h>
 
 #ifndef VMS
@@ -1840,11 +1841,12 @@
 **                     HTLOADED        OK
 **
 */
-PUBLIC int HTLoadFile ARGS4(
+PUBLIC int HTLoadFile ARGS5(
        CONST char *,           addr,
        HTParentAnchor *,       anchor,
        HTFormat,               format_out,
-       HTStream *,             sink)
+       HTStream *,             sink,
+       BOOL,                   passive)
 {
     char * filename = NULL;
     char * acc_method = NULL;
@@ -1886,7 +1888,7 @@
        FREE(nodename);
        FREE(acc_method);
 #ifndef DISABLE_FTP
-       return HTFTPLoad(addr, anchor, format_out, sink);
+       return HTFTPLoad(addr, anchor, format_out, sink, passive);
 #else
        return -1;
 #endif /* DISABLE_FTP */
@@ -2516,7 +2518,7 @@
                             */
            } else {
 #ifndef DISABLE_FTP
-               return HTFTPLoad(addr, anchor, format_out, sink);
+               return HTFTPLoad(addr, anchor, format_out, sink, passive);
 #else
                return -1;
 #endif /* DISABLE_FTP */
--- lynx2-8-2/WWW/Library/Implementation/HTFile.h.passive       Thu Dec  3 19:28:20 
1998
+++ lynx2-8-2/WWW/Library/Implementation/HTFile.h       Mon Jan 31 13:20:57 2000
@@ -78,7 +78,8 @@
        CONST char *            addr,
        HTParentAnchor *        anchor,
        HTFormat                format_out,
-       HTStream *              sink));
+       HTStream *              sink,
+       BOOL                    passive));
 
 /*
 **  Output a directory entry
--- lynx2-8-2/WWW/Library/Implementation/HTFTP.h.passive        Sun Dec 13 05:10:36 
1998
+++ lynx2-8-2/WWW/Library/Implementation/HTFTP.h        Mon Jan 31 13:20:57 2000
@@ -51,7 +51,8 @@
   CONST char *          name,
   HTParentAnchor *      anchor,
   HTFormat              format_out,
-  HTStream*             sink
+  HTStream*             sink,
+  BOOL                 passive
 ));
 
 /*
--- lynx2-8-2/src/LYCgi.c.passive       Mon May 24 21:00:53 1999
+++ lynx2-8-2/src/LYCgi.c       Mon Jan 31 13:20:57 2000
@@ -263,7 +263,7 @@
        LYLocalFileToURL (&new_arg, orig_pgm);
 
        CTRACE(tfp, "%s is not an executable file, passing the buck.\n", arg);
-       status = HTLoadFile(new_arg, anAnchor, format_out, sink);
+       status = HTLoadFile(new_arg, anAnchor, format_out, sink, passive);
        FREE(new_arg);
 
     } else if (path_info &&
--- lynx2-8-2/src/HTFWriter.c.passive   Sun May 30 05:27:26 1999
+++ lynx2-8-2/src/HTFWriter.c   Mon Jan 31 13:20:57 2000
@@ -308,7 +308,8 @@
                    status = HTLoadFile(addr,
                                        me->anchor,
                                        me->output_format,
-                                       me->sink);
+                                       me->sink,
+                                       passive);
                    if (dump_output_immediately &&
                        me->output_format == HTAtom_for("www/present")) {
                        FREE(addr);
--- lynx2-8-2/src/LYMain.c.passive      Tue Jun  1 15:22:18 1999
+++ lynx2-8-2/src/LYMain.c      Mon Jan 31 13:20:57 2000
@@ -167,6 +167,7 @@
 PUBLIC BOOLEAN LYJumpFileURL = FALSE;   /* always FALSE the first time */
 PUBLIC BOOLEAN jump_buffer = JUMPBUFFER; /* TRUE if offering default shortcut */
 PUBLIC BOOLEAN goto_buffer = GOTOBUFFER; /* TRUE if offering default goto URL */
+PUBLIC BOOLEAN passive = PASSIVE; /* TRUE if doing ftp in passive mode */
 PUBLIC BOOLEAN recent_sizechange = FALSE;/* the window size changed recently? */
 PUBLIC int user_mode = NOVICE_MODE;
 PUBLIC BOOLEAN dump_output_immediately = FALSE;
--- lynx2-8-2/src/LYReadCFG.c.passive   Thu May 20 14:48:10 1999
+++ lynx2-8-2/src/LYReadCFG.c   Mon Jan 31 13:20:57 2000
@@ -1023,6 +1023,7 @@
      PARSE_STR("global_mailcap", CONF_STR, &global_type_map),
      PARSE_ENV("gopher_proxy", CONF_ENV, 0 ),
      PARSE_SET("gotobuffer", CONF_BOOL, &goto_buffer),
+     PARSE_SET("passive", CONF_BOOL, &passive),
      PARSE_STR("helpfile", CONF_STR, &helpfile),
      PARSE_SET("historical_comments", CONF_BOOL, &historical_comments),
 
--- lynx2-8-2/src/LYGlobalDefs.h.passive        Mon Jan 31 13:54:35 2000
+++ lynx2-8-2/src/LYGlobalDefs.h        Mon Jan 31 13:54:58 2000
@@ -123,6 +123,7 @@
 extern BOOLEAN LYJumpFileURL;   /* URL from the jump file shortcuts? */
 extern BOOLEAN jump_buffer;     /* TRUE if offering default shortcut */
 extern BOOLEAN goto_buffer;     /* TRUE if offering default goto URL */
+extern BOOLEAN passive;                /* TRUE if we want to use passive mode ftp */
 extern char *LYRequestTitle;    /* newdoc.title in calls to getfile() */
 extern char *jumpprompt;        /* The default jump statusline prompt */
 extern int more;  /* is there more document to display? */
--- lynx2-8-2/lynx.cfg.passive  Mon Jan 31 13:20:57 2000
+++ lynx2-8-2/lynx.cfg  Mon Jan 31 13:20:57 2000
@@ -111,6 +111,11 @@
 #
 #GOTOBUFFER:FALSE
 
+# Set PASSIVE to TRUE if you want to use passive mode ftp transfers.
+# You might have to do this if you're behind a restrictive firewall.
+# This option is specific to Red Hat Linux
+PASSIVE:TRUE
+
 # JUMP_PROMPT is the default statusline prompt for selecting a jumps file
 # shortcut.  (see below).
 # You can change the prompt here from that defined in userdefs.h.  Any
--- lynx2-8-2/userdefs.h.passive        Mon Jan 31 13:20:57 2000
+++ lynx2-8-2/userdefs.h        Mon Jan 31 13:20:57 2000
@@ -495,6 +495,13 @@
 #define GOTOBUFFER       FALSE
 
 /*****************************
+ * If PASSIVE is set to TRUE here or in lynx.cfg, ftp transfers will
+ * be done in passive mode.
+ * This option is specific to Red Hat Linux.
+ */
+#define PASSIVE        FALSE
+ 
+/*****************************
  * JUMPFILE is the default local file checked for shortcut URLs when
  * the user presses the 'J' (JUMP) key.  The user will be prompted for
  * a shortcut entry (analogously to 'g'oto), and can enter one

Reply via email to