#include "unpxti.h"
int
xti_setopt(int fd, int level, int name, void *optval, socklen_t optlen)
{
int rc;
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_setopt: req.opt.maxlen == 0");
topt = (struct t_opthdr *) req->opt.buf;
topt->level = level;
topt->name = name;
topt->len = sizeof(struct t_opthdr) + optlen;
if (topt->len > req->opt.maxlen)
err_quit("optlen too big");
req->opt.len = topt->len;
memcpy(topt+1, optval, optlen); /* copy option value */
req->flags = T_NEGOTIATE;
if (t_optmgmt(fd, req, ret) < 0) {
T_free(req, T_OPTMGMT);
T_free(ret, T_OPTMGMT);
return(-1);
}
rc = ret->flags;
T_free(req, T_OPTMGMT);
T_free(ret, T_OPTMGMT);
if (rc == T_SUCCESS || rc == T_PARTSUCCESS)
return(0);
return(-1); /* T_FAILURE, T_NOTSUPPORT, T_READONLY */
}
syntax highlighted by Code2HTML, v. 0.9.1