aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2000-01-24 02:22:13 +0000
committerUlrich Drepper <drepper@redhat.com>2000-01-24 02:22:13 +0000
commitc1301d9a76ee8da9aa2f1961d57fdf1763e44d57 (patch)
tree0d4e141c5f472e4181f943cfc5305032db689315
parent3356ac25545b2de0464e04662e602b65c0706b8c (diff)
downloadglibc-c1301d9a76ee8da9aa2f1961d57fdf1763e44d57.tar.xz
glibc-c1301d9a76ee8da9aa2f1961d57fdf1763e44d57.zip
Update.
2000-01-23 Philip Blundell <philb@gnu.org> Add basic support for RPC over IPv6: * sunrpc/rpc/svc.h (struct SVCXPRT): Use `struct sockaddr_storage' for remote address. (svcudp6_create, svcudp6_bufcreate, svctcp6_create): New prototypes. * sunrpc/rpc/clnt.h (clnttcp6_create, clntudp6_create, clntudp6_bufcreate): New prototypes. * inet/netinet/in.h (bindresport6): Likewise. * sunrpc/Makefile (routines): Add svc_tcp6, svc_udp6, bindrsvprt6. * sunrpc/Versions: Add svcfd6_create, svctcp6_create, svcudp6_create, svcudp6_bufcreate, svcudp6_enablecache, bindresvport6 for GLIBC_2.2. * sunrpc/rpc_main.c: Support `tcp6' and `udp6' transport types. * sunrpc/rpc_svcout.c: Likewise. * sunrpc/svc_tcp.c (rendezvous_request): Use memcpy rather than simple assignment when copying addresses. * sunrpc/svc_udp.c (cache_get): Likewise. * sunrpc/svc_unix.c (rendezvous_request): Likewise. * sunrpc/bindrsvprt6.c, sunrpc/clnt_tcp6.c, sunrpc/clnt_udp6.c, sunrpc/svc_tcp6.c, sunrpc/svc_udp6.c: New files. 2000-01-05 Philip Blundell <philb@gnu.org> * sysdeps/unix/sysv/linux/arm/mmap64.S: Correct check for ENOSYS. 2000-01-23 Andreas Jaeger <aj@suse.de> * sysdeps/unix/sysv/linux/i386/fxstat.c (__fxstat): Pass right parameter to fstat calls. 2000-01-18 Roland McGrath <roland@baalperazim.frob.com> * sysdeps/generic/bits/socket.h (__ss_aligntype, struct sockaddr_storage): Make these like Linux version, replacing old type name `__ss_align'. 2000-01-05 Roland McGrath <roland@baalperazim.frob.com> * sysdeps/generic/lseek64.c (__libc_lseek64): Renamed from __lseek64. (__lseek64, lseek64): Make these weak aliases for __libc_lseek64. * sysdeps/mach/hurd/lseek.c (__libc_lseek): Renamed from __lseek. (__lseek, lseek): Make these weak aliases for __libc_lseek. * sysdeps/mach/hurd/fcntl.c (__libc_fcntl): Renamed from __fcntl. (__fcntl, fcntl): Make these weak aliases for __libc_fcntl. * sysdeps/mach/hurd/open.c (__libc_open): Renamed from __open. (__open, open): Make these weak aliases for __libc_open. * sysdeps/generic/bits/socket.h (enum __socket_type): Remove trailing comma. (anonymous enum for MSG_*): Likewise. (anonymous enum for SO_*): Likewise. 2000-01-23 Ulrich Drepper <drepper@cygnus.com> * string/bits/string2.h: Fix typo (__GNU_SOURCE -> __USE_GNU) (PR libc/1553).
-rw-r--r--ChangeLog59
-rw-r--r--bits/socket.h16
-rw-r--r--inet/netinet/in.h3
-rw-r--r--sunrpc/Makefile3
-rw-r--r--sunrpc/Versions4
-rw-r--r--sunrpc/bindrsvprt6.c85
-rw-r--r--sunrpc/clnt_tcp6.c533
-rw-r--r--sunrpc/clnt_udp6.c550
-rw-r--r--sunrpc/rpc/clnt.h48
-rw-r--r--sunrpc/rpc/svc.h15
-rw-r--r--sunrpc/rpc_main.c10
-rw-r--r--sunrpc/rpc_svcout.c2
-rw-r--r--sunrpc/svc_tcp.c2
-rw-r--r--sunrpc/svc_tcp6.c411
-rw-r--r--sunrpc/svc_udp.c2
-rw-r--r--sunrpc/svc_udp6.c512
-rw-r--r--sunrpc/svc_unix.c2
-rw-r--r--sysdeps/generic/bits/socket.h16
-rw-r--r--sysdeps/generic/lseek64.c10
-rw-r--r--sysdeps/mach/hurd/fcntl.c7
-rw-r--r--sysdeps/mach/hurd/lseek.c10
-rw-r--r--sysdeps/mach/hurd/open.c7
-rw-r--r--sysdeps/unix/sysv/linux/arm/mmap64.S3
-rw-r--r--sysdeps/unix/sysv/linux/i386/fxstat.c4
24 files changed, 2269 insertions, 45 deletions
diff --git a/ChangeLog b/ChangeLog
index c301ff29cb..49812597d1 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,62 @@
+2000-01-23 Philip Blundell <philb@gnu.org>
+
+ Add basic support for RPC over IPv6:
+ * sunrpc/rpc/svc.h (struct SVCXPRT): Use `struct sockaddr_storage'
+ for remote address.
+ (svcudp6_create, svcudp6_bufcreate, svctcp6_create): New
+ prototypes.
+ * sunrpc/rpc/clnt.h (clnttcp6_create, clntudp6_create,
+ clntudp6_bufcreate): New prototypes.
+ * inet/netinet/in.h (bindresport6): Likewise.
+ * sunrpc/Makefile (routines): Add svc_tcp6, svc_udp6, bindrsvprt6.
+ * sunrpc/Versions: Add svcfd6_create, svctcp6_create,
+ svcudp6_create, svcudp6_bufcreate, svcudp6_enablecache,
+ bindresvport6 for GLIBC_2.2.
+ * sunrpc/rpc_main.c: Support `tcp6' and `udp6' transport types.
+ * sunrpc/rpc_svcout.c: Likewise.
+ * sunrpc/svc_tcp.c (rendezvous_request): Use memcpy rather than
+ simple assignment when copying addresses.
+ * sunrpc/svc_udp.c (cache_get): Likewise.
+ * sunrpc/svc_unix.c (rendezvous_request): Likewise.
+ * sunrpc/bindrsvprt6.c, sunrpc/clnt_tcp6.c, sunrpc/clnt_udp6.c,
+ sunrpc/svc_tcp6.c, sunrpc/svc_udp6.c: New files.
+
+2000-01-05 Philip Blundell <philb@gnu.org>
+
+ * sysdeps/unix/sysv/linux/arm/mmap64.S: Correct check for ENOSYS.
+
+2000-01-23 Andreas Jaeger <aj@suse.de>
+
+ * sysdeps/unix/sysv/linux/i386/fxstat.c (__fxstat): Pass right
+ parameter to fstat calls.
+
+2000-01-18 Roland McGrath <roland@baalperazim.frob.com>
+
+ * sysdeps/generic/bits/socket.h
+ (__ss_aligntype, struct sockaddr_storage): Make these like Linux
+ version, replacing old type name `__ss_align'.
+
+2000-01-05 Roland McGrath <roland@baalperazim.frob.com>
+
+ * sysdeps/generic/lseek64.c (__libc_lseek64): Renamed from __lseek64.
+ (__lseek64, lseek64): Make these weak aliases for __libc_lseek64.
+ * sysdeps/mach/hurd/lseek.c (__libc_lseek): Renamed from __lseek.
+ (__lseek, lseek): Make these weak aliases for __libc_lseek.
+ * sysdeps/mach/hurd/fcntl.c (__libc_fcntl): Renamed from __fcntl.
+ (__fcntl, fcntl): Make these weak aliases for __libc_fcntl.
+ * sysdeps/mach/hurd/open.c (__libc_open): Renamed from __open.
+ (__open, open): Make these weak aliases for __libc_open.
+
+ * sysdeps/generic/bits/socket.h (enum __socket_type): Remove
+ trailing comma.
+ (anonymous enum for MSG_*): Likewise.
+ (anonymous enum for SO_*): Likewise.
+
+2000-01-23 Ulrich Drepper <drepper@cygnus.com>
+
+ * string/bits/string2.h: Fix typo (__GNU_SOURCE -> __USE_GNU)
+ (PR libc/1553).
+
2000-01-08 Mark Kettenis <kettenis@gnu.org>
* sysdeps/mach/hurd/setitimer.c (quantize_timeval): New function.
diff --git a/bits/socket.h b/bits/socket.h
index 5eb29492b4..7828d01bb3 100644
--- a/bits/socket.h
+++ b/bits/socket.h
@@ -1,5 +1,5 @@
/* System-specific socket constants and types. Generic/4.3 BSD version.
- Copyright (C) 1991,92,94,95,96,97,98,99 Free Software Foundation, Inc.
+ Copyright (C) 1991,92,94,95,96,97,98,99,2000 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -47,7 +47,7 @@ enum __socket_type
#define SOCK_RAW SOCK_RAW
SOCK_RDM = 4, /* Reliably-delivered messages. */
#define SOCK_RDM SOCK_RDM
- SOCK_SEQPACKET = 5, /* Sequenced, reliable, connection-based,
+ SOCK_SEQPACKET = 5 /* Sequenced, reliable, connection-based,
datagrams of fixed maximum length. */
#define SOCK_SEQPACKET SOCK_SEQPACKET
};
@@ -133,17 +133,17 @@ struct sockaddr
/* Structure large enough to hold any socket address (with the historical
exception of AF_UNIX). We reserve 128 bytes. */
#if ULONG_MAX > 0xffffffff
-# define __ss_align __uint64_t
+# define __ss_aligntype __uint64_t
#else
-# define __ss_align __uint32_t
+# define __ss_aligntype __uint32_t
#endif
#define _SS_SIZE 128
-#define _SS_PADSIZE (_SS_SIZE - (2 * sizeof (__ss_align)))
+#define _SS_PADSIZE (_SS_SIZE - (2 * sizeof (__ss_aligntype)))
struct sockaddr_storage
{
__SOCKADDR_COMMON (__ss_); /* Address family, etc. */
- __ss_align __ss_align; /* Force desired alignment. */
+ __ss_aligntype __ss_align; /* Force desired alignment. */
char __ss_padding[_SS_PADSIZE];
};
@@ -165,7 +165,7 @@ enum
#define MSG_CTRUNC MSG_CTRUNC
MSG_WAITALL = 0x40, /* Wait for full request or error. */
#define MSG_WAITALL MSG_WAITALL
- MSG_DONTWAIT = 0x80, /* This message should be nonblocking. */
+ MSG_DONTWAIT = 0x80 /* This message should be nonblocking. */
#define MSG_DONTWAIT MSG_DONTWAIT
};
@@ -234,7 +234,7 @@ enum
#define SO_ERROR SO_ERROR
SO_STYLE = 0x1008, /* Get socket connection style. */
#define SO_STYLE SO_STYLE
- SO_TYPE = SO_STYLE, /* Compatible name for SO_STYLE. */
+ SO_TYPE = SO_STYLE /* Compatible name for SO_STYLE. */
#define SO_TYPE SO_TYPE
};
diff --git a/inet/netinet/in.h b/inet/netinet/in.h
index 7d9f3277e5..13c2767d9a 100644
--- a/inet/netinet/in.h
+++ b/inet/netinet/in.h
@@ -293,6 +293,9 @@ extern uint16_t htons (uint16_t __hostshort)
/* Bind socket to a privileged IP port. */
extern int bindresvport (int __sockfd, struct sockaddr_in *__sock_in) __THROW;
+/* The IPv6 version of this function. */
+extern int bindresvport6 (int __sockfd, struct sockaddr_in6 *__sock_in)
+ __THROW;
#define IN6_IS_ADDR_MC_NODELOCAL(a) \
diff --git a/sunrpc/Makefile b/sunrpc/Makefile
index 1ce03d7d98..9e3ff6c7c2 100644
--- a/sunrpc/Makefile
+++ b/sunrpc/Makefile
@@ -66,7 +66,8 @@ routines := auth_none auth_unix authuxprot bindrsvprt \
xdr_rec xdr_ref xdr_stdio publickey xdr_sizeof \
auth_des authdes_prot des_crypt des_impl des_soft \
key_call key_prot netname openchild rtime svcauth_des xcrypt\
- clnt_unix svc_unix create_xid xdr_intXX_t
+ clnt_unix svc_unix create_xid xdr_intXX_t \
+ svc_tcp6 svc_udp6 bindrsvprt6
others := rpcinfo
install-bin := rpcgen
diff --git a/sunrpc/Versions b/sunrpc/Versions
index e222b16096..1f9163da05 100644
--- a/sunrpc/Versions
+++ b/sunrpc/Versions
@@ -109,4 +109,8 @@ libc {
}
GLIBC_2.2 {
svc_getreq_common; svc_getreq_poll; svc_max_pollfd; svc_pollfd;
+ svcfd6_create; svctcp6_create; svcudp6_create; svcudp6_bufcreate;
+ svcudp6_enablecache;
+ bindresvport6;
+ }
}
diff --git a/sunrpc/bindrsvprt6.c b/sunrpc/bindrsvprt6.c
new file mode 100644
index 0000000000..271c9d88a3
--- /dev/null
+++ b/sunrpc/bindrsvprt6.c
@@ -0,0 +1,85 @@
+/*
+ * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
+ * unrestricted use provided that this legend is included on all tape
+ * media and as a part of the software program in whole or part. Users
+ * may copy or modify Sun RPC without charge, but are not authorized
+ * to license or distribute it to anyone else except as part of a product or
+ * program developed by the user.
+ *
+ * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
+ * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
+ *
+ * Sun RPC is provided with no support and without any obligation on the
+ * part of Sun Microsystems, Inc. to assist in its use, correction,
+ * modification or enhancement.
+ *
+ * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
+ * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
+ * OR ANY PART THEREOF.
+ *
+ * In no event will Sun Microsystems, Inc. be liable for any lost revenue
+ * or profits or other special, indirect and consequential damages, even if
+ * Sun has been advised of the possibility of such damages.
+ *
+ * Sun Microsystems, Inc.
+ * 2550 Garcia Avenue
+ * Mountain View, California 94043
+ */
+/*
+ * Copyright (c) 1987 by Sun Microsystems, Inc.
+ */
+
+#include <errno.h>
+#include <unistd.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+
+/*
+ * Bind a socket to a privileged IP port
+ */
+int
+bindresvport6 (int sd, struct sockaddr_in6 *sin)
+{
+ int res;
+ static short port;
+ struct sockaddr_in6 myaddr;
+ int i;
+
+#define STARTPORT 600
+#define ENDPORT (IPPORT_RESERVED - 1)
+#define NPORTS (ENDPORT - STARTPORT + 1)
+
+ if (sin == (struct sockaddr_in6 *) 0)
+ {
+ sin = &myaddr;
+ __bzero (sin, sizeof (*sin));
+ sin->sin6_family = AF_INET6;
+ }
+ else if (sin->sin6_family != AF_INET6)
+ {
+ __set_errno (EPFNOSUPPORT);
+ return -1;
+ }
+
+ if (port == 0)
+ {
+ port = (__getpid () % NPORTS) + STARTPORT;
+ }
+ res = -1;
+ __set_errno (EADDRINUSE);
+
+ for (i = 0; i < NPORTS && res < 0 && errno == EADDRINUSE; ++i)
+ {
+ sin->sin6_port = htons (port++);
+ if (port > ENDPORT)
+ {
+ port = STARTPORT;
+ }
+ res = bind (sd, sin, sizeof (struct sockaddr_in6));
+ }
+
+ return res;
+}
diff --git a/sunrpc/clnt_tcp6.c b/sunrpc/clnt_tcp6.c
new file mode 100644
index 0000000000..3e7c4d9f6b
--- /dev/null
+++ b/sunrpc/clnt_tcp6.c
@@ -0,0 +1,533 @@
+/* @(#)clnt_tcp.c 2.2 88/08/01 4.0 RPCSRC */
+/*
+ * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
+ * unrestricted use provided that this legend is included on all tape
+ * media and as a part of the software program in whole or part. Users
+ * may copy or modify Sun RPC without charge, but are not authorized
+ * to license or distribute it to anyone else except as part of a product or
+ * program developed by the user.
+ *
+ * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
+ * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
+ *
+ * Sun RPC is provided with no support and without any obligation on the
+ * part of Sun Microsystems, Inc. to assist in its use, correction,
+ * modification or enhancement.
+ *
+ * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
+ * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
+ * OR ANY PART THEREOF.
+ *
+ * In no event will Sun Microsystems, Inc. be liable for any lost revenue
+ * or profits or other special, indirect and consequential damages, even if
+ * Sun has been advised of the possibility of such damages.
+ *
+ * Sun Microsystems, Inc.
+ * 2550 Garcia Avenue
+ * Mountain View, California 94043
+ */
+#if !defined(lint) && defined(SCCSIDS)
+static char sccsid[] = "@(#)clnt_tcp.c 1.37 87/10/05 Copyr 1984 Sun Micro";
+#endif
+
+/*
+ * clnt_tcp.c, Implements a TCP/IP based, client side RPC.
+ *
+ * Copyright (C) 1984, Sun Microsystems, Inc.
+ *
+ * TCP based RPC supports 'batched calls'.
+ * A sequence of calls may be batched-up in a send buffer. The rpc call
+ * return immediately to the client even though the call was not necessarily
+ * sent. The batching occurs if the results' xdr routine is NULL (0) AND
+ * the rpc timeout value is zero (see clnt.h, rpc).
+ *
+ * Clients should NOT casually batch calls that in fact return results; that is,
+ * the server side should be aware that a call is batched and not produce any
+ * return message. Batched calls that produce many result messages can
+ * deadlock (netlock) the client and the server....
+ *
+ * Now go hang yourself.
+ */
+
+#include <netdb.h>
+#include <errno.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <rpc/rpc.h>
+#include <sys/poll.h>
+#include <sys/socket.h>
+#include <rpc/pmap_clnt.h>
+
+extern u_long _create_xid (void);
+
+#define MCALL_MSG_SIZE 24
+
+struct ct_data
+ {
+ int ct_sock;
+ bool_t ct_closeit;
+ struct timeval ct_wait;
+ bool_t ct_waitset; /* wait set by clnt_control? */
+ struct sockaddr_in6 ct_addr;
+ struct rpc_err ct_error;
+ char ct_mcall[MCALL_MSG_SIZE]; /* marshalled callmsg */
+ u_int ct_mpos; /* pos after marshal */
+ XDR ct_xdrs;
+ };
+
+static int readtcp (char *, char *, int);
+static int writetcp (char *, char *, int);
+
+static enum clnt_stat clnttcp6_call (CLIENT *, u_long, xdrproc_t, caddr_t,
+ xdrproc_t, caddr_t, struct timeval);
+static void clnttcp6_abort (void);
+static void clnttcp6_geterr (CLIENT *, struct rpc_err *);
+static bool_t clnttcp6_freeres (CLIENT *, xdrproc_t, caddr_t);
+static bool_t clnttcp6_control (CLIENT *, int, char *);
+static void clnttcp6_destroy (CLIENT *);
+
+static struct clnt_ops tcp6_ops =
+{
+ clnttcp6_call,
+ clnttcp6_abort,
+ clnttcp6_geterr,
+ clnttcp6_freeres,
+ clnttcp6_destroy,
+ clnttcp6_control
+};
+
+/*
+ * Create a client handle for a tcp/ip connection.
+ * If *sockp<0, *sockp is set to a newly created TCP socket and it is
+ * connected to raddr. If *sockp non-negative then
+ * raddr is ignored. The rpc/tcp package does buffering
+ * similar to stdio, so the client must pick send and receive buffer sizes,];
+ * 0 => use the default.
+ * If raddr->sin_port is 0, then a binder on the remote machine is
+ * consulted for the right port number.
+ * NB: *sockp is copied into a private area.
+ * NB: It is the clients responsibility to close *sockp.
+ * NB: The rpch->cl_auth is set null authentication. Caller may wish to set this
+ * something more useful.
+ */
+CLIENT *
+clnttcp6_create (struct sockaddr_in6 *raddr, u_long prog, u_long vers,
+ int *sockp, u_int sendsz, u_int recvsz)
+{
+ CLIENT *h;
+ struct ct_data *ct = (struct ct_data *) mem_alloc (sizeof (*ct));
+ struct rpc_msg call_msg;
+
+ h = (CLIENT *) mem_alloc (sizeof (*h));
+ if (h == NULL)
+ {
+ (void) fprintf (stderr, _("clnttcp_create: out of memory\n"));
+ rpc_createerr.cf_stat = RPC_SYSTEMERROR;
+ rpc_createerr.cf_error.re_errno = errno;
+ goto fooy;
+ }
+ /* ct = (struct ct_data *) mem_alloc (sizeof (*ct)); */
+ if (ct == NULL)
+ {
+ (void) fprintf (stderr, _("clnttcp_create: out of memory\n"));
+ rpc_createerr.cf_stat = RPC_SYSTEMERROR;
+ rpc_createerr.cf_error.re_errno = errno;
+ goto fooy;
+ }
+
+ /*
+ * If no port number given ask the pmap for one
+ */
+ if (raddr->sin6_port == 0)
+ {
+ u_short port;
+ if ((port = pmap_getport (raddr, prog, vers, IPPROTO_TCP)) == 0)
+ {
+ mem_free ((caddr_t) ct, sizeof (struct ct_data));
+ mem_free ((caddr_t) h, sizeof (CLIENT));
+ return ((CLIENT *) NULL);
+ }
+ raddr->sin6_port = htons (port);
+ }
+
+ /*
+ * If no socket given, open one
+ */
+ if (*sockp < 0)
+ {
+ *sockp = __socket (AF_INET6, SOCK_STREAM, IPPROTO_TCP);
+ (void) bindresvport6 (*sockp, (struct sockaddr_in6 *) 0);
+ if ((*sockp < 0)
+ || (__connect (*sockp, (struct sockaddr *) raddr,
+ sizeof (*raddr)) < 0))
+ {
+ rpc_createerr.cf_stat = RPC_SYSTEMERROR;
+ rpc_createerr.cf_error.re_errno = errno;
+ if (*sockp >= 0)
+ (void) __close (*sockp);
+ goto fooy;
+ }
+ ct->ct_closeit = TRUE;
+ }
+ else
+ {
+ ct->ct_closeit = FALSE;
+ }
+
+ /*
+ * Set up private data struct
+ */
+ ct->ct_sock = *sockp;
+ ct->ct_wait.tv_usec = 0;
+ ct->ct_waitset = FALSE;
+ ct->ct_addr = *raddr;
+
+ /*
+ * Initialize call message
+ */
+ call_msg.rm_xid = _create_xid ();
+ call_msg.rm_direction = CALL;
+ call_msg.rm_call.cb_rpcvers = RPC_MSG_VERSION;
+ call_msg.rm_call.cb_prog = prog;
+ call_msg.rm_call.cb_vers = vers;
+
+ /*
+ * pre-serialize the static part of the call msg and stash it away
+ */
+ xdrmem_create (&(ct->ct_xdrs), ct->ct_mcall, MCALL_MSG_SIZE,
+ XDR_ENCODE);
+ if (!xdr_callhdr (&(ct->ct_xdrs), &call_msg))
+ {
+ if (ct->ct_closeit)
+ {
+ (void) __close (*sockp);
+ }
+ goto fooy;
+ }
+ ct->ct_mpos = XDR_GETPOS (&(ct->ct_xdrs));
+ XDR_DESTROY (&(ct->ct_xdrs));
+
+ /*
+ * Create a client handle which uses xdrrec for serialization
+ * and authnone for authentication.
+ */
+ xdrrec_create (&(ct->ct_xdrs), sendsz, recvsz,
+ (caddr_t) ct, readtcp, writetcp);
+ h->cl_ops = &tcp6_ops;
+ h->cl_private = (caddr_t) ct;
+ h->cl_auth = authnone_create ();
+ return h;
+
+fooy:
+ /*
+ * Something goofed, free stuff and barf
+ */
+ mem_free ((caddr_t) ct, sizeof (struct ct_data));
+ mem_free ((caddr_t) h, sizeof (CLIENT));
+ return ((CLIENT *) NULL);