lib LibC struct Passwd pw_name : Char* pw_passwd : Char* pw_uid : UInt pw_gid : UInt pw_gecos : Char* pw_dir : UInt pw_shell : Char* end fun setuid(Int32) : Int32 fun setgid(Int32) : Int32 fun getpwnam(Char*) : Passwd* fun initgroups(Char*, Int32) : Int32 end module System def self.become_user(user_name : String) pointer = LibC.getpwnam user_name.to_unsafe if pointer.null? return nil end passwd = pointer.value uid = passwd.pw_uid gid = passwd.pw_gid r = LibC.initgroups user_name, passwd.pw_gid # raise Errno.new "initgroups" if r != 0 raise Exception.new "initgroups" if r != 0 r = LibC.setgid gid # raise Errno.new "setgid" if r != 0 raise Exception.new "setgid" if r != 0 r = LibC.setuid uid # raise Errno.new "setuid" if r != 0 raise Exception.new "setuid" if r != 0 end end