|
|
ru.unix- RU.UNIX ---------------------------------------------------------------------- From : Stas Vlasov 2:5080/172.13 03 Apr 2001 11:27:09 To : Eugene B. Berdnikov Subject : Re: Userspace FTP proxy need -------------------------------------------------------------------------------- At Sat, 31 Mar 2001 22:03:44 +0600, Eugene B. Berdnikov wrote: LS>>> if (STDIN_FILENO != dup2(STDIN_FILENO,clsock)) my_error_handler(); LS>>> if (STDOUT_FILENO != dup2(STDOUT_FILENO,clsock)) my_error_handler(); LS>>> if (clsock != STDIN_FILENO && clsock != STDOUT_FILENO) SV>> SV>> Хм. Одно из двух, либо перл слабо подходит для этого, либо я не умею EBB> читать. SV>> Hо dup2 в перле отсутствует. EBB> Присутствует неявно. Читать надо "perldoc -f open" и "man perlipc". EBB> Там конструкции даже удобнее, чем возня с дупами. :) Поздно :-) Уже начал с дупами. Вот что у меня вышло: #!/usr/bin/perl use IO::Socket; use POSIX; $server_port = 58100; $server = IO::Socket::INET->new(LocalPort => $server_port, Type => SOCK_STREAM, Reuse => 1, Listen => 10 ) or die "Couldn't be a tcp server on port $server_port :$@\n"; while ($client = $server->accept()) { if ($client < 0) { printf "Socket error!\n"; next; } $addr = $client->peerhost(); if (($addr =~ /^192\.168\.47\./) || ($addr =~ /127.0.0.1/)) { $pid = fork(); if ($pid < 0) { printf "Can't fork!\n" }; if ($pid == 0) { close STDIN; close STDOUT; close STDERR; dup2(STDIN, $client); dup2(STDOUT, $client); if (!(STDIN == $client) && !(STDOUT == $client)) { close $client; } exec ("./ftp-gw"); exit(); } else { close $client; } } else { close $client; } } close($server); При этом, ftp-gw (настроенный, отдельно работает) сообщает мне getpeername: Socket operation on non-socket -- Стас. stas%d1794n1@ekasb.sbank.e-burg.su --- tin/pre-1.4-19990805 ("Preacher Man") (UNIX) (Linux/2.4.1 (i686)) * Origin: OSB 1794 (2:5080/172.13) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.unix/7631672741258.html, оценка из 5, голосов 10
|