registers a module, register_f= module register functions * returns <0 on error, 0 on success */
| 147 | /* registers a module, register_f= module register functions |
| 148 | * returns <0 on error, 0 on success */ |
| 149 | int register_module(const struct module_exports* e, char* path, void* handle) |
| 150 | { |
| 151 | int ret; |
| 152 | struct sr_module* mod; |
| 153 | |
| 154 | ret=-1; |
| 155 | |
| 156 | /* add module to the list */ |
| 157 | if ((mod=pkg_malloc(sizeof(struct sr_module)))==0){ |
| 158 | LM_ERR("no more pkg memory\n"); |
| 159 | ret=E_OUT_OF_MEM; |
| 160 | goto error; |
| 161 | } |
| 162 | memset(mod,0, sizeof(struct sr_module)); |
| 163 | mod->path=path; |
| 164 | mod->handle=handle; |
| 165 | mod->exports=e; |
| 166 | mod->next=modules; |
| 167 | modules=mod; |
| 168 | |
| 169 | /* register module pseudo-variables */ |
| 170 | if (e->items) { |
| 171 | LM_DBG("register_pv: %s\n", e->name); |
| 172 | if (register_pvars_mod(e->name, e->items)!=0) { |
| 173 | LM_ERR("failed to register pseudo-variables for module %s\n", |
| 174 | e->name); |
| 175 | pkg_free(mod); |
| 176 | return -1; |
| 177 | } |
| 178 | } |
| 179 | |
| 180 | /* register module transformations */ |
| 181 | if (e->trans) { |
| 182 | LM_DBG("register_trans: %s\n", e->name); |
| 183 | if (register_trans_mod(e->name, e->trans) !=0) { |
| 184 | LM_ERR("failed to register transformations for module %s\n", |
| 185 | e->name); |
| 186 | pkg_free(mod); |
| 187 | return -1; |
| 188 | } |
| 189 | } |
| 190 | |
| 191 | /* register all module dependencies */ |
| 192 | if (e->deps) { |
| 193 | ret = add_module_dependencies(mod); |
| 194 | if (ret != 0) { |
| 195 | LM_CRIT("failed to add module dependencies [%d]\n", ret); |
| 196 | return ret; |
| 197 | } |
| 198 | } |
| 199 | |
| 200 | return 0; |
| 201 | error: |
| 202 | return ret; |
| 203 | } |
| 204 | |
| 205 | |
| 206 | static inline int version_control(const struct module_exports* exp, char *path) |
no test coverage detected