view loadtools/tpinterfb.c @ 815:bc1e150f5bd9

rvinterf/include/bsim_etm_cmd.h: copy from FC Tourmaline
author Mychaela Falconia <falcon@freecalypso.org>
date Fri, 14 May 2021 15:51:20 +0000
parents 8d7dcfd9df53
children
line wrap: on
line source

/*
 * 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>
#include <unistd.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);
}