47 lines
869 B
Crystal
47 lines
869 B
Crystal
|
|
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
|
|
|