#include "io/uid-checker.h"
#ifdef SET_UID
# ifdef SAFE_SETUID
#  ifdef SAFE_SETUID_POSIX
#   include "util.h"
#  endif
#  endif
#endif

/*!
 * @brief ファイルのドロップパーミッションチェック / Hack -- drop permissions
 */
void safe_setuid_drop(void)
{
#ifdef SET_UID
# ifdef SAFE_SETUID
#  ifdef SAFE_SETUID_POSIX

	if (setuid(getuid()) != 0)
	{
		quit(_("setuid(): 正しく許可が取れません！", "setuid(): cannot set permissions correctly!"));
	}
	if (setgid(getgid()) != 0)
	{
		quit(_("setgid(): 正しく許可が取れません！", "setgid(): cannot set permissions correctly!"));
	}
#   else
	if (setreuid(geteuid(), getuid()) != 0)
	{
		quit(_("setreuid(): 正しく許可が取れません！", "setreuid(): cannot set permissions correctly!"));
	}
	if (setregid(getegid(), getgid()) != 0)
	{
		quit(_("setregid(): 正しく許可が取れません！", "setregid(): cannot set permissions correctly!"));
	}
#  endif
# endif
#endif
}


/*!
 * @brief ファイルのグラブパーミッションチェック / Hack -- grab permissions
 */
void safe_setuid_grab(void)
{
#ifdef SET_UID
# ifdef SAFE_SETUID
#  ifdef SAFE_SETUID_POSIX

	if (setuid(p_ptr->player_egid) != 0)
	{
		quit(_("setuid(): 正しく許可が取れません！", "setuid(): cannot set permissions correctly!"));
	}
	if (setgid(p_ptr->player_egid) != 0)
	{
		quit(_("setgid(): 正しく許可が取れません！", "setgid(): cannot set permissions correctly!"));
	}
#  else
	if (setreuid(geteuid(), getuid()) != 0)
	{
		quit(_("setreuid(): 正しく許可が取れません！", "setreuid(): cannot set permissions correctly!"));
	}
	if (setregid(getegid(), getgid()) != 0)
	{
		quit(_("setregid(): 正しく許可が取れません！", "setregid(): cannot set permissions correctly!"));
	}
#  endif
# endif
#endif
}
