[CRIU] [PATCH 10/11] tty: Parse slave index from link path
Pavel Emelyanov
xemul at parallels.com
Tue Oct 7 13:51:45 PDT 2014
On 10/06/2014 05:15 PM, Cyrill Gorcunov wrote:
> Instead of reading link inside tty code lets
> make it on a higher level providing the link
> inside fd_params structure (just like we do
> for other objects).
>
> Also because mount point for devpts fs might
> be not /dev/pts simply search for index from
> the end of the name (as it's done in the
> kernel -- the slave index is a numeric name
> under the mountpoint).
How does the link look like?
> Signed-off-by: Cyrill Gorcunov <gorcunov at openvz.org>
> ---
> files.c | 4 ++++
> tty.c | 23 ++++++++---------------
> 2 files changed, 12 insertions(+), 15 deletions(-)
>
> diff --git a/files.c b/files.c
> index b975cd46d011..10c8c6d16344 100644
> --- a/files.c
> +++ b/files.c
> @@ -268,6 +268,7 @@ static int dump_chrdev(struct fd_parms *p, int lfd, struct cr_img *img)
> {
> int maj = major(p->stat.st_rdev);
> const struct fdtype_ops *ops;
> + struct fd_link link;
>
> switch (maj) {
> case MEM_MAJOR:
> @@ -276,6 +277,9 @@ static int dump_chrdev(struct fd_parms *p, int lfd, struct cr_img *img)
> case TTYAUX_MAJOR:
> case UNIX98_PTY_MASTER_MAJOR ... (UNIX98_PTY_MASTER_MAJOR + UNIX98_PTY_MAJOR_COUNT - 1):
> case UNIX98_PTY_SLAVE_MAJOR:
> + if (fill_fdlink(lfd, p, &link))
> + return -1;
> + p->link = &link;
> ops = &tty_dump_ops;
> break;
> case MISC_MAJOR:
> diff --git a/tty.c b/tty.c
> index 355e679df9e2..edbe85e7505a 100644
> --- a/tty.c
> +++ b/tty.c
> @@ -201,8 +201,9 @@ int tty_verify_active_pairs(void)
> return 0;
> }
>
> -static int parse_pty_index(u32 id, int lfd, int major)
> +static int parse_pty_index(u32 id, int lfd, const struct fd_parms *p, int major)
> {
> + const struct fd_link *link = p->link;
> int index = -1;
>
> switch (major) {
> @@ -214,22 +215,14 @@ static int parse_pty_index(u32 id, int lfd, int major)
> break;
>
> case UNIX98_PTY_SLAVE_MAJOR: {
> - char path[PATH_MAX];
> - char link[32];
> - int len;
> -
> - snprintf(link, sizeof(link), "/proc/self/fd/%d", lfd);
> - len = readlink(link, path, sizeof(path) - 1);
> - if (len < 0) {
> - pr_perror("Can't readlink %s", link);
> - return -1;
> - }
> - path[len] = '\0';
> + char *pos;
>
> - if (sscanf(path, PTS_FMT, &index) != 1) {
> - pr_err("Unexpected format on path %s\n", path);
> + pos = strrchr(link->name, '/');
> + if (!pos || pos == (link->name + link->len - 1)) {
> + pr_err("Unexpected format on path %s\n", link->name + 1);
> return -1;
> }
> + index = atoi(pos + 1);
> break;
> }
> }
> @@ -1172,7 +1165,7 @@ static int dump_one_pty(int lfd, u32 id, const struct fd_parms *p, int major, in
> TtyFileEntry e = TTY_FILE_ENTRY__INIT;
> int ret = 0, index;
>
> - index = parse_pty_index(id, lfd, major);
> + index = parse_pty_index(id, lfd, p, major);
> if (index < 0)
> return -1;
>
>
More information about the CRIU
mailing list