efl exe - map some "well known" exit codes to specific errnos
authorCarsten Haitzler (Rasterman) <raster@rasterman.com>
Wed, 4 Apr 2018 09:57:55 +0000 (18:57 +0900)
committerWonki Kim <wonki_.kim@samsung.com>
Tue, 10 Apr 2018 13:25:55 +0000 (22:25 +0900)
src/lib/ecore/efl_exe.c

index 3ad23e5..f40839c 100644 (file)
@@ -195,7 +195,39 @@ _exe_exit_eval(Eo *obj, Efl_Exe_Data *pd)
              pd->promise = NULL;
              if ((exit_code != 0) && (!(efl_task_flags_get(obj) &
                                         EFL_TASK_FLAGS_NO_EXIT_CODE_ERROR)))
-               eina_promise_reject(p, exit_code + 1000000);
+               {
+                  Eina_Error err = exit_code + 1000000;
+                  // Code  Meaning                        Example             Comments
+                  // ---------------------------------------------------------------------------------------------------------------------------------------------------------------------
+                  // 1     Catchall for general errors    let "var1 = 1/0"    Miscellaneous errors, such as "divide by zero" and other impermissible operations
+                  // 2     Misuse of shell builtins       empty_function() {} Missing keyword or command, or permission problem (and diff return code on a failed binary file comparison).
+                  // 126   Command invoked cannot execute /dev/null           Permission problem or command is not an executable
+                  // 127   "command not found"            illegal_command     Possible problem with $PATH or a typo
+                  // 128   Invalid argument to exit       exit 3.14159        exit takes only integer args in the range 0 - 255 (see first footnote)
+                  // 128+n Fatal error signal "n"         kill -9 $PPID       $? returns 137 (128 + 9)
+                  // 130   Script terminated by Control-C Ctl-C               Control-C is fatal error signal 2, (130 = 128 + 2, see above)
+                  // 255*  Exit status out of range       exit -1             exit takes only integer args in the range 0 - 255
+                  // 
+                  // According to the above table, exit codes 1 - 2,
+                  // 126 - 165, and 255 [1] have special meanings, and
+                  // should therefore be avoided for user-specified exit
+                  // parameters. Ending a script with exit 127 would
+                  // certainly cause confusion when troubleshooting (is
+                  // the error code a "command not found" or a user-defined
+                  // one?). However, many scripts use an exit 1 as a general
+                  // bailout-upon-error. Since exit code 1 signifies so many
+                  // possible errors, it is not particularly useful in
+                  // debugging.
+                  if      (exit_code == 1  ) err = EBADF;
+                  else if (exit_code == 2  ) err = EDOM;
+                  else if (exit_code == 126) err = ENOEXEC;
+                  else if (exit_code == 127) err = ENOENT;
+                  else if (exit_code == 128) err = EINVAL;
+                  else if (exit_code == 129) err = EFAULT;
+                  else if (exit_code == 130) err = EINTR;
+                  else if ((exit_code >= 131) && (exit_code <= 165)) err = EFAULT;
+                  eina_promise_reject(p, err);
+               }
              else eina_promise_resolve(p, eina_value_int_init(exit_code));
           }
      }