Blame sunrpc/thrsvc.c

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