[Lguest] [PATCH 2.6.23] lguest: LCA08 lguest tutorial - patch for Ctrl-Z suspend support (S-lzzz)

Mark Wallis lguest at markwallis.id.au
Thu Jan 31 12:42:10 EST 2008


Support in the lguest userpace utility for triple-Ctrl-Z. Three fast  
taps of Ctrl-Z will suspend the lguest VM.

Signed-off-by: Mark Wallis <lguest at markwallis.id.au>

--- lguest.orig	2008-01-31 12:23:53.000000000 +1100
+++ lguest.c	2008-01-31 12:23:37.000000000 +1100
@@ -689,7 +689,7 @@
  	tcsetattr(STDIN_FILENO, TCSANOW, &orig_term);
  }

-/* We associate some data with the console for our exit hack. */
+/* We associate some data with the console for our exit and suspend  
hacks. */
  struct console_abort
  {
  	/* How many times have they hit ^C? */
@@ -698,6 +698,12 @@
  	struct timeval start;
  };

+struct console_suspend
+{
+	int count;
+	struct timeval start;
+};
+
  /* This is the routine which handles console input (ie. stdin). */
  static bool handle_console_input(int fd, struct device *dev)
  {
@@ -706,6 +712,7 @@
  	unsigned int num;
  	struct iovec iov[LGUEST_MAX_DMA_SECTIONS];
  	struct console_abort *abort = dev->priv;
+	struct console_suspend *suspend = dev->priv;

  	/* First we get the console buffer from the Guest.  The key is dev- 
 >mem
  	 * which was set to 0 in setup_console(). */
@@ -757,9 +764,23 @@
  			}
  			abort->count = 0;
  		}
-	} else
-		/* Any other key resets the abort counter. */
+	} else if (len == 1 && ((char *)iov[0].iov_base)[0] == 26) {
+		if (!suspend->count++)
+			gettimeofday(&suspend->start, NULL);
+		else if (suspend->count == 3) {
+			struct timeval now;
+			gettimeofday(&now, NULL);
+			if (now.tv_sec <= suspend->start.tv_sec+1) {
+				// Suspend the lguest process
+				kill(getpid(), SIGSTOP);
+				cfmakeraw(&orig_term);
+			}
+			suspend->count = 0;
+		}
+	} else {
+		suspend->count = 0;
  		abort->count = 0;
+	}

  	/* Now, if we didn't read anything, put the input terminal back and
  	 * return failure (meaning, don't call us again). */








More information about the Lguest mailing list