From: Serge E. Hallyn Date: Sun, 7 Aug 2011 10:25:07 +0000 (+0200) Subject: Use container's /run/utmp if it exists X-Git-Tag: lxc-0.7.5~13 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4cb05a609b308f0ddf37a9f4bd65e1a37c6b607e;p=thirdparty%2Flxc.git Use container's /run/utmp if it exists If /var/run is a symlink to /run in the container, then opening /proc//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 Signed-off-by: Daniel Lezcano --- diff --git a/src/lxc/utmp.c b/src/lxc/utmp.c index 691c3ef9d..b6469b09a 100644 --- a/src/lxc/utmp.c +++ b/src/lxc/utmp.c @@ -170,6 +170,15 @@ static int utmp_get_runlevel(struct lxc_utmp *utmp_data) 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 @@ static int utmp_get_runlevel(struct lxc_utmp *utmp_data) return -1; } +utmp_ok: + setutxent(); while ((utmpx = getutxent())) { @@ -219,6 +230,7 @@ int lxc_utmp_mainloop_add(struct lxc_epoll_descr *descr, 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 @@ int lxc_utmp_mainloop_add(struct lxc_epoll_descr *descr, * 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 @@ int lxc_utmp_mainloop_add(struct lxc_epoll_descr *descr, return 0; } +run_ok: + utmp_data = (struct lxc_utmp *)malloc(sizeof(struct lxc_utmp)); if (NULL == utmp_data) {