Issue #13095 has been updated by George Koehler.


Kernel.syscall was a wrapper around syscall() or \_\_syscall() in libc, but it didn't use the correct types for arguments and return values. I suggest to use Fiddle to call syscall() or \_\_syscall() with the correct types for your system call. Here is a quick example for getdents64() in 32-bit PowerPC Linux.

~~~ ruby
require 'fiddle'

libc = Fiddle.dlopen('libc.so.6')
libc_syscall = Fiddle::Function.new(
  libc['syscall'],
  [Fiddle::TYPE_INT, Fiddle::TYPE_INT, Fiddle::TYPE_VOIDP,
   Fiddle::TYPE_SIZE_T],
  Fiddle::TYPE_INT)
getdents64 = 202

buf = "X" * 4096
fd = IO.sysopen('/dev', IO::RDONLY)
ret = libc_syscall.(getdents64, fd, buf, buf.size)
ret < 0 and raise SystemCallError, Fiddle.last_error

while ret > 0
  ino, off, reclen, type, name = buf.unpack('QqSCZ*')
  puts name
  buf.slice!(0...reclen)
  ret -= reclen
end
IO.new(fd).close
~~~

~~~
$ ruby -v
ruby 2.1.5p273 (2014-11-13) [powerpc-linux-gnu]
$ ruby exam.rb | head
.
..
hidraw1
vcsa6
vcs6
vcsa5
vcs5
vcsa4
vcs4
vcsa3
~~~

----------------------------------------
Feature #13095: [PATCH] io.c (rb_f_syscall): remove deprecation notice
https://bugs.ruby-lang.org/issues/13095#change-62429

* Author: Eric Wong
* Status: Open
* Priority: Normal
* Assignee: 
* Target version: 
----------------------------------------
io.c (rb_f_syscall): remove deprecation notice

New, perhaps experimental syscalls appear all the time which
may not and never be be supported by the system C library.

Furthermore, on common GNU/Linux platforms, kernel development
and releases happens at a much faster pace than GNU C library
(glibc) development.  In my experience, is more common for users
to run recent, custom-built Linux kernels than a recent,
custom-built glibc.  (This is likely because Linux upstream has
better built-in tooling for distro package management integration
than glibc upstream).

So, ruby should support users who want to deal with the latest
and greatest syscalls in the kernel without having them wait for
C library support.


---Files--------------------------------
0001-io.c-rb_f_syscall-remove-deprecation-notice.patch (1.33 KB)


-- 
https://bugs.ruby-lang.org/

Unsubscribe: <mailto:ruby-core-request / ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>