Skip to content

Commit fb73a1a

Browse files
committed
[Truffle] Add Process.euid
1 parent 44fa539 commit fb73a1a

File tree

3 files changed

+63
-4
lines changed

3 files changed

+63
-4
lines changed

spec/truffle/tags/core/process/egid_tags.txt

Lines changed: 0 additions & 2 deletions
This file was deleted.
Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
fails:Process.euid also goes by Process::UID.eid
2-
fails:Process.euid also goes by Process::Sys.geteuid
31
fails:Process.euid= raises TypeError if not passed an Integer
42
fails:Process.euid= raises Errno::ERPERM if run by a non superuser trying to set the superuser id
53
fails:Process.euid= raises Errno::ERPERM if run by a non superuser trying to set the superuser id from username

truffle/src/main/ruby/core/rubinius/common/process.rb

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -400,6 +400,69 @@ def setresuid(rid, eid, sid)
400400
end
401401
end
402402

403+
module UID
404+
class << self
405+
def change_privilege(uid)
406+
uid = Rubinius::Type.coerce_to uid, Integer, :to_int
407+
408+
ret = FFI::Platform::POSIX.setreuid(uid, uid)
409+
Errno.handle if ret == -1
410+
uid
411+
end
412+
413+
def eid
414+
ret = FFI::Platform::POSIX.geteuid
415+
Errno.handle if ret == -1
416+
ret
417+
end
418+
419+
def eid=(uid)
420+
uid = Rubinius::Type.coerce_to uid, Integer, :to_int
421+
422+
ret = FFI::Platform::POSIX.seteuid(uid)
423+
Errno.handle if ret == -1
424+
uid
425+
end
426+
alias_method :grant_privilege, :eid=
427+
428+
def re_exchange
429+
real = FFI::Platform::POSIX.getuid
430+
Errno.handle if real == -1
431+
eff = FFI::Platform::POSIX.geteuid
432+
Errno.handle if eff == -1
433+
ret = FFI::Platform::POSIX.setreuid(eff, real)
434+
Errno.handle if ret == -1
435+
eff
436+
end
437+
438+
def re_exchangeable?
439+
true
440+
end
441+
442+
def rid
443+
ret = FFI::Platform::POSIX.getuid
444+
Errno.handle if ret == -1
445+
ret
446+
end
447+
448+
def sid_available?
449+
true
450+
end
451+
452+
def switch
453+
eff = re_exchange
454+
if block_given?
455+
ret = yield
456+
re_exchange
457+
return ret
458+
else
459+
return eff
460+
end
461+
end
462+
463+
end
464+
end
465+
403466
module GID
404467
class << self
405468
def change_privilege(gid)

0 commit comments

Comments
 (0)