diff rvinterf/etm/launchrvif.c @ 197:fa7174faa9aa

fc-tmsh: option to invoke rvinterf "behind the scenes"
author Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
date Sun, 15 Dec 2013 07:31:52 +0000
parents
children 2847b6cbd915
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rvinterf/etm/launchrvif.c	Sun Dec 15 07:31:52 2013 +0000
@@ -0,0 +1,59 @@
+/*
+ * This module implements the optional "behind the scenes" invokation
+ * of rvinterf from fc-tmsh.
+ */
+
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+static char rvinterf_pathname[] = "/usr/local/bin/rvinterf";
+
+extern int sock;
+
+char *rvinterf_lopt, *rvinterf_wopt;
+
+launch_rvinterf(ttyport)
+	char *ttyport;
+{
+	int sp[2], rc;
+	char *rvif_argv[9], Sarg[16], **ap;
+
+	rc = socketpair(AF_UNIX, SOCK_STREAM, 0, sp);
+	if (rc < 0) {
+		perror("socketpair");
+		exit(1);
+	}
+	sock = sp[0];
+	sprintf(Sarg, "-S%d", sp[1]);
+	ap = rvif_argv;
+	*ap++ = "rvinterf";
+	*ap++ = Sarg;
+	*ap++ = "-n";
+	if (rvinterf_lopt) {
+		*ap++ = "-l";
+		*ap++ = rvinterf_lopt;
+	}
+	if (rvinterf_wopt) {
+		*ap++ = "-w";
+		*ap++ = rvinterf_wopt;
+	}
+	*ap++ = ttyport;
+	*ap = 0;
+	rc = vfork();
+	if (rc < 0) {
+		perror("vfork for launching rvinterf");
+		exit(1);
+	}
+	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;
+}