Unverified Commit 4de4ec76 by Christian Brauner Committed by Stéphane Graber

conf: non-functional changes to setup_pts()

parent 4645c74c
......@@ -1394,50 +1394,67 @@ static int setup_pivot_root(const struct lxc_rootfs *rootfs)
return 0;
}
static int setup_pts(int pts)
static int lxc_setup_devpts(int num_pts)
{
int ret;
char target[PATH_MAX];
char *devpts_mntopts = "newinstance,ptmxmode=0666,mode=0620,gid=5";
if (!pts)
if (!num_pts) {
DEBUG("no new devpts instance will be mounted since no pts "
"devices are requested");
return 0;
if (!access("/dev/pts/ptmx", F_OK) && umount("/dev/pts")) {
SYSERROR("failed to umount 'dev/pts'");
return -1;
}
if (mkdir("/dev/pts", 0755)) {
if ( errno != EEXIST ) {
SYSERROR("failed to create '/dev/pts'");
return -1;
ret = access("/dev/pts/ptmx", F_OK);
if (!ret) {
/* Unmount old devpts instance. */
ret = umount("/dev/pts");
if (ret < 0) {
SYSERROR("failed to unmount old devpts instance");
return -1;
}
DEBUG("unmounted old /dev/pts instance");
}
if (mount("devpts", "/dev/pts", "devpts", MS_MGC_VAL,
"newinstance,ptmxmode=0666,mode=0620,gid=5")) {
SYSERROR("failed to mount a new instance of '/dev/pts'");
/* Create mountpoint for devpts instance. */
ret = mkdir("/dev/pts", 0755);
if (ret < 0 && errno != EEXIST) {
SYSERROR("failed to create the \"/dev/pts\" directory");
return -1;
}
if (access("/dev/ptmx", F_OK)) {
if (!symlink("/dev/pts/ptmx", "/dev/ptmx"))
goto out;
SYSERROR("failed to symlink '/dev/pts/ptmx'->'/dev/ptmx'");
/* Mount new devpts instance. */
ret = mount("devpts", "/dev/pts", "devpts", MS_MGC_VAL, devpts_mntopts);
if (ret < 0) {
SYSERROR("failed to mount new devpts instance");
return -1;
}
ret = access("/dev/ptmx", F_OK);
if (ret < 0) {
ret = symlink("/dev/pts/ptmx", "/dev/ptmx");
if (!ret) {
DEBUG("created symlink \"/dev/ptmx\" -> \"/dev/pts/ptmx\"");
goto success;
}
SYSERROR("failed to create symlink \"/dev/ptmx\" -> \"/dev/pts/ptmx\"");
return -1;
}
/* Check if any existing symlink is valid. */
if (realpath("/dev/ptmx", target) && !strcmp(target, "/dev/pts/ptmx"))
goto out;
goto success;
/* fallback here, /dev/pts/ptmx exists just mount bind */
if (mount("/dev/pts/ptmx", "/dev/ptmx", "none", MS_BIND, 0)) {
SYSERROR("mount failed '/dev/pts/ptmx'->'/dev/ptmx'");
/* Fallback here, /dev/pts/ptmx exists so just bind mount it. */
ret = mount("/dev/pts/ptmx", "/dev/ptmx", "none", MS_BIND, 0);
if (ret < 0) {
SYSERROR("failed to bind mount \"/dev/pts/ptmx\" to \"/dev/ptmx\"");
return -1;
}
INFO("created new pts instance");
out:
success:
INFO("created new devpts instance");
return 0;
}
......@@ -4015,7 +4032,7 @@ int lxc_setup(struct lxc_handler *handler)
return -1;
}
if (setup_pts(lxc_conf->pts)) {
if (lxc_setup_devpts(lxc_conf->pts)) {
ERROR("failed to setup the new pts instance");
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