示例#1
0
int
VCLI_ReadResult(int fd, unsigned *status, char **ptr, double tmo)
{
	char res[CLI_LINE0_LEN];	/* For NUL */
	int i, j;
	unsigned u, v, s;
	char *p = NULL;
	const char *err = "CLI communication error (hdr)";

	if (status == NULL)
		status = &s;
	if (ptr != NULL)
		*ptr = NULL;
	do {
		i = read_tmo(fd, res, CLI_LINE0_LEN, tmo);
		if (i != CLI_LINE0_LEN)
			break;

		if (res[3] != ' ')
			break;

		if (res[CLI_LINE0_LEN - 1] != '\n')
			break;

		res[CLI_LINE0_LEN - 1] = '\0';
		j = sscanf(res, "%u %u\n", &u, &v);
		if (j != 2)
			break;

		err = "CLI communication error (body)";

		*status = u;
		p = malloc(v + 1L);
		if (p == NULL)
			break;

		i = read_tmo(fd, p, v + 1, tmo);
		if (i < 0)
			break;
		if (i != v + 1)
			break;
		if (p[v] != '\n')
			break;

		p[v] = '\0';
		if (ptr == NULL)
			free(p);
		else
			*ptr = p;
		return (0);
	} while(0);

	if (p != NULL)
		free(p);
	*status = CLIS_COMMS;
	if (ptr != NULL)
		*ptr = strdup(err);
	return (*status);
}
示例#2
0
int
cli_readres(int fd, unsigned *status, char **ptr, double tmo)
{
	char res[CLI_LINE0_LEN];	/* For NUL */
	int i, j;
	unsigned u, v, s;
	char *p;

	if (status == NULL)
		status = &s;
	if (ptr != NULL)
		*ptr = NULL;
	i = read_tmo(fd, res, CLI_LINE0_LEN, tmo);
	if (i != CLI_LINE0_LEN) {
		*status = CLIS_COMMS;
		if (ptr != NULL)
			*ptr = strdup("CLI communication error (hdr)");
		if (i != 0)
			return (i);
		return (*status);
	}
	assert(i == CLI_LINE0_LEN);
	assert(res[3] == ' ');
	assert(res[CLI_LINE0_LEN - 1] == '\n');
	res[CLI_LINE0_LEN - 1] = '\0';
	j = sscanf(res, "%u %u\n", &u, &v);
	assert(j == 2);
	*status = u;
	p = malloc(v + 1L);
	assert(p != NULL);
	i = read_tmo(fd, p, v + 1, tmo);
	if (i < 0) {
		*status = CLIS_COMMS;
		free(p);
		if (ptr != NULL)
			*ptr = strdup("CLI communication error (body)");
		return (i);
	}
	assert(i == v + 1);
	assert(p[v] == '\n');
	p[v] = '\0';
	if (ptr == NULL)
		free(p);
	else
		*ptr = p;
	return (0);
}