diff rvinterf/libinterf/launchrvif.c @ 419:67d683a87b1d

rvinterf client refactoring: libinterf created
author Mychaela Falconia <falcon@freecalypso.org>
date Sat, 27 Oct 2018 23:35:10 +0000
parents rvinterf/etmsync/launchrvif.c@3fb0c7ad27f3
children e40bb5a6c6b9
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rvinterf/libinterf/launchrvif.c	Sat Oct 27 23:35:10 2018 +0000
@@ -0,0 +1,63 @@
+/*
+ * This module implements the optional "behind the scenes" invokation
+ * of rvinterf from client programs.
+ */
+
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include "exitcodes.h"
+
+static char rvinterf_pathname[] = "/opt/freecalypso/bin/rvinterf";
+
+extern int sock;
+
+char *rvinterf_ttyport, *rvinterf_Bopt, *rvinterf_lopt, *rvinterf_wopt;
+
+launch_rvinterf()
+{
+	int sp[2], rc;
+	char *rvif_argv[11], Sarg[16], **ap;
+
+	rc = socketpair(AF_UNIX, SOCK_STREAM, 0, sp);
+	if (rc < 0) {
+		perror("socketpair");
+		exit(ERROR_UNIX);
+	}
+	sock = sp[0];
+	sprintf(Sarg, "-S%d", sp[1]);
+	ap = rvif_argv;
+	*ap++ = "rvinterf";
+	*ap++ = Sarg;
+	*ap++ = "-n";
+	if (rvinterf_Bopt) {
+		*ap++ = "-B";
+		*ap++ = rvinterf_Bopt;
+	}
+	if (rvinterf_lopt) {
+		*ap++ = "-l";
+		*ap++ = rvinterf_lopt;
+	}
+	if (rvinterf_wopt) {
+		*ap++ = "-w";
+		*ap++ = rvinterf_wopt;
+	}
+	*ap++ = rvinterf_ttyport;
+	*ap = 0;
+	rc = vfork();
+	if (rc < 0) {
+		perror("vfork for launching rvinterf");
+		exit(ERROR_UNIX);
+	}
+	if (!rc) {
+		/* we are in the child - do the exec */
+		close(sp[0]);
+		execv(rvinterf_pathname, rvif_argv);
+		perror(rvinterf_pathname);
+		_exit(1);
+	}
+	close(sp[1]);
+	return 0;
+}