Il giorno ven 12 nov 2021 alle ore 10:33 Carsten Haitzler < ras...@rasterman.com> ha scritto:
> raster pushed a commit to branch master. > > > http://git.enlightenment.org/core/enlightenment.git/commit/?id=8edf2fc0a388090da74db683a690e0aed8a33eb6 > > commit 8edf2fc0a388090da74db683a690e0aed8a33eb6 > Author: Carsten Haitzler <ras...@rasterman.com> > Date: Thu Nov 11 14:25:44 2021 +0000 > > e start - force stdout/err to go to specific log files > > ~/.e-log.log is now the stdout/err from e and child processes. finally > it always goes to a single known file. always. e will rename the old > old ~/.e-log.log.old on start - e_start handles this before it execs e. > Super hero commit ! :) > --- > src/bin/e_start_main.c | 48 > ++++++++++++++++++++++++++++++++++++++++++------ > 1 file changed, 42 insertions(+), 6 deletions(-) > > diff --git a/src/bin/e_start_main.c b/src/bin/e_start_main.c > index caa23962d..722063339 100644 > --- a/src/bin/e_start_main.c > +++ b/src/bin/e_start_main.c > @@ -349,16 +349,35 @@ _e_ptrace_continue(int child, int back, Eina_Bool > really_know) > #endif > } > > +static void > +_e_start_stdout_err_redir(const char *home) > +{ > + int logfd; > + char *logf = NULL, *logf_old = NULL; > + > + // rename old olg file > + myasprintf(&logf, "%s/.e-log.log", home); > + myasprintf(&logf_old, "%s/.e-log.log.old", home); > + rename(logf, logf_old); > + // open new log file and move stdout/err to it > + logfd = open(logf, O_WRONLY | O_CREAT | O_TRUNC, 0600); > + printf("Enlightenment: See logs in: %s\n", logf); > + if (logfd < 0) return; > + dup2(logfd, 1); // stdout to file > + dup2(logfd, 2); // stderr to file > +} > + > static int > -_e_start_child(char **args, Eina_Bool really_know) > +_e_start_child(const char *home, char **args, Eina_Bool really_know) > { > + // have e process die with parent enlightenment_start > #ifdef HAVE_PRCTL > prctl(PR_SET_PDEATHSIG, SIGTERM); > #elif defined(HAVE_PROCCTL) > int sig = SIGTERM; > procctl(P_PID, 0, PROC_PDEATHSIG_CTL, &sig); > #endif > - > + _e_start_stdout_err_redir(home); > _e_ptrace_traceme(really_know); > execv(args[0], args); > // We failed, 0 means normal exit from E with no restart or crash so > @@ -367,7 +386,7 @@ _e_start_child(char **args, Eina_Bool really_know) > } > > static Eina_Bool > -_e_ptrace_kernel_check(void) > +_e_ptrace_kernel_check(const char *home) > { > #ifdef __linux__ > // Check if patch to prevent ptrace to another process is present > @@ -380,6 +399,23 @@ _e_ptrace_kernel_check(void) > ret = read(fd, &c, (sizeof(c)) == sizeof(c)) && (c != '0'); > close(fd); > } > + if (ret) > + { > + char *buf = NULL; > + FILE *f; > + > + myasprintf(&buf, "%s/.e-crashdump.txt", home); > + f = fopen(buf, "a"); > + if (f) > + { > + fprintf(f, > + "ERROR: /proc/sys/kernel/yama/ptrace_scope is 1 > disallowing remote\n" > + "attachment to a process. This means a gdb backtrace > cannot be logged.\n" > + "To fix this, as root please do:\n" > + " echo 0 > /proc/sys/kernel/yama/ptrace_scope\n"); > + fclose(f); > + } > + } > return ret; > #else > return EINA_FALSE; > @@ -579,7 +615,7 @@ main(int argc, char **argv) > myasprintf(&buf, "%s/enlightenment", eina_prefix_bin_get(pfx)); > > args = alloca((argc + 1) * sizeof(char *)); > - printf("CMD: [%s]\n", buf); > + printf("Enlightenment: Command: %s\n", buf); > args[0] = buf; > copy_args(&args[1], argv + 1, argc - 1); > args[argc] = NULL; > @@ -604,7 +640,7 @@ main(int argc, char **argv) > } > else if (child == 0) > { // we are in the child fork - so exec > - ret = _e_start_child(args, really_know); > + ret = _e_start_child(home, args, really_know); > break; > } > > @@ -646,7 +682,7 @@ not_done: > usleep(200000); > > /* And call gdb if available */ > - if (home && !_e_ptrace_kernel_check()) > + if (home && !_e_ptrace_kernel_check(home)) > r = _e_call_gdb(child, home, &backtrace_str); > else > r = 0; > > -- > > > _______________________________________________ enlightenment-devel mailing list enlightenment-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-devel