machined: introduce a ptsname_namespace() call and make use of it

The call is like ptsname() but does not assume the pty path was
accessible in the local namespace. It uses the same internal ioctl
though.
This commit is contained in:
Lennart Poettering 2015-09-01 20:12:25 +02:00
parent 395745ba53
commit a07c35c3e6
3 changed files with 25 additions and 3 deletions

View file

@ -1074,3 +1074,22 @@ int get_ctty(pid_t pid, dev_t *_devnr, char **r) {
return 0;
}
int ptsname_namespace(int pty, char **ret) {
int no = -1, r;
/* Like ptsname(), but doesn't assume that the path is
* accessible in the local namespace. */
r = ioctl(pty, TIOCGPTN, &no);
if (r < 0)
return -errno;
if (no < 0)
return -EIO;
if (asprintf(ret, "/dev/pts/%i", no) < 0)
return -ENOMEM;
return 0;
}

View file

@ -107,3 +107,5 @@ int get_ctty(pid_t, dev_t *_devnr, char **r);
int getttyname_malloc(int fd, char **r);
int getttyname_harder(int fd, char **r);
int ptsname_namespace(int pty, char **ret);

View file

@ -45,6 +45,7 @@
#include "formats-util.h"
#include "process-util.h"
#include "env-util.h"
#include "terminal-util.h"
static int property_get_id(
sd_bus *bus,
@ -500,7 +501,7 @@ int bus_machine_method_open_pty(sd_bus_message *message, void *userdata, sd_bus_
if (master < 0)
return master;
r = ptsname_malloc(master, &pty_name);
r = ptsname_namespace(master, &pty_name);
if (r < 0)
return r;
@ -589,7 +590,7 @@ int bus_machine_method_open_login(sd_bus_message *message, void *userdata, sd_bu
if (master < 0)
return master;
r = ptsname_malloc(master, &pty_name);
r = ptsname_namespace(master, &pty_name);
if (r < 0)
return r;
@ -687,7 +688,7 @@ int bus_machine_method_open_shell(sd_bus_message *message, void *userdata, sd_bu
if (master < 0)
return master;
r = ptsname_malloc(master, &pty_name);
r = ptsname_namespace(master, &pty_name);
if (r < 0)
return r;