#include #include #include #include #include #include #include #include #include static void loop(void); static void run_shell(void); static int T(void *arg); static const char * prompt(void) { return "> "; } static History *hist; static HistEvent he; static EditLine *elptr; int main(int argc, char **argv) { hist = history_init(); history(hist, &he, H_SETSIZE, 100); elptr = el_init(getprogname(), stdin, stdout, stderr); el_set(elptr, EL_EDITOR, "emacs"); el_set(elptr, EL_SIGNAL, 0); el_set(elptr, EL_HIST, history, hist); el_set(elptr, EL_PROMPT, prompt); el_source(elptr, NULL); loop(); return 0; } static void loop(void) { Tokenizer *tok; const LineInfo *li; const char *line; int count; int argc; const char **argv; int rv; while ((line = el_gets(elptr, &count)) != NULL && count > 0) { history(hist, &he, H_ENTER, line); tok = tok_init(NULL); li = el_line(elptr); if ((rv = tok_line(tok, li, &argc, &argv, NULL, NULL)) != 0) continue; if (argc > 0 && strcmp(argv[0], "fish") == 0) { thrd_t t; thrd_create(&t, T, NULL); } tok_reset(tok); tok_end(tok); if (rv == 'q') break; } } static void run_shell() { pid_t child; int status; child = fork(); if (child == 0) { execl("/usr/games/fish", "/usr/games/fish"); err(EXIT_FAILURE, "execvp"); /* NOTREACHABLE */ } waitpid(child, &status, WEXITED); } static int T(void *arg) { run_shell(); return 0; }