[pacman-dev] [PATCH] Revamp pacman signal handler
dave reisner
d at falconindy.com
Mon Sep 26 16:59:27 EDT 2011
On Sep 26, 2011 4:29 PM, "Dan McGee" <dan at archlinux.org> wrote:
>
> * All errors now go to stdout
I think you meant stderr here. Looks good otherwise. Do we want to handle a
SIGQUIT which is easily accessible from a shell (ctrl-/)?
D
, so do the same here and simplify the
> writing of the error message.
> * Add SIGHUP to the handled signal list, and don't repeat code.
> * Attempt to release the transaction (e.g. remove the lock file)
> for all of HUP, INT, and TERM. Signals HUP and INT respects
> transaction state, TERM will immediately terminate the process.
>
> Signed-off-by: Dan McGee <dan at archlinux.org>
> ---
> src/pacman/pacman.c | 46 +++++++++++++++++++++++-----------------------
> 1 files changed, 23 insertions(+), 23 deletions(-)
>
> diff --git a/src/pacman/pacman.c b/src/pacman/pacman.c
> index 061d593..40aa444 100644
> --- a/src/pacman/pacman.c
> +++ b/src/pacman/pacman.c
> @@ -299,26 +299,29 @@ static void handler(int signum)
> {
> int out = fileno(stdout);
> int err = fileno(stderr);
> + const char *msg;
> if(signum == SIGSEGV) {
> - const char *msg1 = "error: segmentation fault\n";
> - const char *msg2 = "Internal pacman error: Segmentation
fault.\n"
> + msg = "\nerror: segmentation fault\n"
> "Please submit a full bug report with --debug if
appropriate.\n";
> - /* write a error message to out, the rest to err */
> - xwrite(out, msg1, strlen(msg1));
> - xwrite(err, msg2, strlen(msg2));
> + xwrite(err, msg, strlen(msg));
> exit(signum);
> - } else if(signum == SIGINT) {
> - const char *msg = "\nInterrupt signal received\n";
> + } else if(signum == SIGINT || signum == SIGHUP) {
> + if(signum == SIGINT) {
> + msg = "\nInterrupt signal received\n";
> + } else {
> + msg = "\nHangup signal received\n";
> + }
> xwrite(err, msg, strlen(msg));
> if(alpm_trans_interrupt(config->handle) == 0) {
> /* a transaction is being interrupted, don't exit
pacman yet. */
> return;
> }
> - /* no commiting transaction, we can release it now and
then exit pacman */
> - alpm_trans_release(config->handle);
> - /* output a newline to be sure we clear any line we may be
on */
> - xwrite(out, "\n", 1);
> }
> + /* SIGINT: no commiting transaction, release it now and then exit
pacman
> + * SIGHUP, SIGTERM: release no matter what */
> + alpm_trans_release(config->handle);
> + /* output a newline to be sure we clear any line we may be on */
> + xwrite(out, "\n", 1);
> cleanup(128 + signum);
> }
>
> @@ -757,8 +760,9 @@ static void cl_to_log(int argc, char* argv[])
> */
> int main(int argc, char *argv[])
> {
> - int ret = 0;
> + int i, ret = 0;
> struct sigaction new_action, old_action;
> + const int signals[] = { SIGHUP, SIGINT, SIGTERM, SIGSEGV };
> #if defined(HAVE_GETEUID) && !defined(CYGWIN)
> /* geteuid undefined in CYGWIN */
> uid_t myuid = geteuid();
> @@ -775,17 +779,13 @@ int main(int argc, char *argv[])
> sigemptyset(&new_action.sa_mask);
> new_action.sa_flags = 0;
>
> - sigaction(SIGINT, NULL, &old_action);
> - if(old_action.sa_handler != SIG_IGN) {
> - sigaction(SIGINT, &new_action, NULL);
> - }
> - sigaction(SIGTERM, NULL, &old_action);
> - if(old_action.sa_handler != SIG_IGN) {
> - sigaction(SIGTERM, &new_action, NULL);
> - }
> - sigaction(SIGSEGV, NULL, &old_action);
> - if(old_action.sa_handler != SIG_IGN) {
> - sigaction(SIGSEGV, &new_action, NULL);
> + /* assign our handler to any signals we care about */
> + for(i = 0; i < sizeof(signals) / sizeof(signals[0]); i++) {
> + int signal = signals[i];
> + sigaction(signal, NULL, &old_action);
> + if(old_action.sa_handler != SIG_IGN) {
> + sigaction(signal, &new_action, NULL);
> + }
> }
>
> /* i18n init */
> --
> 1.7.6.3
>
>
More information about the pacman-dev
mailing list