Commit 0728ebf4 by Tycho Andersen

autodev: don't always create /dev/console

In particular, only create /dev/console when it is set to "none". Otherwise, we will bind mount a pts device later, so let's just leave it. Also, when bind mounting the pts device, let's create /dev/console if it doesn't exist, since it may not already exist due to the above :) v2: s/ot/to v3: add O_EXCL so we actually get EEXIST, use the right condition for mount_console (we want to compare against console.path, not console.name, and console.path can be null) Signed-off-by: 's avatarTycho Andersen <tycho.andersen@canonical.com>
parent b3e4df8a
...@@ -1130,7 +1130,7 @@ static const struct lxc_devs lxc_devs[] = { ...@@ -1130,7 +1130,7 @@ static const struct lxc_devs lxc_devs[] = {
{ "console", S_IFCHR | S_IRUSR | S_IWUSR, 5, 1 }, { "console", S_IFCHR | S_IRUSR | S_IWUSR, 5, 1 },
}; };
static int fill_autodev(const struct lxc_rootfs *rootfs) static int fill_autodev(const struct lxc_rootfs *rootfs, bool mount_console)
{ {
int ret; int ret;
char path[MAXPATHLEN]; char path[MAXPATHLEN];
...@@ -1152,6 +1152,10 @@ static int fill_autodev(const struct lxc_rootfs *rootfs) ...@@ -1152,6 +1152,10 @@ static int fill_autodev(const struct lxc_rootfs *rootfs)
cmask = umask(S_IXUSR | S_IXGRP | S_IXOTH); cmask = umask(S_IXUSR | S_IXGRP | S_IXOTH);
for (i = 0; i < sizeof(lxc_devs) / sizeof(lxc_devs[0]); i++) { for (i = 0; i < sizeof(lxc_devs) / sizeof(lxc_devs[0]); i++) {
const struct lxc_devs *d = &lxc_devs[i]; const struct lxc_devs *d = &lxc_devs[i];
if (!strcmp(d->name, "console") && !mount_console)
continue;
ret = snprintf(path, MAXPATHLEN, "%s/dev/%s", rootfs->path ? rootfs->mount : "", d->name); ret = snprintf(path, MAXPATHLEN, "%s/dev/%s", rootfs->path ? rootfs->mount : "", d->name);
if (ret < 0 || ret >= MAXPATHLEN) if (ret < 0 || ret >= MAXPATHLEN)
return -1; return -1;
...@@ -1395,8 +1399,7 @@ static int setup_dev_console(const struct lxc_rootfs *rootfs, ...@@ -1395,8 +1399,7 @@ static int setup_dev_console(const struct lxc_rootfs *rootfs,
const struct lxc_console *console) const struct lxc_console *console)
{ {
char path[MAXPATHLEN]; char path[MAXPATHLEN];
struct stat s; int ret, fd;
int ret;
ret = snprintf(path, sizeof(path), "%s/dev/console", rootfs->mount); ret = snprintf(path, sizeof(path), "%s/dev/console", rootfs->mount);
if (ret >= sizeof(path)) { if (ret >= sizeof(path)) {
...@@ -1404,9 +1407,14 @@ static int setup_dev_console(const struct lxc_rootfs *rootfs, ...@@ -1404,9 +1407,14 @@ static int setup_dev_console(const struct lxc_rootfs *rootfs,
return -1; return -1;
} }
if (access(path, F_OK)) { fd = open(path, O_CREAT | O_EXCL, S_IXUSR | S_IXGRP | S_IXOTH);
WARN("rootfs specified but no console found at '%s'", path); if (fd < 0) {
return 0; if (errno != EEXIST) {
SYSERROR("failed to create console");
return -1;
}
} else {
close(fd);
} }
if (console->master < 0) { if (console->master < 0) {
...@@ -1414,14 +1422,9 @@ static int setup_dev_console(const struct lxc_rootfs *rootfs, ...@@ -1414,14 +1422,9 @@ static int setup_dev_console(const struct lxc_rootfs *rootfs,
return 0; return 0;
} }
if (stat(path, &s)) { if (chmod(console->name, S_IXUSR | S_IXGRP | S_IXOTH)) {
SYSERROR("failed to stat '%s'", path);
return -1;
}
if (chmod(console->name, s.st_mode)) {
SYSERROR("failed to set mode '0%o' to '%s'", SYSERROR("failed to set mode '0%o' to '%s'",
s.st_mode, console->name); S_IXUSR | S_IXGRP | S_IXOTH, console->name);
return -1; return -1;
} }
...@@ -3749,11 +3752,13 @@ int lxc_setup(struct lxc_handler *handler) ...@@ -3749,11 +3752,13 @@ int lxc_setup(struct lxc_handler *handler)
} }
if (lxc_conf->autodev > 0) { if (lxc_conf->autodev > 0) {
bool mount_console = lxc_conf->console.path && !strcmp(lxc_conf->console.path, "none");
if (run_lxc_hooks(name, "autodev", lxc_conf, lxcpath, NULL)) { if (run_lxc_hooks(name, "autodev", lxc_conf, lxcpath, NULL)) {
ERROR("failed to run autodev hooks for container '%s'.", name); ERROR("failed to run autodev hooks for container '%s'.", name);
return -1; return -1;
} }
if (fill_autodev(&lxc_conf->rootfs)) { if (fill_autodev(&lxc_conf->rootfs, mount_console)) {
ERROR("failed to populate /dev in the container"); ERROR("failed to populate /dev in the container");
return -1; return -1;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment