lib/childprocess/unix/lib.rb in childprocess-1.0.0 vs lib/childprocess/unix/lib.rb in childprocess-1.0.1

- old
+ new

@@ -1,186 +1,186 @@ -module ChildProcess - module Unix - module Lib - extend FFI::Library - ffi_lib FFI::Library::LIBC - - if ChildProcess.os == :macosx - attach_function :_NSGetEnviron, [], :pointer - def self.environ - _NSGetEnviron().read_pointer - end - elsif respond_to? :attach_variable - attach_variable :environ, :pointer - end - - attach_function :strerror, [:int], :string - attach_function :chdir, [:string], :int - attach_function :fcntl, [:int, :int, :int], :int # fcntl actually takes varags, but we only need this version. - - # int posix_spawnp( - # pid_t *restrict pid, - # const char *restrict file, - # const posix_spawn_file_actions_t *file_actions, - # const posix_spawnattr_t *restrict attrp, - # char *const argv[restrict], - # char *const envp[restrict] - # ); - - attach_function :posix_spawnp, [ - :pointer, - :string, - :pointer, - :pointer, - :pointer, - :pointer - ], :int - - # int posix_spawn_file_actions_init(posix_spawn_file_actions_t *file_actions); - attach_function :posix_spawn_file_actions_init, [:pointer], :int - - # int posix_spawn_file_actions_destroy(posix_spawn_file_actions_t *file_actions); - attach_function :posix_spawn_file_actions_destroy, [:pointer], :int - - # int posix_spawn_file_actions_addclose(posix_spawn_file_actions_t *file_actions, int filedes); - attach_function :posix_spawn_file_actions_addclose, [:pointer, :int], :int - - # int posix_spawn_file_actions_addopen( - # posix_spawn_file_actions_t *restrict file_actions, - # int filedes, - # const char *restrict path, - # int oflag, - # mode_t mode - # ); - attach_function :posix_spawn_file_actions_addopen, [:pointer, :int, :string, :int, :mode_t], :int - - # int posix_spawn_file_actions_adddup2( - # posix_spawn_file_actions_t *file_actions, - # int filedes, - # int newfiledes - # ); - attach_function :posix_spawn_file_actions_adddup2, [:pointer, :int, :int], :int - - # int posix_spawnattr_init(posix_spawnattr_t *attr); - attach_function :posix_spawnattr_init, [:pointer], :int - - # int posix_spawnattr_destroy(posix_spawnattr_t *attr); - attach_function :posix_spawnattr_destroy, [:pointer], :int - - # int posix_spawnattr_setflags(posix_spawnattr_t *attr, short flags); - attach_function :posix_spawnattr_setflags, [:pointer, :short], :int - - # int posix_spawnattr_getflags(const posix_spawnattr_t *restrict attr, short *restrict flags); - attach_function :posix_spawnattr_getflags, [:pointer, :pointer], :int - - # int posix_spawnattr_setpgroup(posix_spawnattr_t *attr, pid_t pgroup); - attach_function :posix_spawnattr_setpgroup, [:pointer, :pid_t], :int - - # int posix_spawnattr_getpgroup(const posix_spawnattr_t *restrict attr, pid_t *restrict pgroup); - attach_function :posix_spawnattr_getpgroup, [:pointer, :pointer], :int - - # int posix_spawnattr_setsigdefault(posix_spawnattr_t *restrict attr, const sigset_t *restrict sigdefault); - attach_function :posix_spawnattr_setsigdefault, [:pointer, :pointer], :int - - # int posix_spawnattr_getsigdefault(const posix_spawnattr_t *restrict attr, sigset_t *restrict sigdefault); - attach_function :posix_spawnattr_getsigdefault, [:pointer, :pointer], :int - - # int posix_spawnattr_setsigmask(posix_spawnattr_t *restrict attr, const sigset_t *restrict sigmask); - attach_function :posix_spawnattr_setsigmask, [:pointer, :pointer], :int - - # int posix_spawnattr_getsigmask(const posix_spawnattr_t *restrict attr, sigset_t *restrict sigmask); - attach_function :posix_spawnattr_getsigmask, [:pointer, :pointer], :int - - def self.check(errno) - if errno != 0 - raise Error, Lib.strerror(FFI.errno) - end - end - - class FileActions - def initialize - @ptr = FFI::MemoryPointer.new(1, Platform::SIZEOF.fetch(:posix_spawn_file_actions_t), false) - Lib.check Lib.posix_spawn_file_actions_init(@ptr) - end - - def add_close(fileno) - Lib.check Lib.posix_spawn_file_actions_addclose( - @ptr, - fileno - ) - end - - def add_open(fileno, path, oflag, mode) - Lib.check Lib.posix_spawn_file_actions_addopen( - @ptr, - fileno, - path, - oflag, - mode - ) - end - - def add_dup(fileno, new_fileno) - Lib.check Lib.posix_spawn_file_actions_adddup2( - @ptr, - fileno, - new_fileno - ) - end - - def free - Lib.check Lib.posix_spawn_file_actions_destroy(@ptr) - @ptr = nil - end - - def to_ptr - @ptr - end - end # FileActions - - class Attrs - def initialize - @ptr = FFI::MemoryPointer.new(1, Platform::SIZEOF.fetch(:posix_spawnattr_t), false) - Lib.check Lib.posix_spawnattr_init(@ptr) - end - - def free - Lib.check Lib.posix_spawnattr_destroy(@ptr) - @ptr = nil - end - - def flags=(flags) - Lib.check Lib.posix_spawnattr_setflags(@ptr, flags) - end - - def flags - ptr = FFI::MemoryPointer.new(:short) - Lib.check Lib.posix_spawnattr_getflags(@ptr, ptr) - - ptr.read_short - end - - def pgroup=(pid) - self.flags |= Platform::POSIX_SPAWN_SETPGROUP - Lib.check Lib.posix_spawnattr_setpgroup(@ptr, pid) - end - - def to_ptr - @ptr - end - end # Attrs - - end - end -end - -# missing on rubinius -class FFI::MemoryPointer - unless method_defined?(:from_string) - def self.from_string(str) - ptr = new(1, str.bytesize + 1) - ptr.write_string("#{str}\0") - - ptr - end - end -end +module ChildProcess + module Unix + module Lib + extend FFI::Library + ffi_lib FFI::Library::LIBC + + if ChildProcess.os == :macosx + attach_function :_NSGetEnviron, [], :pointer + def self.environ + _NSGetEnviron().read_pointer + end + elsif respond_to? :attach_variable + attach_variable :environ, :pointer + end + + attach_function :strerror, [:int], :string + attach_function :chdir, [:string], :int + attach_function :fcntl, [:int, :int, :int], :int # fcntl actually takes varags, but we only need this version. + + # int posix_spawnp( + # pid_t *restrict pid, + # const char *restrict file, + # const posix_spawn_file_actions_t *file_actions, + # const posix_spawnattr_t *restrict attrp, + # char *const argv[restrict], + # char *const envp[restrict] + # ); + + attach_function :posix_spawnp, [ + :pointer, + :string, + :pointer, + :pointer, + :pointer, + :pointer + ], :int + + # int posix_spawn_file_actions_init(posix_spawn_file_actions_t *file_actions); + attach_function :posix_spawn_file_actions_init, [:pointer], :int + + # int posix_spawn_file_actions_destroy(posix_spawn_file_actions_t *file_actions); + attach_function :posix_spawn_file_actions_destroy, [:pointer], :int + + # int posix_spawn_file_actions_addclose(posix_spawn_file_actions_t *file_actions, int filedes); + attach_function :posix_spawn_file_actions_addclose, [:pointer, :int], :int + + # int posix_spawn_file_actions_addopen( + # posix_spawn_file_actions_t *restrict file_actions, + # int filedes, + # const char *restrict path, + # int oflag, + # mode_t mode + # ); + attach_function :posix_spawn_file_actions_addopen, [:pointer, :int, :string, :int, :mode_t], :int + + # int posix_spawn_file_actions_adddup2( + # posix_spawn_file_actions_t *file_actions, + # int filedes, + # int newfiledes + # ); + attach_function :posix_spawn_file_actions_adddup2, [:pointer, :int, :int], :int + + # int posix_spawnattr_init(posix_spawnattr_t *attr); + attach_function :posix_spawnattr_init, [:pointer], :int + + # int posix_spawnattr_destroy(posix_spawnattr_t *attr); + attach_function :posix_spawnattr_destroy, [:pointer], :int + + # int posix_spawnattr_setflags(posix_spawnattr_t *attr, short flags); + attach_function :posix_spawnattr_setflags, [:pointer, :short], :int + + # int posix_spawnattr_getflags(const posix_spawnattr_t *restrict attr, short *restrict flags); + attach_function :posix_spawnattr_getflags, [:pointer, :pointer], :int + + # int posix_spawnattr_setpgroup(posix_spawnattr_t *attr, pid_t pgroup); + attach_function :posix_spawnattr_setpgroup, [:pointer, :pid_t], :int + + # int posix_spawnattr_getpgroup(const posix_spawnattr_t *restrict attr, pid_t *restrict pgroup); + attach_function :posix_spawnattr_getpgroup, [:pointer, :pointer], :int + + # int posix_spawnattr_setsigdefault(posix_spawnattr_t *restrict attr, const sigset_t *restrict sigdefault); + attach_function :posix_spawnattr_setsigdefault, [:pointer, :pointer], :int + + # int posix_spawnattr_getsigdefault(const posix_spawnattr_t *restrict attr, sigset_t *restrict sigdefault); + attach_function :posix_spawnattr_getsigdefault, [:pointer, :pointer], :int + + # int posix_spawnattr_setsigmask(posix_spawnattr_t *restrict attr, const sigset_t *restrict sigmask); + attach_function :posix_spawnattr_setsigmask, [:pointer, :pointer], :int + + # int posix_spawnattr_getsigmask(const posix_spawnattr_t *restrict attr, sigset_t *restrict sigmask); + attach_function :posix_spawnattr_getsigmask, [:pointer, :pointer], :int + + def self.check(errno) + if errno != 0 + raise Error, Lib.strerror(FFI.errno) + end + end + + class FileActions + def initialize + @ptr = FFI::MemoryPointer.new(1, Platform::SIZEOF.fetch(:posix_spawn_file_actions_t), false) + Lib.check Lib.posix_spawn_file_actions_init(@ptr) + end + + def add_close(fileno) + Lib.check Lib.posix_spawn_file_actions_addclose( + @ptr, + fileno + ) + end + + def add_open(fileno, path, oflag, mode) + Lib.check Lib.posix_spawn_file_actions_addopen( + @ptr, + fileno, + path, + oflag, + mode + ) + end + + def add_dup(fileno, new_fileno) + Lib.check Lib.posix_spawn_file_actions_adddup2( + @ptr, + fileno, + new_fileno + ) + end + + def free + Lib.check Lib.posix_spawn_file_actions_destroy(@ptr) + @ptr = nil + end + + def to_ptr + @ptr + end + end # FileActions + + class Attrs + def initialize + @ptr = FFI::MemoryPointer.new(1, Platform::SIZEOF.fetch(:posix_spawnattr_t), false) + Lib.check Lib.posix_spawnattr_init(@ptr) + end + + def free + Lib.check Lib.posix_spawnattr_destroy(@ptr) + @ptr = nil + end + + def flags=(flags) + Lib.check Lib.posix_spawnattr_setflags(@ptr, flags) + end + + def flags + ptr = FFI::MemoryPointer.new(:short) + Lib.check Lib.posix_spawnattr_getflags(@ptr, ptr) + + ptr.read_short + end + + def pgroup=(pid) + self.flags |= Platform::POSIX_SPAWN_SETPGROUP + Lib.check Lib.posix_spawnattr_setpgroup(@ptr, pid) + end + + def to_ptr + @ptr + end + end # Attrs + + end + end +end + +# missing on rubinius +class FFI::MemoryPointer + unless method_defined?(:from_string) + def self.from_string(str) + ptr = new(1, str.bytesize + 1) + ptr.write_string("#{str}\0") + + ptr + end + end +end