int32_t l4vfs_basic_io_getdents_component(CORBA_Object _dice_corba_obj, object_handle_t handle, l4vfs_dirent_t **dirp, uint32_t *count, CORBA_Server_Environment *_dice_corba_env) { int ret, seek; l4vfs_th_node_t * node; int __count; if (*count > INT_MAX) __count = INT_MAX; else __count = (int)*count; if (handle < 0 || handle >= MAX_CLIENTS) return -EBADF; if (! clients_is_open(handle)) return -EBADF; if (! l4_task_equal(clients[handle].client, *_dice_corba_obj)) return -EBADF; node = clients[handle].node; seek = clients[handle].seek; ret = l4vfs_th_dir_fill_dirents(node, seek, *dirp, &__count); clients[handle].seek = ret; // set new seekpointer if (__count < 0) return -EINVAL; else return *count; }
l4vfs_off_t l4vfs_basic_io_lseek_component(CORBA_Object _dice_corba_obj, object_handle_t handle, l4vfs_off_t offset, int32_t whence, CORBA_Server_Environment *_dice_corba_env) { if (handle < 0 || handle >= MAX_CLIENTS) return -EBADF; if (! clients_is_open(handle)) return -EBADF; if (! l4_task_equal(clients[handle].client, *_dice_corba_obj)) return -EBADF; switch (whence) // fixme: care for all the other cases ... { case SEEK_SET: if (offset != 0) return -EINVAL; clients[handle].seek = offset; break; default: return -EINVAL; } return 0; }
int32_t l4vfs_common_io_close_component(CORBA_Object _dice_corba_obj, object_handle_t handle, CORBA_Server_Environment *_dice_corba_env) { if (handle < 0 || handle >= MAX_CLIENTS) return -EBADF; if (! clients_is_open(handle)) return -EBADF; if (! l4_task_equal(clients[handle].client, *_dice_corba_obj)) return -EBADF; if (clients[handle].node->type != L4VFS_TH_TYPE_DIRECTORY) return -EBADF; clients[handle].node->usage_count--; clients[handle].open = 0; // fixme: check for cleaning up dirs here later if (clients[handle].node->usage_count <= 0) { //_check_and_clean_node(clients[handle].node); } return 0; }
void event_thread(void) { l4events_ch_t event_ch = L4EVENTS_EXIT_CHANNEL; l4events_nr_t event_nr = L4EVENTS_NO_NR; l4events_event_t event; l4_threadid_t tid; int rc; if (!l4events_init()) { LOG_Error("l4events_init() failed"); __exit(1, 1); } if ((rc = l4events_register(L4EVENTS_EXIT_CHANNEL, 15)) != 0) { LOG_Error("l4events_register failed"); __exit(1, 1); } while(1) { /* wait for event */ if ((rc = l4events_give_ack_and_receive(&event_ch, &event, &event_nr, L4_IPC_NEVER, L4EVENTS_RECV_ACK))<0) { l4env_perror("l4events_give_ack_and_receive()", -rc); continue; } tid = *(l4_threadid_t *)event.str; LOG("Got exit event for "l4util_idfmt, l4util_idstr(tid)); /* exit myself */ if (l4_task_equal(tid, os2srv)) __exit(1, rc); } }