service/src/service/libc.cr

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