Esempio n. 1
0
SVCXPRT *Svctcp_create(register int sock, u_int sendsize, u_int recvsize)
{
  bool_t madesock = FALSE;
  register SVCXPRT *xprt;
  register struct tcp_rendezvous *r;
  struct sockaddr_in addr;
  unsigned long len = sizeof(struct sockaddr_in);

  if(sock == RPC_ANYSOCK)
    {
      if((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
        {
          perror("svctcp_.c - udp socket creation problem");
          return ((SVCXPRT *) NULL);
        }
      madesock = TRUE;
    }
  memset(&addr, 0, 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, (socklen_t *) & len) != 0) ||
     (listen(sock, SOMAXCONN) != 0))
    {
      perror("svctcp_.c - cannot getsockname or listen");
      if(madesock)
        (void)close(sock);
      return ((SVCXPRT *) NULL);
    }
  r = (struct tcp_rendezvous *)Mem_Alloc(sizeof(*r));
  if(r == NULL)
    {
      return (NULL);
    }
  r->sendsize = sendsize;
  r->recvsize = recvsize;
  xprt = (SVCXPRT *) Mem_Alloc(sizeof(SVCXPRT));
  if(xprt == NULL)
    {
      return (NULL);
    }
  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);
}
Esempio n. 2
0
SVCXPRT *Svcudp_bufcreate(register int sock, u_int sendsz, u_int recvsz)
{
  bool_t madesock = FALSE;
  register SVCXPRT *xprt;
  register struct Svcudp_data *su;
  struct sockaddr_in addr;
  unsigned long len = sizeof(struct sockaddr_in);

  if(sock == RPC_ANYSOCK)
    {
      if((sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0)
        {
          perror("Svcudp_create: socket creation problem");
          return ((SVCXPRT *) NULL);
        }
      madesock = TRUE;
    }

  memset(&addr, 0, 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, (socklen_t *) & len) != 0)
    {
      perror("Svcudp_create - cannot getsockname");
      if(madesock)
        (void)close(sock);
      return ((SVCXPRT *) NULL);
    }

  xprt = (SVCXPRT *) Mem_Alloc(sizeof(SVCXPRT));
  if(xprt == NULL)
    {
      return (NULL);
    }

  su = (struct Svcudp_data *)Mem_Alloc(sizeof(*su));

  if(su == NULL)
    {
      return (NULL);
    }
  su->su_iosz = ((MAX(sendsz, recvsz) + 3) / 4) * 4;
  if((rpc_buffer(xprt) = Mem_Alloc(su->su_iosz)) == NULL)
    {
      return (NULL);
    }

  xdrmem_create(&(su->su_xdrs), rpc_buffer(xprt), su->su_iosz, XDR_DECODE);
  xprt->xp_p2 = (caddr_t) su;
  xprt->xp_verf.oa_base = su->su_verfbody;
  xprt->xp_ops = &Svcudp_op;
  xprt->xp_port = ntohs(addr.sin_port);
#ifdef _FREEBSD
  xprt->xp_fd = sock;
#else
  xprt->xp_sock = sock;
#endif

  Xprt_register(xprt);

  return (xprt);
}