[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