forked from enlightenment/enlightenment
e system - spew out unique exit codes we can then show dialogs for
tell the user all the possible exit reason we know about for enlightenment_system.
This commit is contained in:
parent
a999bdcdf3
commit
2ae006cfbd
|
@ -24,20 +24,102 @@ static double _last_spawn = 0.0;
|
|||
static int _respawn_count = 0;
|
||||
|
||||
static Eina_Bool
|
||||
_cb_dialog_timer(void *data EINA_UNUSED)
|
||||
_cb_dialog_timer(void *data)
|
||||
{
|
||||
int exit_code = (int)(long)data;
|
||||
|
||||
_error_dialog_timer = NULL;
|
||||
e_util_dialog_show(_("Error in Enlightenment System Service"),
|
||||
_("Enlightenment cannot successfully start<br>"
|
||||
"the enlightenment_system service."));
|
||||
|
||||
if (exit_code == 0) // can't even do ecore_exe_run...
|
||||
e_util_dialog_show(_("Error in Enlightenment System Service"),
|
||||
_("Enlightenment cannot successfully start<br>"
|
||||
"the enlightenment_system service<br>"
|
||||
"because ecore_exe_run() failed."));
|
||||
else if (exit_code == 31) // can't get passwd entry for user
|
||||
e_util_dialog_show(_("Error in Enlightenment System Service"),
|
||||
_("Enlightenment cannot successfully start<br>"
|
||||
"the enlightenment_system service<br>"
|
||||
"because your user has no passwd file entry."));
|
||||
else if (exit_code == 32) // username is blank in passwd entry
|
||||
e_util_dialog_show(_("Error in Enlightenment System Service"),
|
||||
_("Enlightenment cannot successfully start<br>"
|
||||
"the enlightenment_system service<br>"
|
||||
"because your username is blank in the passwd file."));
|
||||
else if (exit_code == 33) // can't alloc mem for username
|
||||
e_util_dialog_show(_("Error in Enlightenment System Service"),
|
||||
_("Enlightenment cannot successfully start<br>"
|
||||
"the enlightenment_system service<br>"
|
||||
"because it could not allocate memory."));
|
||||
else if (exit_code == 34) // can't get group entry for user's group
|
||||
e_util_dialog_show(_("Error in Enlightenment System Service"),
|
||||
_("Enlightenment cannot successfully start<br>"
|
||||
"the enlightenment_system service<br>"
|
||||
"because it can't find your user group entry."));
|
||||
else if (exit_code == 35) // group name is blank
|
||||
e_util_dialog_show(_("Error in Enlightenment System Service"),
|
||||
_("Enlightenment cannot successfully start<br>"
|
||||
"the enlightenment_system service<br>"
|
||||
"because your user group entry is blank."));
|
||||
else if (exit_code == 36) // can't setuid to 0
|
||||
e_util_dialog_show(_("Error in Enlightenment System Service"),
|
||||
_("Enlightenment cannot successfully start<br>"
|
||||
"the enlightenment_system service<br>"
|
||||
"since it can't become root. Missing setuid bit?"));
|
||||
else if (exit_code == 37) // can't setgid to 0
|
||||
e_util_dialog_show(_("Error in Enlightenment System Service"),
|
||||
_("Enlightenment cannot successfully start<br>"
|
||||
"the enlightenment_system service<br>"
|
||||
"since it can't become group root. Missing setuid bit?"));
|
||||
else if (exit_code == 38) // can't get passwd entry for uid 0
|
||||
e_util_dialog_show(_("Error in Enlightenment System Service"),
|
||||
_("Enlightenment cannot successfully start<br>"
|
||||
"the enlightenment_system service<br>"
|
||||
"because the passwd file entry for root isn't found."));
|
||||
else if (exit_code == 39) // root has no homedir
|
||||
e_util_dialog_show(_("Error in Enlightenment System Service"),
|
||||
_("Enlightenment cannot successfully start<br>"
|
||||
"the enlightenment_system service<br>"
|
||||
"because the root home directory is blank."));
|
||||
else if (exit_code == 40) // root homedir is not a full path
|
||||
e_util_dialog_show(_("Error in Enlightenment System Service"),
|
||||
_("Enlightenment cannot successfully start<br>"
|
||||
"the enlightenment_system service<br>"
|
||||
"because the root home directory is not a full path."));
|
||||
else if (exit_code == 41) // root homedir does not resolve to a path
|
||||
e_util_dialog_show(_("Error in Enlightenment System Service"),
|
||||
_("Enlightenment cannot successfully start<br>"
|
||||
"the enlightenment_system service<br>"
|
||||
"because the root home directory can't be found."));
|
||||
else if (exit_code == 42) // can't change HOME to root homedir
|
||||
e_util_dialog_show(_("Error in Enlightenment System Service"),
|
||||
_("Enlightenment cannot successfully start<br>"
|
||||
"the enlightenment_system service<br>"
|
||||
"because it can't change the HOME environment."));
|
||||
else if (exit_code == 43) // can't change dir to root homedir
|
||||
e_util_dialog_show(_("Error in Enlightenment System Service"),
|
||||
_("Enlightenment cannot successfully start<br>"
|
||||
"the enlightenment_system service<br>"
|
||||
"because it cannot change working directory to root's home."));
|
||||
else if (exit_code == 46) // user denied to all subsystems
|
||||
e_util_dialog_show(_("Error in Enlightenment System Service"),
|
||||
_("Enlightenment cannot successfully start<br>"
|
||||
"the enlightenment_system service<br>"
|
||||
"because your user is denied access to all services.<br>"
|
||||
"Please see /etc/enlightenment/system.conf."));
|
||||
else
|
||||
e_util_dialog_show(_("Error in Enlightenment System Service"),
|
||||
_("Enlightenment cannot successfully start<br>"
|
||||
"the enlightenment_system service for<br>"
|
||||
"some unknown reason."));
|
||||
return EINA_FALSE;
|
||||
}
|
||||
|
||||
static void
|
||||
_system_spawn_error(void)
|
||||
_system_spawn_error(int exit_code)
|
||||
{
|
||||
if (_error_dialog_timer) ecore_timer_del(_error_dialog_timer);
|
||||
_error_dialog_timer = ecore_timer_add(5.0, _cb_dialog_timer, NULL);
|
||||
_error_dialog_timer = ecore_timer_add(5.0, _cb_dialog_timer,
|
||||
(void *)(long)exit_code);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -54,7 +136,7 @@ _system_spawn(void)
|
|||
_system_exe = ecore_exe_pipe_run
|
||||
(buf, ECORE_EXE_NOT_LEADER | ECORE_EXE_TERM_WITH_PARENT |
|
||||
ECORE_EXE_PIPE_READ | ECORE_EXE_PIPE_WRITE, NULL);
|
||||
if (!_system_exe) _system_spawn_error();
|
||||
if (!_system_exe) _system_spawn_error(0);
|
||||
}
|
||||
|
||||
static Eina_Bool
|
||||
|
@ -131,12 +213,24 @@ _cb_exe_del(void *data EINA_UNUSED, int ev_type EINA_UNUSED, void *event)
|
|||
Ecore_Exe_Event_Del *ev = event;
|
||||
|
||||
if (ev->exe != _system_exe) return ECORE_CALLBACK_PASS_ON;
|
||||
if ((ev->exit_code == 3) || (ev->exit_code == 5) ||
|
||||
(ev->exit_code == 7) || (ev->exit_code == 9) ||
|
||||
(ev->exit_code == 11))
|
||||
if ((ev->exit_code == 31) || // can't get passwd entry for user
|
||||
(ev->exit_code == 32) || // username is blank in passwd entry
|
||||
(ev->exit_code == 33) || // can't alloc mem for username
|
||||
(ev->exit_code == 34) || // can't get group entry for user's group
|
||||
(ev->exit_code == 35) || // group name is blank
|
||||
(ev->exit_code == 36) || // can't setuid to 0
|
||||
(ev->exit_code == 37) || // can't setgid to 0
|
||||
(ev->exit_code == 38) || // can't get passwd entry for uid 0
|
||||
(ev->exit_code == 39) || // root has no homedir
|
||||
(ev->exit_code == 40) || // root homedir is not a full path
|
||||
(ev->exit_code == 41) || // root homedir does not resolve to a path
|
||||
(ev->exit_code == 42) || // can't change HOME to root homedir
|
||||
(ev->exit_code == 43) || // can't change dir to root homedir
|
||||
(ev->exit_code == 46) // user denied to all subsystems
|
||||
)
|
||||
{
|
||||
// didn't run because it literally refused....
|
||||
_system_spawn_error();
|
||||
_system_spawn_error(ev->exit_code);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
@ -5,12 +5,12 @@
|
|||
#define E_UTILS_H
|
||||
|
||||
#define e_util_dialog_show(title, args...) \
|
||||
{ \
|
||||
do { \
|
||||
char __tmpbuf[4096]; \
|
||||
\
|
||||
snprintf(__tmpbuf, sizeof(__tmpbuf), ##args); \
|
||||
e_util_dialog_internal(title, __tmpbuf); \
|
||||
}
|
||||
} while (0)
|
||||
|
||||
E_API void e_util_wakeup(void);
|
||||
E_API void e_util_env_set(const char *var, const char *val);
|
||||
|
|
|
@ -128,86 +128,86 @@ setuid_setup(void)
|
|||
if (!pwent)
|
||||
{
|
||||
ERR("Unable to obtain passwd entry for calling user\n");
|
||||
exit(1);
|
||||
exit(31);
|
||||
}
|
||||
if (!pwent->pw_name)
|
||||
{
|
||||
ERR("Blank username for user\n");
|
||||
exit(1);
|
||||
exit(32);
|
||||
}
|
||||
user_name = strdup(pwent->pw_name);
|
||||
if (!user_name)
|
||||
{
|
||||
ERR("Unable to allocate memory for username\n");
|
||||
exit(1);
|
||||
exit(33);
|
||||
}
|
||||
grent = getgrgid(gid);
|
||||
if (!grent)
|
||||
{
|
||||
ERR("Unable to obtain group entry for calling group\n");
|
||||
exit(1);
|
||||
exit(34);
|
||||
}
|
||||
if (!grent->gr_name)
|
||||
{
|
||||
ERR("Blank groupname for group\n");
|
||||
exit(1);
|
||||
exit(35);
|
||||
}
|
||||
group_name = strdup(grent->gr_name);
|
||||
if (!group_name)
|
||||
{
|
||||
ERR("Unable to allocate memory for groupname\n");
|
||||
exit(1);
|
||||
exit(36);
|
||||
}
|
||||
|
||||
if (setuid(0) != 0)
|
||||
{
|
||||
ERR("Unable to assume root user privileges\n");
|
||||
exit(5);
|
||||
exit(37);
|
||||
}
|
||||
if (setgid(0) != 0)
|
||||
{
|
||||
ERR("Unable to assume root group privileges\n");
|
||||
exit(7);
|
||||
exit(38);
|
||||
}
|
||||
|
||||
pwent = getpwuid(getuid());
|
||||
if (!pwent)
|
||||
{
|
||||
ERR("Unable to obtain passwd entry\n");
|
||||
exit(1);
|
||||
exit(39);
|
||||
}
|
||||
if (!pwent->pw_dir)
|
||||
{
|
||||
ERR("No home dir for root\n");
|
||||
exit(1);
|
||||
exit(40);
|
||||
}
|
||||
if (strlen(pwent->pw_dir) > (sizeof(buf) - 8))
|
||||
{
|
||||
ERR("Root homedir too long\n");
|
||||
exit(1);
|
||||
exit(41);
|
||||
}
|
||||
if (pwent->pw_dir[0] != '/')
|
||||
{
|
||||
ERR("Root homedir %s is not a full path\n", pwent->pw_dir);
|
||||
exit(1);
|
||||
exit(42);
|
||||
}
|
||||
if (!realpath(pwent->pw_dir, buf))
|
||||
{
|
||||
ERR("Root homedir %s does not resolve\n", pwent->pw_dir);
|
||||
exit(1);
|
||||
exit(43);
|
||||
}
|
||||
snprintf(buf, sizeof(buf), "HOME=%s", pwent->pw_dir);
|
||||
if (putenv(buf) == -1)
|
||||
{
|
||||
ERR("Unable to set $HOME environment\n");
|
||||
exit(1);
|
||||
exit(44);
|
||||
}
|
||||
|
||||
// change CWD to / to avoid path search dlopens finding libs in ./
|
||||
if (chdir("/") != 0)
|
||||
{
|
||||
ERR("Unable to change working dir to /\n");
|
||||
exit(1);
|
||||
exit(45);
|
||||
}
|
||||
|
||||
// die with parent - special as this is setuid
|
||||
|
@ -425,7 +425,7 @@ main(int argc EINA_UNUSED, const char **argv EINA_UNUSED)
|
|||
if (systems == 0)
|
||||
{
|
||||
ERR("Permission denied to use this tool\n");
|
||||
exit(11);
|
||||
exit(46);
|
||||
}
|
||||
|
||||
ecore_idle_enterer_add(_cb_idle_enterer, NULL);
|
||||
|
|
Loading…
Reference in New Issue