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_bind.c


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



#ident "@(#) $RCSfile: t_bind.c,v $ $Name:  $($Revision: 0.8.2.3 $) $Date: 2003/05/27 11:21:50 $"

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

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

int t_bind(int fd, const struct t_bind *req, struct t_bind *ret)
{
	struct t_info info;
	if (_t_getsizes(fd, &info) < 0)
		goto error;
	if (info.addr < 0)
		info.addr = 0;
	{
		union {
			struct {
				struct T_bind_req prim;
				char addr[info.addr];
			} req;
			struct {
				struct T_bind_ack prim;
				char addr[info.addr];
			} ret;
		} buf;
		buf.req.prim.PRIM_type = T_BIND_REQ;
		if (req) {
			buf.req.prim.CONIND_number = req->qlen;
			if (req->addr.len && !req->addr.buf)
				goto efault;
			if (req->addr.len) {
				if (req->addr.len > info.addr)
					goto tbadaddr;
				buf.req.prim.ADDR_length = req->addr.len;
				buf.req.prim.ADDR_offset = sizeof(buf.req.prim);
				memcpy(buf.req.addr, req->addr.buf, req->addr.len);
			} else {
				buf.req.prim.ADDR_length = 0;
				buf.req.prim.ADDR_offset = 0;
			}
		} else {
			buf.req.prim.CONIND_number = 0;
			buf.req.prim.ADDR_length = 0;
			buf.req.prim.ADDR_offset = 0;
		}
		if (t_strioctl(fd, TI_BIND, &buf, sizeof(buf)) < 0)
			goto error;
		if (buf.ret.prim.PRIM_type != T_BIND_ACK)
			goto tproto;
		if (!ret || !ret->addr.maxlen)
			goto done;
		if (!ret->addr.buf)
			goto efault;
		if (ret->addr.maxlen < buf.ret.prim.ADDR_length)
			goto tbufovflw;
		ret->addr.len = buf.ret.prim.ADDR_length;
		ret->qlen = buf.ret.prim.CONIND_number;
		memcpy(ret->addr.buf, buf.ret.addr + buf.ret.prim.ADDR_offset - sizeof(buf.ret.prim),
		       ret->addr.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_bind.c

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

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