Changeset 670 for trunk/kernel/syscalls/sys_mkfifo.c
- Timestamp:
- Nov 19, 2020, 11:45:52 PM (4 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/kernel/syscalls/sys_mkfifo.c
r637 r670 2 2 * sys_mkfifo.c - creates a named FIFO file. 3 3 * 4 * Author Alain Greiner (2016,2017,2018,2019 )4 * Author Alain Greiner (2016,2017,2018,2019,2020) 5 5 * 6 6 * Copyright (c) UPMC Sorbonne Universites … … 31 31 //////////////////////////////////// 32 32 int sys_mkfifo ( char * pathname, 33 uint32_t mode __attribute__((unused)))33 uint32_t mode ) 34 34 { 35 char kbuf[CONFIG_VFS_MAX_PATH_LENGTH]; 35 vseg_t * vseg; 36 error_t error; 37 xptr_t root_inode_xp; 38 char kbuf[CONFIG_VFS_MAX_PATH_LENGTH]; 36 39 37 thread_t * this = CURRENT_THREAD;38 process_t * process = this->process;40 thread_t * this = CURRENT_THREAD; 41 process_t * process = this->process; 39 42 40 #if (DEBUG_SYS_MKFIFO || CONFIG_INSTRUMENTATION_SYSCALLS)43 #if DEBUG_SYS_MKFIFO || DEBUG_SYSCALLS_ERROR || CONFIG_INSTRUMENTATION_SYSCALLS 41 44 uint64_t tm_start = hal_get_cycles(); 42 45 #endif … … 45 48 if( DEBUG_SYS_MKFIFO < tm_end ) 46 49 printk("\n[%s] thread[%x,%x] enter for <%s> / cycle %d\n", 47 __FUNCTION__, process->pid, this->trdid, pathname, (uint32_t)tm_ end);50 __FUNCTION__, process->pid, this->trdid, pathname, (uint32_t)tm_start ); 48 51 #endif 49 52 50 // check fd_array not full51 if( process_fd_array_full() )52 53 // check pathname in user space 54 if( vmm_get_vseg( process, (intptr_t)pathname , &vseg ) ) 55 { 53 56 54 57 #if DEBUG_SYSCALLS_ERROR 55 printk("\n[ERROR] in %s : file descriptor array full for process %x\n", 56 __FUNCTION__ , process->pid ); 58 if( DEBUG_SYSCALLS_ERROR < (uint32_t)tm_start ) 59 printk("\n[ERROR] in %s : user buffer unmapped %x for thread[%x,%x]\n", 60 __FUNCTION__ , (intptr_t)pathname , process->pid, this->trdid ); 57 61 #endif 58 this->errno = ENFILE;62 this->errno = EINVAL; 59 63 return -1; 60 64 } 61 65 62 66 // check pathname length … … 65 69 66 70 #if DEBUG_SYSCALLS_ERROR 67 printk("\n[ERROR] in %s : pathname too long\n", __FUNCTION__ ); 71 if( DEBUG_SYSCALLS_ERROR < (uint32_t)tm_start ) 72 printk("\n[ERROR] in %s : pathname too long for thread[%x,%x]\n", 73 __FUNCTION__ , process->pid , this->trdid ); 68 74 #endif 69 75 this->errno = ENFILE; … … 76 82 CONFIG_VFS_MAX_PATH_LENGTH ); 77 83 78 printk("\n[ERROR] in %s : not implemented yet\n", __FUNCTION__ ); 79 return -1; 84 #if DEBUG_SYS_MKFIFO 85 if( DEBUG_SYS_MKFIFO < tm_end ) 86 printk("\n[%s] thread[%x,%x] enter for <%s> / cycle %d\n", 87 __FUNCTION__, process->pid, this->trdid, kbuf, (uint32_t)tm_start ); 88 #endif 89 90 // get cluster and local pointer on reference process 91 xptr_t ref_xp = process->ref_xp; 92 process_t * ref_ptr = GET_PTR( ref_xp ); 93 cxy_t ref_cxy = GET_CXY( ref_xp ); 94 95 // get extended pointer on root inode in path 96 if( kbuf[0] == '/' ) // absolute path 97 { 98 // use extended pointer on VFS root inode 99 root_inode_xp = process->vfs_root_xp; 100 } 101 else // relative path 102 { 103 // use extended pointer on CWD inode 104 root_inode_xp = hal_remote_l64( XPTR( ref_cxy , &ref_ptr->cwd_xp ) ); 105 } 106 107 // call the relevant VFS function 108 error = vfs_mkfifo( root_inode_xp, 109 kbuf, 110 mode ); 111 if( error ) 112 { 113 114 #if DEBUG_SYSCALLS_ERROR 115 if( DEBUG_SYSCALLS_ERROR < (uint32_t)tm_start ) 116 printk("\n[ERROR] in %s : thread[%x,%x] cannot create node in VFS for <%s> path\n", 117 __FUNCTION__ , process->pid , this->trdid , kbuf ); 118 #endif 119 this->errno = ENFILE; 120 return -1; 121 } 80 122 81 123 #if (DEBUG_SYS_MKFIFO || CONFIG_INSTRUMENTATION_SYSCALLS) … … 94 136 #endif 95 137 138 return 0; 139 96 140 } // end sys_mkfifo()
Note: See TracChangeset
for help on using the changeset viewer.