Hi, Here is an updated patch:
Index: splash.c =================================================================== RCS file: /cvsroot/suspend/suspend/splash.c,v retrieving revision 1.4 diff -u -r1.4 splash.c --- splash.c 18 Sep 2006 12:00:09 -0000 1.4 +++ splash.c 10 Jan 2007 11:43:45 -0000 @@ -16,6 +16,8 @@ #include "bootsplash.h" #include "splashy_funcs.h" #include "encrypt.h" +#include <unistd.h> +#include <termios.h> /** * dummy functions in case if no splash system was found or @@ -32,6 +34,36 @@ printf(prompt); return getchar(); } +static int prepare_abort(struct termios *oldtrm, struct termios *newtrm) +{ + int ret; + + ret = tcgetattr(0, oldtrm); + if (!ret) { + *newtrm = *oldtrm; + newtrm->c_cc[VMIN] = 0; + newtrm->c_cc[VTIME] = 1; + newtrm->c_iflag = IGNBRK | IGNPAR | ICRNL | IMAXBEL; + newtrm->c_lflag = 0; + ret = tcsetattr(0, TCSANOW, newtrm); + } + + return ret; +} + +static int key_pressed(const char key) +{ + char c; + if (read(0, &c, 1) > 0 && c == key) + return 1; + + return 0; +} + +static void restore_abort(struct termios *oldtrm) +{ + tcsetattr(0, TCSANOW, oldtrm); +} /* Tries to find a splash system and initializes interface functions */ void splash_prepare(struct splash *splash, int enabled) @@ -47,6 +79,9 @@ #else splash->read_password = splash_dummy_readpass; #endif + splash->prepare_abort = prepare_abort; + splash->restore_abort = restore_abort; + splash->key_pressed = key_pressed; if (!enabled) return; Index: splash.h =================================================================== RCS file: /cvsroot/suspend/suspend/splash.h,v retrieving revision 1.3 diff -u -r1.3 splash.h --- splash.h 18 Sep 2006 12:00:09 -0000 1.3 +++ splash.h 10 Jan 2007 11:43:45 -0000 @@ -12,6 +12,8 @@ #ifndef SPLASH_H #define SPLASH_H +#include <termios.h> + /* generic interface functions for an arbitary splash method */ struct splash { int (*finish) (void); @@ -19,6 +21,9 @@ void (*switch_to) (void); void (*read_password) (char *, int); int (*dialog) (const char *); + int (*prepare_abort) (struct termios *, struct termios *); + int (*key_pressed) (const char key); + void (*restore_abort) (struct termios *); }; void splash_prepare(struct splash *splash, int enabled); Index: suspend.c =================================================================== RCS file: /cvsroot/suspend/suspend/suspend.c,v retrieving revision 1.65 diff -u -r1.65 suspend.c --- suspend.c 7 Nov 2006 21:13:33 -0000 1.65 +++ suspend.c 10 Jan 2007 11:43:45 -0000 @@ -446,7 +446,6 @@ unsigned int m, writeout_rate; int ret, abort_possible; struct termios newtrm, savedtrm; - char c = 0; int error = 0; /* Switch the state of the terminal so that we can read the keyboard @@ -454,15 +453,8 @@ * * stdin must be attached to the terminal now. */ - abort_possible = !tcgetattr(0, &savedtrm); - if (abort_possible) { - newtrm = savedtrm; - newtrm.c_cc[VMIN] = 0; - newtrm.c_cc[VTIME] = 1; - newtrm.c_iflag = IGNBRK | IGNPAR | ICRNL | IMAXBEL; - newtrm.c_lflag = 0; - abort_possible = !tcsetattr(0, TCSANOW, &newtrm); - } + abort_possible = !splash.prepare_abort(&savedtrm, &newtrm); + if (abort_possible) printf("suspend: Saving %u image data pages " "(press " ABORT_KEY_NAME " to abort) ... ", @@ -491,13 +483,11 @@ if (!(nr_pages % m)) { printf("\b\b\b\b%3d%%", nr_pages / m); splash.progress(20 + (nr_pages / m) * 0.75); - if (abort_possible) { - ret = read(0, &c, 1); - if (ret > 0 && c == ABORT_KEY_CODE) { - printf(" aborted!\n"); - return -EINTR; - } - ret = 1; + if (abort_possible && + splash.key_pressed(ABORT_KEY_CODE)) { + + printf(" aborted!\n"); + return -EINTR; } } if (!(nr_pages % writeout_rate)) @@ -513,7 +503,7 @@ printf(" done (%u pages)\n", nr_pages); if (abort_possible) - tcsetattr(0, TCSANOW, &savedtrm); + splash.restore_abort(&savedtrm); return error; } ------------------------------------------------------------------------- Take Surveys. Earn Cash. Influence the Future of IT Join SourceForge.net's Techsay panel and you'll get the chance to share your opinions on IT & business topics through brief surveys - and earn cash http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV _______________________________________________ Suspend-devel mailing list Suspend-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/suspend-devel