Skip to content
Permalink
master
Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Go to file
 
 
Cannot retrieve contributors at this time
#include <pthread.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <rpc/rpc.h>
#include <arpa/inet.h>
#define PROGNUM 1234
#define VERSNUM 1
#define PROCNUM 1
#define PROCQUIT 2
static int exitcode;
struct rpc_arg
{
CLIENT *client;
u_long proc;
};
static void
dispatch(struct svc_req *request, SVCXPRT *xprt)
{
svc_sendreply(xprt, (xdrproc_t)xdr_void, 0);
if (request->rq_proc == PROCQUIT)
exit (0);
}
static void
test_one_call (struct rpc_arg *a)
{
struct timeval tout = { 60, 0 };
enum clnt_stat result;
printf ("test_one_call: ");
result = clnt_call (a->client, a->proc,
(xdrproc_t) xdr_void, 0,
(xdrproc_t) xdr_void, 0, tout);
if (result == RPC_SUCCESS)
puts ("success");
else
{
clnt_perrno (result);
putchar ('\n');
exitcode = 1;
}
}
static void *
thread_wrapper (void *arg)
{
struct rpc_arg a;
a.client = (CLIENT *)arg;
a.proc = PROCNUM;
test_one_call (&a);
a.client = (CLIENT *)arg;
a.proc = PROCQUIT;
test_one_call (&a);
return 0;
}
int
main (void)
{
pthread_t tid;
pid_t pid;
int err;
SVCXPRT *svx;
CLIENT *clnt;
struct sockaddr_in sin;
struct timeval wait = { 5, 0 };
int sock = RPC_ANYSOCK;
struct rpc_arg a;
svx = svcudp_create (RPC_ANYSOCK);
svc_register (svx, PROGNUM, VERSNUM, dispatch, 0);
pid = fork ();
if (pid == -1)
{
perror ("fork");
return 1;
}
if (pid == 0)
svc_run ();
inet_aton ("127.0.0.1", &sin.sin_addr);
sin.sin_port = htons (svx->xp_port);
sin.sin_family = AF_INET;
clnt = clntudp_create (&sin, PROGNUM, VERSNUM, wait, &sock);
a.client = clnt;
a.proc = PROCNUM;
/* Test in this thread */
test_one_call (&a);
/* Test in a child thread */
err = pthread_create (&tid, 0, thread_wrapper, (void *) clnt);
if (err)
fprintf (stderr, "pthread_create: %s\n", strerror (err));
err = pthread_join (tid, 0);
if (err)
fprintf (stderr, "pthread_join: %s\n", strerror (err));
return exitcode;
}