Changeset fcab7ef in mainline for uspace/srv/vfs
- Timestamp:
- 2017-03-26T20:46:56Z (8 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- fe91f66
- Parents:
- f644472
- Location:
- uspace/srv/vfs
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/vfs/vfs.h
rf644472 rfcab7ef 204 204 extern int vfs_open_node_remote(vfs_node_t *); 205 205 206 extern int vfs_op_clone(int oldfd, bool desc);206 extern int vfs_op_clone(int oldfd, int newfd, bool desc); 207 207 extern int vfs_op_close(int fd); 208 extern int vfs_op_dup(int oldfd, int newfd);209 208 extern int vfs_op_fstat(int fd); 210 209 extern int vfs_op_mount(int mpfd, unsigned servid, unsigned flags, unsigned instance, const char *opts, const char *fsname, int *outfd); -
uspace/srv/vfs/vfs_file.c
rf644472 rfcab7ef 304 304 305 305 fibril_mutex_lock(&VFS_DATA->lock); 306 if ((fd < 0) || (fd >= MAX_OPEN_FILES) || (FILES[fd] != NULL)) {306 if ((fd < 0) || (fd >= MAX_OPEN_FILES)) { 307 307 fibril_mutex_unlock(&VFS_DATA->lock); 308 return EINVAL; 308 return EBADF; 309 } 310 if (FILES[fd] != NULL) { 311 fibril_mutex_unlock(&VFS_DATA->lock); 312 return EEXIST; 309 313 } 310 314 -
uspace/srv/vfs/vfs_ipc.c
rf644472 rfcab7ef 37 37 { 38 38 int oldfd = IPC_GET_ARG1(*request); 39 bool desc = IPC_GET_ARG2(*request); 40 41 int ret = vfs_op_clone(oldfd, desc); 39 int newfd = IPC_GET_ARG2(*request); 40 bool desc = IPC_GET_ARG3(*request); 41 42 int ret = vfs_op_clone(oldfd, newfd, desc); 42 43 async_answer_0(rid, ret); 43 44 } … … 48 49 int rc = vfs_op_close(fd); 49 50 async_answer_0(rid, rc); 50 }51 52 static void vfs_in_dup(ipc_callid_t rid, ipc_call_t *request)53 {54 int oldfd = IPC_GET_ARG1(*request);55 int newfd = IPC_GET_ARG2(*request);56 int rc = vfs_op_dup(oldfd, newfd);57 async_answer_1(rid, rc, newfd);58 51 } 59 52 … … 279 272 vfs_in_close(callid, &call); 280 273 break; 281 case VFS_IN_DUP:282 vfs_in_dup(callid, &call);283 break;284 274 case VFS_IN_FSTAT: 285 275 vfs_in_fstat(callid, &call); -
uspace/srv/vfs/vfs_ops.c
rf644472 rfcab7ef 88 88 } 89 89 90 int vfs_op_clone(int oldfd, bool desc) 91 { 90 int vfs_op_clone(int oldfd, int newfd, bool desc) 91 { 92 int rc; 93 94 /* If the file descriptors are the same, do nothing. */ 95 if (oldfd == newfd) 96 return EOK; 97 92 98 /* Lookup the file structure corresponding to fd. */ 93 99 vfs_file_t *oldfile = vfs_file_get(oldfd); … … 96 102 97 103 assert(oldfile->node != NULL); 98 99 vfs_file_t *newfile; 100 int newfd = vfs_fd_alloc(&newfile, desc); 101 if (newfd >= 0) { 102 newfile->node = oldfile->node; 103 newfile->permissions = oldfile->permissions; 104 vfs_node_addref(newfile->node); 105 106 vfs_file_put(newfile); 104 105 if (newfd != -1) { 106 /* Make sure newfd is closed. */ 107 (void) vfs_fd_free(newfd); 108 /* Assign the old file to newfd. */ 109 rc = vfs_fd_assign(oldfile, newfd); 110 } else { 111 vfs_file_t *newfile; 112 int newfd = vfs_fd_alloc(&newfile, desc); 113 if (newfd >= 0) { 114 newfile->node = oldfile->node; 115 newfile->permissions = oldfile->permissions; 116 vfs_node_addref(newfile->node); 117 118 vfs_file_put(newfile); 119 } 120 rc = newfd; 107 121 } 108 122 vfs_file_put(oldfile); 109 123 110 return newfd;124 return rc; 111 125 } 112 126 … … 114 128 { 115 129 return vfs_fd_free(fd); 116 }117 118 int vfs_op_dup(int oldfd, int newfd)119 {120 /* If the file descriptors are the same, do nothing. */121 if (oldfd == newfd)122 return EOK;123 124 /* Lookup the file structure corresponding to oldfd. */125 vfs_file_t *oldfile = vfs_file_get(oldfd);126 if (!oldfile)127 return EBADF;128 129 /* Make sure newfd is closed. */130 (void) vfs_fd_free(newfd);131 132 /* Assign the old file to newfd. */133 int ret = vfs_fd_assign(oldfile, newfd);134 vfs_file_put(oldfile);135 136 return ret;137 130 } 138 131
Note:
See TracChangeset
for help on using the changeset viewer.