def file_writable?(file)
pid = fork do
begin
uid_num = Etc.getpwnam(self.uid).uid if self.uid
gid_num = Etc.getgrnam(self.gid).gid if self.gid
::Dir.chroot(self.chroot) if self.chroot
::Process.groups = [gid_num] if self.gid
::Process::Sys.setgid(gid_num) if self.gid
::Process::Sys.setuid(uid_num) if self.uid
rescue ArgumentError, Errno::EPERM, Errno::ENOENT
exit(1)
end
File.writable?(file_in_chroot(file)) ? exit(0) : exit(1)
end
wpid, status = ::Process.waitpid2(pid)
status.exitstatus == 0 ? true : false
end