2023-01-25 23:37:56 -05:00
|
|
|
#include <pty.h>
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <unistd.h>
|
|
|
|
|
2023-02-04 16:39:44 -05:00
|
|
|
// compile with gcc term.c -lutil
|
2023-01-25 23:37:56 -05:00
|
|
|
int main(int argc, char **argv) {
|
|
|
|
if (argc < 2) {
|
|
|
|
printf("usage: %s ROM\n", argv[0]);
|
|
|
|
return 1;
|
|
|
|
}
|
2023-02-04 16:32:59 -05:00
|
|
|
char *rom = argv[1]; // find term.rom
|
|
|
|
int fdm = -1; // allocate file descriptor
|
2023-01-25 23:37:56 -05:00
|
|
|
|
2023-02-04 16:32:59 -05:00
|
|
|
// allocate a pty, fork, inititialize file descriptor
|
|
|
|
pid_t pid = forkpty(&fdm, NULL, NULL, NULL);
|
|
|
|
|
|
|
|
if (pid < 0) { // failure
|
2023-02-04 16:34:05 -05:00
|
|
|
perror("fork failed");
|
2023-02-04 16:02:21 -05:00
|
|
|
return 1;
|
2023-02-04 16:32:59 -05:00
|
|
|
} else if (pid == 0) { // child
|
|
|
|
setenv("TERM", "ansi", 1);
|
|
|
|
execlp("bash", "bash", NULL); // exec bash
|
2023-02-04 16:34:05 -05:00
|
|
|
perror("exec bash failed");
|
2023-02-04 16:32:59 -05:00
|
|
|
} else { // parent
|
|
|
|
struct winsize ws = {23, 80, 8, 12}; // rows, cols, xps, ypx
|
|
|
|
ioctl(fdm, TIOCSWINSZ, &ws); // set term window size
|
|
|
|
dup2(fdm, 0); // use fdm for stdin
|
|
|
|
dup2(fdm, 1); // use fdm for stdout
|
|
|
|
execlp("uxnemu", "uxnemu", rom, NULL); // exec uxnemu
|
2023-02-04 16:34:05 -05:00
|
|
|
perror("exec uxnemu failed");
|
2023-01-25 23:37:56 -05:00
|
|
|
}
|
|
|
|
}
|