OpenSS7 SS7 for the Common Man |
© Copyright 1997-2004,OpenSS7 Corporation, All Rights Reserved. |
||||||||||||||||||||||||||
Home | Overview | Status | News | Documentation | Resources | About | |||||||||||||||||||||
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); }
|
|||||||||||||||||||||||||||
OpenSS7 SS7 for the Common Man |
Home | Overview | Status | News | Documentation | Resources | About | ||||||||||||||||||||
© Copyright 1997-2004,OpenSS7 Corporation, All Rights Reserved. |