#include <unistd.h>

#define VGA_TEXT_W 80
#define VGA_TEXT_H 25

void term();

int ptys;
int ptym;

int main(int argc, char *argv[]) {
    (void)argc;
    (void)argv;

    ptym = pty(&ptys);

    if (fork() == 0) {
        close(ptym);
        dup2(ptys, 0);
        dup2(0, 1);
        dup2(0, 2);

        exec("/bin/rocksh.elf");  
    }

    close(ptys);
    dup2(ptym, 0);
    dup2(0, 1);
    dup2(0, 2);

    term();

    return 0;
}

void clear(int fd) {
    lseek(fd, 0, 0);
    size_t bytes = VGA_TEXT_W * VGA_TEXT_H;
    char c = ' ';
    for (size_t i = 0; i < bytes; i++) {
        write(fd, &c, 1);
    }
    lseek(fd, 0, 0);
}

void term() {
    int vga_fd = open("/dev/tvga");
    if (vga_fd == -1) return;

    int kbd_fd = open("/dev/kbd");
    if (kbd_fd == -1) return;

    clear(vga_fd);

    char c;
    while (1) {
        // first, get shell output
        int rd = read(0, &c, 1);
        if (rd > 0) {
            write(vga_fd, &c, 1);
        }

        // then read a byte from the kbd. If we got one, pass it to the shell
        rd = read(kbd_fd, &c, 1);
        if (rd > 0) {
            write(1, &c, 1);
        }
    }
}