Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 17 Jun 2013 15:42:22 +0000 (UTC)
From:      "George V. Neville-Neil" <gnn@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-9@freebsd.org
Subject:   svn commit: r251857 - stable/9/cddl/contrib/opensolaris/lib/libdtrace/common
Message-ID:  <201306171542.r5HFgMSj038845@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: gnn
Date: Mon Jun 17 15:42:21 2013
New Revision: 251857
URL: http://svnweb.freebsd.org/changeset/base/251857

Log:
  MFC: 248848
  
  Commit a patch that fixes a problem in the #pragma statement when searching
  for and loading dependent modules.  This addresses a bug seen with
  io.d where it was being doubly included.
  
  PR:		171678
  Submitted by:	 Mark Johnston

Modified:
  stable/9/cddl/contrib/opensolaris/lib/libdtrace/common/dt_pragma.c
Directory Properties:
  stable/9/cddl/contrib/opensolaris/lib/libdtrace/common/   (props changed)

Modified: stable/9/cddl/contrib/opensolaris/lib/libdtrace/common/dt_pragma.c
==============================================================================
--- stable/9/cddl/contrib/opensolaris/lib/libdtrace/common/dt_pragma.c	Mon Jun 17 15:34:22 2013	(r251856)
+++ stable/9/cddl/contrib/opensolaris/lib/libdtrace/common/dt_pragma.c	Mon Jun 17 15:42:21 2013	(r251857)
@@ -241,6 +241,8 @@ dt_pragma_depends(const char *prname, dt
 	int found;
 	dt_lib_depend_t *dld;
 	char lib[MAXPATHLEN];
+	size_t plen;
+	char *provs, *cpy, *tok;
 
 	if (cnp == NULL || nnp == NULL ||
 	    cnp->dn_kind != DT_NODE_IDENT || nnp->dn_kind != DT_NODE_IDENT) {
@@ -248,9 +250,31 @@ dt_pragma_depends(const char *prname, dt
 		    "<class> <name>\n", prname);
 	}
 
-	if (strcmp(cnp->dn_string, "provider") == 0)
-		found = dt_provider_lookup(dtp, nnp->dn_string) != NULL;
-	else if (strcmp(cnp->dn_string, "module") == 0) {
+	if (strcmp(cnp->dn_string, "provider") == 0) {
+		/*
+		 * First try to get the provider list using the
+		 * debug.dtrace.providers sysctl, since that'll work even if
+		 * we're not running as root.
+		 */
+		provs = NULL;
+		if (sysctlbyname("debug.dtrace.providers", NULL, &plen, NULL, 0) ||
+		    ((provs = dt_alloc(dtp, plen)) == NULL) ||
+		    sysctlbyname("debug.dtrace.providers", provs, &plen, NULL, 0))
+			found = dt_provider_lookup(dtp, nnp->dn_string) != NULL;
+		else {
+			found = B_FALSE;
+			for (cpy = provs; (tok = strsep(&cpy, " ")) != NULL; )
+				if (strcmp(tok, nnp->dn_string) == 0) {
+					found = B_TRUE;
+					break;
+				}
+			if (found == B_FALSE)
+				found = dt_provider_lookup(dtp,
+				    nnp->dn_string) != NULL;
+		}
+		if (provs != NULL)
+			dt_free(dtp, provs);
+	} else if (strcmp(cnp->dn_string, "module") == 0) {
 		dt_module_t *mp = dt_module_lookup_by_name(dtp, nnp->dn_string);
 		found = mp != NULL && dt_module_getctf(dtp, mp) != NULL;
 	} else if (strcmp(cnp->dn_string, "library") == 0) {



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201306171542.r5HFgMSj038845>