diff 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 diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libcommon/backend.c	Sun Mar 14 06:55:38 2021 +0000
@@ -0,0 +1,82 @@
+/*
+ * 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);
+}