From 2ae006cfbd7fcb52edc3eca05bb09dc401ee2d89 Mon Sep 17 00:00:00 2001 From: "Carsten Haitzler (Rasterman)" Date: Wed, 29 Apr 2020 22:10:10 +0100 Subject: [PATCH] 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. --- src/bin/e_system.c | 116 +++++++++++++++++++++++++++++---- src/bin/e_utils.h | 4 +- src/bin/system/e_system_main.c | 32 ++++----- 3 files changed, 123 insertions(+), 29 deletions(-) diff --git a/src/bin/e_system.c b/src/bin/e_system.c index 70db1f45e..bb8e5e999 100644 --- a/src/bin/e_system.c +++ b/src/bin/e_system.c @@ -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
" - "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
" + "the enlightenment_system service
" + "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
" + "the enlightenment_system service
" + "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
" + "the enlightenment_system service
" + "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
" + "the enlightenment_system service
" + "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
" + "the enlightenment_system service
" + "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
" + "the enlightenment_system service
" + "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
" + "the enlightenment_system service
" + "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
" + "the enlightenment_system service
" + "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
" + "the enlightenment_system service
" + "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
" + "the enlightenment_system service
" + "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
" + "the enlightenment_system service
" + "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
" + "the enlightenment_system service
" + "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
" + "the enlightenment_system service
" + "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
" + "the enlightenment_system service
" + "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
" + "the enlightenment_system service
" + "because your user is denied access to all services.
" + "Please see /etc/enlightenment/system.conf.")); + else + e_util_dialog_show(_("Error in Enlightenment System Service"), + _("Enlightenment cannot successfully start
" + "the enlightenment_system service for
" + "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 { diff --git a/src/bin/e_utils.h b/src/bin/e_utils.h index 2a51a5959..a1588c351 100644 --- a/src/bin/e_utils.h +++ b/src/bin/e_utils.h @@ -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); diff --git a/src/bin/system/e_system_main.c b/src/bin/system/e_system_main.c index 570adc70a..85f1dec36 100644 --- a/src/bin/system/e_system_main.c +++ b/src/bin/system/e_system_main.c @@ -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);