pty: merge fork_pty and pty_spawn
pty_spawn was just a short wrapper so we can merge both into one function. Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
This commit is contained in:
parent
d480ec1030
commit
57bb28b1b4
63
src/pty.c
63
src/pty.c
@ -197,49 +197,13 @@ err_out:
|
||||
* a little bit more control of the process, and as a bonus avoid linking to
|
||||
* the libutil library in glibc.
|
||||
*/
|
||||
static pid_t fork_pty(int *pty_out, struct winsize *ws)
|
||||
static int pty_spawn(struct kmscon_pty *pty, unsigned short width,
|
||||
unsigned short height)
|
||||
{
|
||||
int ret;
|
||||
pid_t pid;
|
||||
int master;
|
||||
|
||||
master = posix_openpt(O_RDWR | O_NOCTTY | O_CLOEXEC | O_NONBLOCK);
|
||||
if (master < 0) {
|
||||
ret = -errno;
|
||||
log_err("pty: cannot open master: %m");
|
||||
goto err_out;
|
||||
}
|
||||
|
||||
pid = fork();
|
||||
switch (pid) {
|
||||
case -1:
|
||||
log_err("pty: cannot fork: %m");
|
||||
ret = -errno;
|
||||
goto err_master;
|
||||
case 0:
|
||||
ret = fork_pty_child(master, ws);
|
||||
if (ret)
|
||||
goto err_master;
|
||||
*pty_out = -1;
|
||||
return 0;
|
||||
default:
|
||||
*pty_out = master;
|
||||
return pid;
|
||||
}
|
||||
|
||||
err_master:
|
||||
close(master);
|
||||
err_out:
|
||||
*pty_out = -1;
|
||||
errno = -ret;
|
||||
return -1;
|
||||
}
|
||||
|
||||
static int pty_spawn(struct kmscon_pty *pty,
|
||||
unsigned short width, unsigned short height)
|
||||
{
|
||||
struct winsize ws;
|
||||
pid_t pid;
|
||||
|
||||
if (pty->fd >= 0)
|
||||
return -EALREADY;
|
||||
@ -248,18 +212,35 @@ static int pty_spawn(struct kmscon_pty *pty,
|
||||
ws.ws_col = width;
|
||||
ws.ws_row = height;
|
||||
|
||||
pid = fork_pty(&pty->fd, &ws);
|
||||
master = posix_openpt(O_RDWR | O_NOCTTY | O_CLOEXEC | O_NONBLOCK);
|
||||
if (master < 0) {
|
||||
log_err("pty: cannot open master: %m");
|
||||
return -errno;
|
||||
}
|
||||
|
||||
log_debug("pty: forking child\n");
|
||||
pid = fork();
|
||||
switch (pid) {
|
||||
case -1:
|
||||
log_err("pty: cannot fork or open pty pair: %m");
|
||||
return -errno;
|
||||
log_err("pty: cannot fork: %m");
|
||||
ret = -errno;
|
||||
goto err_master;
|
||||
case 0:
|
||||
ret = fork_pty_child(master, &ws);
|
||||
if (ret)
|
||||
goto err_master;
|
||||
exec_child(pty->fd);
|
||||
abort();
|
||||
default:
|
||||
pty->fd = master;
|
||||
break;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
err_master:
|
||||
close(master);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void pty_output(struct kmscon_fd *fd, int mask, void *data)
|
||||
|
Loading…
x
Reference in New Issue
Block a user