mirror of
https://github.com/tsl0922/ttyd.git
synced 2026-01-29 22:24:20 +01:00
54 lines
1.1 KiB
C
54 lines
1.1 KiB
C
#include <errno.h>
|
|
#include <fcntl.h>
|
|
#include <stdbool.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <sys/ioctl.h>
|
|
#include <unistd.h>
|
|
|
|
#if defined(__OpenBSD__) || defined(__APPLE__)
|
|
#include <util.h>
|
|
#elif defined(__FreeBSD__)
|
|
#include <libutil.h>
|
|
#else
|
|
#include <pty.h>
|
|
#endif
|
|
|
|
#include "utils.h"
|
|
|
|
pid_t pty_fork(int *pty, const char *file, char *const argv[], const char *term) {
|
|
pid_t pid = forkpty(pty, NULL, NULL, NULL);
|
|
|
|
if (pid < 0) {
|
|
return pid;
|
|
} else if (pid == 0) {
|
|
setenv("TERM", term, true);
|
|
int ret = execvp(file, argv);
|
|
if (ret < 0) {
|
|
perror("execvp failed\n");
|
|
_exit(-errno);
|
|
}
|
|
}
|
|
|
|
// set the file descriptor non blocking
|
|
int flags = fcntl(*pty, F_GETFL);
|
|
if (flags != -1) {
|
|
fcntl(*pty, F_SETFD, flags | O_NONBLOCK);
|
|
}
|
|
// set the file descriptor close-on-exec
|
|
fd_set_cloexec(*pty);
|
|
|
|
return pid;
|
|
}
|
|
|
|
int pty_resize(pid_t pty, int cols, int rows) {
|
|
struct winsize size;
|
|
|
|
size.ws_col = (unsigned short)cols;
|
|
size.ws_row = (unsigned short)rows;
|
|
size.ws_xpixel = 0;
|
|
size.ws_ypixel = 0;
|
|
|
|
return ioctl(pty, TIOCSWINSZ, &size);
|
|
}
|