From mboxrd@z Thu Jan 1 00:00:00 1970 From: Martin Lucina Subject: [PATCH] xenconsole: Ensure exclusive access to console using locks Date: Fri, 24 Jul 2015 14:51:50 +0200 Message-ID: <1437742310-14193-1-git-send-email-martin@lucina.net> References: <1437738262.24746.79.camel@citrix.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: Received: from mail6.bemta5.messagelabs.com ([195.245.231.135]) by lists.xen.org with esmtp (Exim 4.72) (envelope-from ) id 1ZIcSC-0001fX-5z for xen-devel@lists.xenproject.org; Fri, 24 Jul 2015 12:51:56 +0000 In-Reply-To: <1437738262.24746.79.camel@citrix.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: xen-devel@lists.xenproject.org Cc: Wei Liu , Martin Lucina , Ian Jackson , Ian Campbell , Stefano Stabellini List-Id: xen-devel@lists.xenproject.org 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 /xenconsole.. Signed-off-by: Martin Lucina Cc: Ian Jackson Cc: Stefano Stabellini Cc: Ian Campbell Cc: Wei Liu --- 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 #include #include #include @@ -40,10 +41,13 @@ #include #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