Changeset 210e50a in mainline for uspace/lib/libc/generic/vfs/vfs.c


Ignore:
Timestamp:
2010-02-03T13:36:46Z (15 years ago)
Author:
Martin Decky <martin@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
28be7fa
Parents:
82474ef
Message:

understand an empty fqdn as the device argument to mount() as an implicit request to create a fresh null/%d device

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/libc/generic/vfs/vfs.c

    r82474ef r210e50a  
    125125        aid_t req;
    126126        dev_handle_t dev_handle;
     127        int null_id = -1;
     128        char null[DEVMAP_NAME_MAXLEN];
     129       
     130        if (str_cmp(fqdn, "") == 0) {
     131                /* No device specified, create a fresh
     132                   null/%d device instead */
     133                null_id = devmap_null_create();
     134               
     135                if (null_id == -1)
     136                        return ENOMEM;
     137               
     138                snprintf(null, DEVMAP_NAME_MAXLEN, "null/%d", null_id);
     139                fqdn = null;
     140        }
    127141       
    128142        res = devmap_device_get_handle(fqdn, &dev_handle, flags);
    129         if (res != EOK)
     143        if (res != EOK) {
     144                if (null_id != -1)
     145                        devmap_null_destroy(null_id);
     146               
    130147                return res;
     148        }
    131149       
    132150        size_t mpa_size;
    133151        char *mpa = absolutize(mp, &mpa_size);
    134         if (!mpa)
    135                 return ENOMEM;
     152        if (!mpa) {
     153                if (null_id != -1)
     154                        devmap_null_destroy(null_id);
     155               
     156                return ENOMEM;
     157        }
    136158       
    137159        futex_down(&vfs_phone_futex);
     
    146168                futex_up(&vfs_phone_futex);
    147169                free(mpa);
     170               
     171                if (null_id != -1)
     172                        devmap_null_destroy(null_id);
     173               
    148174                if (rc_orig == EOK)
    149175                        return (int) rc;
     
    158184                futex_up(&vfs_phone_futex);
    159185                free(mpa);
    160                 if (rc_orig == EOK)
    161                         return (int) rc;
    162                 else
    163                         return (int) rc_orig;
    164         }
    165 
     186               
     187                if (null_id != -1)
     188                        devmap_null_destroy(null_id);
     189               
     190                if (rc_orig == EOK)
     191                        return (int) rc;
     192                else
     193                        return (int) rc_orig;
     194        }
     195       
    166196        rc = async_data_write_start(vfs_phone, (void *) fs_name, str_size(fs_name));
    167197        if (rc != EOK) {
     
    170200                futex_up(&vfs_phone_futex);
    171201                free(mpa);
    172                 if (rc_orig == EOK)
    173                         return (int) rc;
    174                 else
    175                         return (int) rc_orig;
    176         }
    177 
     202               
     203                if (null_id != -1)
     204                        devmap_null_destroy(null_id);
     205               
     206                if (rc_orig == EOK)
     207                        return (int) rc;
     208                else
     209                        return (int) rc_orig;
     210        }
     211       
    178212        /* Ask VFS whether it likes fs_name. */
    179213        rc = async_req_0_0(vfs_phone, IPC_M_PING);
     
    183217                futex_up(&vfs_phone_futex);
    184218                free(mpa);
     219               
     220                if (null_id != -1)
     221                        devmap_null_destroy(null_id);
     222               
    185223                if (rc_orig == EOK)
    186224                        return (int) rc;
     
    193231        futex_up(&vfs_phone_futex);
    194232        free(mpa);
     233       
     234        if ((rc != EOK) && (null_id != -1))
     235                devmap_null_destroy(null_id);
    195236       
    196237        return (int) rc;
Note: See TracChangeset for help on using the changeset viewer.