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:
parent
395745ba53
commit
a07c35c3e6
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
Loading…
Reference in a new issue