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

Introduce syscalls.

File:
1 edited

Legend:

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

    r1 r23  
    11/*
    2  * kern/sys_getcwd.c - get process current work directory
     2 * sys_getcwd.c - get process current work directory
    33 *
    4  * Copyright (c) 2008,2009,2010,2011,2012 Ghassan Almaless
    5  * Copyright (c) 2011,2012 UPMC Sorbonne Universites
     4 * Author    Alain Greiner (2016,2017)
    65 *
    7  * This file is part of ALMOS-kernel.
     6 * Copyright (c)  UPMC Sorbonne Universites
    87 *
    9  * ALMOS-kernel is free software; you can redistribute it and/or modify it
     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
    23 #include <libk.h>
     24#include <kernel_config.h>
     25#include <hal_types.h>
     26#include <hal_uspace.h>
     27#include <hal_special.h>
     28#include <errno.h>
    2429#include <vfs.h>
    25 #include <sys-vfs.h>
    26 #include <task.h>
    27 #include <kmem.h>
    28 #include <ppm.h>
     30#include <vmm.h>
     31#include <process.h>
    2932#include <thread.h>
     33#include <printk.h>
    3034
    31 /* TODO: user page need to be locked as long as its region */
     35/* TODO: user page(s) need to be locked  [AG] */
    3236
    33 int sys_getcwd (char *buff, size_t size)
     37////////////////////////////////
     38int sys_getcwd ( char     * buf,
     39                 uint32_t   nbytes )
    3440{
    35         register struct thread_s *this;
    36         register struct task_s *task;
    37         register error_t err;
    38         struct ku_obj ku_buff;
     41        error_t    error;
     42    paddr_t    paddr;
     43    char       kbuf[CONFIG_VFS_MAX_PATH_LENGTH];
    3944 
    40         this      = current_thread;
    41         task      = current_task;
     45        thread_t  * this    = CURRENT_THREAD;
     46    process_t * process = this->process;
    4247
    43         if((size < VFS_MAX_NAME_LENGTH) || (!buff))
     48    // check buffer size
     49        if( nbytes < CONFIG_VFS_MAX_PATH_LENGTH )
    4450        {
    45                 err = ERANGE;
    46                 goto SYS_GETCWD_ERROR;
     51        printk("\n[ERROR] in %s : buffer too small\n", __FUNCTION__ );
     52                this->errno = ERANGE;
     53        return -1;
    4754        }
    4855
    49         if(vmm_check_address("usr cwd buffer", task, buff, size))
     56    // check buffer in user space
     57    error = vmm_v2p_translate( false , buf , &paddr );
     58
     59        if( error )
    5060        {
    51                 err = EFAULT;
    52                 goto SYS_GETCWD_ERROR;
     61        printk("\n[ERROR] in %s : user buffer unmapped\n", __FUNCTION__ );
     62                this->errno = EFAULT;
     63        return -1;
    5364        }
    5465
    55         KU_SZ_BUFF(ku_buff, buff, size);
     66    // get reference process cluster and local pointer
     67    xptr_t      ref_xp  = process->ref_xp;
     68    cxy_t       ref_cxy = GET_CXY( ref_xp );
     69    process_t * ref_ptr = (process_t *)GET_PTR( ref_xp );
    5670
    57         rwlock_rdlock(&task->cwd_lock);
     71    // get CWD lock in read mode
     72        remote_rwlock_rd_lock( XPTR( ref_cxy , &ref_ptr->cwd_lock ) );
    5873
    59         err = vfs_get_path(&task->vfs_cwd, &ku_buff);
     74    // call relevant VFS function
     75        error = vfs_get_path( XPTR( ref_cxy , &ref_ptr->vfs_cwd_xp ) ,
     76                          kbuf , CONFIG_VFS_MAX_PATH_LENGTH );
    6077
    61         rwlock_unlock(&task->cwd_lock);
     78    // release CWD lock
     79        remote_rwlock_rd_unlock( XPTR( ref_cxy , &ref_ptr->cwd_lock ) );
    6280
     81    // copy kernel buffer to user space
     82    hal_copy_to_uspace( buf , kbuf , CONFIG_VFS_MAX_PATH_LENGTH );
    6383
    64 SYS_GETCWD_ERROR:
    65         this->info.errno = err;
    66         return (int)buff;
    67 }
     84    hal_wbflush();
     85
     86        return 0;
     87
     88}  // end sys_getcwd()
Note: See TracChangeset for help on using the changeset viewer.