Changeset 610 for trunk/kernel/syscalls/sys_opendir.c
- Timestamp:
- Dec 27, 2018, 7:38:58 PM (6 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/kernel/syscalls/sys_opendir.c
r473 r610 2 2 * sys_opendir.c - open a directory. 3 3 * 4 * Author Alain Greiner (2016,2017 )4 * Author Alain Greiner (2016,2017,2018) 5 5 * 6 6 * Copyright (c) UPMC Sorbonne Universites … … 23 23 24 24 #include <hal_kernel_types.h> 25 #include <hal_uspace.h> 25 26 #include <thread.h> 26 27 #include <process.h> … … 35 36 DIR ** dirp ) 36 37 { 37 printk("\n[ERROR] in %s : not implemented yet\n", __FUNCTION__, pathname, dirp ); 38 return -1; 39 } // end sys opendir() 38 error_t error; 39 vseg_t * vseg; // for user space checking 40 xptr_t root_inode_xp; // extended pointer on path root inode 41 42 char kbuf[CONFIG_VFS_MAX_PATH_LENGTH]; 43 44 thread_t * this = CURRENT_THREAD; 45 process_t * process = this->process; 46 47 #if (DEBUG_SYS_OPENDIR || CONFIG_INSTRUMENTATION_SYSCALLS) 48 uint64_t tm_start = hal_get_cycles(); 49 #endif 50 51 // check DIR buffer in user space 52 error = vmm_get_vseg( process , (intptr_t)dirp, &vseg ); 53 54 if( error ) 55 { 56 57 #if DEBUG_SYSCALLS_ERROR 58 printk("\n[ERROR] in %s / thread[%x,%x] : DIR buffer %x unmapped\n", 59 __FUNCTION__ , process->pid , this->trdid, dirp ); 60 vmm_display( process , false ); 61 #endif 62 this->errno = EINVAL; 63 return -1; 64 } 65 66 // check pathname length 67 if( hal_strlen_from_uspace( pathname ) >= CONFIG_VFS_MAX_PATH_LENGTH ) 68 { 69 70 #if DEBUG_SYSCALLS_ERROR 71 printk("\n[ERROR] in %s / thread[%x,%x] : pathname too long\n", 72 __FUNCTION__ , process->pid , this->trdid ); 73 #endif 74 this->errno = ENFILE; 75 return -1; 76 } 77 78 // copy pathname in kernel space 79 hal_strcpy_from_uspace( kbuf , pathname , CONFIG_VFS_MAX_PATH_LENGTH ); 80 81 #if DEBUG_SYS_OPENDIR 82 if( DEBUG_SYS_OPENDIR < tm_start ) 83 printk("\n[%s] thread[%x,%x] enter for directory <%s> / cycle %d\n", 84 __FUNCTION__, process->pid, this->trdid, kbuf, (uint32_t)tm_start ); 85 #endif 86 87 // compute root inode for path 88 if( kbuf[0] == '/' ) // absolute path 89 { 90 // use extended pointer on VFS root inode 91 root_inode_xp = process->vfs_root_xp; 92 } 93 else // relative path 94 { 95 // get cluster and local pointer on reference process 96 xptr_t ref_xp = process->ref_xp; 97 process_t * ref_ptr = (process_t *)GET_PTR( ref_xp ); 98 cxy_t ref_cxy = GET_CXY( ref_xp ); 99 100 // use extended pointer on CWD inode 101 root_inode_xp = hal_remote_l64( XPTR( ref_cxy , &ref_ptr->cwd_xp ) ); 102 } 103 104 /* 105 // call the relevant VFS function ??? 106 error = vfs_opendir( root_inode_xp, 107 kbuf ); 108 if( error ) 109 { 110 111 #if DEBUG_SYSCALLS_ERROR 112 printk("\n[ERROR] in %s / thread[%x,%x] : cannot open directory <%s>\n", 113 __FUNCTION__ , process->pid , this->trdid , pathname ); 114 #endif 115 this->errno = ENFILE; 116 return -1; 117 } 118 119 // copy to user space ??? 120 */ 121 122 hal_fence(); 123 124 #if (DEBUG_SYS_OPENDIR || CONFIG_INSTRUMENTATION_SYSCALLS) 125 uint64_t tm_end = hal_get_cycles(); 126 #endif 127 128 #if DEBUG_SYS_OPENDIR 129 if( DEBUG_SYS_OPENDIR < tm_end ) 130 printk("\n[%s] thread[%x,%x] exit for directory <%s> / cycle %d\n", 131 __FUNCTION__, process->pid, this->trdid, kbuf, (uint32_t)tm_end ); 132 #endif 133 134 #if CONFIG_INSTRUMENTATION_SYSCALLS 135 hal_atomic_add( &syscalls_cumul_cost[SYS_OPENDIR] , tm_end - tm_start ); 136 hal_atomic_add( &syscalls_occurences[SYS_OPENDIR] , 1 ); 137 #endif 138 139 return 0; 140 141 } // end sys_opendir()
Note: See TracChangeset
for help on using the changeset viewer.