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
[email protected]
https://lists.sourceforge.net/lists/listinfo/suspend-devel