10 m = dtmalloc(strlen(n) + 1);
12 setmalloctag(m, getcallerpc(&n));
17 dtpnew(char *name, DTProvider *prov, void *aux)
21 p = dtmalloc(sizeof(DTProbe));
22 p->name = dtstrdup(name);
25 p->enablist.probnext = p->enablist.probprev = &p->enablist;
26 for(pp = &prov->probes; *pp != nil; pp = &(*pp)->provnext)
32 /* does the pattern match at most one probe (or provider if provonly)? */
34 patunique(char *pat, int provonly)
51 partmatch(char *pat, char *str, int provonly)
56 if(*pat != *str && (*pat != '?' || *str == ':') && (!provonly || *pat != ':' || *str != 0))
58 if(*pat == 0 || *pat == ':' && provonly)
64 do a wildcard match with * and ?, but don't match : against a wildcard
65 if provonly, stop at the first :
67 replacing empty parts with * is done in user space
70 dtnamematch(char *pat, char *str, int provonly)
72 char *patp, *strp, *p;
74 patp = partmatch(pat, str, provonly);
75 if(patp == nil) return 0;
76 if(patp == (void*)-1) return 1;
78 strp = str + (patp - pat);
81 /* try the rest of the pattern against each position */
82 p = partmatch(patp, strp, provonly);
84 if(*strp == 0 || *strp == ':') return 0;
90 /* reached another * */
97 dtpmatch(char *name, DTProbe ***ret)
101 DTProvider **provp, *prov;
103 int unique, uniqueprov;
107 unique = patunique(name, 0);
108 uniqueprov = patunique(name, 1);
109 for(provp = dtproviders; prov = *provp, prov != nil; provp++){
110 if(!dtnamematch(name, prov->name, 1))
116 for(pp = &prov->probes; p = *pp, p != nil; pp = &p->provnext){
117 if(dtnamematch(name, p->name, 0)){
119 l = dtrealloc(l, (nl + 1) * sizeof(DTProbe *));
126 if(uniqueprov) goto out;
135 dtplist(DTProbe ***ret)
139 DTProvider **provp, *prov;
144 for(provp = dtproviders; prov = *provp, prov != nil; provp++){
149 for(pp = &prov->probes; p = *pp, p != nil; pp = &p->provnext){
151 l = dtrealloc(l, (nl + 1) * sizeof(DTProbe *));