/* * This file is part of Jehanne. * * Copyright (C) 2015-2016 Giacomo Tesio * * Jehanne is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, version 3 of the License. * * Jehanne is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Jehanne. If not, see . */ #include #include #include "console.h" int linecontrol; int blind; int crnl; static void usage(void) { fprint(2, "usage: %s [-d dbgfile] [-s srvname] comfile [program [args]]\n", argv0); exits("usage"); } static void opencom(char *file) { int fd; if((fd = sys_open(file, ORDWR)) <= 0) sysfatal("open: %r"); dup(fd, 0); dup(fd, 1); sys_close(fd); } void main(int argc, char *argv[]) { int fd, devmnt; char *srv = nil; blind = 0; linecontrol = 1; crnl = 1; ARGBEGIN{ case 'd': enabledebug(EARGF(usage())); break; case 's': srv = EARGF(usage()); break; default: usage(); }ARGEND; if(srv && argc != 1) usage(); if(argc < 2 && srv == nil) usage(); opencom(argv[0]); fd = servecons(passthrough, passthrough, &devmnt); if(srv){ debug("%s (%d): posting %d\n", argv0, getpid(), fd); post(srv, fd); exits(0); } else { debug("%s %d: mounting cons for %s\n", argv0, getpid(), argv[0]); if(sys_mount(fd, -1, "/dev", MBEFORE, "", devmnt) == -1) sysfatal("mount (%s): %r", argv[0]); debug("%s (%d): all services started, ready to sys_exec(%s)\n", argv0, getpid(), argv[0]); /* become the requested program */ sys_rfork(RFNOTEG|RFREND|RFCFDG); fd = sys_open("/dev/cons", OREAD); fd = sys_open("/dev/cons", OWRITE); if(dup(fd, 2) != 2) sysfatal("bad FDs: %r"); sys_exec(argv[1], (const char**)(argv+1)); sysfatal("exec %s: %r", argv[1]); } }