WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-devel

[Xen-devel] [PATCH] xenconsole: add file lock to xenconsole

To: xen-devel@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-devel] [PATCH] xenconsole: add file lock to xenconsole
From: Yufang Zhang <yuzhang@xxxxxxxxxx>
Date: Tue, 24 May 2011 22:13:22 +0800
Cc: pbonzini@xxxxxxxxxx, yuzhang@xxxxxxxxxx, yufang521247@xxxxxxxxx, stefano.stabellini@xxxxxxxxxxxxx
Delivery-date: Tue, 24 May 2011 07:16:25 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
This patch add a file lock to xenconsole for each console id, so
that only one console could be attached to a guest at a time.
Otherwise, consoles would get stuck and print strange outputs.

Signed-off-by: Yufang Zhang <yuzhang@xxxxxxxxxx>
---
 tools/console/client/main.c |   31 +++++++++++++++++++++++++++++++
 1 files changed, 31 insertions(+), 0 deletions(-)

diff --git a/tools/console/client/main.c b/tools/console/client/main.c
index df3636f..d7461a8 100644
--- a/tools/console/client/main.c
+++ b/tools/console/client/main.c
@@ -46,6 +46,28 @@
 
 static volatile sig_atomic_t received_signal = 0;
 
+static int console_locked(const char *file)
+{
+        int fd;
+
+        fd = open(file, O_RDWR | O_CREAT, S_IRUSR|S_IWUSR);
+        if (fd == -1) {
+                fprintf(stderr,"can't open lock file: %s\n", file);
+                exit(1);
+        }
+
+        if (lockf(fd, F_TLOCK, 0) == -1) {
+            if ( errno == EACCES || errno == EAGAIN ) {
+                close(fd);
+                return (1);
+            }
+            fprintf(stderr,"can't lock file: %s\n", file);
+            exit(1);
+        }
+
+        return (0);
+}
+
 static void sighandler(int signum)
 {
        received_signal = 1;
@@ -280,6 +302,7 @@ int main(int argc, char **argv)
        int spty, xsfd;
        struct xs_handle *xs;
        char *end;
+        char buf[100];
        console_type type = CONSOLE_INVAL;
 
        while((ch = getopt_long(argc, argv, sopt, lopt, &opt_ind)) != -1) {
@@ -368,6 +391,13 @@ int main(int argc, char **argv)
                exit(EINVAL);
        }
 
+        /* Make sure only one console is attached to guest */
+        sprintf(buf, "/tmp/xenconsole-%d-%d", domid, num);
+        if (console_locked(buf) == 1) {
+                fprintf(stderr, "Another console has already been attached to 
guest\n");
+                exit(EINVAL);
+        }
+
        /* Set a watch on this domain's console pty */
        if (!xs_watch(xs, path, ""))
                err(errno, "Can't set watch for console pty");
@@ -387,6 +417,7 @@ int main(int argc, char **argv)
        console_loop(spty, xs, path);
        restore_term(STDIN_FILENO, &attr);
 
+        unlink(buf);
        free(path);
        free(dom_path);
        return 0;
-- 
1.7.4.4


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel

<Prev in Thread] Current Thread [Next in Thread>