#include	"unpxti.h"

int
xti_getopt(int fd, int level, int name, void *optval, socklen_t *optlenp)
{
	int					rc, len;
	struct t_optmgmt	*req, *ret;
	struct t_opthdr		*topt;

	req = T_alloc(fd, T_OPTMGMT, T_ALL);
	ret = T_alloc(fd, T_OPTMGMT, T_ALL);
	if (req->opt.maxlen == 0)
		err_quit("xti_getopt: opt.maxlen == 0");

	topt = (struct t_opthdr *) req->opt.buf;
	topt->level = level;
	topt->name = name;
	topt->len = sizeof(struct t_opthdr);	/* just a t_opthdr{} */
	req->opt.len = topt->len;

	req->flags = T_CURRENT;
	if (t_optmgmt(fd, req, ret) < 0) {
		T_free(req, T_OPTMGMT);
		T_free(ret, T_OPTMGMT);
		return(-1);
	}
	rc = ret->flags;

	if (rc == T_SUCCESS || rc == T_READONLY) {
			/*4copy back value and length */
		topt = (struct t_opthdr *) ret->opt.buf;
		len = topt->len - sizeof(struct t_opthdr);
		len = min(len, *optlenp);
		memcpy(optval, topt+1, len);
		*optlenp = len;
	}

	T_free(req, T_OPTMGMT);
	T_free(ret, T_OPTMGMT);

	if (rc == T_SUCCESS || rc == T_READONLY)
		return(0);
	return(-1);		/* T_NOTSUPPORT */
}


syntax highlighted by Code2HTML, v. 0.9.1