#include #include #include #include #include #include #include #include #include "mpw-shell.h" #include "fdset.h" #include "phase1.h" #include "phase2.h" #include "command.h" // should set {MPW}, {MPWVersion}, then execute {MPW}StartUp void init(Environment &e) { e.set("status", std::string("0")); e.set("exit", std::string("1")); // terminate script on error. e.set("echo", std::string("1")); } int read_stdin(phase1 &p) { unsigned char buffer[2048]; ssize_t size; for (;;) { size = read(STDIN_FILENO, buffer, sizeof(buffer)); if (size == 0) break; if (size < 0) { if (errno == EINTR) continue; perror("read: "); return -1; } try { p.process(buffer, buffer + size); } catch(std::exception &ex) { fprintf(stderr, "%s\n", ex.what()); p.reset(); } } try { p.finish(); } catch(std::exception &ex) { fprintf(stderr, "%s\n", ex.what()); p.reset(); } return 0; } int main(int argc, char **argv) { Environment e; init(e); phase1 p1; phase2 p2; p1 >>= p2; p2 >>= [&e](command_ptr &&ptr) { fdmask fds; ptr->execute(e, fds); }; /* p1 >>= [&p2](std::string &&s) { fprintf(stdout, " -> %s\n", s.c_str()); p2.process(s); }; */ read_stdin(p1); p2.finish(); /* try { head = read_fd(0); } catch (std::exception &ex) { fprintf(stderr, "%s\n", ex.what()); exit(1); } try { int status = execute(head); exit(status); } catch(std::exception &ex) { fprintf(stderr, "%s\n", ex.what()); exit(1); } */ }