Added features to the dyninst API library, including an optional "else"
[dyninst.git] / dyninstAPI / src / sharedobject.C
1 #include "dyninstAPI/src/sharedobject.h"
2
3 // TODO: this should probably not be a shared_object method, but since
4 // for now it is only used by shared_objects it is
5 // from a string that is a complete path name to a function in a module
6 // (ie. "/usr/lib/libc.so.1/write") return a string with the function
7 // part removed.  return 0 on error
8 char *shared_object::getModulePart(string &full_path_name) {
9
10     char *whole_name = P_strdup(full_path_name.string_of());
11     char *next=0;
12     char *last=next;
13     if((last = P_strrchr(whole_name, '/'))){
14         next = whole_name;
15         for(u_int i=0;(next!=last)&&(i<full_path_name.length()); i++){
16             next++;
17             if(next == last){
18                 u_int size = i+2;
19                 char *temp_str = new char[size];
20                 if(P_strncpy(temp_str,whole_name,size-1)){
21                     temp_str[size-1] = '\0';
22                     delete whole_name;
23                     return temp_str;
24                     temp_str = 0;
25             } }
26         }
27     }
28     delete whole_name;
29     return 0;
30 }
31
32
33 #ifndef BPATCH_LIBRARY
34 // returns all the functions not excluded by exclude_lib or exclude_func
35 // mdl option
36 vector<pd_Function *> *shared_object::getSomeFunctions(){
37     if(objs_image) {
38       if(some_funcs) return some_funcs;
39       // return (&(objs_image->mdlNormal));
40       // check to see if this module occurs in the list of modules from
41       // exclude_funcs mdl option...if it does then we need to check
42       // function by function
43       some_funcs = new vector<pd_Function *>;
44       *some_funcs +=  *(getAllFunctions());
45       vector<string> func_constraints;
46
47       if(mdl_get_lib_constraints(func_constraints)) {
48         for(u_int i=0; i < func_constraints.size(); i++) {
49
50           // if this is not a lib constraint of the form "module/function" 
51           // then this is one that specifies an entire library and  
52           // we ignore it here
53           char *blah = 0;
54           char *next = P_strdup(func_constraints[i].string_of());
55           if(next && (blah = P_strchr(next,'/'))) {
56             char *mod_part = getModulePart(func_constraints[i]);
57             char *mod_name = P_strdup(name.string_of());
58             if(mod_name && mod_part && (P_strstr(mod_name,mod_part))){
59                 // find corresponding function in the list of
60                 // some_funcs and remove it
61                 char *temp = P_strdup(func_constraints[i].string_of());
62                 char *func_name = P_strrchr(temp,'/'); 
63                 func_name++;
64                 if(func_name){
65                    string blah(func_name);
66                    pd_Function *pf = findOneFunction(blah,false);
67                    if(pf) {
68                      // remove this function from the somefunctions list
69                      u_int size = some_funcs->size();
70                      for(u_int j=0; j < size; j++) {
71                         if(pf == (*some_funcs)[j]){
72                           (*some_funcs)[j] = (*some_funcs)[size - 1];
73                           some_funcs->resize(size - 1);
74                           break;
75                    } } }
76                 }
77             }
78             if(mod_name) delete mod_name;
79             if(mod_part) delete mod_part;
80           }
81           if(next) free(next); // strdup allocs via malloc, so we use free() here
82
83       } }
84
85       return some_funcs;
86     }
87     some_funcs = 0;
88     return 0;
89 }
90 #endif /* BPATCH_LIBRARY */