Hajimu UMEMOTO writes:
> archie> But why is sysinstall going to active mode? I *know* FTP passive
> archie> was selected..
> 
> This is just because ftpPassive() is called from ftpGet().
> 
>       ftpGet()
>               check_passive()
>                       ftpPassive()
> 
> Further more, if FTP_PASSIVE_MODE is not set, check_passive() calls
> ftpPassive(fp, 0).
> First, sysinstall calls ftpPassive() to intend to use PASV.  Then,
> ftp->is_passive is reset to 1.
> Next, ftpGet() calls ftpPassive() according to the setting of
> FTP_PASSIVE_MODE.  In installer, FTP_PASSIVE_MODE is not set. Then,
> ftp->is_passive is reset to 0 by ftpPassive() toggle.
> So, ftp_file_op() issues PORT.

Yes, now I understand.. you and your patch are exactly right.
A combined patch is below; please review.

-Archie

___________________________________________________________________________
Archie Cobbs   *   Whistle Communications, Inc.  *   http://www.whistle.com

diff -ur /usr/src/lib/libftpio/ftpio.3 ./ftpio.3
--- /usr/src/lib/libftpio/ftpio.3       Mon Aug  7 14:14:40 2000
+++ ./ftpio.3   Thu Aug 17 14:39:48 2000
@@ -213,8 +213,10 @@
 .Tn FTP
 connection.
 .It Ev FTP_PASSIVE_MODE
-Force the use of passive mode
-.Tn FTP .
+If defined, forces the use of passive mode, unless equal
+to ``NO'' or ``no'' in which case active mode is forced.
+If defined, the setting of this variable always overrides any calls to
+.Fn ftpPassive .
 .El
 .Sh BUGS
 I'm sure you can get this thing's internal state machine confused if
diff -ur /usr/src/lib/libftpio/ftpio.c ./ftpio.c
--- /usr/src/lib/libftpio/ftpio.c       Mon Aug  7 14:14:40 2000
+++ ./ftpio.c   Thu Aug 17 14:36:10 2000
@@ -327,37 +327,12 @@
     return NULL;
 }
 
-/* Unlike binary mode, passive mode is a toggle! :-( */
 int
 ftpPassive(FILE *fp, int st)
 {
     FTP_t ftp = fcookie(fp);
-    int i;
 
-    if (ftp->is_passive == st)
-       return SUCCESS;
-    switch (ftp->addrtype) {
-    case AF_INET:
-       i = cmd(ftp, "PASV");
-       if (i < 0)
-           return i;
-       if (i != FTP_PASSIVE_HAPPY)
-           return FAILURE;
-       break;
-    case AF_INET6:
-       i = cmd(ftp, "EPSV");
-       if (i < 0)
-           return i;
-       if (i != FTP_EPASSIVE_HAPPY) {
-           i = cmd(ftp, "LPSV");
-           if (i < 0)
-               return i;
-           if (i != FTP_LPASSIVE_HAPPY)
-               return FAILURE;
-       }
-       break;
-    }
-    ftp->is_passive = !ftp->is_passive;
+    ftp->is_passive = !!st;    /* normalize "st" to zero or one */
     return SUCCESS;
 }
 
@@ -545,12 +520,17 @@
     return i;
 }
 
+/*
+ * This function checks whether the FTP_PASSIVE_MODE environment
+ * variable is set, and, if so, enforces the desired mode.
+ */
 static void
 check_passive(FILE *fp)
 {
-    char *cp = getenv("FTP_PASSIVE_MODE");
+    const char *cp = getenv("FTP_PASSIVE_MODE");
 
-    ftpPassive(fp, (cp && strncasecmp(cp, "no", 2)));
+    if (cp != NULL)
+       ftpPassive(fp, strncasecmp(cp, "no", 2));
 }
 
 static void


To Unsubscribe: send mail to [EMAIL PROTECTED]
with "unsubscribe freebsd-current" in the body of the message

Reply via email to