integrate patch from handlerug
This commit is contained in:
parent
fd5afa4833
commit
625527799c
35
term.c
35
term.c
|
@ -1,18 +1,42 @@
|
|||
#include <pwd.h>
|
||||
#ifdef __APPLE__
|
||||
#include <util.h>
|
||||
#include <sys/ioctl.h>
|
||||
#else
|
||||
#include <pty.h>
|
||||
#endif
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
// compile with gcc term.c -lutil
|
||||
int main(int argc, char **argv) {
|
||||
if (argc < 2) {
|
||||
printf("usage: %s ROM\n", argv[0]);
|
||||
printf("usage: %s ROM [LOGIN]\n", argv[0]);
|
||||
return 1;
|
||||
}
|
||||
char *rom = argv[1]; // find term.rom
|
||||
int fdm = -1; // allocate file descriptor
|
||||
int login = argc > 2; // any extra arg signals login shell
|
||||
|
||||
// detect the user's shell
|
||||
char *shell = getenv("SHELL");
|
||||
if (shell == NULL) {
|
||||
struct passwd *passwd = getpwuid(getuid());
|
||||
if (passwd != NULL) {
|
||||
shell = passwd->pw_shell;
|
||||
}
|
||||
}
|
||||
if (shell == NULL) {
|
||||
shell = "/bin/sh";
|
||||
}
|
||||
|
||||
// find the shell's name
|
||||
char *slash = strrchr(shell, '/');
|
||||
char *name = slash == NULL ? shell : slash + 1;
|
||||
|
||||
// allocate a pty, fork, inititialize file descriptor
|
||||
int fdm = -1; // allocate file descriptor
|
||||
pid_t pid = forkpty(&fdm, NULL, NULL, NULL);
|
||||
|
||||
if (pid < 0) { // failure
|
||||
|
@ -20,7 +44,12 @@ int main(int argc, char **argv) {
|
|||
return 1;
|
||||
} else if (pid == 0) { // child
|
||||
setenv("TERM", "ansi", 1);
|
||||
execlp("bash", "bash", NULL); // exec bash
|
||||
// execute shell
|
||||
if (login) {
|
||||
execlp(name, shell, "-l", "-i", NULL);
|
||||
} else {
|
||||
execlp(name, shell, NULL);
|
||||
}
|
||||
perror("exec bash failed");
|
||||
} else { // parent
|
||||
struct winsize ws = {23, 80, 8, 12}; // rows, cols, xps, ypx
|
||||
|
|
10
term.tal
10
term.tal
|
@ -377,6 +377,12 @@
|
|||
DUP LIT "9 GTH ?end-arg
|
||||
!add-to-arg
|
||||
|
||||
@on-read-osc ( -> )
|
||||
.Console/r DEI
|
||||
DUP #07 ( bell ) EQU ?&end-osc
|
||||
#9c ( esc-\ ) EQU ?&end-osc BRK
|
||||
&end-osc ;on-read .Console/vect DEO2 BRK
|
||||
|
||||
@debug-arg ( n* -> )
|
||||
&short SWP debug-arg/byte
|
||||
&byte DUP #04 SFT debug-arg/char
|
||||
|
@ -612,6 +618,7 @@
|
|||
@on-read-esc ( -> )
|
||||
.Console/r DEI
|
||||
DUP LIT "[ EQU ?start-csi
|
||||
DUP LIT "] EQU ?start-osc
|
||||
DUP LIT "( EQU ?start-charset
|
||||
DUP LIT ") EQU ?start-charset
|
||||
DUP LIT "7 EQU ?&skip ( save cursor )
|
||||
|
@ -635,6 +642,9 @@
|
|||
@start-csi ( c^ -> )
|
||||
POP reset-args ;on-read-csi .Console/vect DEO2 BRK
|
||||
|
||||
@start-osc ( c^ -> )
|
||||
POP reset-args ;on-read-osc .Console/vect DEO2 BRK
|
||||
|
||||
@on-read ( -> )
|
||||
.Console/r DEI
|
||||
DUP ?&ok POP BRK
|
||||
|
|
Loading…
Reference in New Issue