| |
| |
| |
| |
| |
| |
| #include <ntapi/ntapi.h> |
| #include <stdio.h> |
| #include <unistd.h> |
| |
| #include <ptycon/ptycon.h> |
| #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 fprintf(stdout,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); |
| } |