Changeset fcab7ef in mainline for uspace/srv/vfs/vfs_ops.c


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()

File:
1 edited

Legend:

Unmodified
Added
Removed
  • 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.