Please find attached a 'diff -uNp' of parted/ui.c to solve this problem.
I forgot the attachment. Here it is.
Happy hacking,
Debarshi
--
GPG key ID: 63D4A5A7
Key server: pgp.mit.edu
--- parted/parted/ui.c 2007-02-27 01:42:35.000000000 +0530
+++ ui.c 2007-02-28 04:24:25.000000000 +0530
@@ -1,6 +1,7 @@
/*
parted - a frontend to libparted
- Copyright (C) 1999, 2000, 2001, 2002, 2006, 2007 Free Software Foundation, Inc.
+ Copyright (C) 1999, 2000, 2001, 2002, 2006, 2007
+ Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -109,10 +110,12 @@ static struct {
sigjmp_buf jmp_state;
} readline_state;
+#ifdef SA_SIGINFO
static struct sigaction sig_segv;
static struct sigaction sig_int;
static struct sigaction sig_fpe;
static struct sigaction sig_ill;
+#endif /* SA_SIGINFO */
volatile int got_ctrl_c = 0; /* used in exception_handler */
@@ -187,26 +190,26 @@ _add_history_unique (const char* line)
static void
_dump_history ()
{
- fputs (_("\nCommand History:\n"), stdout);
- int i = 0;
- HIST_ENTRY** all_entries = history_list ();
- while (all_entries[i]) {
- puts(all_entries[i++]->line);
- }
+ fputs (_("\nCommand History:\n"), stdout);
+ int i = 0;
+ HIST_ENTRY** all_entries = history_list ();
+ while (all_entries[i]) {
+ puts(all_entries[i++]->line);
+ }
}
#endif /* HAVE_LIBREADLINE */
-#ifndef HAVE_SIGACTION
+#ifndef SA_SIGINFO
static void
mask_signal()
{
- sigset_t curr;
- sigset_t prev;
+ sigset_t curr;
+ sigset_t prev;
- sigfillset(&curr);
- sigprocmask(SIG_SETMASK, &curr, &prev);
+ sigfillset(&curr);
+ sigprocmask(SIG_SETMASK, &curr, &prev);
}
-#endif /* HAVE_SIGACTION */
+#endif /* SA_SIGINFO */
/* Resets the environment by jumping to the initial state
* saved during ui intitialisation.
@@ -216,7 +219,7 @@ mask_signal()
static void
reset_env (int quit)
{
- int in_readline = readline_state.in_readline;
+ int in_readline = readline_state.in_readline;
readline_state.in_readline = 0;
@@ -229,182 +232,231 @@ reset_env (int quit)
}
}
-/* Signal handler for SIGINT */
+/* Signal handler for SIGSEGV */
+#ifdef SA_SIGINFO
static void
-sigint_handler (int signum, siginfo_t* info, void *ucontext)
+sigsegv_handler (int signum, siginfo_t* info, void* ucontext)
{
- got_ctrl_c = 1;
+ sigaction (SIGSEGV, &sig_segv, NULL);
- #ifdef HAVE_SIGACTION
- sigaction (SIGINT, &sig_int, NULL);
- #else
- signal (SIGINT, &sigint_handler);
- mask_signal();
- #endif /* HAVE_SIGACTION */
+ printf (bug_msg, VERSION);
+ #ifdef HAVE_LIBREADLINE
+ _dump_history ();
+ #endif
+
+ switch (info->si_code) {
+
+ case SEGV_MAPERR:
+ fputs(_("\nError: SEGV_MAPERR (Address not mapped "
+ "to object)\n"), stdout);
+ PED_ASSERT(0, break); /* Force a backtrace */
+ break;
+
+ case SEGV_ACCERR:
+ fputs(_("\nError: SEGV_ACCERR (Invalid permissions "
+ "for mapped object)\n"), stdout);
+ break;
+
+ default:
+ fputs(_("\nError: A general SIGSEGV signal was "
+ "encountered.\n"), stdout);
+ PED_ASSERT(0, break); /* Force a backtrace */
+ break;
+ }
- reset_env (0);
+ abort ();
}
-
-/* Signal handler for SIGSEGV */
+#else
static void
-sigsegv_handler (int signum, siginfo_t* info, void* ucontext)
+sigsegv_handler (int signum)
{
- #ifdef HAVE_SIGACTION
- sigaction (SIGSEGV, &sig_segv, NULL);
- #else
- signal (SIGSEGV, &sigsegv_handler);
- mask_signal();
- #endif /* HAVE_SIGACTION */
-
- printf (bug_msg, VERSION);
- #ifdef HAVE_LIBREADLINE
- _dump_history ();
- #endif
-
- switch (info->si_code) {
-
- case SEGV_MAPERR:
- fputs(_("\nError: SEGV_MAPERR (Address not mapped "
- "to object)\n"), stdout);
- PED_ASSERT(0, break); /* Force a backtrace */
- break;
-
- case SEGV_ACCERR:
- fputs(_("\nError: SEGV_ACCERR (Invalid permissions "
- "for mapped object)\n"), stdout);
- break;
-
- default:
- fputs(_("\nError: A general SIGSEGV signal was "
- "encountered.\n"), stdout);
- PED_ASSERT(0, break); /* Force a backtrace */
- break;
- }
+ signal (SIGSEGV, &sigsegv_handler);
+ mask_signal ();
+
+ printf (bug_msg, VERSION);
+ #ifdef HAVE_LIBREADLINE
+ _dump_history ();
+ #endif
- abort ();
+ abort ();
}
+#endif /* SA_SIGINFO */
+
+/* Signal handler for SIGINT */
+#ifdef SA_SIGINFO
+static void
+sigint_handler (int signum, siginfo_t* info, void *ucontext)
+{
+ got_ctrl_c = 1;
+ sigaction (SIGINT, &sig_int, NULL);
+ reset_env (0);
+}
+#else
+static void
+sigint_handler (int signum)
+{
+ got_ctrl_c = 1;
+ signal (SIGINT, &sigint_handler);
+ mask_signal ();
+ reset_env (0);
+}
+#endif /* SA_SIGINFO */
/* Signal handler for SIGFPE */
+#ifdef SA_SIGINFO
static void
sigfpe_handler (int signum, siginfo_t* info, void* ucontext)
{
- #ifdef HAVE_SIGACTION
- sigaction (SIGFPE, &sig_fpe, NULL);
- #else
- signal (SIGFPE, &sigfpe_handler);
- mask_signal();
- #endif /* HAVE_SIGACTION */
-
- printf (bug_msg, VERSION);
- #ifdef HAVE_LIBREADLINE
- _dump_history ();
- #endif
-
- switch (info->si_code) {
-
- case FPE_INTDIV:
- fputs(_("\nError: FPE_INTDIV (Integer: divide by zero)"), stdout);
- break;
+ sigaction (SIGFPE, &sig_fpe, NULL);
+
+ printf (bug_msg, VERSION);
+ #ifdef HAVE_LIBREADLINE
+ _dump_history ();
+ #endif
+
+ switch (info->si_code) {
+
+ case FPE_INTDIV:
+ fputs(_("\nError: FPE_INTDIV (Integer: "
+ "divide by zero)"), stdout);
+ break;
- case FPE_INTOVF:
- fputs(_("\nError: FPE_INTOVF (Integer: overflow)"), stdout);
- break;
+ case FPE_INTOVF:
+ fputs(_("\nError: FPE_INTOVF (Integer: "
+ "overflow)"), stdout);
+ break;
- case FPE_FLTDIV:
- fputs(_("\nError: FPE_FLTDIV (Float: divide by zero)"), stdout);
- break;
-
- case FPE_FLTOVF:
- fputs(_("\nError: FPE_FLTOVF (Float: overflow)"), stdout);
- break;
-
- case FPE_FLTUND:
- fputs(_("\nError: FPE_FLTUND (Float: underflow)"), stdout);
- break;
-
- case FPE_FLTRES:
- fputs(_("\nError: FPE_FLTRES (Float: inexact result)"), stdout);
- break;
-
- case FPE_FLTINV:
- fputs(_("\nError: FPE_FLTINV (Float: invalid operation)"), stdout);
- break;
-
- case FPE_FLTSUB:
- fputs(_("\nError: FPE_FLTSUB (Float: subscript out of "
- "range)"), stdout);
- break;
-
- default:
- fputs(_("\nError: A general SIGFPE signal was "
- "encountered."), stdout);
- break;
+ case FPE_FLTDIV:
+ fputs(_("\nError: FPE_FLTDIV (Float: "
+ "divide by zero)"), stdout);
+ break;
+
+ case FPE_FLTOVF:
+ fputs(_("\nError: FPE_FLTOVF (Float: "
+ "overflow)"), stdout);
+ break;
+
+ case FPE_FLTUND:
+ fputs(_("\nError: FPE_FLTUND (Float: "
+ "underflow)"), stdout);
+ break;
+
+ case FPE_FLTRES:
+ fputs(_("\nError: FPE_FLTRES (Float: "
+ "inexact result)"), stdout);
+ break;
+
+ case FPE_FLTINV:
+ fputs(_("\nError: FPE_FLTINV (Float: "
+ "invalid operation)"), stdout);
+ break;
+
+ case FPE_FLTSUB:
+ fputs(_("\nError: FPE_FLTSUB (Float: "
+ "subscript out of range)"), stdout);
+ break;
+
+ default:
+ fputs(_("\nError: A general SIGFPE signal "
+ "was encountered."), stdout);
+ break;
- }
-
- abort ();
+ }
+ abort ();
+}
+#else
+static void
+sigfpe_handler (int signum)
+{
+ signal (SIGFPE, &sigfpe_handler);
+ mask_signal ();
+
+ printf (bug_msg, VERSION);
+ #ifdef HAVE_LIBREADLINE
+ _dump_history ();
+ #endif
+
+ abort ();
}
+#endif /* SA_SIGINFO */
/* Signal handler for SIGILL */
+#ifdef SA_SIGINFO
static void
sigill_handler (int signum, siginfo_t* info, void* ucontext)
{
- #ifdef HAVE_SIGACTION
- sigaction (SIGILL, &sig_ill, NULL);
- #else
- signal (SIGILL, &sigill_handler);
- mask_signal();
- #endif /* HAVE_SIGACTION */
-
- printf (bug_msg, VERSION);
- #ifdef HAVE_LIBREADLINE
- _dump_history ();
- #endif
-
- switch (info->si_code) {
-
- case ILL_ILLOPC:
- fputs(_("\nError: ILL_ILLOPC (Illegal Opcode)"), stdout);
- break;
-
- case ILL_ILLOPN:
- fputs(_("\nError: ILL_ILLOPN (Illegal Operand)"), stdout);
- break;
+ sigaction (SIGILL, &sig_ill, NULL);
+
+ printf (bug_msg, VERSION);
+ #ifdef HAVE_LIBREADLINE
+ _dump_history ();
+ #endif
+
+ switch (info->si_code) {
+
+ case ILL_ILLOPC:
+ fputs(_("\nError: ILL_ILLOPC "
+ "(Illegal Opcode)"), stdout);
+ break;
+
+ case ILL_ILLOPN:
+ fputs(_("\nError: ILL_ILLOPN "
+ "(Illegal Operand)"), stdout);
+ break;
- case ILL_ILLADR:
- fputs(_("\nError: ILL_ILLADR (Illegal addressing mode)"),
- stdout);
- break;
-
- case ILL_ILLTRP:
- fputs(_("\nError: ILL_ILLTRP (Illegal Trap)"), stdout);
- break;
-
- case ILL_PRVOPC:
- fputs(_("\nError: ILL_PRVOPC (Privileged Opcode)"), stdout);
- break;
-
- case ILL_PRVREG:
- fputs(_("\nError: ILL_PRVREG (Privileged Register)"), stdout);
- break;
-
- case ILL_COPROC:
- fputs(_("\nError: ILL_COPROC (Coprocessor Error)"), stdout);
- break;
-
- case ILL_BADSTK:
- fputs(_("\nError: ILL_BADSTK (Internal Stack Error)"), stdout);
- break;
-
- default:
- fputs(_("\nError: A general SIGILL signal was "
- "encountered."), stdout);
- break;
- }
+ case ILL_ILLADR:
+ fputs(_("\nError: ILL_ILLADR "
+ "(Illegal addressing mode)"), stdout);
+ break;
+
+ case ILL_ILLTRP:
+ fputs(_("\nError: ILL_ILLTRP "
+ "(Illegal Trap)"), stdout);
+ break;
+
+ case ILL_PRVOPC:
+ fputs(_("\nError: ILL_PRVOPC "
+ "(Privileged Opcode)"), stdout);
+ break;
+
+ case ILL_PRVREG:
+ fputs(_("\nError: ILL_PRVREG "
+ "(Privileged Register)"), stdout);
+ break;
+
+ case ILL_COPROC:
+ fputs(_("\nError: ILL_COPROC "
+ "(Coprocessor Error)"), stdout);
+ break;
+
+ case ILL_BADSTK:
+ fputs(_("\nError: ILL_BADSTK "
+ "(Internal Stack Error)"), stdout);
+ break;
+
+ default:
+ fputs(_("\nError: A general SIGILL "
+ "signal was encountered."), stdout);
+ break;
+ }
- abort ();
+ abort ();
}
+#else
+static void
+sigill_handler (int signum)
+{
+ signal (SIGILL, &sigill_handler);
+ mask_signal ();
+ printf (bug_msg, VERSION);
+ #ifdef HAVE_LIBREADLINE
+ _dump_history ();
+ #endif
+
+ abort ();
+}
+#endif /* SA_SIGINFO */
static char*
_readline (const char* prompt, const StrList* possibilities)
@@ -1235,7 +1287,7 @@ init_ui ()
readline_state.in_readline = 0;
#endif
-#ifdef HAVE_SIGACTION
+#ifdef SA_SIGACTION
sigset_t curr;
sigfillset (&curr);
@@ -1258,7 +1310,12 @@ init_ui ()
sigaction (SIGINT, &sig_int, NULL);
sigaction (SIGFPE, &sig_fpe, NULL);
sigaction (SIGILL, &sig_ill, NULL);
-#endif /* HAVE_SIGACTION */
+#else
+ signal (SIGSEGV, sigsegv_handler);
+ signal (SIGINT, sigint_handler);
+ signal (SIGFPE, sigfpe_handler);
+ signal (SIGILL, sigill_handler);
+#endif /* SA_SIGACTION */
return 1;
}
_______________________________________________
parted-devel mailing list
[email protected]
http://lists.alioth.debian.org/mailman/listinfo/parted-devel