Changeset fcab7ef in mainline for uspace/srv/vfs


Ignore:
Timestamp:
2017-03-26T20:46:56Z (8 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
fe91f66
Parents:
f644472
Message:

Merge dup2() into vfs_clone()

Location:
uspace/srv/vfs
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/vfs/vfs.h

    rf644472 rfcab7ef  
    204204extern int vfs_open_node_remote(vfs_node_t *);
    205205
    206 extern int vfs_op_clone(int oldfd, bool desc);
     206extern int vfs_op_clone(int oldfd, int newfd, bool desc);
    207207extern int vfs_op_close(int fd);
    208 extern int vfs_op_dup(int oldfd, int newfd);
    209208extern int vfs_op_fstat(int fd);
    210209extern 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  
    304304
    305305        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)) {
    307307                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;
    309313        }
    310314       
  • uspace/srv/vfs/vfs_ipc.c

    rf644472 rfcab7ef  
    3737{
    3838        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);
    4243        async_answer_0(rid, ret);
    4344}
     
    4849        int rc = vfs_op_close(fd);
    4950        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);
    5851}
    5952
     
    279272                        vfs_in_close(callid, &call);
    280273                        break;
    281                 case VFS_IN_DUP:
    282                         vfs_in_dup(callid, &call);
    283                         break;
    284274                case VFS_IN_FSTAT:
    285275                        vfs_in_fstat(callid, &call);
  • uspace/srv/vfs/vfs_ops.c

    rf644472 rfcab7ef  
    8888}
    8989
    90 int vfs_op_clone(int oldfd, bool desc)
    91 {
     90int 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       
    9298        /* Lookup the file structure corresponding to fd. */
    9399        vfs_file_t *oldfile = vfs_file_get(oldfd);
     
    96102
    97103        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;
    107121        }
    108122        vfs_file_put(oldfile);
    109123       
    110         return newfd;
     124        return rc;
    111125}
    112126
     
    114128{
    115129        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;
    137130}
    138131
Note: See TracChangeset for help on using the changeset viewer.