linux-um archives
 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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox