Author: gnn
Date: Thu Mar 28 20:31:03 2013
New Revision: 248848
URL: http://svnweb.freebsd.org/changeset/base/248848

Log:
  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
  MFC after:    2 weeks

Modified:
  head/cddl/contrib/opensolaris/lib/libdtrace/common/dt_pragma.c

Modified: head/cddl/contrib/opensolaris/lib/libdtrace/common/dt_pragma.c
==============================================================================
--- head/cddl/contrib/opensolaris/lib/libdtrace/common/dt_pragma.c      Thu Mar 
28 20:27:01 2013        (r248847)
+++ head/cddl/contrib/opensolaris/lib/libdtrace/common/dt_pragma.c      Thu Mar 
28 20:31:03 2013        (r248848)
@@ -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) {
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to