Sha256: 518d2a34f1e29055f196ec70cc399ee93991a78a45ee6eb74bcc91eae3999574

Contents?: true

Size: 1.07 KB

Versions: 3

Compression:

Stored size: 1.07 KB

Contents

module Einhorn
  module Compat
    # In Ruby 2.1.0 (and possibly earlier), IO.pipe sets cloexec on
    # the descriptors.
    def self.pipe
      readable, writeable = IO.pipe
      cloexec!(readable, false)
      cloexec!(writeable, false)
      [readable, writeable]
    end

    def self.cloexec!(fd, enable)
      original = fd.fcntl(Fcntl::F_GETFD)
      if enable
        new = original | Fcntl::FD_CLOEXEC
      else
        new = original & (-Fcntl::FD_CLOEXEC-1)
      end
      fd.fcntl(Fcntl::F_SETFD, new)
    end

    def self.cloexec?(fd)
      fd.fcntl(Fcntl::F_GETFD) & Fcntl::FD_CLOEXEC
    end

    # Opts are ignored in Ruby 1.8
    def self.exec(script, args, opts={})
      cmd = [script, script]
      begin
        Kernel.exec(cmd, *(args + [opts]))
      rescue TypeError
        Kernel.exec(cmd, *args)
      end
    end

    def self.unixserver_new(path)
      server = UNIXServer.new(path)
      cloexec!(server, false)
      server
    end

    def self.accept_nonblock(server)
      sock = server.accept_nonblock
      cloexec!(sock, false)
      sock
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
einhorn-0.5.4 lib/einhorn/compat.rb
einhorn-0.5.3 lib/einhorn/compat.rb
einhorn-0.5.2 lib/einhorn/compat.rb