Exemple #1
0
// In MRI, this only sets properties on sockets, which requires
// tracking all fd's that are sockets...
int fcntl(int fd, int cmd, ...) {

  if(cmd != F_SETFL) {
    errno = EINVAL;
    return -1;
  }

  va_list va;
  va_start(va, cmd);
  int arg = va_arg(va, int);
  va_end(va);

  unsigned long ioctl_arg;
  if(arg & O_NONBLOCK) {
    ioctl_arg = 1;
  }
  else {
    ioctl_arg = 0;
  }

  int ret = ioctlsocket(fd, FIONBIO, &ioctl_arg);
  if(ret) errno = map_errno(WSAGetLastError());

  return ret;
}
Exemple #2
0
static fru_errno_t
frt_get_seg_list(fru_treehdl_t handle, fru_strlist_t *list)
{
	fru_strlist_t rc_list;
	fru_errno_t err = FRU_SUCCESS;
	int acc_err = 0;
	int i = 0;
	int num_section = 0;
	section_t *sects = NULL;
	container_hdl_t cont;

	cont = treehdl_to_conthdl(handle);

	num_section = fru_get_num_sections(cont, NULL);
	if (num_section == -1) {
		return (map_errno(errno));
	}

	sects = malloc(sizeof (*sects) * (num_section));
	if (sects == NULL) {
		return (FRU_FAILURE);
	}

	acc_err = fru_get_sections(cont, sects, num_section, NULL);
	if (acc_err == -1) {
		free(sects);
		return (map_errno(errno));
	}

	rc_list.num = 0;
	rc_list.strs = NULL;
	for (i = 0; i < num_section; i++) {
		if ((err = add_segs_for_section(&(sects[i]), &rc_list))
		    != FRU_SUCCESS) {
			fru_destroy_strlist(&rc_list);
			free(sects);
			return (err);
		}
	}

	list->strs = rc_list.strs;
	list->num = rc_list.num;

	return (FRU_SUCCESS);
}
Exemple #3
0
static fru_errno_t
add_segs_for_section(section_t *section, fru_strlist_t *list)
{
	int i = 0;
	segment_t *segs = NULL;
	int acc_err = 0;

	int num_segment = fru_get_num_segments(section->handle, NULL);
	if (num_segment == -1) {
		return (map_errno(errno));
	} else if (num_segment == 0) {
		return (FRU_SUCCESS);
	}

	segs = malloc(sizeof (*segs) * (num_segment));
	if (segs == NULL) {
		return (FRU_FAILURE);
	}

	acc_err = fru_get_segments(section->handle, segs, num_segment, NULL);
	if (acc_err == -1) {
		free(segs);
		return (map_errno(errno));
	}

	list->strs = realloc(list->strs, sizeof (char *)
	    * (list->num + num_segment));

	for (i = 0; i < num_segment; i++) {
		/* ensure NULL terminated. */
		char *tmp = malloc(sizeof (*tmp) * (sizeof (segs[i].name)+1));
		if (tmp == NULL) {
			free(segs);
			return (FRU_FAILURE);
		}
		(void) memcpy(tmp, segs[i].name, sizeof (segs[i].name));
		tmp[sizeof (segs[i].name)] = '\0';

		list->strs[(list->num)++] = tmp;
	}

	free(segs);

	return (FRU_SUCCESS);
}
Exemple #4
0
static fru_errno_t
find_segment(fru_treehdl_t handle, const char *seg_name, int *prot_flg,
    segment_t *segment)
{
	int i = 0;
	int acc_err = 0;
	section_t *sect = NULL;
	container_hdl_t cont;
	int num_sect;

	cont = treehdl_to_conthdl(handle);

	num_sect = fru_get_num_sections(cont, NULL);
	if (num_sect == -1) {
		return (map_errno(errno));
	}

	sect = malloc(sizeof (*sect) * (num_sect));
	if (sect == NULL) {
		return (FRU_FAILURE);
	}

	acc_err = fru_get_sections(cont, sect, num_sect, NULL);
	if (acc_err == -1) {
		free(sect);
		return (map_errno(errno));
	}

	for (i = 0; i < num_sect; i++) {
		if (find_seg_in_sect(&(sect[i]), seg_name, prot_flg, segment)
		    == FRU_SUCCESS) {
			free(sect);
			return (FRU_SUCCESS);
		}
	}

	free(sect);
	return (FRU_INVALSEG);
}
Exemple #5
0
static fru_errno_t
find_seg_in_sect(section_t *sect, const char *seg_name, int *prot_flg,
    segment_t *segment)
{
	int j = 0;
	int acc_err = 0;
	segment_t *segs = NULL;

	int num_seg = fru_get_num_segments(sect->handle, NULL);
	if (num_seg == -1) {
		return (FRU_FAILURE);
	}

	segs = malloc(sizeof (*segs) * (num_seg));
	if (segs == NULL) {
		return (FRU_FAILURE);
	}

	acc_err = fru_get_segments(sect->handle, segs, num_seg, NULL);
	if (acc_err == -1) {
		free(segs);
		return (map_errno(errno));
	}

	for (j = 0; j < num_seg; j++) {
		/* NULL terminate */
		char tmp[SEG_NAME_LEN+1];
		(void) memcpy(tmp, segs[j].name, SEG_NAME_LEN);
		tmp[SEG_NAME_LEN] = '\0';
		if (strcmp(tmp, seg_name) == 0) {
			*segment = segs[j];
			*prot_flg = (sect->protection ? 1 : 0);
			free(segs);
			return (FRU_SUCCESS);
		}
	}

	free(segs);
	return (FRU_INVALSEG);
}
Exemple #6
0
static fru_errno_t
frt_for_each_packet(fru_seghdl_t node,
    int (*function)(fru_tag_t *tag, uint8_t *payload, size_t length,
	void *args), void *args)
{
	int rc_num;
	int status;
	char *rc_tags;
	char *rc_data;
	int i;
	packet_t *packets = NULL;
	segment_list_t *tmp_list;
	fru_segdesc_t *descriptor;

	tmp_list = g_raw->segs;

	/* num of packet */
	rc_num = fru_get_num_packets(node, NULL);
	if (rc_num == -1) {
		return (map_errno(errno));
	} else if (rc_num == 0) {
		return (FRU_SUCCESS);
	}
	while (tmp_list) {
		if (node == tmp_list->segment->handle) {
			break;
		}
		tmp_list = tmp_list->next;
	}
	if (tmp_list) {
		descriptor = (fru_segdesc_t *)&tmp_list->segment->descriptor;
		if (descriptor->field.opaque) {
			return (FRU_SUCCESS);
		}

		if (descriptor->field.encrypted && (encrypt_func == NULL)) {
			return (FRU_SUCCESS);
		}
	}

	packets = malloc(sizeof (*packets) * (rc_num));
	if (packets == NULL) {
		return (FRU_FAILURE);
	}
	/* get all packets */
	if (fru_get_packets(node, packets, rc_num, NULL) == -1) {
		free(packets);
		return (map_errno(errno));
	}

	rc_tags = malloc(sizeof (*rc_tags) * (rc_num));
	if (rc_tags == NULL) {
		free(packets);
		return (FRU_FAILURE);
	}

	/* number of tags */
	for (i = 0; i < rc_num; i++) {
		size_t rc_len =
		    get_payload_length((fru_tag_t *)&packets[i].tag);

		rc_data = malloc(sizeof (*rc_data) * (rc_len));
		if (rc_data == NULL) {
			free(packets);
			return (FRU_FAILURE);
		}
		/* get the payload data */
		(void) fru_get_payload(packets[i].handle, (void *)rc_data,
		    rc_len, NULL);

		if (tmp_list) {
			descriptor =
			    (fru_segdesc_t *)&tmp_list->segment->descriptor;

			if ((descriptor->field.encrypted) &&
			    ((status = encrypt_func(FRU_DECRYPT,
			    (void *)rc_data, rc_len))
			    != FRU_SUCCESS)) {
				return (status);
			}
		}
		/* print packet */
		if ((status = function((fru_tag_t *)&packets[i].tag,
		    (uint8_t *)rc_data, rc_len, args)) != FRU_SUCCESS) {
			free(rc_data);
			free(packets);
			return (status);
		}
		free(rc_data);
	}
	return (FRU_SUCCESS);

}
Exemple #7
0
static fru_errno_t
frt_get_segment_name(fru_seghdl_t node, char **name)
{
	int num_sect;
	int acc_err;
	int cnt;
	int num_segment;
	section_t *sects;
	segment_t *segs;
	int each_seg;
	container_hdl_t cont;

	cont = treehdl_to_conthdl(node);

	num_sect = fru_get_num_sections(cont, NULL);
	if (num_sect == -1) {
		return (map_errno(errno));
	}

	sects = malloc(sizeof (*sects) * (num_sect));
	if (sects == NULL) {
		return (FRU_FAILURE);
	}
	acc_err = fru_get_sections(cont, sects, num_sect, NULL);
	if (acc_err == -1) {
		free(sects);
		return (map_errno(errno));
	}

	for (cnt = 0; cnt < num_sect; cnt++) {
		num_segment = fru_get_num_segments(sects[cnt].handle, NULL);
		if (num_segment == -1) {
			free(sects);
			return (map_errno(errno));
		} else if (num_segment == 0) {
			continue;
		}

		segs = malloc(sizeof (*segs) * (num_segment));
		if (segs == NULL) {
			free(sects);
			return (FRU_FAILURE);
		}

		acc_err = fru_get_segments(sects[cnt].handle, segs,
		    num_segment, NULL);
		if (acc_err == -1) {
			free(sects);
			free(segs);
			return (map_errno(errno));
		}

		for (each_seg = 0; each_seg < num_segment; each_seg++) {
			if (segs[each_seg].handle == node) {
				segs[each_seg].name[FRU_SEGNAMELEN] = '\0';
				*name = strdup(segs[each_seg].name);
				free(sects);
				free(segs);
				return (FRU_SUCCESS);
			}
		}
		free(segs);
	}

	return (FRU_FAILURE);
}
Exemple #8
0
/* ARGSUSED */
static fru_errno_t
frt_for_each_segment(fru_nodehdl_t node,
    int (*function)(fru_seghdl_t hdl, void *args), void *args)
{
	int num_segment;
	int cnt;
	int num_sect;
	int each_seg;
	section_t *sects;
	segment_t *segs;
	segment_list_t *tmp_list;
	int acc_err;
	int status;
	container_hdl_t cont;

	cont = g_raw->cont;

	num_sect = fru_get_num_sections(cont, NULL);
	if (num_sect == -1) {
		return (map_errno(errno));
	}

	sects = malloc((num_sect + 1) * sizeof (section_t));
	if (sects == NULL) {
		return (FRU_FAILURE);
	}
	num_sect = fru_get_sections(cont, sects, num_sect, NULL);
	if (num_sect == -1) {
		free(sects);
		return (map_errno(errno));
	}
	for (cnt = 0; cnt < num_sect; cnt++) {
		num_segment = fru_get_num_segments(sects[cnt].handle, NULL);
		if (num_segment == -1) {
			return (map_errno(errno));
		} else if (num_segment == 0) {
			continue;
		}
		segs = malloc((num_segment + 1) * sizeof (segment_t));
		if (segs == NULL) {
			free(sects);
			return (FRU_FAILURE);
		}
		acc_err = fru_get_segments(sects[cnt].handle, segs,
		    num_segment, NULL);
		if (acc_err == -1) {
			free(sects);
			free(segs);
			return (map_errno(errno));
		}
		for (each_seg = 0; each_seg < num_segment; each_seg++) {
			tmp_list = malloc(sizeof (segment_list_t));
			tmp_list->segment = &segs[each_seg];
			tmp_list->next = NULL;
			if (g_raw->segs == NULL) {
				g_raw->segs = tmp_list;
			} else {
				tmp_list->next = g_raw->segs;
				g_raw->segs = tmp_list;
			}

			if ((status = function(segs[each_seg].handle, args))
			    != FRU_SUCCESS) {
				free(segs);
				free(sects);
				return (status);
			}
		}
		free(segs);
		free(sects);

	}
	return (FRU_SUCCESS);
}