view libcommon/backend.c @ 9:c9ef9e91dd8e

new libcommon, initial version
author Mychaela Falconia <falcon@freecalypso.org>
date Sun, 14 Mar 2021 06:55:38 +0000
parents
children 9eb5460f51a6
line wrap: on
line source

/*
 * This module is responsible for launching and connecting
 * our SIM card communication back end.
 */

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

extern unsigned calypso_fd, pcsc_reader_num;

static char calypso_be_pathname[] = "/opt/freecalypso/bin/fcsim-calypso-be";
static char pcsc_be_pathname[] = "/opt/freecalypso/bin/fc-pcsc-backend";

static char *backend_prog, *backend_argv[3], backend_optarg[16];

FILE *cpipeF, *rpipeF;

static void
setup_be_calypso()
{
	backend_prog = calypso_be_pathname;
	backend_argv[0] = "fcsim-calypso-be";
	sprintf(backend_optarg, "-C%u", calypso_fd);
	backend_argv[1] = backend_optarg;
	backend_argv[2] = 0;
}

static void
setup_be_pcsc()
{
	backend_prog = pcsc_be_pathname;
	backend_argv[0] = "fc-pcsc-backend";
	sprintf(backend_optarg, "-p%u", pcsc_reader_num);
	backend_argv[1] = backend_optarg;
	backend_argv[2] = 0;
}

launch_backend()
{
	int cpipe[2], rpipe[2], rc;

	if (calypso_fd)
		setup_be_calypso();
	else
		setup_be_pcsc();
	if (pipe(cpipe) < 0 || pipe(rpipe) < 0) {
		perror("pipe");
		exit(1);
	}
	rc = vfork();
	if (rc < 0) {
		perror("vfork for launching back end");
		exit(1);
	}
	if (!rc) {
		/* we are in the child - prepare to exec the BE */
		dup2(cpipe[0], 0);
		dup2(rpipe[1], 1);
		close(cpipe[0]);
		close(cpipe[1]);
		close(rpipe[0]);
		close(rpipe[1]);
		/* do the exec */
		execv(backend_prog, backend_argv);
		perror(backend_prog);
		_exit(1);
	}
	close(cpipe[0]);
	close(rpipe[1]);
	cpipeF = fdopen(cpipe[1], "w");
	if (!cpipeF) {
		perror("fdopen");
		exit(1);
	}
	rpipeF = fdopen(rpipe[0], "r");
	if (!rpipeF) {
		perror("fdopen");
		exit(1);
	}
	return(0);
}