PERFORCE change 147317 for review
Ed Schouten
ed at FreeBSD.org
Wed Aug 13 17:39:03 UTC 2008
http://perforce.freebsd.org/chv.cgi?CH=147317
Change 147317 by ed at 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 <sys/cdefs.h>
-__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 <sys/param.h>
#include <sys/bus.h>
@@ -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 <sys/cdefs.h>
-__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 <sys/param.h>
#include <sys/bus.h>
@@ -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 <sys/cdefs.h>
-__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 <sys/param.h>
#include <sys/systm.h>
@@ -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 <sys/cdefs.h>
-__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 <sys/param.h>
#include <sys/bus.h>
@@ -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 <sys/cdefs.h>
-__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 <sys/param.h>
#include <sys/bus.h>
@@ -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 <sys/cdefs.h>
-__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 <sys/cdefs.h>
-__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 <sys/param.h>
#include <sys/fcntl.h>
@@ -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 <sys/cdefs.h>
-__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 <sys/param.h>
#include <sys/systm.h>
@@ -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));
}
More information about the p4-projects
mailing list