diff options
Diffstat (limited to 'src/modules/manager/main.c')
-rw-r--r-- | src/modules/manager/main.c | 97 |
1 files changed, 92 insertions, 5 deletions
diff --git a/src/modules/manager/main.c b/src/modules/manager/main.c index 9e23097..d211831 100644 --- a/src/modules/manager/main.c +++ b/src/modules/manager/main.c @@ -2,20 +2,107 @@ #include <gc/mem.h> #include <gc/server.h> #include <gm/method.h> +#include <gm/call/manager.h> +#include <string.h> +char *loglevels[] = {"Critical", "Error", "Warning", "Notice", "Status", "Debug"}; +int loglevel = LL_DEBUG; + +struct service { + char* name; + int pid; + Object obj; + struct service *next; +}; + +struct service *services = 0; + +//************************ FUNCTIONS THAT DO STUFF ******************** +void logsvc(int pid, char* log, int level) { + if (level > loglevel || level < 0) return; + struct service *svc = services; + while (svc) { + if (svc->pid == pid) break; + svc = svc->next; + } + if (svc == 0) { + printk("[log:??] "); + } else { + printk("[log:"); printk(svc->name); printk("] "); + } + printk(loglevels[level]); printk(": "); + printk(log); printk("\n"); +} + +void registersvc(int pid, char* name, Object descriptor) { + struct service *svc = malloc(sizeof(struct service)); + svc->name = strdup(name); + svc->pid = pid; + svc->obj = descriptor; + svc->next = services; + services = svc; + char msg[100] = "Service registered: "; + strcat(msg, svc->name); + logsvc(1, msg, LL_NOTICE); +} + +//****************************** HANDLING METHODS ON MAIN OBJECT ***************** struct method_ret handle_nothing(struct method_data *d) { - if (d->blocking) printk("[manager] Received a {nothing} request.\n"); - else printk("[manager] Received a {nothing} message.\n"); + if (d->blocking) logsvc(1, "Received a {nothing} request.", LL_DEBUG); + else logsvc(1, "Received a {nothing} message.", LL_DEBUG); + return mr_void(); +} + +struct method_ret handle_open(struct method_data *d) { + CHKSSTR(d, 0); + char *svc = d->parameters[0].p; + printk("open: "); printk(svc); printk("\n"); + char *sep, *res; + sep = strchr(svc, ':'); + if (sep != 0) *sep = '0'; + struct service *s = services; + while (s) { + if (strcmp(s->name, svc) == 0) break; + s = s->next; + } + if (s == 0) return mr_err(-2); + if (sep == 0) { + return mr_obj(s->obj); + } else { + *sep = ':'; + res = sep + 1; + // open service svc, ressource res + Object r = c_open(s->obj, 1, res); + if (r == -1) return mr_err(-3); + return mr_obj(r); + } +} + +struct method_ret handle_registersvc(struct method_data *d) { + CHKSSTR(d, 0); + if (d->parameters[1].i == 0) return mr_err(-1); + registersvc(d->pid, d->parameters[0].p, d->parameters[1].i); + return mr_void(); +} + +struct method_ret handle_logsvc(struct method_data *d) { + CHKSSTR(d, 0); + logsvc(d->pid, d->parameters[0].p, d->parameters[1].i); return mr_void(); } int main() { - printk("[manager] Manager module configuring...\n"); - Server *mgr = srv_get(0); + logsvc(1, "Manager module configuring...", LL_NOTICE); + registersvc(1, "manager", 0); + Server *mgr = srv_get(0); srv_addHandler(mgr, M_NOTHING_VVVV, handle_nothing); - printk("[manager] Manager module configured : starting request handling.\n"); + srv_addHandler(mgr, M_OPEN_OMVV, handle_open); + srv_addHandler(mgr, M_REGISTERSVC_VMOV, handle_registersvc); + srv_addHandler(mgr, M_LOGSVC_VMIV, handle_logsvc); + + logsvc(1, "Manager module configured : starting request handling.", LL_STATUS); srv_handle(mgr, HA_LOOP); printk("[manager] Manager EPIC FAIL.\n"); |