All of lore.kernel.org
 help / color / mirror / Atom feed
* [uml-devel] patch for mconsole to interrupt for gdb
@ 2005-08-26 19:39 Allan Graves
  0 siblings, 0 replies; only message in thread
From: Allan Graves @ 2005-08-26 19:39 UTC (permalink / raw)
  To: user-mode-linux-devel

[-- Attachment #1: Type: text/plain, Size: 73 bytes --]

Jeff,
Here's the patch for mconsole to make it interrupt for gdb. 
Allan

[-- Attachment #2: interrupt.patch --]
[-- Type: text/plain, Size: 3039 bytes --]

--- uml_mconsole.c.orig	2005-08-26 13:08:33.000000000 -0400
+++ uml_mconsole.c	2005-08-26 15:32:31.000000000 -0400
@@ -37,13 +37,20 @@
 #include <sys/uio.h>
 #include <readline/readline.h>
 #include <readline/history.h>
+#include <signal.h>
+
 
 static char uml_name[11];
 static struct sockaddr_un sun;
+static long int uml_pid;
 
-static int do_switch(char *file, char *name)
+static int do_switch(char *dir, char *file, char *name)
 {
   struct stat buf;
+  char pid_path[MAXPATHLEN + 1]="";
+  FILE *fd;
+  char pid[32]="";
+  int x=-1;
 
   if(stat(file, &buf) == -1){
     fprintf(stderr, "Warning: couldn't stat file: %s - ", file);
@@ -53,6 +60,24 @@
   sun.sun_family = AF_UNIX;
   strncpy(sun.sun_path, file, sizeof(sun.sun_path));
   strncpy(uml_name, name, sizeof(uml_name));
+
+  /* Open and read PID file */
+  snprintf(pid_path, sizeof(pid_path), "%s/%s/pid", dir, name);
+  if(!(fd=fopen(pid_path, "r"))) {
+    uml_pid=-1;
+    return(0);
+  }
+  while (!feof(fd) && !ferror(fd)) {
+    fread(&pid[++x], sizeof(char), 1, fd);
+  }
+  /* Convert read PID to number, or set PID to known error number */
+  if (feof(fd) && !ferror(fd) ) {
+    uml_pid=strtol(pid, NULL, 10);
+  }
+  else {
+    uml_pid=-1;
+    return(0);
+  }
   return(0);
 }
 
@@ -65,19 +90,22 @@
     snprintf(dir, sizeof(dir), "%s/.uml", home);
     snprintf(file, sizeof(file), "%s/%s/mconsole", dir, name);
     if(strncmp(name, dir, strlen(dir))){
-      if(!do_switch(file, name)) return(0);
+      if(!do_switch(dir,file, name)) return(0);
       try_file = 0;
     }
   }
 
+  snprintf(dir, sizeof(dir), "/tmp/uml/%s", name);
   snprintf(tmp, sizeof(tmp), "/tmp/uml/%s/mconsole", name);
   if(strncmp(name, "/tmp/uml/", strlen("/tmp/uml/"))){
-    if(!do_switch(tmp, name)) return(0);
+    if(!do_switch(dir,tmp, name)) return(0);
   }
 
-  if(!do_switch(name, name)) return(0);
+
+  snprintf(dir, sizeof(dir), "./");
+  if(!do_switch(dir, name, name)) return(0);
   if(!try_file) return(-1);
-  return(do_switch(file, name));
+  return(do_switch(dir,file, name));
 }
 
 #define MCONSOLE_MAGIC (0xcafebabe)
@@ -264,7 +292,8 @@
     quit - Quit mconsole\n\
     switch <socket-name> - Switch control to the given machine\n\
     log -f <filename> - use contents of <filename> as UML log messages\n\
-    mconsole-version - version of this mconsole program\n";
+    mconsole-version - version of this mconsole program\n\
+    int  - Interrupt UML session \n";
 
 static int help_cmd(int fd, char *command)
 {
@@ -344,6 +373,19 @@
   return(0);
 }
 
+static int int_cmd(int fd, char *command)
+{
+
+  if (uml_pid == -1) {
+    printf("Cannot determine the PID of your UML session, not sending signal.\n");
+    return(0);
+  }
+
+  kill(uml_pid, SIGINT);
+
+  return(0);
+}
+
 struct cmd {
   char *command;
   int (*proc)(int, char *);
@@ -355,6 +397,7 @@
   { "switch", switch_cmd },
   { "log", log_cmd },
   { "mconsole-version", mversion_cmd },
+  { "int", int_cmd },
   { NULL, default_cmd }
   /* default_cmd means "send it to the UML" */
 };

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2005-08-26 19:39 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2005-08-26 19:39 [uml-devel] patch for mconsole to interrupt for gdb Allan Graves

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.