X-Git-Url: https://git.distorted.org.uk/~mdw/with-authinfo-kludge/blobdiff_plain/b1436e12dcef42f3c96677b1aece6aa03bbfed84..a3775340c77f71691104cbdcc3b993b60d980e5d:/with-authinfo-kludge diff --git a/with-authinfo-kludge b/with-authinfo-kludge index f3bb428..651cd8c 100755 --- a/with-authinfo-kludge +++ b/with-authinfo-kludge @@ -23,8 +23,6 @@ ## things to do ## -## split parsing and resolution of addresses -## default port ## pidfiles my $VERSION = "0.1.0~unfinished"; @@ -75,7 +73,7 @@ my $SESSDIR = undef; my %SERVMAP = (); my %CLIENT_NOIP = (); my %KIDMAP = (); -my $CLIENTKID = undef; +my $CLIENTKID = -1; ###-------------------------------------------------------------------------- ### Utilities. @@ -155,6 +153,13 @@ sub set_cloexec ($) { sysfail "failed to set close-on-exec: $!"; } +sub set_nonblock ($) { + my ($fh) = @_; + my $f = fcntl $fh, F_GETFL, 0 or sysfail "failed to get file flags: $!"; + fcntl $fh, F_SETFL, $f | O_NONBLOCK or + sysfail "failed to set non-blockingness: $!"; +} + sub lockedp ($) { my ($f) = @_; my $l = new File::FcntlLock; @@ -630,7 +635,7 @@ sub server_listen ($) { for my $a (@{$s->{"_laddrs"}}) { socket my $sk, PF_UNIX, SOCK_STREAM, 0 or sysfail "failed to make Unix-domain socket: $!"; - set_cloexec $sk; + set_cloexec $sk; set_nonblock $sk; my $sa = "$SESSDIR/noip-client/$a"; bind $sk, sockaddr_un $sa or sysfail "failed to bind Unix-domain socket to `$sa': $!"; @@ -768,15 +773,18 @@ sub run_client (@) { sub accept_loop () { my $rfd_in = ""; for my $fd (keys %SERVMAP) { vec($rfd_in, $fd, 1) = 1; } - for (;;) { + SELECT: for (;;) { my ($n, $t) = select my $rfd_out = $rfd_in, undef, undef, undef; - $n >= 0 || $! == EINTR or sysfail "select failed: $!"; + if ($n >= 0) { } + elsif ($! == EINTR) { next SELECT; } + else { sysfail "select failed: $!"; } FD: for my $fd (keys %SERVMAP) { - next unless vec $rfd_out, $fd, 1; + next FD unless vec $rfd_out, $fd, 1; my ($s, $a, $sk) = @{$SERVMAP{$fd}}; my $nsk; unless (accept $nsk, $sk) { - moan "failed to accept new connection: $!"; + moan "failed to accept new connection: $!" + unless $! == EAGAIN || $! == EWOULDBLOCK; next FD; } set_cloexec $nsk;