diff options
| author | Ulrich Drepper <drepper@redhat.com> | 2000-01-24 02:22:13 +0000 |
|---|---|---|
| committer | Ulrich Drepper <drepper@redhat.com> | 2000-01-24 02:22:13 +0000 |
| commit | c1301d9a76ee8da9aa2f1961d57fdf1763e44d57 (patch) | |
| tree | 0d4e141c5f472e4181f943cfc5305032db689315 | |
| parent | 3356ac25545b2de0464e04662e602b65c0706b8c (diff) | |
| download | glibc-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-- | ChangeLog | 59 | ||||
| -rw-r--r-- | bits/socket.h | 16 | ||||
| -rw-r--r-- | inet/netinet/in.h | 3 | ||||
| -rw-r--r-- | sunrpc/Makefile | 3 | ||||
| -rw-r--r-- | sunrpc/Versions | 4 | ||||
| -rw-r--r-- | sunrpc/bindrsvprt6.c | 85 | ||||
| -rw-r--r-- | sunrpc/clnt_tcp6.c | 533 | ||||
| -rw-r--r-- | sunrpc/clnt_udp6.c | 550 | ||||
| -rw-r--r-- | sunrpc/rpc/clnt.h | 48 | ||||
| -rw-r--r-- | sunrpc/rpc/svc.h | 15 | ||||
| -rw-r--r-- | sunrpc/rpc_main.c | 10 | ||||
| -rw-r--r-- | sunrpc/rpc_svcout.c | 2 | ||||
| -rw-r--r-- | sunrpc/svc_tcp.c | 2 | ||||
| -rw-r--r-- | sunrpc/svc_tcp6.c | 411 | ||||
| -rw-r--r-- | sunrpc/svc_udp.c | 2 | ||||
| -rw-r--r-- | sunrpc/svc_udp6.c | 512 | ||||
| -rw-r--r-- | sunrpc/svc_unix.c | 2 | ||||
| -rw-r--r-- | sysdeps/generic/bits/socket.h | 16 | ||||
| -rw-r--r-- | sysdeps/generic/lseek64.c | 10 | ||||
| -rw-r--r-- | sysdeps/mach/hurd/fcntl.c | 7 | ||||
| -rw-r--r-- | sysdeps/mach/hurd/lseek.c | 10 | ||||
| -rw-r--r-- | sysdeps/mach/hurd/open.c | 7 | ||||
| -rw-r--r-- | sysdeps/unix/sysv/linux/arm/mmap64.S | 3 | ||||
| -rw-r--r-- | sysdeps/unix/sysv/linux/i386/fxstat.c | 4 |
24 files changed, 2269 insertions, 45 deletions
@@ -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); |
