[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