Blame sunrpc/thrsvc.c

Packit 6c4009
#include <pthread.h>
Packit 6c4009
#include <stdio.h>
Packit 6c4009
#include <string.h>
Packit 6c4009
#include <unistd.h>
Packit 6c4009
#include <rpc/rpc.h>
Packit 6c4009
#include <arpa/inet.h>
Packit 6c4009
Packit 6c4009
#define PROGNUM 1234
Packit 6c4009
#define VERSNUM 1
Packit 6c4009
#define PROCNUM 1
Packit 6c4009
#define PROCQUIT 2
Packit 6c4009
Packit 6c4009
static int exitcode;
Packit 6c4009
Packit 6c4009
struct rpc_arg
Packit 6c4009
{
Packit 6c4009
  CLIENT *client;
Packit 6c4009
  u_long proc;
Packit 6c4009
};
Packit 6c4009
Packit 6c4009
static void
Packit 6c4009
dispatch(struct svc_req *request, SVCXPRT *xprt)
Packit 6c4009
{
Packit 6c4009
  svc_sendreply(xprt, (xdrproc_t)xdr_void, 0);
Packit 6c4009
  if (request->rq_proc == PROCQUIT)
Packit 6c4009
    exit (0);
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
static void
Packit 6c4009
test_one_call (struct rpc_arg *a)
Packit 6c4009
{
Packit 6c4009
  struct timeval tout = { 60, 0 };
Packit 6c4009
  enum clnt_stat result;
Packit 6c4009
Packit 6c4009
  printf ("test_one_call: ");
Packit 6c4009
  result = clnt_call (a->client, a->proc,
Packit 6c4009
		      (xdrproc_t) xdr_void, 0,
Packit 6c4009
		      (xdrproc_t) xdr_void, 0, tout);
Packit 6c4009
  if (result == RPC_SUCCESS)
Packit 6c4009
    puts ("success");
Packit 6c4009
  else
Packit 6c4009
    {
Packit 6c4009
      clnt_perrno (result);
Packit 6c4009
      putchar ('\n');
Packit 6c4009
      exitcode = 1;
Packit 6c4009
    }
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
static void *
Packit 6c4009
thread_wrapper (void *arg)
Packit 6c4009
{
Packit 6c4009
  struct rpc_arg a;
Packit 6c4009
Packit 6c4009
  a.client = (CLIENT *)arg;
Packit 6c4009
  a.proc = PROCNUM;
Packit 6c4009
  test_one_call (&a);
Packit 6c4009
  a.client = (CLIENT *)arg;
Packit 6c4009
  a.proc = PROCQUIT;
Packit 6c4009
  test_one_call (&a);
Packit 6c4009
  return 0;
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
int
Packit 6c4009
main (void)
Packit 6c4009
{
Packit 6c4009
  pthread_t tid;
Packit 6c4009
  pid_t pid;
Packit 6c4009
  int err;
Packit 6c4009
  SVCXPRT *svx;
Packit 6c4009
  CLIENT *clnt;
Packit 6c4009
  struct sockaddr_in sin;
Packit 6c4009
  struct timeval wait = { 5, 0 };
Packit 6c4009
  int sock = RPC_ANYSOCK;
Packit 6c4009
  struct rpc_arg a;
Packit 6c4009
Packit 6c4009
  svx = svcudp_create (RPC_ANYSOCK);
Packit 6c4009
  svc_register (svx, PROGNUM, VERSNUM, dispatch, 0);
Packit 6c4009
Packit 6c4009
  pid = fork ();
Packit 6c4009
  if (pid == -1)
Packit 6c4009
    {
Packit 6c4009
      perror ("fork");
Packit 6c4009
      return 1;
Packit 6c4009
    }
Packit 6c4009
  if (pid == 0)
Packit 6c4009
    svc_run ();
Packit 6c4009
Packit 6c4009
  inet_aton ("127.0.0.1", &sin.sin_addr);
Packit 6c4009
  sin.sin_port = htons (svx->xp_port);
Packit 6c4009
  sin.sin_family = AF_INET;
Packit 6c4009
Packit 6c4009
  clnt = clntudp_create (&sin, PROGNUM, VERSNUM, wait, &sock);
Packit 6c4009
Packit 6c4009
  a.client = clnt;
Packit 6c4009
  a.proc = PROCNUM;
Packit 6c4009
Packit 6c4009
  /* Test in this thread */
Packit 6c4009
  test_one_call (&a);
Packit 6c4009
Packit 6c4009
  /* Test in a child thread */
Packit 6c4009
  err = pthread_create (&tid, 0, thread_wrapper, (void *) clnt);
Packit 6c4009
  if (err)
Packit 6c4009
    fprintf (stderr, "pthread_create: %s\n", strerror (err));
Packit 6c4009
  err = pthread_join (tid, 0);
Packit 6c4009
  if (err)
Packit 6c4009
    fprintf (stderr, "pthread_join: %s\n", strerror (err));
Packit 6c4009
Packit 6c4009
  return exitcode;
Packit 6c4009
}