AnyEvent-FDpasser

 view release on metacpan or  search on metacpan

lib/AnyEvent/FDpasser.pm  view on Meta::CPAN

      }
    } elsif ($rv == -2) {
      $self->error("cmsg truncated");
    } elsif ($rv == 0) {
      ## Orderly shutdown
      $self->error(undef);
    } else {
      open(my $new_fh, '+<&=', $rv);
      $self->{iwatcher} = undef;
      $cb->($new_fh);
      $self->try_to_recv;
    }
  };

  $self->setup_fh_duped;
}





sub _convert_fh_to_fd {
  my $fh = shift;
  $fh = fileno($fh) unless $fh =~ /^\d+$/;
  return $fh;
}

sub fdpasser_socketpair {
  my ($s1, $s2);

  if ($^O eq 'MSWin32') {
    die "AnyEvent::FDpasser does not support windows";
  } elsif (fdpasser_mode() == 2) {
    pipe $s1, $s2;
    die "can't pipe: $!" unless $s1;
  } else {
    socketpair $s1, $s2, AF_UNIX, SOCK_STREAM, AF_UNSPEC;
    die "can't make socketpair: $!" unless $s2;
  }

  return ($s1, $s2);
}

sub fdpasser_server {
  my ($path, $backlog) = @_;

  $backlog ||= 10;

  my $fh;

  if ($^O eq 'MSWin32') {
    die "AnyEvent::FDpasser does not support windows";
  } elsif (fdpasser_mode() == 2) {
    my $fd = _fdpasser_server($path);
    die "unable to _fdpasser_server($path) : $!" if $fd < 0;
    open($fh, '+<&=', $fd) || die "couldn't open";
  } else {
    socket($fh, AF_UNIX, SOCK_STREAM, AF_UNSPEC) || die "Unable to create AF_UNIX socket: $!";
    setsockopt($fh, SOL_SOCKET, SO_REUSEADDR, pack("l", 1)) || die "Unable to setsockopt(SO_REUSEADDR): $!";
    unlink($path);
    bind($fh, Socket::sockaddr_un($path)) || die "Unable to bind AF_UNIX socket to $path : $!";
    listen($fh, $backlog) || die "Unable to listen on $path : $!";
  }

  return $fh;
}

sub fdpasser_accept {
  my ($listener_fh) = @_;

  my $passer_fh;

  if ($^O eq 'MSWin32') {
    die "AnyEvent::FDpasser does not support windows";
  } elsif (fdpasser_mode() == 2) {
    my $fd = _fdpasser_accept(fileno($listener_fh));
    die "unable to _fdpasser_accept($listener_fh) : $!" if $fd < 0;
    open($passer_fh, '+<&=', $fd) || die "couldn't open";
  } else {
    accept($passer_fh, $listener_fh);
  }

  return $passer_fh;
}

sub fdpasser_connect {
  my ($path) = @_;

  my $fh;

  if ($^O eq 'MSWin32') {
    die "AnyEvent::FDpasser does not support windows";
  } elsif (fdpasser_mode() == 2) {
    my $fd = _fdpasser_connect($path);
    die "unable to _fdpasser_connect($path) : $!" if $fd < 0;
    open($fh, '+<&=', $fd) || die "couldn't open";
  } else {
    socket($fh, AF_UNIX, SOCK_STREAM, AF_UNSPEC) || die "Unable to create AF_UNIX socket: $!";
    connect($fh, Socket::sockaddr_un($path)) || die "Unable to connect AF_UNIX socket to $path : $!";
  }

  return $fh;
}


sub error {
  my ($self, $err) = @_;

  my $on_error = $self->{on_error};
  close($self->{fh});
  close($self->{fh_pair}) if exists $self->{fh_pair};

  if (exists $self->{fh_duped}) {
    POSIX::close($self->{fh_duped});
    delete $self->{fh_duped};
  }
  if (exists $self->{fh_duped_orig}) {
    POSIX::close($self->{fh_duped_orig});
    delete $self->{fh_duped_orig};
  }



( run in 1.003 second using v1.01-cache-2.11-cpan-2398b32b56e )