From 295c121a6d97949b7689d18c75c9b3f54f0a1baf Mon Sep 17 00:00:00 2001 From: "Dr. Werner Fink" Date: Tue, 8 Mar 2011 17:49:07 +0000 Subject: [PATCH] . OBS-URL: https://build.opensuse.org/package/show/Base:System/bash?expand=0&rev=65 --- bash-4.2-history.dif | 164 ++++++++++++++++++++++++++++--------------- bash.changes | 5 ++ 2 files changed, 111 insertions(+), 58 deletions(-) diff --git a/bash-4.2-history.dif b/bash-4.2-history.dif index c68d5267..dd0583f7 100644 --- a/bash-4.2-history.dif +++ b/bash-4.2-history.dif @@ -1,75 +1,123 @@ ---- config.h.in -+++ config.h.in 2011-03-08 11:18:00.139925937 +0000 -@@ -530,6 +530,9 @@ - /* Define if you have the asprintf function. */ - #undef HAVE_ASPRINTF +--- shell.c ++++ shell.c 2011-03-08 17:25:55.160426342 +0000 +@@ -261,6 +261,11 @@ static const struct { + { (char *)0x0, Int, (int *)0x0, (char **)0x0 } + }; -+/* Define if you have the ATEXIT function. */ -+#undef HAVE_ATEXIT ++#if defined (HAVE_POSIX_SIGSETJMP) ++volatile procenv_t terminating_now; ++volatile sig_atomic_t jump_with_sig; ++#endif /* HAVE_POSIX_SIGSETJMP */ + - /* Define if you have the bcopy function. */ - #undef HAVE_BCOPY + /* These are extern so execute_simple_command can set them, and then + longjmp back to main to execute a shell script, instead of calling + main () again and resulting in indefinite, possibly fatal, stack +@@ -379,6 +384,39 @@ main (argc, argv, env) + if (code) + exit (2); ---- configure -+++ configure 2011-03-08 11:20:57.780426177 +0000 -@@ -13497,7 +13497,7 @@ done ++#if defined (HAVE_POSIX_SIGSETJMP) ++ /* Catch signals here */ ++ if (sigsetjmp (terminating_now, 1)) ++ { ++ int sig = jump_with_sig; ++ ++ /* I don't believe this condition ever tests true. */ ++ if (sig == SIGINT && signal_is_trapped (SIGINT)) ++ run_interrupt_trap (); ++ ++# if defined (HISTORY) ++ if (interactive_shell && sig != SIGABRT) ++ maybe_save_shell_history (); ++# endif /* HISTORY */ ++ ++# if defined (JOB_CONTROL) ++ if (sig == SIGHUP && (interactive || (subshell_environment & (SUBSHELL_COMSUB|SUBSHELL_PROCSUB)))) ++ hangup_all_jobs (); ++ end_job_control (); ++# endif /* JOB_CONTROL */ ++ ++# if defined (PROCESS_SUBSTITUTION) ++ unlink_fifo_list (); ++# endif /* PROCESS_SUBSTITUTION */ ++ ++ run_exit_trap (); ++ set_signal_handler (sig, SIG_DFL); ++ kill (getpid (), sig); ++ _exit(0); ++ } ++ jump_with_sig = 0; ++#endif /* HAVE_POSIX_SIGSETJMP */ ++ + xtrace_init (); - - --for ac_func in bcopy bzero confstr faccessat fnmatch \ -+for ac_func in atexit bcopy bzero confstr faccessat fnmatch \ - getaddrinfo gethostbyname getservbyname getservent inet_aton \ - memmove pathconf putenv raise regcomp regexec \ - setenv setlinebuf setlocale setvbuf siginterrupt strchr \ ---- configure.in -+++ configure.in 2011-03-08 11:20:46.020641745 +0000 -@@ -727,7 +727,7 @@ AC_CHECK_FUNCS(dup2 eaccess fcntl getdta - AC_REPLACE_FUNCS(rename) - - dnl checks for c library functions --AC_CHECK_FUNCS(bcopy bzero confstr faccessat fnmatch \ -+AC_CHECK_FUNCS(atexit bcopy bzero confstr faccessat fnmatch \ - getaddrinfo gethostbyname getservbyname getservent inet_aton \ - memmove pathconf putenv raise regcomp regexec \ - setenv setlinebuf setlocale setvbuf siginterrupt strchr \ + #if defined (USING_BASH_MALLOC) && defined (DEBUG) && !defined (DISABLE_MALLOC_WRAPPERS) --- sig.c -+++ sig.c 2011-03-08 11:32:29.067927069 +0000 -@@ -292,6 +292,11 @@ initialize_terminating_signals () - - #endif /* !HAVE_POSIX_SIGNALS */ - -+#if defined (HISTORY) && defined (HAVE_ATEXIT) -+ if (interactive_shell) -+ atexit(maybe_save_shell_history); -+#endif /* HISTORY && HAVE_ATEXIT */ -+ - termsigs_initialized = 1; - } - -@@ -504,8 +509,11 @@ termsig_sighandler (sig) ++++ sig.c 2011-03-08 17:26:31.627928783 +0000 +@@ -503,7 +503,7 @@ termsig_sighandler (sig) + /* XXX - should this also trigger when interrupt_immediately is set? */ if (terminate_immediately) { - #if defined (HISTORY) -- /* XXX - will inhibit history file being written */ -- history_lines_this_session = 0; -+# if defined (HAVE_ATEXIT) -+ if (sig == SIGABRT) -+# endif -+ /* XXX - will inhibit history file being written */ -+ history_lines_this_session = 0; +-#if defined (HISTORY) ++#if defined (HISTORY) && ! defined (HAVE_POSIX_SIGSETJMP) + /* XXX - will inhibit history file being written */ + history_lines_this_session = 0; #endif - terminate_immediately = 0; - termsig_handler (sig); -@@ -532,10 +540,10 @@ termsig_handler (sig) +@@ -514,6 +514,11 @@ termsig_sighandler (sig) + SIGRETURN (0); + } + ++#if defined (HAVE_POSIX_SIGSETJMP) ++extern volatile procenv_t terminating_now; ++extern volatile sig_atomic_t jump_with_sig; ++#endif /* HAVE_POSIX_SIGSETJMP */ ++ + void + termsig_handler (sig) + int sig; +@@ -528,32 +533,39 @@ termsig_handler (sig) + handling_termsig = 1; + terminating_signal = 0; /* keep macro from re-testing true. */ + ++#if ! defined (HAVE_POSIX_SIGSETJMP) + /* I don't believe this condition ever tests true. */ if (sig == SIGINT && signal_is_trapped (SIGINT)) run_interrupt_trap (); -#if defined (HISTORY) -+#if defined (HISTORY) && ! defined (HAVE_ATEXIT) ++# if defined (HISTORY) if (interactive_shell && sig != SIGABRT) maybe_save_shell_history (); -#endif /* HISTORY */ -+#endif /* HISTORY && ! HAVE_ATEXIT */ ++# endif /* HISTORY */ - #if defined (JOB_CONTROL) +-#if defined (JOB_CONTROL) ++# if defined (JOB_CONTROL) if (sig == SIGHUP && (interactive || (subshell_environment & (SUBSHELL_COMSUB|SUBSHELL_PROCSUB)))) + hangup_all_jobs (); + end_job_control (); +-#endif /* JOB_CONTROL */ ++# endif /* JOB_CONTROL */ + +-#if defined (PROCESS_SUBSTITUTION) ++# if defined (PROCESS_SUBSTITUTION) + unlink_fifo_list (); +-#endif /* PROCESS_SUBSTITUTION */ ++# endif /* PROCESS_SUBSTITUTION */ ++#endif /* ! HAVE_POSIX_SIGSETJMP */ + + /* Reset execution context */ + loop_level = continuing = breaking = funcnest = 0; + executing_list = comsub_ignore_return = return_catch_flag = 0; + ++#if defined (HAVE_POSIX_SIGSETJMP) ++ jump_with_sig = sig; ++ siglongjmp(terminating_now, 1); ++#else /* ! HAVE_POSIX_SIGSETJMP */ + run_exit_trap (); + set_signal_handler (sig, SIG_DFL); + kill (getpid (), sig); ++#endif /* ! HAVE_POSIX_SIGSETJMP */ + } + + /* What we really do when SIGINT occurs. */ diff --git a/bash.changes b/bash.changes index 10b511cf..91e4bc53 100644 --- a/bash.changes +++ b/bash.changes @@ -1,3 +1,8 @@ +------------------------------------------------------------------- +Tue Mar 8 18:47:59 CET 2011 - werner@suse.de + +- Much better solution for saving history for system with sigsetjmp + ------------------------------------------------------------------- Tue Mar 8 12:51:29 CET 2011 - werner@suse.de