#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