raster pushed a commit to branch master.

http://git.enlightenment.org/core/enlightenment.git/commit/?id=2ae006cfbd7fcb52edc3eca05bb09dc401ee2d89

commit 2ae006cfbd7fcb52edc3eca05bb09dc401ee2d89
Author: Carsten Haitzler (Rasterman) <[email protected]>
Date:   Wed Apr 29 22:10:10 2020 +0100

    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<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
      {
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);

-- 


Reply via email to