#include <stdlib.h>
#include <rpc/rpc.h>
static struct svcraw_private {
char _raw_buf[UDPMSGSIZE];
SVCXPRT server;
XDR xdr_stream;
char verf_body[MAX_AUTH_BYTES];
} *svcraw_private;
static bool_t svcraw_recv(SVCXPRT *xprt, struct rpc_msg *msg);
static enum xprt_stat svcraw_stat(SVCXPRT *xprt);
static bool_t svcraw_getargs(SVCXPRT *xprt, xdrproc_t xdr_args,
caddr_t args_ptr);
static bool_t svcraw_reply(SVCXPRT *xprt, struct rpc_msg *msg);
static bool_t svcraw_freeargs(SVCXPRT *xprt, xdrproc_t xdr_args,
caddr_t args_ptr);
static void svcraw_destroy(SVCXPRT *xprt);
static const struct xp_ops server_ops = {
svcraw_recv,
svcraw_stat,
svcraw_getargs,
svcraw_reply,
svcraw_freeargs,
svcraw_destroy
};
SVCXPRT *
svcraw_create(void)
{
struct svcraw_private *srp = svcraw_private;
if (srp == NULL) {
srp = calloc(1, sizeof (*srp));
if (srp == NULL)
return (NULL);
}
srp->server.xp_sock = 0;
srp->server.xp_port = 0;
srp->server.xp_ops = &server_ops;
srp->server.xp_verf.oa_base = srp->verf_body;
xdrmem_create(&srp->xdr_stream, srp->_raw_buf, UDPMSGSIZE, XDR_FREE);
return (&srp->server);
}
static enum xprt_stat
svcraw_stat(SVCXPRT *xprt)
{
return (XPRT_IDLE);
}
static bool_t
svcraw_recv(SVCXPRT *xprt, struct rpc_msg *msg)
{
struct svcraw_private *srp = svcraw_private;
XDR *xdrs;
if (srp == NULL)
return (0);
xdrs = &srp->xdr_stream;
xdrs->x_op = XDR_DECODE;
XDR_SETPOS(xdrs, 0);
if (! xdr_callmsg(xdrs, msg))
return (FALSE);
return (TRUE);
}
static bool_t
svcraw_reply(SVCXPRT *xprt, struct rpc_msg *msg)
{
struct svcraw_private *srp = svcraw_private;
XDR *xdrs;
if (srp == NULL)
return (FALSE);
xdrs = &srp->xdr_stream;
xdrs->x_op = XDR_ENCODE;
XDR_SETPOS(xdrs, 0);
if (! xdr_replymsg(xdrs, msg))
return (FALSE);
(void)XDR_GETPOS(xdrs);
return (TRUE);
}
static bool_t
svcraw_getargs(SVCXPRT *xprt, xdrproc_t xdr_args, caddr_t args_ptr)
{
struct svcraw_private *srp = svcraw_private;
if (srp == NULL)
return (FALSE);
return ((*xdr_args)(&srp->xdr_stream, args_ptr));
}
static bool_t
svcraw_freeargs(SVCXPRT *xprt, xdrproc_t xdr_args, caddr_t args_ptr)
{
struct svcraw_private *srp = svcraw_private;
XDR *xdrs;
if (srp == NULL)
return (FALSE);
xdrs = &srp->xdr_stream;
xdrs->x_op = XDR_FREE;
return ((*xdr_args)(xdrs, args_ptr));
}
static void
svcraw_destroy(SVCXPRT *xprt)
{
}