[lxc-devel] [PATCH 5/8] Use container's proc to setup the utmp watching

Daniel Lezcano daniel.lezcano at free.fr
Sun Oct 3 21:46:34 UTC 2010


The <rootfs>/var/run/utmp is located in:

/proc/<containerinit>/root/var/run/utmp, let's use it.

Signed-off-by: Daniel Lezcano <dlezcano at fr.ibm.com>
---
 src/lxc/utmp.c |   30 +++++++++++++++++++-----------
 1 files changed, 19 insertions(+), 11 deletions(-)

diff --git a/src/lxc/utmp.c b/src/lxc/utmp.c
index dca9d72..e6249ce 100644
--- a/src/lxc/utmp.c
+++ b/src/lxc/utmp.c
@@ -82,8 +82,10 @@ static int utmp_handler(int fd, void *data, struct lxc_epoll_descr *descr)
 
 	struct lxc_utmp *utmp_data = (struct lxc_utmp *)data;
 
-	/* we're monitoring a directory. ie->name is not included in sizeof(struct inotify_event)
-	 * if we don't read it all at once, read gives us EINVAL, so we read and cast to struct ie
+	/*
+	 * we're monitoring a directory. ie->name is not included in
+	 * sizeof(struct inotify_event) if we don't read it all at once,
+	 * read gives us EINVAL, so we read and cast to struct ie
 	 */
 	char buffer[MAXPATHLEN];
 
@@ -100,7 +102,13 @@ static int utmp_handler(int fd, void *data, struct lxc_epoll_descr *descr)
 	ie = (struct inotify_event *)buffer;
 
 	if (ie->len <= 0) {
-		SYSERROR("inotify event with no name");
+
+		if (ie->mask & IN_UNMOUNT) {
+			DEBUG("watched directory removed");
+			goto out;
+		}
+
+		SYSERROR("inotify event with no name (mask %d)", ie->mask);
 		return -1;
 	}
 
@@ -161,10 +169,9 @@ static int utmp_get_runlevel(struct lxc_utmp *utmp_data)
 	struct utmpx *utmpx;
 	char path[MAXPATHLEN];
 	struct lxc_handler *handler = utmp_data->handler;
-	struct lxc_conf *conf = handler->conf;
 
-	if (snprintf(path, MAXPATHLEN, "%s/var/run/utmp", conf->rootfs.path) >
-	    MAXPATHLEN) {
+	if (snprintf(path, MAXPATHLEN, "/proc/%d/root/var/run/utmp",
+		     handler->pid) > MAXPATHLEN) {
 		ERROR("path is too long");
 		return -1;
 	}
@@ -211,19 +218,20 @@ static int utmp_get_ntasks(struct lxc_handler *handler)
 int lxc_utmp_mainloop_add(struct lxc_epoll_descr *descr,
 			  struct lxc_handler *handler)
 {
-	struct lxc_conf *conf = handler->conf;
 	char path[MAXPATHLEN];
 	int fd, wd;
 	struct lxc_utmp *utmp_data;
+	struct lxc_conf *conf = handler->conf;
 
 	if (!conf->rootfs.path)
 		return 0;
 
-	/* We set up a watch for the /var/run directory. We're only interested in
-	 * utmp at the moment, but want to watch for delete and create events as well.
+	/* We set up a watch for the /var/run directory. We're only interested
+	 * in utmp at the moment, but want to watch for delete and create
+	 * events as well.
 	 */
-	if (snprintf(path, MAXPATHLEN, "%s/var/run", conf->rootfs.path) >
-	    MAXPATHLEN) {
+	if (snprintf(path, MAXPATHLEN, "/proc/%d/root/var/run",
+		     handler->pid) > MAXPATHLEN) {
 		ERROR("path is too long");
 		return -1;
 	}
-- 
1.7.0.4





More information about the lxc-devel mailing list