Back to index

glibc  2.9
Functions | Variables
pm_getport.c File Reference
#include <stdbool.h>
#include <unistd.h>
#include <rpc/rpc.h>
#include <rpc/pmap_prot.h>
#include <rpc/pmap_clnt.h>
#include <sys/socket.h>

Go to the source code of this file.

Functions

int internal_function __get_socket (struct sockaddr_in *saddr)
u_short pmap_getport (struct sockaddr_in *address, u_long program, u_long version, u_int protocol)

Variables

static struct timeval

Function Documentation

Definition at line 60 of file pm_getport.c.

{
  int so = __socket (AF_INET, SOCK_STREAM, IPPROTO_TCP);
  if (so < 0)
    return -1;

  struct sockaddr_in laddr;
  socklen_t namelen = sizeof (laddr);
  laddr.sin_family = AF_INET;
  laddr.sin_port = 0;
  laddr.sin_addr.s_addr = htonl (INADDR_ANY);

  int cc = __bind (so, (struct sockaddr *) &laddr, namelen);
  if (__builtin_expect (cc < 0, 0))
    {
    fail:
      __close (so);
      return -1;
    }

  cc = __connect (so, (struct sockaddr *) saddr, namelen);
  if (__builtin_expect (cc < 0, 0))
    goto fail;

  return so;
}

Here is the call graph for this function:

Here is the caller graph for this function:

u_short pmap_getport ( struct sockaddr_in address,
u_long  program,
u_long  version,
u_int  protocol 
)

Definition at line 94 of file pm_getport.c.

{
  u_short port = 0;
  int socket = -1;
  CLIENT *client;
  struct pmap parms;
  bool closeit = false;

  address->sin_port = htons (PMAPPORT);
  if (protocol == IPPROTO_TCP)
    {
      /* Don't need a reserved port to get ports from the portmapper.  */
      socket = __get_socket(address);
      if (socket != -1)
       closeit = true;
      client = INTUSE(clnttcp_create) (address, PMAPPROG, PMAPVERS, &socket,
                                   RPCSMALLMSGSIZE, RPCSMALLMSGSIZE);
    }
  else
    client = INTUSE(clntudp_bufcreate) (address, PMAPPROG, PMAPVERS, timeout,
                                   &socket, RPCSMALLMSGSIZE,
                                   RPCSMALLMSGSIZE);
  if (client != (CLIENT *) NULL)
    {
      struct rpc_createerr *ce = &get_rpc_createerr ();
      parms.pm_prog = program;
      parms.pm_vers = version;
      parms.pm_prot = protocol;
      parms.pm_port = 0;    /* not needed or used */
      if (CLNT_CALL (client, PMAPPROC_GETPORT, (xdrproc_t)INTUSE(xdr_pmap),
                   (caddr_t)&parms, (xdrproc_t)INTUSE(xdr_u_short),
                   (caddr_t)&port, tottimeout) != RPC_SUCCESS)
       {
         ce->cf_stat = RPC_PMAPFAILURE;
         clnt_geterr (client, &ce->cf_error);
       }
      else if (port == 0)
       {
         ce->cf_stat = RPC_PROGNOTREGISTERED;
       }
      CLNT_DESTROY (client);
    }
  /* We only need to close the socket here if we opened  it.  */
  if (closeit)
    (void) __close (socket);
  address->sin_port = 0;
  return port;
}

Here is the call graph for this function:

Here is the caller graph for this function:


Variable Documentation

static struct timeval [static]
Initial value:
{5, 0}

Definition at line 48 of file pm_getport.c.