OpenSS7
SS7 for the
Common Man

© Copyright 1997-2004,OpenSS7 Corporation, All Rights Reserved.
Last modified:

Home Overview Status News Documentation Resources About
   
 Overview
 Status
 News
 Documentation
 Resources
 About

   
Home Index Prev Next More Download Info FAQ Mail   Home -> Resources -> Browse Source -> strss7/lib/libxnet/t_optmgmt.c


File /code/strss7/lib/libxnet/t_optmgmt.c



#ident "@(#) $RCSfile: t_optmgmt.c,v $ $Name:  $($Revision: 0.8.2.2 $) $Date: 2003/05/27 11:21:51 $"

static char const ident[] = "$RCSfile: t_optmgmt.c,v $ $Name:  $($Revision: 0.8.2.2 $) $Date: 2003/05/27 11:21:51 $";

#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <sys/stropts.h>
#include <sys/xti.h>
#include <sys/tpi.h>
#include <timod.h>
#include "xti.h"

int t_optmgmt(int fd, const struct t_optmgmt *req, struct t_optmgmt *ret)
{
	struct t_info info;
	if (_t_getsizes(fd, &info) < 0)
		goto error;
	{
		union {
			struct {
				struct T_optmgmt_req prim;
				char opts[info.options];
			} req;
			struct {
				struct T_optmgmt_ack prim;
				char opts[info.options];
			} ret;
		} buf;
		buf.req.prim.PRIM_type = T_OPTMGMT_REQ;
		if (req) {
			buf.req.prim.MGMT_flags = req->flags;
			if (req->opt.len && !req->opt.buf)
				goto efault;
			if (req->opt.len) {
				if (req->opt.len > info.options)
					goto tbadaddr;
				buf.req.prim.OPT_length = req->opt.len;
				buf.req.prim.OPT_offset = sizeof(buf.req.prim);;
				memcpy(buf.req.opts, req->opt.buf, req->opt.len);
			} else {
				buf.req.prim.OPT_length = 0;
				buf.req.prim.OPT_offset = 0;
			}
		} else {
			buf.req.prim.MGMT_flags = 0;
			buf.req.prim.OPT_length = 0;
			buf.req.prim.OPT_offset = 0;
		}
		if (t_strioctl(fd, TI_OPTMGMT, &buf, sizeof(buf)) < 0)
			goto error;
		if (buf.ret.prim.PRIM_type != T_OPTMGMT_ACK)
			goto tproto;
		if (!ret || !ret->opt.maxlen)
			goto done;
		if (!ret->opt.buf)
			goto efault;
		if (ret->opt.maxlen < buf.ret.prim.OPT_length)
			goto tbufovflw;
		ret->opt.len = buf.ret.prim.OPT_length;
		ret->flags = buf.ret.prim.MGMT_flags;
		memcpy(ret->opt.buf, buf.ret.opts + buf.ret.prim.OPT_offset - sizeof(buf.ret.prim),
		       ret->opt.len);
	}
      done:
	return (0);
      tbadaddr:
	t_errno = TBADADDR;
	goto error;
      tbufovflw:
	t_errno = TBUFOVFLW;
	goto error;
      tproto:
	t_errno = TPROTO;
	goto error;
      efault:
	t_errno = TSYSERR;
	errno = EFAULT;
	goto error;
      error:
	return (-1);
}


Home Index Prev Next More Download Info FAQ Mail   Home -> Resources -> Browse Source -> strss7/lib/libxnet/t_optmgmt.c

OpenSS7
SS7 for the
Common Man
Home Overview Status News Documentation Resources About

© Copyright 1997-2004,OpenSS7 Corporation, All Rights Reserved.
Last modified: