mirror of
https://git.proxmox.com/git/mirror_lxc
synced 2025-08-13 05:37:24 +00:00
Use container's /run/utmp if it exists
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@canonical.com> Signed-off-by: Daniel Lezcano <dlezcano@fr.ibm.com>
This commit is contained in:
parent
3e9c97c17a
commit
4cb05a609b
@ -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) {
|
||||
|
Loading…
Reference in New Issue
Block a user