Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
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;
}
Ejemplo n.º 3
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;
}
Ejemplo n.º 4
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);
  }
}