static int lxc_setup_devpts(struct lxc_conf *conf)
{
int ret;
- char default_devpts_mntopts[] = "gid=5,newinstance,ptmxmode=0666,mode=0620";
+ char **opts;
char devpts_mntopts[256];
+ char *mntopt_sets[5];
+ char default_devpts_mntopts[256] = "gid=5,newinstance,ptmxmode=0666,mode=0620";
if (conf->pty_max <= 0) {
DEBUG("No new devpts instance will be mounted since no pts "
return -1;
}
- /* mount new devpts instance */
- ret = mount("devpts", "/dev/pts", "devpts", MS_NOSUID | MS_NOEXEC, devpts_mntopts);
- if (ret < 0) {
- /* try mounting without "max" */
- if (errno == EINVAL) {
- devpts_mntopts[sizeof(default_devpts_mntopts) - 1] = '\0';
- ret = mount("devpts", "/dev/pts", "devpts",
- MS_NOSUID | MS_NOEXEC, devpts_mntopts);
- if (ret < 0) {
- SYSERROR("Failed to mount new devpts instance");
- return -1;
- }
- }
+ /* gid=5 && max= */
+ mntopt_sets[0] = devpts_mntopts;
- /* try mounting without gid=5 */
- ret = mount("devpts", "/dev/pts", "devpts", MS_NOSUID | MS_NOEXEC,
- devpts_mntopts + sizeof("gid=5"));
- if (ret < 0) {
- SYSERROR("Failed to mount new devpts instance");
- return -1;
- }
+ /* !gid=5 && max= */
+ mntopt_sets[1] = devpts_mntopts + sizeof("gid=5");
+
+ /* gid=5 && !max= */
+ mntopt_sets[2] = default_devpts_mntopts;
+
+ /* !gid=5 && !max= */
+ mntopt_sets[3] = default_devpts_mntopts + sizeof("gid=5");
+
+ /* end */
+ mntopt_sets[4] = NULL;
+
+ for (ret = -1, opts = mntopt_sets; opts && *opts; opts++) {
+ /* mount new devpts instance */
+ ret = mount("devpts", "/dev/pts", "devpts", MS_NOSUID | MS_NOEXEC, *opts);
+ if (ret == 0)
+ break;
+ }
+
+ if (ret < 0) {
+ SYSERROR("Failed to mount new devpts instance");
+ return -1;
}
- DEBUG("Mount new devpts instance with options \"%s\"", devpts_mntopts);
+ DEBUG("Mount new devpts instance with options \"%s\"", *opts);
/* Remove any pre-existing /dev/ptmx file. */
ret = remove("/dev/ptmx");