Back to index

glibc  2.9
Classes | Functions | Variables
svc_tcp.c File Reference
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <libintl.h>
#include <rpc/rpc.h>
#include <sys/socket.h>
#include <sys/poll.h>
#include <errno.h>
#include <stdlib.h>

Go to the source code of this file.

Classes

struct  tcp_conn

Functions

static bool_t svctcp_recv (SVCXPRT *, struct rpc_msg *)
static enum xprt_stat svctcp_stat (SVCXPRT *)
static bool_t svctcp_getargs (SVCXPRT *, xdrproc_t, caddr_t)
static bool_t svctcp_reply (SVCXPRT *, struct rpc_msg *)
static bool_t svctcp_freeargs (SVCXPRT *, xdrproc_t, caddr_t)
static void svctcp_destroy (SVCXPRT *)
static bool_t rendezvous_request (SVCXPRT *, struct rpc_msg *)
static enum xprt_stat rendezvous_stat (SVCXPRT *)
static void svctcp_rendezvous_abort (void)
static int readtcp (char *, char *, int)
static int writetcp (char *, char *, int)
static SVCXPRTmakefd_xprt (int, u_int, u_int)
SVCXPRTsvctcp_create (int sock, u_int sendsize, u_int recvsize)
SVCXPRTsvcfd_create (int fd, u_int sendsize, u_int recvsize)

Variables

static struct xp_ops

Class Documentation

struct tcp_conn

Definition at line 114 of file svc_tcp.c.


Function Documentation

static SVCXPRT *internal_function makefd_xprt ( int  fd,
u_int  sendsize,
u_int  recvsize 
) [static]

Definition at line 106 of file svc_tcp.c.

  {                         /* kept in xprt->xp_p1 */
    u_int sendsize;
    u_int recvsize;
  };

Here is the caller graph for this function:

static int readtcp ( char *  xprtptr,
char *  buf,
int  len 
) [static]

Definition at line 297 of file svc_tcp.c.

{
  SVCXPRT *xprt = (SVCXPRT *)xprtptr;
  int sock = xprt->xp_sock;
  int milliseconds = 35 * 1000;
  struct pollfd pollfd;

  do
    {
      pollfd.fd = sock;
      pollfd.events = POLLIN;
      switch (__poll (&pollfd, 1, milliseconds))
       {
       case -1:
         if (errno == EINTR)
           continue;
         /*FALLTHROUGH*/
       case 0:
         goto fatal_err;
       default:
          if ((pollfd.revents & POLLERR) || (pollfd.revents & POLLHUP)
              || (pollfd.revents & POLLNVAL))
            goto fatal_err;
         break;
       }
    }
  while ((pollfd.revents & POLLIN) == 0);

  if ((len = __read (sock, buf, len)) > 0)
    return len;

 fatal_err:
  ((struct tcp_conn *) (xprt->xp_p1))->strm_stat = XPRT_DIED;
  return -1;
}

Here is the call graph for this function:

static bool_t rendezvous_request ( SVCXPRT xprt,
struct rpc_msg errmsg 
) [static]

Definition at line 238 of file svc_tcp.c.

{
  int sock;
  struct tcp_rendezvous *r;
  struct sockaddr_in addr;
  socklen_t len;

  r = (struct tcp_rendezvous *) xprt->xp_p1;
again:
  len = sizeof (struct sockaddr_in);
  if ((sock = accept (xprt->xp_sock, (struct sockaddr *) &addr, &len)) < 0)
    {
      if (errno == EINTR)
       goto again;
      return FALSE;
    }
  /*
   * make a new transporter (re-uses xprt)
   */
  xprt = makefd_xprt (sock, r->sendsize, r->recvsize);
  memcpy (&xprt->xp_raddr, &addr, sizeof (addr));
  xprt->xp_addrlen = len;
  return FALSE;             /* there is never an rpc msg to be processed */
}

Here is the call graph for this function:

static enum xprt_stat rendezvous_stat ( SVCXPRT xprt) [static]

Definition at line 264 of file svc_tcp.c.

{
  return XPRT_IDLE;
}
SVCXPRT* svcfd_create ( int  fd,
u_int  sendsize,
u_int  recvsize 
)

Definition at line 201 of file svc_tcp.c.

{
  return makefd_xprt (fd, sendsize, recvsize);
}

Here is the call graph for this function:

SVCXPRT* svctcp_create ( int  sock,
u_int  sendsize,
u_int  recvsize 
)

Definition at line 143 of file svc_tcp.c.

{
  bool_t madesock = FALSE;
  SVCXPRT *xprt;
  struct tcp_rendezvous *r;
  struct sockaddr_in addr;
  socklen_t len = sizeof (struct sockaddr_in);

  if (sock == RPC_ANYSOCK)
    {
      if ((sock = __socket (AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
       {
         perror (_("svc_tcp.c - tcp socket creation problem"));
         return (SVCXPRT *) NULL;
       }
      madesock = TRUE;
    }
  __bzero ((char *) &addr, sizeof (addr));
  addr.sin_family = AF_INET;
  if (bindresvport (sock, &addr))
    {
      addr.sin_port = 0;
      (void) __bind (sock, (struct sockaddr *) &addr, len);
    }
  if ((__getsockname (sock, (struct sockaddr *) &addr, &len) != 0) ||
      (__listen (sock, SOMAXCONN) != 0))
    {
      perror (_("svc_tcp.c - cannot getsockname or listen"));
      if (madesock)
       (void) __close (sock);
      return (SVCXPRT *) NULL;
    }
  r = (struct tcp_rendezvous *) mem_alloc (sizeof (*r));
  xprt = (SVCXPRT *) mem_alloc (sizeof (SVCXPRT));
  if (r == NULL || xprt == NULL)
    {
      (void) __fxprintf (NULL, "%s: %s", __func__, _("out of memory\n"));
      mem_free (r, sizeof (*r));
      mem_free (xprt, sizeof (SVCXPRT));
      return NULL;
    }
  r->sendsize = sendsize;
  r->recvsize = recvsize;
  xprt->xp_p2 = NULL;
  xprt->xp_p1 = (caddr_t) r;
  xprt->xp_verf = _null_auth;
  xprt->xp_ops = &svctcp_rendezvous_op;
  xprt->xp_port = ntohs (addr.sin_port);
  xprt->xp_sock = sock;
  xprt_register (xprt);
  return xprt;
}

Here is the call graph for this function:

Here is the caller graph for this function:

static void svctcp_destroy ( SVCXPRT xprt) [static]

Definition at line 270 of file svc_tcp.c.

{
  struct tcp_conn *cd = (struct tcp_conn *) xprt->xp_p1;

  xprt_unregister (xprt);
  (void) __close (xprt->xp_sock);
  if (xprt->xp_port != 0)
    {
      /* a rendezvouser socket */
      xprt->xp_port = 0;
    }
  else
    {
      /* an actual connection socket */
      XDR_DESTROY (&(cd->xdrs));
    }
  mem_free ((caddr_t) cd, sizeof (struct tcp_conn));
  mem_free ((caddr_t) xprt, sizeof (SVCXPRT));
}

Here is the call graph for this function:

static bool_t svctcp_freeargs ( SVCXPRT xprt,
xdrproc_t  xdr_args,
caddr_t  args_ptr 
) [static]

Definition at line 392 of file svc_tcp.c.

{
  XDR *xdrs = &(((struct tcp_conn *) (xprt->xp_p1))->xdrs);

  xdrs->x_op = XDR_FREE;
  return ((*xdr_args) (xdrs, args_ptr));
}
static bool_t svctcp_getargs ( SVCXPRT xprt,
xdrproc_t  xdr_args,
caddr_t  args_ptr 
) [static]

Definition at line 385 of file svc_tcp.c.

{
  return ((*xdr_args) (&(((struct tcp_conn *)
                       (xprt->xp_p1))->xdrs), args_ptr));
}
static bool_t svctcp_recv ( SVCXPRT xprt,
struct rpc_msg msg 
) [static]

Definition at line 368 of file svc_tcp.c.

{
  struct tcp_conn *cd = (struct tcp_conn *) (xprt->xp_p1);
  XDR *xdrs = &(cd->xdrs);

  xdrs->x_op = XDR_DECODE;
  (void) INTUSE(xdrrec_skiprecord) (xdrs);
  if (INTUSE(xdr_callmsg) (xdrs, msg))
    {
      cd->x_id = msg->rm_xid;
      return TRUE;
    }
  cd->strm_stat = XPRT_DIED;       /* XXXX */
  return FALSE;
}

Here is the call graph for this function:

static void svctcp_rendezvous_abort ( void  ) [static]

Definition at line 84 of file svc_tcp.c.

{
  abort ();
};

Here is the call graph for this function:

static bool_t svctcp_reply ( SVCXPRT xprt,
struct rpc_msg msg 
) [static]

Definition at line 401 of file svc_tcp.c.

{
  struct tcp_conn *cd = (struct tcp_conn *) (xprt->xp_p1);
  XDR *xdrs = &(cd->xdrs);
  bool_t stat;

  xdrs->x_op = XDR_ENCODE;
  msg->rm_xid = cd->x_id;
  stat = INTUSE(xdr_replymsg) (xdrs, msg);
  (void) INTUSE(xdrrec_endofrecord) (xdrs, TRUE);
  return stat;
}

Here is the call graph for this function:

static enum xprt_stat svctcp_stat ( SVCXPRT xprt) [static]

Definition at line 355 of file svc_tcp.c.

{
  struct tcp_conn *cd =
  (struct tcp_conn *) (xprt->xp_p1);

  if (cd->strm_stat == XPRT_DIED)
    return XPRT_DIED;
  if (!INTUSE(xdrrec_eof) (&(cd->xdrs)))
    return XPRT_MOREREQS;
  return XPRT_IDLE;
}

Here is the call graph for this function:

static int writetcp ( char *  xprtptr,
char *  buf,
int  len 
) [static]

Definition at line 338 of file svc_tcp.c.

{
  SVCXPRT *xprt = (SVCXPRT *)xprtptr;
  int i, cnt;

  for (cnt = len; cnt > 0; cnt -= i, buf += i)
    {
      if ((i = __write (xprt->xp_sock, buf, cnt)) < 0)
       {
         ((struct tcp_conn *) (xprt->xp_p1))->strm_stat = XPRT_DIED;
         return -1;
       }
    }
  return len;
}

Here is the call graph for this function:


Variable Documentation

static struct xp_ops [static]
Initial value:

Definition at line 69 of file svc_tcp.c.