Blob Blame History Raw
/*********************************************************/
/*  ptycon: a pty-console bridge                         */
/*  Copyright (C) 2016--2017  SysDeer Technologies, LLC  */
/*  Released under GPLv2 and GPLv3; see COPYING.PTYCON.  */
/*********************************************************/

#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 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(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)
			? !argv || !argv[0] || !argv[1]
			: 2;

	if (dctx->cctx->drvflags & PTYC_DRIVER_VERSION)
		if ((ptyc_version(dctx)) < 0)
			return ptyc_exit(dctx,2);

	if (!dctx->cctx->eargv && !dctx->units[0])
		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);
}