00001 #include <l4/omega0/client.h>
00002 #include <omega0_proto.h>
00003 #include <l4/sys/types.h>
00004 #include <l4/sys/ipc.h>
00005 #include "internal.h"
00006 #include "config.h"
00007
00008 omega0_alien_handler_t omega0_alien_handler;
00009
00010
00011 int omega0_request(int handle, omega0_request_t action){
00012 if(!omega0_initalized && omega0_init()) return -1;
00013
00014 if(omega0_alien_handler){
00015 l4_threadid_t alien;
00016 l4_umword_t d0, d1;
00017 int err;
00018
00019 while(1) {
00020 if((err = omega0_open_call(handle, OMEGA0_REQUEST, action.i,
00021 L4_IPC_NEVER, &alien, &d0, &d1))!=0)
00022 return err;
00023 if(!l4_task_equal(alien, omega0_management_thread)){
00024 omega0_alien_handler(alien, d0, d1);
00025 } else return d0;
00026 action.s.consume=action.s.mask=action.s.unmask=0;
00027 action.s.again=1;
00028 }
00029 } else
00030 return omega0_call(handle, OMEGA0_REQUEST, action.i, L4_IPC_NEVER);
00031 }
00032
00033 omega0_alien_handler_t omega0_set_alien_handler(
00034 omega0_alien_handler_t handler){
00035 omega0_alien_handler_t old = omega0_alien_handler;
00036 omega0_alien_handler = handler;
00037 return old;
00038 }