diff loadtools/tpinterfb.c @ 649:141372e0d28f

fc-loadtool module refactoring: tpinterfb.c split out
author Mychaela Falconia <falcon@freecalypso.org>
date Mon, 02 Mar 2020 02:45:35 +0000
parents
children 8d7dcfd9df53
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/loadtools/tpinterfb.c	Mon Mar 02 02:45:35 2020 +0000
@@ -0,0 +1,52 @@
+/*
+ * This module contains functions for binary (as opposed to our usual ASCII)
+ * interfacing to loadagent.
+ */
+
+#include <sys/types.h>
+#include <sys/time.h>
+#include <sys/errno.h>
+#include <stdio.h>
+#include <string.h>
+#include <strings.h>
+#include <stdlib.h>
+
+extern int errno;
+
+extern int target_fd;
+
+collect_binblock_from_target(buf, expect_len, timeout)
+	u_char *buf;
+	unsigned expect_len;
+{
+	fd_set fds;
+	struct timeval tv;
+	unsigned rcvd;
+	int cc;
+
+	for (rcvd = 0; rcvd < expect_len; ) {
+		FD_ZERO(&fds);
+		FD_SET(target_fd, &fds);
+		tv.tv_sec = timeout;
+		tv.tv_usec = 0;
+		cc = select(target_fd+1, &fds, NULL, NULL, &tv);
+		if (cc < 0) {
+			if (errno == EINTR)
+				continue;
+			perror("select");
+			return(-1);
+		}
+		if (cc < 1) {
+			fprintf(stderr,
+				"error: timeout waiting for binary block\n");
+			return(-1);
+		}
+		cc = read(target_fd, buf + rcvd, expect_len - rcvd);
+		if (cc <= 0) {
+			perror("read after successful select");
+			return(-1);
+		}
+		rcvd += cc;
+	}
+	return(0);
+}