Back to index

glibc  2.9
Classes | Functions | Variables
clnt_simp.c File Reference
#include <alloca.h>
#include <errno.h>
#include <stdio.h>
#include <unistd.h>
#include <rpc/rpc.h>
#include <sys/socket.h>
#include <netdb.h>
#include <string.h>

Go to the source code of this file.

Classes

struct  callrpc_private_s

Functions

int callrpc (const char *host, u_long prognum, u_long versnum, u_long procnum, xdrproc_t inproc, const char *in, xdrproc_t outproc, char *out)

Variables

static struct callrpc_private_scallrpc_private

Class Documentation

struct callrpc_private_s

Definition at line 50 of file clnt_simp.c.

Collaboration diagram for callrpc_private_s:
Class Members
CLIENT * client
char * oldhost
u_long oldprognum
u_long oldversnum
int socket
u_long valid

Function Documentation

int callrpc ( const char *  host,
u_long  prognum,
u_long  versnum,
u_long  procnum,
xdrproc_t  inproc,
const char *  in,
xdrproc_t  outproc,
char *  out 
)

Definition at line 64 of file clnt_simp.c.

{
  struct callrpc_private_s *crp = callrpc_private;
  struct sockaddr_in server_addr;
  enum clnt_stat clnt_stat;
  struct hostent hostbuf, *hp;
  struct timeval timeout, tottimeout;

  if (crp == 0)
    {
      crp = (struct callrpc_private_s *) calloc (1, sizeof (*crp));
      if (crp == 0)
       return 0;
      callrpc_private = crp;
    }
  if (crp->oldhost == NULL)
    {
      crp->oldhost = malloc (256);
      crp->oldhost[0] = 0;
      crp->socket = RPC_ANYSOCK;
    }
  if (crp->valid && crp->oldprognum == prognum && crp->oldversnum == versnum
      && strcmp (crp->oldhost, host) == 0)
    {
      /* reuse old client */
    }
  else
    {
      size_t buflen;
      char *buffer;
      int herr;

      crp->valid = 0;
      if (crp->socket != RPC_ANYSOCK)
       {
         (void) __close (crp->socket);
         crp->socket = RPC_ANYSOCK;
       }
      if (crp->client)
       {
         clnt_destroy (crp->client);
         crp->client = NULL;
       }

      buflen = 1024;
      buffer = __alloca (buflen);
      while (__gethostbyname_r (host, &hostbuf, buffer, buflen,
                            &hp, &herr) != 0
            || hp == NULL)
       if (herr != NETDB_INTERNAL || errno != ERANGE)
         return (int) RPC_UNKNOWNHOST;
       else
         {
           /* Enlarge the buffer.  */
           buflen *= 2;
           buffer = __alloca (buflen);
         }

      timeout.tv_usec = 0;
      timeout.tv_sec = 5;
      memcpy ((char *) &server_addr.sin_addr, hp->h_addr, hp->h_length);
      server_addr.sin_family = AF_INET;
      server_addr.sin_port = 0;
      if ((crp->client = INTUSE(clntudp_create) (&server_addr, (u_long) prognum,
                       (u_long) versnum, timeout, &crp->socket)) == NULL)
       return (int) get_rpc_createerr().cf_stat;
      crp->valid = 1;
      crp->oldprognum = prognum;
      crp->oldversnum = versnum;
      (void) strncpy (crp->oldhost, host, 255);
      crp->oldhost[255] = '\0';
    }
  tottimeout.tv_sec = 25;
  tottimeout.tv_usec = 0;
  clnt_stat = clnt_call (crp->client, procnum, inproc, (char *) in,
                      outproc, out, tottimeout);
  /*
   * if call failed, empty cache
   */
  if (clnt_stat != RPC_SUCCESS)
    crp->valid = 0;
  return (int) clnt_stat;
}

Here is the call graph for this function:


Variable Documentation

Definition at line 60 of file clnt_simp.c.