vita-import.c (3505B)
1 #include "vita-import.h" 2 #include <stdlib.h> 3 #include <string.h> 4 5 vita_imports_t *vita_imports_new(int n_libs) 6 { 7 vita_imports_t *imp = malloc(sizeof(*imp)); 8 if (imp == NULL) 9 return NULL; 10 11 imp->postfix = calloc(64, sizeof(char)); 12 13 imp->firmware = NULL; 14 15 imp->n_libs = n_libs; 16 17 imp->libs = calloc(n_libs, sizeof(*imp->libs)); 18 19 return imp; 20 } 21 22 void vita_imports_free(vita_imports_t *imp) 23 { 24 if (imp) { 25 int i; 26 for (i = 0; i < imp->n_libs; i++) { 27 vita_imports_lib_free(imp->libs[i]); 28 } 29 30 if (imp->firmware) 31 free(imp->firmware); 32 33 free(imp->postfix); 34 free(imp); 35 } 36 } 37 38 vita_imports_lib_t *vita_imports_lib_new(const char *name, uint32_t NID, int n_modules) 39 { 40 vita_imports_lib_t *lib = malloc(sizeof(*lib)); 41 if (lib == NULL) 42 return NULL; 43 44 lib->name = strdup(name); 45 lib->NID = NID; 46 lib->n_modules = n_modules; 47 48 lib->modules = calloc(n_modules, sizeof(*lib->modules)); 49 50 return lib; 51 } 52 53 54 vita_imports_module_t *vita_imports_module_new(const char *name, bool kernel, uint32_t NID, int n_functions, int n_variables) 55 { 56 vita_imports_module_t *mod = malloc(sizeof(*mod)); 57 if (mod == NULL) 58 return NULL; 59 60 mod->name = strdup(name); 61 mod->NID = NID; 62 mod->is_kernel = kernel; 63 mod->n_functions = n_functions; 64 mod->n_variables = n_variables; 65 66 mod->functions = calloc(n_functions, sizeof(*mod->functions)); 67 68 mod->variables = calloc(n_variables, sizeof(*mod->variables)); 69 70 return mod; 71 } 72 73 void vita_imports_module_free(vita_imports_module_t *mod) 74 { 75 if (mod) { 76 int i; 77 for (i = 0; i < mod->n_variables; i++) { 78 vita_imports_stub_free(mod->variables[i]); 79 } 80 for (i = 0; i < mod->n_functions; i++) { 81 vita_imports_stub_free(mod->functions[i]); 82 } 83 free(mod->name); 84 free(mod); 85 } 86 } 87 88 89 void vita_imports_lib_free(vita_imports_lib_t *lib) 90 { 91 if (lib) { 92 int i; 93 for (i = 0; i < lib->n_modules; i++) { 94 vita_imports_module_free(lib->modules[i]); 95 } 96 free(lib->name); 97 free(lib); 98 } 99 } 100 101 vita_imports_stub_t *vita_imports_stub_new(const char *name, uint32_t NID) 102 { 103 vita_imports_stub_t *stub = malloc(sizeof(*stub)); 104 if (stub == NULL) 105 return NULL; 106 107 stub->name = strdup(name); 108 stub->NID = NID; 109 110 return stub; 111 } 112 113 void vita_imports_stub_free(vita_imports_stub_t *stub) 114 { 115 if (stub) { 116 free(stub->name); 117 free(stub); 118 } 119 } 120 121 /* For now these functions are just dumb full-table searches. We can implement qsort/bsearch/whatever later if necessary. */ 122 123 static vita_imports_common_fields *generic_find(vita_imports_common_fields **entries, int n_entries, uint32_t NID) { 124 int i; 125 vita_imports_common_fields *entry; 126 127 for (i = 0; i < n_entries; i++) { 128 entry = entries[i]; 129 if (entry == NULL) 130 continue; 131 132 if (entry->NID == NID) 133 return entry; 134 } 135 136 return NULL; 137 } 138 139 vita_imports_lib_t *vita_imports_find_lib(vita_imports_t *imp, uint32_t NID) { 140 return (vita_imports_lib_t *)generic_find((vita_imports_common_fields **)imp->libs, imp->n_libs, NID); 141 } 142 vita_imports_module_t *vita_imports_find_module(vita_imports_lib_t *lib, uint32_t NID) { 143 return (vita_imports_module_t *)generic_find((vita_imports_common_fields **)lib->modules, lib->n_modules, NID); 144 } 145 vita_imports_stub_t *vita_imports_find_function(vita_imports_module_t *mod, uint32_t NID) { 146 return (vita_imports_stub_t *)generic_find((vita_imports_common_fields **)mod->functions, mod->n_functions, NID); 147 } 148 vita_imports_stub_t *vita_imports_find_variable(vita_imports_module_t *mod, uint32_t NID) { 149 return (vita_imports_stub_t *)generic_find((vita_imports_common_fields **)mod->variables, mod->n_variables, NID); 150 }