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


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



#ident "@(#) $RCSfile: t_connect.c,v $ $Name:  $($Revision: 0.8.2.3 $) $Date: 2003/05/28 08:01:28 $"

static char const ident[] = "$RCSfile: t_connect.c,v $ $Name:  $($Revision: 0.8.2.3 $) $Date: 2003/05/28 08:01:28 $";

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

static int _t_connect(int fd, const struct t_call *snd, struct t_call *rcv, struct t_info *info)
{
	union {
		struct {
			struct T_conn_req prim;
			char addr[info->addr];
			char opts[info->options];
			char data[info->connect];
		} req;
		struct {
			struct T_ok_ack prim;
		} ret;
	} buf;
	buf.req.prim.PRIM_type = T_CONN_REQ;
	if (snd) {
		if ((snd->addr.len && !snd->addr.buf) || (snd->opt.len && !snd->opt.buf) ||
		    (snd->udata.len && !snd->udata.buf))
			goto efault;
		buf.req.prim.DEST_length = snd->addr.len;
		buf.req.prim.DEST_offset = snd->addr.len ? sizeof(buf.req.prim) : 0;
		if (snd->addr.len)
			memcpy(buf.req.addr, snd->addr.buf, snd->addr.len);
		buf.req.prim.DEST_length = snd->opt.len;
		buf.req.prim.DEST_offset = snd->opt.len ? sizeof(buf.req.prim) + snd->addr.len : 0;
		if (snd->opt.len)
			memcpy(buf.req.addr + snd->addr.len, snd->opt.buf, snd->opt.len);
	} else {
		buf.req.prim.DEST_length = 0;
		buf.req.prim.DEST_offset = 0;
		buf.req.prim.OPT_length = 0;
		buf.req.prim.OPT_offset = 0;
	}
	if (t_strioctl(fd, TI_SETPEERNAME, &buf, sizeof(buf)) < 0)
		goto error;
	return _t_rcvconnect(fd, rcv, info);
      efault:
	t_errno = TSYSERR;
	errno = EFAULT;
	goto error;
      error:
	return (-1);
}

int t_connect(int fd, const struct t_call *snd, struct t_call *rcv)
{
	struct t_info info = { 0, };
	int state;
	if ((state = _t_getsizes(fd, &info)) < 0)
		goto error;
	switch (state) {
	case TS_UNBND:
	case TS_WACK_BREQ:
	case TS_WACK_UREQ:
	case TS_IDLE:
	case TS_WACK_OPTREQ:
	case TS_WACK_CREQ:
	case TS_WCON_CREQ:
	case TS_WRES_CIND:
	case TS_WACK_CRES:
	case TS_DATA_XFER:
	case TS_WIND_ORDREL:
	case TS_WREQ_ORDREL:
	case TS_WACK_DREQ6:
	case TS_WACK_DREQ7:
	case TS_WACK_DREQ9:
	case TS_WACK_DREQ10:
	case TS_WACK_DREQ11:
	default:
	}
	return _t_connect(fd, snd, rcv, &info);
      error:
	return (-1);
}


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

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

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