From 1ab2de5bddd8db1c7a16a66699d7bb344af517bd Mon Sep 17 00:00:00 2001 From: matz Date: Fri, 30 Apr 1999 06:19:21 +0000 Subject: ipv6 git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_3@452 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- lib/ftplib.rb | 81 ++++++++++++++++++++++++++++++++++++++++++++++++++++++----- lib/mkmf.rb | 7 +++--- 2 files changed, 79 insertions(+), 9 deletions(-) (limited to 'lib') diff --git a/lib/ftplib.rb b/lib/ftplib.rb index 4cba9c50e5..9336e0a8c2 100644 --- a/lib/ftplib.rb +++ b/lib/ftplib.rb @@ -150,16 +150,23 @@ class FTP end def sendport(host, port) - hbytes = host.split(".") - pbytes = [port / 256, port % 256] - bytes = hbytes + pbytes - cmd = "PORT " + bytes.join(",") + af = (@sock.peeraddr)[0] + if af == "AF_INET" + hbytes = host.split(".") + pbytes = [port / 256, port % 256] + bytes = hbytes + pbytes + cmd = "PORT " + bytes.join(",") + elsif af == "AF_INET6" + cmd = "EPRT |2|" + host + "|" + sprintf("%d", port) + "|" + else + raise FTPProtoError, host + end voidcmd(cmd) end private :sendport def makeport - sock = TCPserver.open(0) + sock = TCPserver.open(@sock.addr[3], 0) port = sock.addr[1] host = TCPsocket.getaddress(@sock.addr[2]) resp = sendport(host, port) @@ -167,9 +174,20 @@ class FTP end private :makeport + def makepasv + if @sock.peeraddr[0] == "AF_INET" + host, port = parse227(sendcmd("PASV")) + else + host, port = parse229(sendcmd("EPSV")) +# host, port = parse228(sendcmd("LPSV")) + end + return host, port + end + private :makepasv + def transfercmd(cmd) if @passive - host, port = parse227(sendcmd("PASV")) + host, port = makepasv conn = open_socket(host, port) resp = sendcmd(cmd) if resp[0] != ?1 @@ -541,6 +559,57 @@ class FTP end private :parse227 + def parse228(resp) + if resp[0, 3] != "228" + raise FTPReplyError, resp + end + left = resp.index("(") + right = resp.index(")") + if left == nil or right == nil + raise FTPProtoError, resp + end + numbers = resp[left + 1 .. right - 1].split(",") + if numbers[0] == "4" + if numbers.length != 9 || numbers[1] != "4" || numbers[2 + 4] != "2" + raise FTPProtoError, resp + end + host = numbers[2, 4].join(".") + port = (numbers[7].to_i << 8) + numbers[8].to_i + elsif numbers[0] == "6" + if numbers.length != 21 || numbers[1] != "16" || numbers[2 + 16] != "2" + raise FTPProtoError, resp + end + v6 = ["", "", "", "", "", "", "", ""] + for i in 0 .. 7 + v6[i] = sprintf("%02x%02x", numbers[(i * 2) + 2].to_i, + numbers[(i * 2) + 3].to_i) + end + host = v6[0, 8].join(":") + port = (numbers[19].to_i << 8) + numbers[20].to_i + end + return host, port + end + private :parse228 + + def parse229(resp) + if resp[0, 3] != "229" + raise FTPReplyError, resp + end + left = resp.index("(") + right = resp.index(")") + if left == nil or right == nil + raise FTPProtoError, resp + end + numbers = resp[left + 1 .. right - 1].split(resp[left + 1, 1]) + if numbers.length != 4 + raise FTPProtoError, resp + end + port = numbers[3].to_i + host = (@sock.peeraddr())[3] + return host, port + end + private :parse228 + def parse257(resp) if resp[0, 3] != "257" raise FTPReplyError, resp diff --git a/lib/mkmf.rb b/lib/mkmf.rb index fb37cae9ea..f3654c3ca2 100644 --- a/lib/mkmf.rb +++ b/lib/mkmf.rb @@ -71,8 +71,9 @@ def xsystem command print command, "\n" return system(command) end - $stderr.reopen($null) - $stdout.reopen($null) +p command +# $stderr.reopen($null) +# $stdout.reopen($null) r = system(command) $stderr.reopen($orgerr) $stdout.reopen($orgout) @@ -83,7 +84,7 @@ def try_link(src, opt="") cfile = open("conftest.c", "w") cfile.print src cfile.close - xsystem(format(LINK, $CFLAGS, $LDFLAGS, libs)) + xsystem(format(LINK, $CFLAGS, $LDFLAGS, opt)) end def try_cpp(src, opt=$CFLAGS) -- cgit v1.2.3