Ignore:
Timestamp:
Jun 18, 2017, 10:06:41 PM (5 years ago)
Author:
alain
Message:

Introduce syscalls.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/kernel/syscalls/sys_readdir.c

    r1 r23  
    11/*
    2  * sys_read.c: read entries from an opened directory
    3  *
    4  * Copyright (c) 2008,2009,2010,2011,2012 Ghassan Almaless
    5  * Copyright (c) 2011,2012 UPMC Sorbonne Universites
     2 * sys_readdir.c - Read one entry from an open directory.
    63 *
    7  * This file is part of ALMOS-kernel.
     4 * Author    Alain Greiner (2016,2017)
    85 *
    9  * ALMOS-kernel is free software; you can redistribute it and/or modify it
     6 * Copyright (c) UPMC Sorbonne Universites
     7 *
     8 * This file is part of ALMOS-MKH.
     9 *
     10 * ALMOS-MKH is free software; you can redistribute it and/or modify it
    1011 * under the terms of the GNU General Public License as published by
    1112 * the Free Software Foundation; version 2.0 of the License.
    1213 *
    13  * ALMOS-kernel is distributed in the hope that it will be useful, but
     14 * ALMOS-MKH is distributed in the hope that it will be useful, but
    1415 * WITHOUT ANY WARRANTY; without even the implied warranty of
    1516 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     
    1718 *
    1819 * You should have received a copy of the GNU General Public License
    19  * along with ALMOS-kernel; if not, write to the Free Software Foundation,
     20 * along with ALMOS-MKH; if not, write to the Free Software Foundation,
    2021 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
    2122 */
    2223
     24#include <kernel_config.h>
     25#include <hal_types.h>
     26#include <hal_uspace.h>
     27#include <errno.h>
     28#include <thread.h>
     29#include <printk.h>
    2330#include <vfs.h>
    24 #include <sys-vfs.h>
    25 #include <task.h>
    26 #include <thread.h>
     31#include <process.h>
     32#include <syscalls.h>
    2733
    28 /* FIXEME: reading dirent from user without any protection */
     34//////////////////////////////////////////
     35int sys_readdir ( uint32_t       file_id,
     36                  vfs_dirent_t * dirent )
     37{
     38        error_t        error;
     39    paddr_t        paddr;
     40        xptr_t         file_xp;    // extended pointer on searched directory file descriptor
     41    vfs_dirent_t   k_dirent;   // kernel copy of dirent
    2942
    30 int sys_readdir (uint_t fd, struct vfs_usp_dirent_s *dirent)
    31 {
    32         error_t err;
    33         struct ku_obj dir;
    34         struct task_s *task;
    35         struct thread_s *this;
    36         struct vfs_file_s *file;
    37  
    38         file = NULL;
    39         task = current_task;
    40         this = current_thread;
     43        thread_t     * this     = CURRENT_THREAD;
     44        process_t    * process  = this->process;
    4145
    42         if((dirent == NULL)                ||
    43            (fd >= CONFIG_TASK_FILE_MAX_NR) ||
    44            (task_fd_lookup(task, fd, &file)))
     46    // check file_id argument
     47        if( file_id >= CONFIG_PROCESS_FILE_MAX_NR )
    4548        {
    46                 this->info.errno = EBADFD;
     49        printk("\n[ERROR] in %s : illegal file descriptor index\n", __FUNCTION__ );
     50        this->errno = EBADFD;
    4751                return -1;
    4852        }
    4953
    50         KU_OBJ(dir, dirent);
    51         if((err = vfs_readdir(file, &dir)))
     54    // check dirent structure in user space
     55    error = vmm_v2p_translate( false , dirent , &paddr );
     56
     57    if ( error )
     58    {
     59        printk("\n[ERROR] in %s : user buffer for dirent unmapped = %x\n",
     60               __FUNCTION__ , (intptr_t)dirent );
     61                this->errno = EFAULT;
     62                return -1;
     63    }
     64
     65    // get extended pointer on remote file descriptor
     66    file_xp = process_fd_get_xptr( process , file_id );
     67
     68    if( file_xp == XPTR_NULL )
     69    {
     70        printk("\n[ERROR] in %s : undefined file descriptor index = %d\n",
     71               __FUNCTION__ , file_id );
     72            this->errno = EBADFD;
     73        return -1;
     74    }
     75 
     76    // call the relevant VFS function
     77        error = vfs_readdir( file_xp , &k_dirent );
     78
     79        if( error )
    5280        {
    53                 this->info.errno = (err < 0) ? -err : err;
     81        printk("\n[ERROR] in %s : cannot access directory %d\n",
     82               __FUNCTION__ , file_id );
     83                this->errno = error;
    5484                return -1;
    5585        }
    5686   
     87    // copy dirent to user space
     88    hal_copy_to_uspace( dirent , &k_dirent , sizeof(vfs_dirent_t) );
     89
    5790        return 0;
    58 }
     91
     92}  // end sys_readdir()
Note: See TracChangeset for help on using the changeset viewer.