]> git.ipfire.org Git - thirdparty/lxc.git/commitdiff
conf: stash pty_nr in struct lxc_terminal
authorChristian Brauner <christian.brauner@ubuntu.com>
Fri, 30 Jul 2021 07:07:50 +0000 (09:07 +0200)
committerChristian Brauner <christian.brauner@ubuntu.com>
Fri, 30 Jul 2021 07:07:50 +0000 (09:07 +0200)
Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com>
src/lxc/conf.c
src/lxc/terminal.c
src/lxc/terminal.h

index 9e50692396a9ed08fc2e6cc3da1d0ed397ee110a..78f59e24a53cbf4eaac94982c5b808daf90c2816 100644 (file)
@@ -1087,14 +1087,17 @@ static int lxc_allocate_ttys(struct lxc_conf *conf)
                return -ENOMEM;
 
        for (size_t i = 0; i < conf->ttys.max; i++) {
+               int pty_nr = -1;
                struct lxc_terminal_info *tty = &ttys->tty[i];
 
-               ret = lxc_devpts_terminal(conf->devpts_fd, conf, &tty->ptx, &tty->pty, tty->name);
+               ret = lxc_devpts_terminal(conf->devpts_fd, conf, &tty->ptx,
+                                         &tty->pty, &pty_nr);
                if (ret < 0) {
                        conf->ttys.max = i;
                        return syserror_set(-ENOTTY, "Failed to create tty %zu", i);
                }
-               DEBUG("Created tty with ptx fd %d and pty fd %d", tty->ptx, tty->pty);
+               DEBUG("Created tty with ptx fd %d and pty fd %d and index %d",
+                     tty->ptx, tty->pty, pty_nr);
                tty->busy = -1;
        }
 
@@ -3246,6 +3249,7 @@ struct lxc_conf *lxc_conf_init(void)
        new->console.proxy.pty = -1;
        new->console.ptx = -EBADF;
        new->console.pty = -EBADF;
+       new->console.pty_nr = -1;
        new->console.name[0] = '\0';
        new->devpts_fd = -EBADF;
        memset(&new->console.ringbuf, 0, sizeof(struct lxc_ringbuf));
index 3125846404f4e25b4d5769d5eab75fd37fe4be32..f89c726f8d542fb908109ab325c7299b1c69f356 100644 (file)
@@ -767,6 +767,8 @@ void lxc_terminal_delete(struct lxc_terminal *terminal)
                close(terminal->pty);
        terminal->pty = -1;
 
+       terminal->pty_nr = -1;
+
        if (terminal->log_fd >= 0)
                close(terminal->log_fd);
        terminal->log_fd = -1;
@@ -910,7 +912,7 @@ err:
 }
 
 int lxc_devpts_terminal(int devpts_fd, struct lxc_conf *conf,
-                       int *ret_ptx, int *ret_pty, char buf[static PATH_MAX])
+                       int *ret_ptx, int *ret_pty, int *ret_pty_nr)
 {
        __do_close int fd_ptx = -EBADF, fd_opath_pty = -EBADF, fd_pty = -EBADF;
        int pty_nr = -1;
@@ -957,12 +959,9 @@ int lxc_devpts_terminal(int devpts_fd, struct lxc_conf *conf,
        if (!same_file_lax(fd_pty, fd_opath_pty))
                return syswarn_set(-ENODEV, "Terminal file descriptor changed");
 
-       ret = strnprintf(buf, PATH_MAX, "dev/pts/%d", pty_nr);
-       if (ret < 0)
-               return syswarn_set(-ENODEV, "Failed to create terminal pty name");
-
        *ret_ptx = move_fd(fd_ptx);
        *ret_pty = move_fd(fd_pty);
+       *ret_pty_nr = pty_nr;
        return 0;
 }
 
@@ -978,10 +977,15 @@ static int lxc_terminal_create_native(const char *name, const char *lxcpath,
                return log_error_errno(-1, errno, "Failed to receive devpts fd");
 
        ret = lxc_devpts_terminal(devpts_fd, conf, &terminal->ptx,
-                                 &terminal->pty, terminal->name);
+                                 &terminal->pty, &terminal->pty_nr);
        if (ret < 0)
                return ret;
 
+       ret = strnprintf(terminal->name, sizeof(terminal->name),
+                        "/dev/pts/%d", terminal->pty_nr);
+       if (ret < 0)
+               return syserror("Failed to create path");
+
        ret = lxc_terminal_peer_default(terminal);
        if (ret < 0) {
                lxc_terminal_delete(terminal);
@@ -1270,6 +1274,7 @@ void lxc_terminal_info_init(struct lxc_terminal_info *terminal)
 void lxc_terminal_init(struct lxc_terminal *terminal)
 {
        memset(terminal, 0, sizeof(*terminal));
+       terminal->pty_nr = -1;
        terminal->pty = -EBADF;
        terminal->ptx = -EBADF;
        terminal->peer = -EBADF;
index 4d2894fe79411a3cae0e70c08cf1474058595c71..67d7ea89924ceef0f4f07945878f10f8adb825ad 100644 (file)
@@ -58,6 +58,7 @@ struct lxc_terminal_state {
 };
 
 struct lxc_terminal {
+       int pty_nr;
        int pty;
        int ptx;
        int peer;
@@ -254,6 +255,6 @@ __hidden extern void lxc_terminal_init(struct lxc_terminal *terminal);
 __hidden extern int lxc_terminal_signal_sigmask_safe_blocked(struct lxc_terminal *terminal);
 __hidden extern int lxc_devpts_terminal(int devpts_fd, struct lxc_conf *conf,
                                        int *ret_ptx, int *ret_pty,
-                                       char buf[static PATH_MAX]);
+                                       int *ret_pty_nr);
 
 #endif /* __LXC_TERMINAL_H */