mirror of
https://codeberg.org/dnkl/foot.git
synced 2026-02-23 01:40:12 -05:00
Set up pseudo terminal and fork slave
This commit is contained in:
parent
4de6a8ad38
commit
acda4d2d31
4 changed files with 127 additions and 7 deletions
67
slave.c
Normal file
67
slave.c
Normal file
|
|
@ -0,0 +1,67 @@
|
|||
#define _XOPEN_SOURCE 500
|
||||
#include "slave.h"
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <errno.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
|
||||
#define LOG_MODULE "slave"
|
||||
#define LOG_ENABLE_DBG 1
|
||||
#include "log.h"
|
||||
|
||||
void
|
||||
slave_spawn(int ptmx)
|
||||
{
|
||||
int pts = -1;
|
||||
const char *pts_name = ptsname(ptmx);
|
||||
|
||||
if (grantpt(ptmx) == -1) {
|
||||
LOG_ERRNO("failed to grantpt()");
|
||||
goto err;
|
||||
}
|
||||
if (unlockpt(ptmx) == -1) {
|
||||
LOG_ERRNO("failed to unlockpt()");
|
||||
goto err;
|
||||
}
|
||||
|
||||
close(ptmx);
|
||||
ptmx = -1;
|
||||
|
||||
if (setsid() == -1) {
|
||||
LOG_ERRNO("failed to setsid()");
|
||||
goto err;
|
||||
}
|
||||
|
||||
pts = open(pts_name, O_RDWR);
|
||||
if (pts == -1) {
|
||||
LOG_ERRNO("failed to open pseudo terminal slave device");
|
||||
goto err;
|
||||
}
|
||||
|
||||
if (dup2(pts, STDIN_FILENO) == -1 ||
|
||||
dup2(pts, STDOUT_FILENO) == -1 ||
|
||||
dup2(pts, STDERR_FILENO) == -1)
|
||||
{
|
||||
LOG_ERRNO("failed to dup stdin/stdout/stderr");
|
||||
goto err;
|
||||
}
|
||||
|
||||
close(pts);
|
||||
pts = -1;
|
||||
|
||||
/* TODO: exec() */
|
||||
const char *s = "hello world\n";
|
||||
write(STDOUT_FILENO, s, strlen(s));
|
||||
|
||||
sleep(1000);
|
||||
|
||||
err:
|
||||
if (pts != -1)
|
||||
close(pts);
|
||||
if (ptmx != -1)
|
||||
close(ptmx);
|
||||
_exit(errno);
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue