service/src/service/libc.cr

57 lines
975 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*
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
become_user passwd.pw_uid, passwd.pw_uid
end
def self.become_user(uid, gid)
r = LibC.setgid gid
raise Errno.new "setgid" if r != 0
r = LibC.setuid uid
raise Errno.new "setuid" if r != 0
end
end
#def get_uid_gid(user_name : String)
# pointer = LibC.getpwnam user_name.to_unsafe
#
# if pointer.null?
# return nil
# end
#
# passwd = pointer.value
#
# {passwd.pw_uid, passwd.pw_gid}
#end
#uid, gid = get_uid_gid("http").not_nil!
#LibC.setuid uid
#LibC.setgid gid
#puts Process.run "whoami", output: Process::Redirect::Inherit