[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [PATCH] xenconsole: Ensure exclusive access to console using locks



If more than one instance of xenconsole is run against the same DOMID
then each instance will only get some data. This change ensures
exclusive access to the console by creating and obtaining an exclusive
lock on <XEN_LOCK_DIR>/xenconsole.<DOMID>.

Signed-off-by: Martin Lucina <martin@xxxxxxxxxx>
Cc: Ian Jackson <ian.jackson@xxxxxxxxxxxxx>
Cc: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx>
Cc: Ian Campbell <ian.campbell@xxxxxxxxxx>
Cc: Wei Liu <wei.liu2@xxxxxxxxxx>
---
 tools/console/Makefile      |  2 +-
 tools/console/client/main.c | 31 +++++++++++++++++++++++++++++++
 2 files changed, 32 insertions(+), 1 deletion(-)

diff --git a/tools/console/Makefile b/tools/console/Makefile
index 71f8088..b6a51eb 100644
--- a/tools/console/Makefile
+++ b/tools/console/Makefile
@@ -3,7 +3,7 @@ include $(XEN_ROOT)/tools/Rules.mk
 
 CFLAGS  += -Werror
 
-CFLAGS  += $(CFLAGS_libxenctrl)
+CFLAGS  += $(CFLAGS_libxenctrl) -I$(XEN_ROOT)/tools/libxc
 CFLAGS  += $(CFLAGS_libxenstore)
 LDLIBS += $(LDLIBS_libxenctrl)
 LDLIBS += $(LDLIBS_libxenstore)
diff --git a/tools/console/client/main.c b/tools/console/client/main.c
index 753b3aa..709abc1 100644
--- a/tools/console/client/main.c
+++ b/tools/console/client/main.c
@@ -18,6 +18,7 @@
  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 \*/
 
+#include <sys/file.h>
 #include <sys/types.h>
 #include <sys/socket.h>
 #include <sys/un.h>
@@ -40,10 +41,13 @@
 
 #include <xenstore.h>
 #include "xenctrl.h"
+#include "_paths.h"
 
 #define ESCAPE_CHARACTER 0x1d
 
 static volatile sig_atomic_t received_signal = 0;
+static char *lockfile = NULL;
+static int lockfd = -1;
 
 static void sighandler(int signum)
 {
@@ -267,6 +271,30 @@ static void restore_term_stdin(void)
        restore_term(STDIN_FILENO, &stdin_old_attr);
 }
 
+static void console_lock(int domid)
+{
+       lockfile = malloc(PATH_MAX);
+       if (lockfile == NULL)
+               err(ENOMEM, "malloc");
+       snprintf(lockfile, PATH_MAX - 1, "%s/xenconsole.%d", XEN_LOCK_DIR, 
domid);
+
+       lockfd = open(lockfile, O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);
+       if (lockfd == -1)
+               err(errno, "Could not open %s", lockfile);
+       if (flock(lockfd, LOCK_EX|LOCK_NB) != 0)
+               err(errno, "Could not lock %s", lockfile);
+}
+
+static void console_unlock(void)
+{
+       if (lockfd != -1) {
+               flock(lockfd, LOCK_UN);
+               close(lockfd);
+       }
+       if (lockfile != NULL)
+               unlink(lockfile);
+}
+
 int main(int argc, char **argv)
 {
        struct termios attr;
@@ -382,6 +410,9 @@ int main(int argc, char **argv)
                exit(EINVAL);
        }
 
+       console_lock(domid);
+       atexit(console_unlock);
+
        /* Set a watch on this domain's console pty */
        if (!xs_watch(xs, path, ""))
                err(errno, "Can't set watch for console pty");
-- 
2.1.4


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.