From owner-p4-projects@FreeBSD.ORG Wed Aug 13 17:39:03 2008 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 214D81065676; Wed, 13 Aug 2008 17:39:03 +0000 (UTC) Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id D91B01065674 for ; Wed, 13 Aug 2008 17:39:02 +0000 (UTC) (envelope-from ed@FreeBSD.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id CAE1B8FC19 for ; Wed, 13 Aug 2008 17:39:02 +0000 (UTC) (envelope-from ed@FreeBSD.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.2/8.14.2) with ESMTP id m7DHd2Sc079965 for ; Wed, 13 Aug 2008 17:39:02 GMT (envelope-from ed@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.2/8.14.1/Submit) id m7DHd2Wu079963 for perforce@freebsd.org; Wed, 13 Aug 2008 17:39:02 GMT (envelope-from ed@FreeBSD.org) Date: Wed, 13 Aug 2008 17:39:02 GMT Message-Id: <200808131739.m7DHd2Wu079963@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to ed@FreeBSD.org using -f From: Ed Schouten To: Perforce Change Reviews Cc: Subject: PERFORCE change 147317 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 13 Aug 2008 17:39:03 -0000 http://perforce.freebsd.org/chv.cgi?CH=147317 Change 147317 by ed@ed_dull on 2008/08/13 17:38:39 IFC. Affected files ... .. //depot/projects/mpsafetty/lib/libpcap/config.h#2 integrate .. //depot/projects/mpsafetty/sys/dev/cpufreq/ichss.c#2 integrate .. //depot/projects/mpsafetty/sys/dev/usb/umass.c#2 integrate .. //depot/projects/mpsafetty/sys/i386/cpufreq/est.c#2 integrate .. //depot/projects/mpsafetty/sys/i386/cpufreq/p4tcc.c#2 integrate .. //depot/projects/mpsafetty/sys/i386/cpufreq/powernow.c#2 integrate .. //depot/projects/mpsafetty/sys/i386/cpufreq/smist.c#2 integrate .. //depot/projects/mpsafetty/sys/net/bpf.c#4 integrate .. //depot/projects/mpsafetty/sys/nlm/nlm_prot_impl.c#2 integrate .. //depot/projects/mpsafetty/sys/rpc/clnt_rc.c#2 integrate Differences ... ==== //depot/projects/mpsafetty/lib/libpcap/config.h#2 (text+ko) ==== @@ -1,4 +1,4 @@ -/* $FreeBSD: src/lib/libpcap/config.h,v 1.6 2007/10/16 02:10:44 mlaier Exp $ */ +/* $FreeBSD: src/lib/libpcap/config.h,v 1.7 2008/08/13 15:41:21 ed Exp $ */ /* This is an edited copy of the config.h generated by configure. */ /* config.h. Generated by configure. */ @@ -15,7 +15,7 @@ /* #undef BDEBUG */ /* define if you have a cloning BPF device */ -/* #undef HAVE_CLONING_BPF */ +#define HAVE_CLONING_BPF 1 /* define if you have the DAG API */ /* #undef HAVE_DAG_API */ ==== //depot/projects/mpsafetty/sys/dev/cpufreq/ichss.c#2 (text+ko) ==== @@ -25,7 +25,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/dev/cpufreq/ichss.c,v 1.11 2008/03/10 22:18:07 jhb Exp $"); +__FBSDID("$FreeBSD: src/sys/dev/cpufreq/ichss.c,v 1.12 2008/08/13 16:09:40 jhb Exp $"); #include #include @@ -181,7 +181,7 @@ } DPRINT("ichss: PMBASE is %#x\n", pmbase); - child = BUS_ADD_CHILD(parent, 0, "ichss", 0); + child = BUS_ADD_CHILD(parent, 20, "ichss", 0); if (child == NULL) { device_printf(parent, "add SpeedStep child failed\n"); return; ==== //depot/projects/mpsafetty/sys/dev/usb/umass.c#2 (text+ko) ==== @@ -24,7 +24,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $FreeBSD: src/sys/dev/usb/umass.c,v 1.163 2008/05/16 19:47:15 remko Exp $ + * $FreeBSD: src/sys/dev/usb/umass.c,v 1.164 2008/08/13 12:40:20 maxim Exp $ * $NetBSD: umass.c,v 1.28 2000/04/02 23:46:53 augustss Exp $ */ @@ -758,6 +758,10 @@ UMASS_PROTO_RBC | UMASS_PROTO_CBI, NO_QUIRKS }, + { USB_VENDOR_SONY, USB_PRODUCT_SONY_HANDYCAM, 0x0500, + UMASS_PROTO_RBC | UMASS_PROTO_CBI, + RBC_PAD_TO_12 + }, { USB_VENDOR_SONY, USB_PRODUCT_SONY_HANDYCAM, RID_WILDCARD, UMASS_PROTO_RBC | UMASS_PROTO_CBI, NO_QUIRKS ==== //depot/projects/mpsafetty/sys/i386/cpufreq/est.c#2 (text+ko) ==== @@ -26,7 +26,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/i386/cpufreq/est.c,v 1.17 2008/05/30 22:01:09 jhb Exp $"); +__FBSDID("$FreeBSD: src/sys/i386/cpufreq/est.c,v 1.18 2008/08/13 16:09:40 jhb Exp $"); #include #include @@ -967,7 +967,7 @@ * We add a child for each CPU since settings must be performed * on each CPU in the SMP case. */ - child = BUS_ADD_CHILD(parent, 0, "est", -1); + child = BUS_ADD_CHILD(parent, 10, "est", -1); if (child == NULL) device_printf(parent, "add est child failed\n"); } ==== //depot/projects/mpsafetty/sys/i386/cpufreq/p4tcc.c#2 (text+ko) ==== @@ -37,7 +37,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/i386/cpufreq/p4tcc.c,v 1.16 2008/03/17 09:05:15 phk Exp $"); +__FBSDID("$FreeBSD: src/sys/i386/cpufreq/p4tcc.c,v 1.17 2008/08/13 16:09:40 jhb Exp $"); #include #include @@ -131,7 +131,7 @@ * of the IA32 Intel Architecture Software Developer's Manual, * Volume 3, for more info. */ - if (BUS_ADD_CHILD(parent, 0, "p4tcc", -1) == NULL) + if (BUS_ADD_CHILD(parent, 10, "p4tcc", -1) == NULL) device_printf(parent, "add p4tcc child failed\n"); } ==== //depot/projects/mpsafetty/sys/i386/cpufreq/powernow.c#2 (text+ko) ==== @@ -29,7 +29,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/i386/cpufreq/powernow.c,v 1.4 2007/01/23 19:20:30 bruno Exp $"); +__FBSDID("$FreeBSD: src/sys/i386/cpufreq/powernow.c,v 1.5 2008/08/13 16:09:40 jhb Exp $"); #include #include @@ -894,7 +894,7 @@ } if (device_find_child(parent, "powernow", -1) != NULL) return; - if ((child = BUS_ADD_CHILD(parent, 0, "powernow", -1)) == NULL) + if ((child = BUS_ADD_CHILD(parent, 10, "powernow", -1)) == NULL) device_printf(parent, "powernow: add child failed\n"); } ==== //depot/projects/mpsafetty/sys/i386/cpufreq/smist.c#2 (text+ko) ==== @@ -36,7 +36,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/i386/cpufreq/smist.c,v 1.2 2007/06/17 07:18:23 njl Exp $"); +__FBSDID("$FreeBSD: src/sys/i386/cpufreq/smist.c,v 1.3 2008/08/13 16:09:40 jhb Exp $"); #include #include @@ -308,7 +308,7 @@ if (device_find_child(parent, "smist", -1) != NULL) return; - if (BUS_ADD_CHILD(parent, 0, "smist", -1) == NULL) + if (BUS_ADD_CHILD(parent, 30, "smist", -1) == NULL) device_printf(parent, "smist: add child failed\n"); } ==== //depot/projects/mpsafetty/sys/net/bpf.c#4 (text+ko) ==== @@ -35,7 +35,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/net/bpf.c,v 1.199 2008/08/01 21:38:46 csjp Exp $"); +__FBSDID("$FreeBSD: src/sys/net/bpf.c,v 1.200 2008/08/13 15:41:21 ed Exp $"); #include "opt_bpf.h" #include "opt_mac.h" @@ -117,7 +117,6 @@ static void filt_bpfdetach(struct knote *); static int filt_bpfread(struct knote *, long); static void bpf_drvinit(void *); -static void bpf_clone(void *, struct ucred *, char *, int, struct cdev **); static int bpf_stats_sysctl(SYSCTL_HANDLER_ARGS); SYSCTL_NODE(_net, OID_AUTO, bpf, CTLFLAG_RW, 0, "bpf sysctl"); @@ -131,7 +130,6 @@ bpf_stats_sysctl, "bpf statistics portal"); static d_open_t bpfopen; -static d_close_t bpfclose; static d_read_t bpfread; static d_write_t bpfwrite; static d_ioctl_t bpfioctl; @@ -140,9 +138,7 @@ static struct cdevsw bpf_cdevsw = { .d_version = D_VERSION, - .d_flags = D_TRACKCLOSE, .d_open = bpfopen, - .d_close = bpfclose, .d_read = bpfread, .d_write = bpfwrite, .d_ioctl = bpfioctl, @@ -585,6 +581,34 @@ } /* + * Close the descriptor by detaching it from its interface, + * deallocating its buffers, and marking it free. + */ +static void +bpf_dtor(void *data) +{ + struct bpf_d *d = data; + + BPFD_LOCK(d); + if (d->bd_state == BPF_WAITING) + callout_stop(&d->bd_callout); + d->bd_state = BPF_IDLE; + BPFD_UNLOCK(d); + funsetown(&d->bd_sigio); + mtx_lock(&bpf_mtx); + if (d->bd_bif) + bpf_detachd(d); + mtx_unlock(&bpf_mtx); + selwakeuppri(&d->bd_sel, PRINET); +#ifdef MAC + mac_bpfdesc_destroy(d); +#endif /* MAC */ + knlist_destroy(&d->bd_sel.si_note); + bpf_freed(d); + free(d, M_BPF); +} + +/* * Open ethernet device. Returns ENXIO for illegal minor device number, * EBUSY if file is open by another process. */ @@ -593,25 +617,14 @@ bpfopen(struct cdev *dev, int flags, int fmt, struct thread *td) { struct bpf_d *d; + int error; - mtx_lock(&bpf_mtx); - d = dev->si_drv1; - /* - * Each minor can be opened by only one process. If the requested - * minor is in use, return EBUSY. - */ - if (d != NULL) { - mtx_unlock(&bpf_mtx); - return (EBUSY); + MALLOC(d, struct bpf_d *, sizeof(*d), M_BPF, M_WAITOK | M_ZERO); + error = devfs_set_cdevpriv(d, bpf_dtor); + if (error != 0) { + free(d, M_BPF); + return (error); } - dev->si_drv1 = (struct bpf_d *)~0; /* mark device in use */ - mtx_unlock(&bpf_mtx); - - if ((dev->si_flags & SI_NAMED) == 0) - make_dev(&bpf_cdevsw, minor(dev), UID_ROOT, GID_WHEEL, 0600, - "bpf%d", dev2unit(dev)); - MALLOC(d, struct bpf_d *, sizeof(*d), M_BPF, M_WAITOK | M_ZERO); - dev->si_drv1 = d; /* * For historical reasons, perform a one-time initialization call to @@ -635,47 +648,19 @@ } /* - * Close the descriptor by detaching it from its interface, - * deallocating its buffers, and marking it free. - */ -/* ARGSUSED */ -static int -bpfclose(struct cdev *dev, int flags, int fmt, struct thread *td) -{ - struct bpf_d *d = dev->si_drv1; - - BPFD_LOCK(d); - if (d->bd_state == BPF_WAITING) - callout_stop(&d->bd_callout); - d->bd_state = BPF_IDLE; - BPFD_UNLOCK(d); - funsetown(&d->bd_sigio); - mtx_lock(&bpf_mtx); - if (d->bd_bif) - bpf_detachd(d); - mtx_unlock(&bpf_mtx); - selwakeuppri(&d->bd_sel, PRINET); -#ifdef MAC - mac_bpfdesc_destroy(d); -#endif /* MAC */ - knlist_destroy(&d->bd_sel.si_note); - bpf_freed(d); - dev->si_drv1 = NULL; - free(d, M_BPF); - - return (0); -} - -/* * bpfread - read next chunk of packets from buffers */ static int bpfread(struct cdev *dev, struct uio *uio, int ioflag) { - struct bpf_d *d = dev->si_drv1; + struct bpf_d *d; int timed_out; int error; + error = devfs_get_cdevpriv((void **)&d); + if (error != 0) + return (error); + /* * Restrict application to use a buffer the same size as * as kernel buffers. @@ -829,12 +814,16 @@ static int bpfwrite(struct cdev *dev, struct uio *uio, int ioflag) { - struct bpf_d *d = dev->si_drv1; + struct bpf_d *d; struct ifnet *ifp; struct mbuf *m, *mc; struct sockaddr dst; int error, hlen; + error = devfs_get_cdevpriv((void **)&d); + if (error != 0) + return (error); + d->bd_pid = curthread->td_proc->p_pid; d->bd_wcount++; if (d->bd_bif == NULL) { @@ -963,8 +952,12 @@ bpfioctl(struct cdev *dev, u_long cmd, caddr_t addr, int flags, struct thread *td) { - struct bpf_d *d = dev->si_drv1; - int error = 0; + struct bpf_d *d; + int error; + + error = devfs_get_cdevpriv((void **)&d); + if (error != 0) + return (error); /* * Refresh PID associated with this descriptor. @@ -1482,9 +1475,9 @@ struct bpf_d *d; int revents; - d = dev->si_drv1; - if (d->bd_bif == NULL) - return (ENXIO); + if (devfs_get_cdevpriv((void **)&d) != 0 || d->bd_bif == NULL) + return (events & + (POLLHUP|POLLIN|POLLRDNORM|POLLOUT|POLLWRNORM)); /* * Refresh PID associated with this descriptor. @@ -1516,9 +1509,10 @@ int bpfkqfilter(struct cdev *dev, struct knote *kn) { - struct bpf_d *d = (struct bpf_d *)dev->si_drv1; + struct bpf_d *d; - if (kn->kn_filter != EVFILT_READ) + if (devfs_get_cdevpriv((void **)&d) != 0 || + kn->kn_filter != EVFILT_READ) return (1); /* @@ -2008,29 +2002,17 @@ } static void -bpf_clone(void *arg, struct ucred *cred, char *name, int namelen, - struct cdev **dev) -{ - int u; - - if (*dev != NULL) - return; - if (dev_stdclone(name, NULL, "bpf", &u) != 1) - return; - *dev = make_dev(&bpf_cdevsw, unit2minor(u), UID_ROOT, GID_WHEEL, 0600, - "bpf%d", u); - dev_ref(*dev); - (*dev)->si_flags |= SI_CHEAPCLONE; - return; -} - -static void bpf_drvinit(void *unused) { + struct cdev *dev; mtx_init(&bpf_mtx, "bpf global lock", NULL, MTX_DEF); LIST_INIT(&bpf_iflist); - EVENTHANDLER_REGISTER(dev_clone, bpf_clone, 0, 1000); + + dev = make_dev(&bpf_cdevsw, 0, UID_ROOT, GID_WHEEL, 0600, "bpf"); + /* For compatibility */ + make_dev_alias(dev, "bpf0"); + } static void ==== //depot/projects/mpsafetty/sys/nlm/nlm_prot_impl.c#2 (text+ko) ==== @@ -28,7 +28,7 @@ #include "opt_inet6.h" #include -__FBSDID("$FreeBSD: src/sys/nlm/nlm_prot_impl.c,v 1.12 2008/07/03 14:09:00 dfr Exp $"); +__FBSDID("$FreeBSD: src/sys/nlm/nlm_prot_impl.c,v 1.13 2008/08/13 12:03:31 dfr Exp $"); #include #include @@ -291,8 +291,11 @@ struct timeval timo; RPCB parms; char *uaddr; - enum clnt_stat stat; - int rpcvers; + enum clnt_stat stat = RPC_SUCCESS; + int rpcvers = RPCBVERS4; + bool_t do_tcp = FALSE; + struct pmap mapping; + u_short port = 0; /* * First we need to contact the remote RPCBIND service to find @@ -322,13 +325,17 @@ } rpcb = clnt_dg_create(so, (struct sockaddr *)&ss, - RPCBPROG, RPCBVERS4, 0, 0); + RPCBPROG, rpcvers, 0, 0); if (!rpcb) return (NULL); +try_tcp: parms.r_prog = prog; parms.r_vers = vers; - parms.r_netid = "udp"; + if (do_tcp) + parms.r_netid = "tcp"; + else + parms.r_netid = "udp"; parms.r_addr = ""; parms.r_owner = ""; @@ -338,55 +345,50 @@ timo.tv_sec = 25; timo.tv_usec = 0; again: - uaddr = NULL; - stat = CLNT_CALL(rpcb, (rpcprog_t) RPCBPROC_GETADDR, - (xdrproc_t) xdr_rpcb, &parms, - (xdrproc_t) xdr_wrapstring, &uaddr, timo); - if (stat == RPC_PROGVERSMISMATCH) { + switch (rpcvers) { + case RPCBVERS4: + case RPCBVERS: /* - * Try RPCBIND version 3 if we haven't already. - * - * XXX fall back to portmap? + * Try RPCBIND 4 then 3. */ - CLNT_CONTROL(rpcb, CLGET_VERS, &rpcvers); - if (rpcvers == RPCBVERS4) { - rpcvers = RPCBVERS; + uaddr = NULL; + stat = CLNT_CALL(rpcb, (rpcprog_t) RPCBPROC_GETADDR, + (xdrproc_t) xdr_rpcb, &parms, + (xdrproc_t) xdr_wrapstring, &uaddr, timo); + if (stat == RPC_PROGVERSMISMATCH) { + if (rpcvers == RPCBVERS4) + rpcvers = RPCBVERS; + else if (rpcvers == RPCBVERS) + rpcvers = PMAPVERS; CLNT_CONTROL(rpcb, CLSET_VERS, &rpcvers); goto again; + } else if (stat == RPC_SUCCESS) { + /* + * We have a reply from the remote RPCBIND - turn it + * into an appropriate address and make a new client + * that can talk to the remote NLM. + * + * XXX fixup IPv6 scope ID. + */ + struct netbuf *a; + a = __rpc_uaddr2taddr_af(ss.ss_family, uaddr); + if (!a) { + CLNT_DESTROY(rpcb); + return (NULL); + } + memcpy(&ss, a->buf, a->len); + free(a->buf, M_RPC); + free(a, M_RPC); + xdr_free((xdrproc_t) xdr_wrapstring, &uaddr); } - } - - if (stat == RPC_SUCCESS) { + break; + case PMAPVERS: /* - * We have a reply from the remote RPCBIND - turn it into an - * appropriate address and make a new client that can talk to - * the remote NLM. - * - * XXX fixup IPv6 scope ID. - */ - struct netbuf *a; - a = __rpc_uaddr2taddr_af(ss.ss_family, uaddr); - if (!a) { - CLNT_DESTROY(rpcb); - return (NULL); - } - memcpy(&ss, a->buf, a->len); - free(a->buf, M_RPC); - free(a, M_RPC); - xdr_free((xdrproc_t) xdr_wrapstring, &uaddr); - } else if (stat == RPC_PROGVERSMISMATCH) { - /* * Try portmap. */ - struct pmap mapping; - u_short port; - - rpcvers = PMAPVERS; - CLNT_CONTROL(rpcb, CLSET_VERS, &rpcvers); - mapping.pm_prog = parms.r_prog; mapping.pm_vers = parms.r_vers; - mapping.pm_prot = IPPROTO_UDP; + mapping.pm_prot = do_tcp ? IPPROTO_TCP : IPPROTO_UDP; mapping.pm_port = 0; stat = CLNT_CALL(rpcb, (rpcprog_t) PMAPPROC_GETPORT, @@ -408,22 +410,81 @@ #endif } } + break; + default: + panic("invalid rpcvers %d", rpcvers); + } + /* + * We may have a positive response from the portmapper, but the NLM + * service was not found. Make sure we received a valid port. + */ + switch (ss.ss_family) { + case AF_INET: + port = ((struct sockaddr_in *)&ss)->sin_port; + break; +#ifdef INET6 + case AF_INET6: + port = ((struct sockaddr_in6 *)&ss)->sin6_port; + break; +#endif } - if (stat != RPC_SUCCESS) { - printf("NLM: failed to contact remote rpcbind, stat = %d\n", - (int) stat); + if (stat != RPC_SUCCESS || !port) { + /* + * If we were able to talk to rpcbind or portmap, but the udp + * variant wasn't available, ask about tcp. + * + * XXX - We could also check for a TCP portmapper, but + * if the host is running a portmapper at all, we should be able + * to hail it over UDP. + */ + if (stat == RPC_SUCCESS && !do_tcp) { + do_tcp = TRUE; + goto try_tcp; + } + + /* Otherwise, bad news. */ + printf("NLM: failed to contact remote rpcbind, " + "stat = %d, port = %d\n", + (int) stat, port); CLNT_DESTROY(rpcb); return (NULL); } - /* - * Re-use the client we used to speak to rpcbind. - */ - CLNT_CONTROL(rpcb, CLSET_SVC_ADDR, &ss); - CLNT_CONTROL(rpcb, CLSET_PROG, &prog); - CLNT_CONTROL(rpcb, CLSET_VERS, &vers); - CLNT_CONTROL(rpcb, CLSET_WAITCHAN, &wchan); - rpcb->cl_auth = nlm_auth; + if (do_tcp) { + /* + * Destroy the UDP client we used to speak to rpcbind and + * recreate as a TCP client. + */ + struct netconfig *nconf = NULL; + + CLNT_DESTROY(rpcb); + + switch (ss.ss_family) { + case AF_INET: + nconf = getnetconfigent("tcp"); + break; +#ifdef INET6 + case AF_INET6: + nconf = getnetconfigent("tcp6"); + break; +#endif + } + + rpcb = clnt_reconnect_create(nconf, (struct sockaddr *)&ss, + prog, vers, 0, 0); + CLNT_CONTROL(rpcb, CLSET_WAITCHAN, &wchan); + rpcb->cl_auth = nlm_auth; + + } else { + /* + * Re-use the client we used to speak to rpcbind. + */ + CLNT_CONTROL(rpcb, CLSET_SVC_ADDR, &ss); + CLNT_CONTROL(rpcb, CLSET_PROG, &prog); + CLNT_CONTROL(rpcb, CLSET_VERS, &vers); + CLNT_CONTROL(rpcb, CLSET_WAITCHAN, &wchan); + rpcb->cl_auth = nlm_auth; + } return (rpcb); } ==== //depot/projects/mpsafetty/sys/rpc/clnt_rc.c#2 (text+ko) ==== @@ -26,7 +26,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/rpc/clnt_rc.c,v 1.4 2008/06/26 10:21:54 dfr Exp $"); +__FBSDID("$FreeBSD: src/sys/rpc/clnt_rc.c,v 1.5 2008/08/13 12:04:54 dfr Exp $"); #include #include @@ -385,6 +385,7 @@ if (rc->rc_client) CLNT_DESTROY(rc->rc_client); + mtx_destroy(&rc->rc_lock); mem_free(rc, sizeof(*rc)); mem_free(cl, sizeof (CLIENT)); }