Changeset 23 for trunk/kernel/syscalls/sys_getcwd.c
- Timestamp:
- Jun 18, 2017, 10:06:41 PM (6 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/kernel/syscalls/sys_getcwd.c
r1 r23 1 1 /* 2 * kern/sys_getcwd.c - get process current work directory2 * sys_getcwd.c - get process current work directory 3 3 * 4 * Copyright (c) 2008,2009,2010,2011,2012 Ghassan Almaless 5 * Copyright (c) 2011,2012 UPMC Sorbonne Universites 4 * Author Alain Greiner (2016,2017) 6 5 * 7 * This file is part of ALMOS-kernel.6 * Copyright (c) UPMC Sorbonne Universites 8 7 * 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 10 11 * under the terms of the GNU General Public License as published by 11 12 * the Free Software Foundation; version 2.0 of the License. 12 13 * 13 * ALMOS- kernelis distributed in the hope that it will be useful, but14 * ALMOS-MKH is distributed in the hope that it will be useful, but 14 15 * WITHOUT ANY WARRANTY; without even the implied warranty of 15 16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU … … 17 18 * 18 19 * 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, 20 21 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 21 22 */ 22 23 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> 24 29 #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> 29 32 #include <thread.h> 33 #include <printk.h> 30 34 31 /* TODO: user page need to be locked as long as its region*/35 /* TODO: user page(s) need to be locked [AG] */ 32 36 33 int sys_getcwd (char *buff, size_t size) 37 //////////////////////////////// 38 int sys_getcwd ( char * buf, 39 uint32_t nbytes ) 34 40 { 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]; 39 44 40 th is = current_thread;41 task = current_task;45 thread_t * this = CURRENT_THREAD; 46 process_t * process = this->process; 42 47 43 if((size < VFS_MAX_NAME_LENGTH) || (!buff)) 48 // check buffer size 49 if( nbytes < CONFIG_VFS_MAX_PATH_LENGTH ) 44 50 { 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; 47 54 } 48 55 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 ) 50 60 { 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; 53 64 } 54 65 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 ); 56 70 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 ) ); 58 73 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 ); 60 77 61 rwlock_unlock(&task->cwd_lock); 78 // release CWD lock 79 remote_rwlock_rd_unlock( XPTR( ref_cxy , &ref_ptr->cwd_lock ) ); 62 80 81 // copy kernel buffer to user space 82 hal_copy_to_uspace( buf , kbuf , CONFIG_VFS_MAX_PATH_LENGTH ); 63 83 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.