/*********************************************************/ /* ptycon: a pty-console bridge */ /* Copyright (C) 2016--2017 Z. Gilboa */ /* Released under GPLv2 and GPLv3; see COPYING.PTYCON. */ /*********************************************************/ #include #include #include #include #include "ptycon_init_impl.h" #include "ptycon_driver_impl.h" #include "ptycon_nolibc_impl.h" #ifndef PTYC_DRIVER_FLAGS #define PTYC_DRIVER_FLAGS PTYC_DRIVER_VERBOSITY_ERRORS \ | PTYC_DRIVER_VERBOSITY_USAGE #endif static const char vermsg[] = "%s%s%s (git://midipix.org/ptycon): " "version %s%d.%d.%d%s.\n" "[commit reference: %s%s%s]\n"; static const char * const ptyc_ver_color[6] = { "\x1b[1m\x1b[35m","\x1b[0m", "\x1b[1m\x1b[32m","\x1b[0m", "\x1b[1m\x1b[34m","\x1b[0m" }; static const char * const ptyc_ver_plain[6] = { "","", "","", "","" }; static ssize_t ptyc_version(struct ptyc_driver_ctx * dctx) { const struct ptyc_source_version * verinfo; const char * const * verclr; verinfo = ptyc_source_version(); verclr = isatty(STDOUT_FILENO) ? ptyc_ver_color : ptyc_ver_plain; return ptyc_dprintf(STDOUT_FILENO,vermsg, verclr[0],dctx->program,verclr[1], verclr[2],verinfo->major,verinfo->minor, verinfo->revision,verclr[3], verclr[4],verinfo->commit,verclr[5]); } static int ptyc_exit(struct ptyc_driver_ctx * dctx, int nerrors) { ptyc_free_driver_ctx(dctx); return nerrors ? 2 : 0; } int ptyc_main(int argc, char ** argv, char ** envp) { int ret; struct ptyc_driver_ctx * dctx; if ((ret = ptyc_init())) return ret; if ((ret = ptyc_get_driver_ctx(argv,envp,PTYC_DRIVER_FLAGS,&dctx))) return (ret == PTYC_USAGE) ? !--argc : 2; if (dctx->cctx->drvflags & PTYC_DRIVER_VERSION) if ((ptyc_version(dctx)) < 0) return ptyc_exit(dctx,2); if (!dctx->cctx->eargv) if (!(dctx->cctx->drvflags & PTYC_DRIVER_DBG_MODE)) return ptyc_exit(dctx,0); if (ptyc_alloc_pty(dctx)) return ptyc_exit(dctx,2); if (ptyc_spawn(dctx)) return ptyc_exit(dctx,2); if (ptyc_alloc_console(dctx)) return ptyc_exit(dctx,2); if (ptyc_wait_for_console(dctx)) return ptyc_exit(dctx,2); return ptyc_exit(dctx,ret); }