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