[Lxc-users] Use container's /run/utmp if it exists

Serge E. Hallyn serge.hallyn at canonical.com
Thu Jul 28 18:20:03 UTC 2011


If /var/run is a symlink to /run in the container, then opening
/proc/<pid>/root/var/run/utmp will end up opening the host's utmp.
Therefore the hack detecting shutdown through utmp fails.

Signed-off-by: Serge Hallyn <serge.hallyn at canonical.com>

Index: lxc/src/lxc/utmp.c
===================================================================
--- lxc.orig/src/lxc/utmp.c	2011-07-28 12:16:21.973116768 -0500
+++ lxc/src/lxc/utmp.c	2011-07-28 12:50:47.295227858 -0500
@@ -170,6 +170,15 @@
 	char path[MAXPATHLEN];
 	struct lxc_handler *handler = utmp_data->handler;
 
+	if (snprintf(path, MAXPATHLEN, "/proc/%d/root/run/utmp",
+		     handler->pid) > MAXPATHLEN) {
+		ERROR("path is too long");
+		return -1;
+	}
+
+	if (!access(path, F_OK) && !utmpxname(path))
+		goto utmp_ok;
+
 	if (snprintf(path, MAXPATHLEN, "/proc/%d/root/var/run/utmp",
 		     handler->pid) > MAXPATHLEN) {
 		ERROR("path is too long");
@@ -181,6 +190,8 @@
 		return -1;
 	}
 
+utmp_ok:
+
 	setutxent();
 
 	while ((utmpx = getutxent())) {
@@ -219,6 +230,7 @@
 			  struct lxc_handler *handler)
 {
 	char path[MAXPATHLEN];
+	char path2[MAXPATHLEN];
 	int fd, wd;
 	struct lxc_utmp *utmp_data;
 	struct lxc_conf *conf = handler->conf;
@@ -230,6 +242,19 @@
 	 * in utmp at the moment, but want to watch for delete and create
 	 * events as well.
 	 */
+	if (snprintf(path, MAXPATHLEN, "/proc/%d/root/run",
+		     handler->pid) > MAXPATHLEN) {
+		ERROR("path is too long");
+		return -1;
+	}
+	if (snprintf(path2, MAXPATHLEN, "/proc/%d/root/run/utmp",
+		     handler->pid) > MAXPATHLEN) {
+		ERROR("path is too long");
+		return -1;
+	}
+	if (!access(path2, F_OK))
+		goto run_ok;
+
 	if (snprintf(path, MAXPATHLEN, "/proc/%d/root/var/run",
 		     handler->pid) > MAXPATHLEN) {
 		ERROR("path is too long");
@@ -241,6 +266,8 @@
 		return 0;
 	}
 
+run_ok:
+
 	utmp_data = (struct lxc_utmp *)malloc(sizeof(struct lxc_utmp));
 
 	if (NULL == utmp_data) {




More information about the lxc-users mailing list