00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00037 #include <malloc.h>
00038 #include <task.h>
00039 #include <unistd.h>
00040 #include <errno.h>
00041
00042 #include <ipc/services.h>
00043
00044 #include <net/modules.h>
00045
00046 #include <adt/generic_char_map.h>
00047 #include <adt/module_map.h>
00048
00049 GENERIC_CHAR_MAP_IMPLEMENT(modules, module_t)
00050
00051
00064 int
00065 add_module(module_t **module, modules_t *modules, const uint8_t *name,
00066 const uint8_t *filename, services_t service, task_id_t task_id,
00067 connect_module_t connect_module)
00068 {
00069 module_t *tmp_module;
00070 int rc;
00071
00072 tmp_module = (module_t *) malloc(sizeof(module_t));
00073 if (!tmp_module)
00074 return ENOMEM;
00075
00076 tmp_module->task_id = task_id;
00077 tmp_module->phone = 0;
00078 tmp_module->usage = 0;
00079 tmp_module->name = name;
00080 tmp_module->filename = filename;
00081 tmp_module->service = service;
00082 tmp_module->connect_module = connect_module;
00083
00084 rc = modules_add(modules, tmp_module->name, 0, tmp_module);
00085 if (rc != EOK) {
00086 free(tmp_module);
00087 return rc;
00088 }
00089 if (module)
00090 *module = tmp_module;
00091
00092 return EOK;
00093 }
00094
00106 module_t *get_running_module(modules_t *modules, uint8_t *name)
00107 {
00108 module_t *module;
00109
00110 module = modules_find(modules, name, 0);
00111 if (!module)
00112 return NULL;
00113
00114 if (!module->task_id) {
00115 module->task_id = net_spawn(module->filename);
00116 if (!module->task_id)
00117 return NULL;
00118 }
00119 if (!module->phone)
00120 module->phone = module->connect_module(module->service);
00121
00122 return module;
00123 }
00124
00133 task_id_t net_spawn(const uint8_t *fname)
00134 {
00135 task_id_t id;
00136 int rc;
00137
00138 rc = task_spawnl(&id, (const char *) fname, (const char *) fname, NULL);
00139 if (rc != EOK)
00140 return 0;
00141
00142 return id;
00143 }
00144