diff options
author | Ulrich Drepper <drepper@redhat.com> | 2002-04-20 20:36:26 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2002-04-20 20:36:26 +0000 |
commit | c238ecf7095c0df636011c10cd19e9ebc8d6225b (patch) | |
tree | d4c68c987b115bf9d3a0409df06b69f7ac1566ac /sunrpc/thrsvc.c | |
parent | cbba1b889900b8a15252d25600631d5e5cf59188 (diff) | |
download | glibc-c238ecf7095c0df636011c10cd19e9ebc8d6225b.tar.gz glibc-c238ecf7095c0df636011c10cd19e9ebc8d6225b.tar.xz glibc-c238ecf7095c0df636011c10cd19e9ebc8d6225b.zip |
Update.
2002-04-20 Ulrich Drepper <drepper@redhat.com> * Makefile: Add handling of xtests and xcheck targets. * MakeTAGS: Likewise. * Makeconfig: Likewise. * Makerules: Likewise. * Rules: Likewise. * sunrpc/Makefile (xtests): Add thrsvc if thread library available. * sunrpc/thrsvc.c: New file. By Zack Weinberg.
Diffstat (limited to 'sunrpc/thrsvc.c')
-rw-r--r-- | sunrpc/thrsvc.c | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/sunrpc/thrsvc.c b/sunrpc/thrsvc.c new file mode 100644 index 0000000000..ac6af09f5b --- /dev/null +++ b/sunrpc/thrsvc.c @@ -0,0 +1,89 @@ +#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 + +static int exitcode; + +static void +dispatch(struct svc_req *request, SVCXPRT *xprt) +{ + svc_sendreply(xprt, (xdrproc_t)xdr_void, 0); +} + +static void +test_one_call (CLIENT *c) +{ + struct timeval tout = { 60, 0 }; + enum clnt_stat result; + + printf ("test_one_call: "); + result = clnt_call (c, PROCNUM, + (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) +{ + test_one_call ((CLIENT *)arg); + 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; + + 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); + + /* Test in this thread */ + test_one_call (clnt); + + /* 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; +} |