Introduce file_descriptors struct

This commit is contained in:
Joseph Ferano 2022-09-15 18:13:34 +07:00
parent 58d77943f6
commit 2eeac80444

48
bt.c
View File

@ -18,29 +18,30 @@ typedef struct scrollback {
char *buf; char *buf;
} scrollback; } scrollback;
// PTY typedef struct file_descriptors {
int master; int master;
int slave; int child;
} file_descriptors;
void spawn(void) { void spawn(file_descriptors *fds) {
openpty(&master, &slave, NULL, NULL, NULL); openpty(&fds->master, &fds->child, NULL, NULL, NULL);
pid_t p = fork(); pid_t p = fork();
if (p == 0) { if (p == 0) {
close(master); close(fds->master);
setsid(); setsid();
ioctl(slave, TIOCSCTTY, NULL); ioctl(fds->child, TIOCSCTTY, NULL);
dup2(slave, 0); dup2(fds->child, 0);
dup2(slave, 1); dup2(fds->child, 1);
dup2(slave, 2); dup2(fds->child, 2);
execle("/bin/dash", "-/bin/dash", (char *)NULL, (char *[]){ "TERM=dumb", NULL }); execle("/bin/dash", "-/bin/dash", (char *)NULL, (char *[]){ "TERM=dumb", NULL });
} else { } else {
close(slave); close(fds->child);
} }
} }
float fontsize = 12; static float fontsize = 12;
Font *load_font() { Font *load_font() {
unsigned int file_size = 0; unsigned int file_size = 0;
@ -57,10 +58,10 @@ Font *load_font() {
return fontDefault; return fontDefault;
} }
int read_pty(scrollback *sb) { int read_pty(file_descriptors *fds, scrollback *sb) {
ssize_t nread; ssize_t nread;
char readbuf[256]; char readbuf[256];
switch (nread = read(master, readbuf, sizeof(readbuf))) { switch (nread = read(fds->master, readbuf, sizeof(readbuf))) {
case -1: case -1:
if (errno == EAGAIN) { if (errno == EAGAIN) {
return 0; return 0;
@ -85,9 +86,10 @@ int read_pty(scrollback *sb) {
} }
int main(void) { int main(void) {
spawn();
scrollback sb = { 0 }; scrollback sb = { 0 };
file_descriptors fds = { 0 };
spawn(&fds);
const int screenWidth = 800; const int screenWidth = 800;
const int screenHeight = 550; const int screenHeight = 550;
@ -105,12 +107,12 @@ int main(void) {
char buf[128]; char buf[128];
int buf_len = 0; int buf_len = 0;
int flags = fcntl(master, F_GETFL); int flags = fcntl(fds.master, F_GETFL);
flags |= O_NONBLOCK; flags |= O_NONBLOCK;
fcntl(master, F_SETFL, flags); fcntl(fds.master, F_SETFL, flags);
fd_set rset; fd_set rset;
FD_ZERO(&rset); FD_ZERO(&rset);
FD_SET(master, &rset); FD_SET(fds.master, &rset);
sb.ypos = 0; sb.ypos = 0;
@ -152,8 +154,8 @@ int main(void) {
if (IsKeyPressed(KEY_ENTER)) { if (IsKeyPressed(KEY_ENTER)) {
sb.length -= buf_len; sb.length -= buf_len;
sb.buf[sb.length] = '\0'; sb.buf[sb.length] = '\0';
write(master, buf, buf_len); write(fds.master, buf, buf_len);
write(master, "\r", 1); write(fds.master, "\r", 1);
buf[0] = '\0'; buf[0] = '\0';
buf_len = 0; buf_len = 0;
new_char = true; new_char = true;
@ -171,7 +173,7 @@ int main(void) {
// Drawing // Drawing
BeginDrawing(); BeginDrawing();
{ {
int nread = read_pty(&sb); int nread = read_pty(&fds, &sb);
if (nread > 0) { if (nread > 0) {
sb.length += nread; sb.length += nread;
new_read = true; new_read = true;
@ -201,6 +203,6 @@ int main(void) {
} }
free(sb.buf); free(sb.buf);
close(master); close(fds.master);
CloseWindow(); CloseWindow();
} }