Ignore:
File:
1 edited

Legend:

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

    r6b8e5b7 r8e80d3f  
    3333 */
    3434
     35#include <vfs/vfs.h>
    3536#include <vfs/canonify.h>
    36 #include <vfs/vfs.h>
    37 #include <vfs/vfs_sess.h>
    3837#include <macros.h>
    3938#include <stdlib.h>
     
    4544#include <sys/types.h>
    4645#include <ipc/services.h>
    47 #include <ns.h>
     46#include <ipc/ns.h>
    4847#include <async.h>
    4948#include <fibril_synch.h>
     
    5150#include <assert.h>
    5251#include <str.h>
    53 #include <loc.h>
     52#include <devmap.h>
    5453#include <ipc/vfs.h>
    55 #include <ipc/loc.h>
    56 
    57 static FIBRIL_MUTEX_INITIALIZE(vfs_mutex);
    58 static async_sess_t *vfs_sess = NULL;
     54#include <ipc/devmap.h>
     55
     56static async_sess_t vfs_session;
     57
     58static FIBRIL_MUTEX_INITIALIZE(vfs_phone_mutex);
     59static int vfs_phone = -1;
    5960
    6061static FIBRIL_MUTEX_INITIALIZE(cwd_mutex);
     
    6465static size_t cwd_size = 0;
    6566
    66 /** Start an async exchange on the VFS session.
    67  *
    68  * @return New exchange.
    69  *
    70  */
    71 async_exch_t *vfs_exchange_begin(void)
    72 {
    73         fibril_mutex_lock(&vfs_mutex);
    74        
    75         while (vfs_sess == NULL)
    76                 vfs_sess = service_connect_blocking(EXCHANGE_PARALLEL, SERVICE_VFS,
    77                     0, 0);
    78        
    79         fibril_mutex_unlock(&vfs_mutex);
    80        
    81         return async_exchange_begin(vfs_sess);
    82 }
    83 
    84 /** Finish an async exchange on the VFS session.
    85  *
    86  * @param exch Exchange to be finished.
    87  *
    88  */
    89 void vfs_exchange_end(async_exch_t *exch)
    90 {
    91         async_exchange_end(exch);
    92 }
    93 
    9467char *absolutize(const char *path, size_t *retlen)
    9568{
    9669        char *ncwd_path;
    9770        char *ncwd_path_nc;
     71        size_t total_size;
    9872
    9973        fibril_mutex_lock(&cwd_mutex);
     
    10478                        return NULL;
    10579                }
    106                 ncwd_path_nc = malloc(cwd_size + 1 + size + 1);
     80                total_size = cwd_size + 1 + size + 1;
     81                ncwd_path_nc = malloc(total_size);
    10782                if (!ncwd_path_nc) {
    10883                        fibril_mutex_unlock(&cwd_mutex);
    10984                        return NULL;
    11085                }
    111                 str_cpy(ncwd_path_nc, cwd_size + 1 + size + 1, cwd_path);
     86                str_cpy(ncwd_path_nc, total_size, cwd_path);
    11287                ncwd_path_nc[cwd_size] = '/';
    11388                ncwd_path_nc[cwd_size + 1] = '\0';
    11489        } else {
    115                 ncwd_path_nc = malloc(size + 1);
     90                total_size = size + 1;
     91                ncwd_path_nc = malloc(total_size);
    11692                if (!ncwd_path_nc) {
    11793                        fibril_mutex_unlock(&cwd_mutex);
     
    12096                ncwd_path_nc[0] = '\0';
    12197        }
    122         str_append(ncwd_path_nc, cwd_size + 1 + size + 1, path);
     98        str_append(ncwd_path_nc, total_size, path);
    12399        ncwd_path = canonify(ncwd_path_nc, retlen);
    124100        if (!ncwd_path) {
     
    142118}
    143119
    144 int mount(const char *fs_name, const char *mp, const char *fqsn,
    145     const char *opts, unsigned int flags, unsigned int instance)
     120/** Connect to VFS service and create session. */
     121static void vfs_connect(void)
     122{
     123        while (vfs_phone < 0)
     124                vfs_phone = service_connect_blocking(SERVICE_VFS, 0, 0);
     125       
     126        async_session_create(&vfs_session, vfs_phone, 0);
     127}
     128
     129/** Start an async exchange on the VFS session.
     130 *
     131 * @return              New phone to be used during the exchange.
     132 */
     133static int vfs_exchange_begin(void)
     134{
     135        fibril_mutex_lock(&vfs_phone_mutex);
     136        if (vfs_phone < 0)
     137                vfs_connect();
     138        fibril_mutex_unlock(&vfs_phone_mutex);
     139
     140        return async_exchange_begin(&vfs_session);
     141}
     142
     143/** End an async exchange on the VFS session.
     144 *
     145 * @param phone         Phone used during the exchange.
     146 */
     147static void vfs_exchange_end(int phone)
     148{
     149        async_exchange_end(&vfs_session, phone);
     150}
     151
     152int mount(const char *fs_name, const char *mp, const char *fqdn,
     153    const char *opts, unsigned int flags)
    146154{
    147155        int null_id = -1;
    148         char null[LOC_NAME_MAXLEN];
    149        
    150         if (str_cmp(fqsn, "") == 0) {
     156        char null[DEVMAP_NAME_MAXLEN];
     157       
     158        if (str_cmp(fqdn, "") == 0) {
    151159                /* No device specified, create a fresh
    152160                   null/%d device instead */
    153                 null_id = loc_null_create();
     161                null_id = devmap_null_create();
    154162               
    155163                if (null_id == -1)
    156164                        return ENOMEM;
    157165               
    158                 snprintf(null, LOC_NAME_MAXLEN, "null/%d", null_id);
    159                 fqsn = null;
    160         }
    161        
    162         service_id_t service_id;
    163         int res = loc_service_get_id(fqsn, &service_id, flags);
     166                snprintf(null, DEVMAP_NAME_MAXLEN, "null/%d", null_id);
     167                fqdn = null;
     168        }
     169       
     170        devmap_handle_t devmap_handle;
     171        int res = devmap_device_get_handle(fqdn, &devmap_handle, flags);
    164172        if (res != EOK) {
    165173                if (null_id != -1)
    166                         loc_null_destroy(null_id);
     174                        devmap_null_destroy(null_id);
    167175               
    168176                return res;
     
    173181        if (!mpa) {
    174182                if (null_id != -1)
    175                         loc_null_destroy(null_id);
     183                        devmap_null_destroy(null_id);
    176184               
    177185                return ENOMEM;
    178186        }
    179187       
    180         async_exch_t *exch = vfs_exchange_begin();
     188        int vfs_phone = vfs_exchange_begin();
    181189
    182190        sysarg_t rc_orig;
    183         aid_t req = async_send_3(exch, VFS_IN_MOUNT, service_id, flags,
    184             instance, NULL);
    185         sysarg_t rc = async_data_write_start(exch, (void *) mpa, mpa_size);
    186         if (rc != EOK) {
    187                 vfs_exchange_end(exch);
     191        aid_t req = async_send_2(vfs_phone, VFS_IN_MOUNT, devmap_handle, flags, NULL);
     192        sysarg_t rc = async_data_write_start(vfs_phone, (void *) mpa, mpa_size);
     193        if (rc != EOK) {
     194                vfs_exchange_end(vfs_phone);
    188195                free(mpa);
    189196                async_wait_for(req, &rc_orig);
    190197               
    191198                if (null_id != -1)
    192                         loc_null_destroy(null_id);
    193                
    194                 if (rc_orig == EOK)
    195                         return (int) rc;
    196                 else
    197                         return (int) rc_orig;
    198         }
    199        
    200         rc = async_data_write_start(exch, (void *) opts, str_size(opts));
    201         if (rc != EOK) {
    202                 vfs_exchange_end(exch);
     199                        devmap_null_destroy(null_id);
     200               
     201                if (rc_orig == EOK)
     202                        return (int) rc;
     203                else
     204                        return (int) rc_orig;
     205        }
     206       
     207        rc = async_data_write_start(vfs_phone, (void *) opts, str_size(opts));
     208        if (rc != EOK) {
     209                vfs_exchange_end(vfs_phone);
    203210                free(mpa);
    204211                async_wait_for(req, &rc_orig);
    205212               
    206213                if (null_id != -1)
    207                         loc_null_destroy(null_id);
    208                
    209                 if (rc_orig == EOK)
    210                         return (int) rc;
    211                 else
    212                         return (int) rc_orig;
    213         }
    214        
    215         rc = async_data_write_start(exch, (void *) fs_name, str_size(fs_name));
    216         if (rc != EOK) {
    217                 vfs_exchange_end(exch);
     214                        devmap_null_destroy(null_id);
     215               
     216                if (rc_orig == EOK)
     217                        return (int) rc;
     218                else
     219                        return (int) rc_orig;
     220        }
     221       
     222        rc = async_data_write_start(vfs_phone, (void *) fs_name, str_size(fs_name));
     223        if (rc != EOK) {
     224                vfs_exchange_end(vfs_phone);
    218225                free(mpa);
    219226                async_wait_for(req, &rc_orig);
    220227               
    221228                if (null_id != -1)
    222                         loc_null_destroy(null_id);
     229                        devmap_null_destroy(null_id);
    223230               
    224231                if (rc_orig == EOK)
     
    229236       
    230237        /* Ask VFS whether it likes fs_name. */
    231         rc = async_req_0_0(exch, VFS_IN_PING);
    232         if (rc != EOK) {
    233                 vfs_exchange_end(exch);
     238        rc = async_req_0_0(vfs_phone, IPC_M_PING);
     239        if (rc != EOK) {
     240                vfs_exchange_end(vfs_phone);
    234241                free(mpa);
    235242                async_wait_for(req, &rc_orig);
    236243               
    237244                if (null_id != -1)
    238                         loc_null_destroy(null_id);
    239                
    240                 if (rc_orig == EOK)
    241                         return (int) rc;
    242                 else
    243                         return (int) rc_orig;
    244         }
    245        
    246         vfs_exchange_end(exch);
     245                        devmap_null_destroy(null_id);
     246               
     247                if (rc_orig == EOK)
     248                        return (int) rc;
     249                else
     250                        return (int) rc_orig;
     251        }
     252       
     253        vfs_exchange_end(vfs_phone);
    247254        free(mpa);
    248255        async_wait_for(req, &rc);
    249256       
    250257        if ((rc != EOK) && (null_id != -1))
    251                 loc_null_destroy(null_id);
     258                devmap_null_destroy(null_id);
    252259       
    253260        return (int) rc;
     
    266273                return ENOMEM;
    267274       
    268         async_exch_t *exch = vfs_exchange_begin();
    269        
    270         req = async_send_0(exch, VFS_IN_UNMOUNT, NULL);
    271         rc = async_data_write_start(exch, (void *) mpa, mpa_size);
    272         if (rc != EOK) {
    273                 vfs_exchange_end(exch);
     275        int vfs_phone = vfs_exchange_begin();
     276       
     277        req = async_send_0(vfs_phone, VFS_IN_UNMOUNT, NULL);
     278        rc = async_data_write_start(vfs_phone, (void *) mpa, mpa_size);
     279        if (rc != EOK) {
     280                vfs_exchange_end(vfs_phone);
    274281                free(mpa);
    275282                async_wait_for(req, &rc_orig);
     
    281288       
    282289
    283         vfs_exchange_end(exch);
     290        vfs_exchange_end(vfs_phone);
    284291        free(mpa);
    285292        async_wait_for(req, &rc);
     
    290297static int open_internal(const char *abs, size_t abs_size, int lflag, int oflag)
    291298{
    292         async_exch_t *exch = vfs_exchange_begin();
     299        int vfs_phone = vfs_exchange_begin();
    293300       
    294301        ipc_call_t answer;
    295         aid_t req = async_send_3(exch, VFS_IN_OPEN, lflag, oflag, 0, &answer);
    296         sysarg_t rc = async_data_write_start(exch, abs, abs_size);
    297        
    298         if (rc != EOK) {
    299                 vfs_exchange_end(exch);
     302        aid_t req = async_send_3(vfs_phone, VFS_IN_OPEN, lflag, oflag, 0, &answer);
     303        sysarg_t rc = async_data_write_start(vfs_phone, abs, abs_size);
     304       
     305        if (rc != EOK) {
     306                vfs_exchange_end(vfs_phone);
    300307
    301308                sysarg_t rc_orig;
     
    308315        }
    309316       
    310         vfs_exchange_end(exch);
     317        vfs_exchange_end(vfs_phone);
    311318        async_wait_for(req, &rc);
    312319       
     
    330337}
    331338
     339int open_node(fdi_node_t *node, int oflag)
     340{
     341        int vfs_phone = vfs_exchange_begin();
     342       
     343        ipc_call_t answer;
     344        aid_t req = async_send_4(vfs_phone, VFS_IN_OPEN_NODE, node->fs_handle,
     345            node->devmap_handle, node->index, oflag, &answer);
     346       
     347        vfs_exchange_end(vfs_phone);
     348
     349        sysarg_t rc;
     350        async_wait_for(req, &rc);
     351       
     352        if (rc != EOK)
     353                return (int) rc;
     354       
     355        return (int) IPC_GET_ARG1(answer);
     356}
     357
    332358int close(int fildes)
    333359{
    334360        sysarg_t rc;
    335361       
    336         async_exch_t *exch = vfs_exchange_begin();
    337         rc = async_req_1_0(exch, VFS_IN_CLOSE, fildes);
    338         vfs_exchange_end(exch);
    339        
    340         return (int) rc;
     362        int vfs_phone = vfs_exchange_begin();
     363       
     364        rc = async_req_1_0(vfs_phone, VFS_IN_CLOSE, fildes);
     365       
     366        vfs_exchange_end(vfs_phone);
     367       
     368        return (int)rc;
    341369}
    342370
     
    346374        ipc_call_t answer;
    347375        aid_t req;
    348        
    349         async_exch_t *exch = vfs_exchange_begin();
    350        
    351         req = async_send_1(exch, VFS_IN_READ, fildes, &answer);
    352         rc = async_data_read_start(exch, (void *)buf, nbyte);
    353         if (rc != EOK) {
    354                 vfs_exchange_end(exch);
     376
     377        int vfs_phone = vfs_exchange_begin();
     378       
     379        req = async_send_1(vfs_phone, VFS_IN_READ, fildes, &answer);
     380        rc = async_data_read_start_generic(vfs_phone, (void *) buf, nbyte,
     381            IPC_XF_RESTRICT);
     382        if (rc != EOK) {
     383                vfs_exchange_end(vfs_phone);
    355384
    356385                sysarg_t rc_orig;
     
    362391                        return (ssize_t) rc_orig;
    363392        }
    364         vfs_exchange_end(exch);
     393        vfs_exchange_end(vfs_phone);
    365394        async_wait_for(req, &rc);
    366395        if (rc == EOK)
     
    375404        ipc_call_t answer;
    376405        aid_t req;
    377        
    378         async_exch_t *exch = vfs_exchange_begin();
    379        
    380         req = async_send_1(exch, VFS_IN_WRITE, fildes, &answer);
    381         rc = async_data_write_start(exch, (void *)buf, nbyte);
    382         if (rc != EOK) {
    383                 vfs_exchange_end(exch);
     406
     407        int vfs_phone = vfs_exchange_begin();
     408       
     409        req = async_send_1(vfs_phone, VFS_IN_WRITE, fildes, &answer);
     410        rc = async_data_write_start_generic(vfs_phone, (void *) buf, nbyte,
     411            IPC_XF_RESTRICT);
     412        if (rc != EOK) {
     413                vfs_exchange_end(vfs_phone);
    384414
    385415                sysarg_t rc_orig;
     
    391421                        return (ssize_t) rc_orig;
    392422        }
    393         vfs_exchange_end(exch);
     423        vfs_exchange_end(vfs_phone);
    394424        async_wait_for(req, &rc);
    395425        if (rc == EOK)
     
    399429}
    400430
    401 /** Read entire buffer.
    402  *
    403  * In face of short reads this function continues reading until either
    404  * the entire buffer is read or no more data is available (at end of file).
    405  *
    406  * @param fildes        File descriptor
    407  * @param buf           Buffer, @a nbytes bytes long
    408  * @param nbytes        Number of bytes to read
    409  *
    410  * @return              On success, positive number of bytes read.
    411  *                      On failure, negative error code from read().
    412  */
    413 ssize_t read_all(int fildes, void *buf, size_t nbyte)
    414 {
    415         ssize_t cnt = 0;
    416         size_t nread = 0;
    417         uint8_t *bp = (uint8_t *) buf;
    418 
    419         do {
    420                 bp += cnt;
    421                 nread += cnt;
    422                 cnt = read(fildes, bp, nbyte - nread);
    423         } while (cnt > 0 && (nbyte - nread - cnt) > 0);
    424 
    425         if (cnt < 0)
    426                 return cnt;
    427 
    428         return nread + cnt;
    429 }
    430 
    431 /** Write entire buffer.
    432  *
    433  * This function fails if it cannot write exactly @a len bytes to the file.
    434  *
    435  * @param fildes        File descriptor
    436  * @param buf           Data, @a nbytes bytes long
    437  * @param nbytes        Number of bytes to write
    438  *
    439  * @return              EOK on error, return value from write() if writing
    440  *                      failed.
    441  */
    442 ssize_t write_all(int fildes, const void *buf, size_t nbyte)
    443 {
    444         ssize_t cnt = 0;
    445         ssize_t nwritten = 0;
    446         const uint8_t *bp = (uint8_t *) buf;
    447 
    448         do {
    449                 bp += cnt;
    450                 nwritten += cnt;
    451                 cnt = write(fildes, bp, nbyte - nwritten);
    452         } while (cnt > 0 && ((ssize_t )nbyte - nwritten - cnt) > 0);
    453 
    454         if (cnt < 0)
    455                 return cnt;
    456 
    457         if ((ssize_t)nbyte - nwritten - cnt > 0)
    458                 return EIO;
    459 
    460         return nbyte;
    461 }
    462 
    463431int fsync(int fildes)
    464432{
    465         async_exch_t *exch = vfs_exchange_begin();
    466         sysarg_t rc = async_req_1_0(exch, VFS_IN_SYNC, fildes);
    467         vfs_exchange_end(exch);
     433        int vfs_phone = vfs_exchange_begin();
     434       
     435        sysarg_t rc = async_req_1_0(vfs_phone, VFS_IN_SYNC, fildes);
     436       
     437        vfs_exchange_end(vfs_phone);
    468438       
    469439        return (int) rc;
     
    472442off64_t lseek(int fildes, off64_t offset, int whence)
    473443{
    474         async_exch_t *exch = vfs_exchange_begin();
     444        int vfs_phone = vfs_exchange_begin();
    475445       
    476446        sysarg_t newoff_lo;
    477447        sysarg_t newoff_hi;
    478         sysarg_t rc = async_req_4_2(exch, VFS_IN_SEEK, fildes,
     448        sysarg_t rc = async_req_4_2(vfs_phone, VFS_IN_SEEK, fildes,
    479449            LOWER32(offset), UPPER32(offset), whence,
    480450            &newoff_lo, &newoff_hi);
    481451       
    482         vfs_exchange_end(exch);
     452        vfs_exchange_end(vfs_phone);
    483453       
    484454        if (rc != EOK)
     
    492462        sysarg_t rc;
    493463       
    494         async_exch_t *exch = vfs_exchange_begin();
    495         rc = async_req_3_0(exch, VFS_IN_TRUNCATE, fildes,
     464        int vfs_phone = vfs_exchange_begin();
     465       
     466        rc = async_req_3_0(vfs_phone, VFS_IN_TRUNCATE, fildes,
    496467            LOWER32(length), UPPER32(length));
    497         vfs_exchange_end(exch);
     468        vfs_exchange_end(vfs_phone);
    498469       
    499470        return (int) rc;
     
    504475        sysarg_t rc;
    505476        aid_t req;
    506        
    507         async_exch_t *exch = vfs_exchange_begin();
    508        
    509         req = async_send_1(exch, VFS_IN_FSTAT, fildes, NULL);
    510         rc = async_data_read_start(exch, (void *) stat, sizeof(struct stat));
    511         if (rc != EOK) {
    512                 vfs_exchange_end(exch);
     477
     478        int vfs_phone = vfs_exchange_begin();
     479       
     480        req = async_send_1(vfs_phone, VFS_IN_FSTAT, fildes, NULL);
     481        rc = async_data_read_start(vfs_phone, (void *) stat, sizeof(struct stat));
     482        if (rc != EOK) {
     483                vfs_exchange_end(vfs_phone);
    513484
    514485                sysarg_t rc_orig;
     
    520491                        return (ssize_t) rc_orig;
    521492        }
    522         vfs_exchange_end(exch);
     493        vfs_exchange_end(vfs_phone);
    523494        async_wait_for(req, &rc);
    524495
     
    537508                return ENOMEM;
    538509       
    539         async_exch_t *exch = vfs_exchange_begin();
    540        
    541         req = async_send_0(exch, VFS_IN_STAT, NULL);
    542         rc = async_data_write_start(exch, pa, pa_size);
    543         if (rc != EOK) {
    544                 vfs_exchange_end(exch);
     510        int vfs_phone = vfs_exchange_begin();
     511       
     512        req = async_send_0(vfs_phone, VFS_IN_STAT, NULL);
     513        rc = async_data_write_start(vfs_phone, pa, pa_size);
     514        if (rc != EOK) {
     515                vfs_exchange_end(vfs_phone);
    545516                free(pa);
    546517                async_wait_for(req, &rc_orig);
     
    550521                        return (int) rc_orig;
    551522        }
    552         rc = async_data_read_start(exch, stat, sizeof(struct stat));
    553         if (rc != EOK) {
    554                 vfs_exchange_end(exch);
     523        rc = async_data_read_start(vfs_phone, stat, sizeof(struct stat));
     524        if (rc != EOK) {
     525                vfs_exchange_end(vfs_phone);
    555526                free(pa);
    556527                async_wait_for(req, &rc_orig);
     
    560531                        return (int) rc_orig;
    561532        }
    562         vfs_exchange_end(exch);
     533        vfs_exchange_end(vfs_phone);
    563534        free(pa);
    564535        async_wait_for(req, &rc);
     
    621592                return ENOMEM;
    622593       
    623         async_exch_t *exch = vfs_exchange_begin();
    624        
    625         req = async_send_1(exch, VFS_IN_MKDIR, mode, NULL);
    626         rc = async_data_write_start(exch, pa, pa_size);
    627         if (rc != EOK) {
    628                 vfs_exchange_end(exch);
     594        int vfs_phone = vfs_exchange_begin();
     595       
     596        req = async_send_1(vfs_phone, VFS_IN_MKDIR, mode, NULL);
     597        rc = async_data_write_start(vfs_phone, pa, pa_size);
     598        if (rc != EOK) {
     599                vfs_exchange_end(vfs_phone);
    629600                free(pa);
    630601
     
    637608                        return (int) rc_orig;
    638609        }
    639         vfs_exchange_end(exch);
     610        vfs_exchange_end(vfs_phone);
    640611        free(pa);
    641612        async_wait_for(req, &rc);
     
    652623        if (!pa)
    653624                return ENOMEM;
    654        
    655         async_exch_t *exch = vfs_exchange_begin();
    656        
    657         req = async_send_1(exch, VFS_IN_UNLINK, lflag, NULL);
    658         rc = async_data_write_start(exch, pa, pa_size);
    659         if (rc != EOK) {
    660                 vfs_exchange_end(exch);
     625
     626        int vfs_phone = vfs_exchange_begin();
     627       
     628        req = async_send_0(vfs_phone, VFS_IN_UNLINK, NULL);
     629        rc = async_data_write_start(vfs_phone, pa, pa_size);
     630        if (rc != EOK) {
     631                vfs_exchange_end(vfs_phone);
    661632                free(pa);
    662633
     
    669640                        return (int) rc_orig;
    670641        }
    671         vfs_exchange_end(exch);
     642        vfs_exchange_end(vfs_phone);
    672643        free(pa);
    673644        async_wait_for(req, &rc);
     
    702673                return ENOMEM;
    703674        }
    704        
    705         async_exch_t *exch = vfs_exchange_begin();
    706        
    707         req = async_send_0(exch, VFS_IN_RENAME, NULL);
    708         rc = async_data_write_start(exch, olda, olda_size);
    709         if (rc != EOK) {
    710                 vfs_exchange_end(exch);
     675
     676        int vfs_phone = vfs_exchange_begin();
     677       
     678        req = async_send_0(vfs_phone, VFS_IN_RENAME, NULL);
     679        rc = async_data_write_start(vfs_phone, olda, olda_size);
     680        if (rc != EOK) {
     681                vfs_exchange_end(vfs_phone);
    711682                free(olda);
    712683                free(newa);
     
    717688                        return (int) rc_orig;
    718689        }
    719         rc = async_data_write_start(exch, newa, newa_size);
    720         if (rc != EOK) {
    721                 vfs_exchange_end(exch);
     690        rc = async_data_write_start(vfs_phone, newa, newa_size);
     691        if (rc != EOK) {
     692                vfs_exchange_end(vfs_phone);
    722693                free(olda);
    723694                free(newa);
     
    728699                        return (int) rc_orig;
    729700        }
    730         vfs_exchange_end(exch);
     701        vfs_exchange_end(vfs_phone);
    731702        free(olda);
    732703        free(newa);
     
    784755}
    785756
    786 async_sess_t *fd_session(exch_mgmt_t mgmt, int fildes)
     757int fd_phone(int fildes)
    787758{
    788759        struct stat stat;
     760       
    789761        int rc = fstat(fildes, &stat);
    790         if (rc != 0) {
    791                 errno = rc;
    792                 return NULL;
    793         }
    794        
    795         if (!stat.service) {
    796                 errno = ENOENT;
    797                 return NULL;
    798         }
    799        
    800         return loc_service_connect(mgmt, stat.service, 0);
     762        if (rc != 0)
     763                return rc;
     764       
     765        if (!stat.device)
     766                return -1;
     767       
     768        return devmap_device_connect(stat.device, 0);
     769}
     770
     771int fd_node(int fildes, fdi_node_t *node)
     772{
     773        struct stat stat;
     774        int rc;
     775
     776        rc = fstat(fildes, &stat);
     777       
     778        if (rc == EOK) {
     779                node->fs_handle = stat.fs_handle;
     780                node->devmap_handle = stat.devmap_handle;
     781                node->index = stat.index;
     782        }
     783       
     784        return rc;
    801785}
    802786
    803787int dup2(int oldfd, int newfd)
    804788{
    805         async_exch_t *exch = vfs_exchange_begin();
     789        int vfs_phone = vfs_exchange_begin();
    806790       
    807791        sysarg_t ret;
    808         sysarg_t rc = async_req_2_1(exch, VFS_IN_DUP, oldfd, newfd, &ret);
    809        
    810         vfs_exchange_end(exch);
     792        sysarg_t rc = async_req_2_1(vfs_phone, VFS_IN_DUP, oldfd, newfd, &ret);
     793       
     794        vfs_exchange_end(vfs_phone);
    811795       
    812796        if (rc == EOK)
     
    816800}
    817801
    818 int fd_wait(void)
    819 {
    820         async_exch_t *exch = vfs_exchange_begin();
    821        
    822         sysarg_t ret;
    823         sysarg_t rc = async_req_0_1(exch, VFS_IN_WAIT_HANDLE, &ret);
    824        
    825         vfs_exchange_end(exch);
    826        
    827         if (rc == EOK)
    828                 return (int) ret;
    829        
    830         return (int) rc;
    831 }
    832 
    833 int get_mtab_list(list_t *mtab_list)
    834 {
    835         sysarg_t rc;
    836         aid_t req;
    837         size_t i;
    838         sysarg_t num_mounted_fs;
    839        
    840         async_exch_t *exch = vfs_exchange_begin();
    841 
    842         req = async_send_0(exch, VFS_IN_MTAB_GET, NULL);
    843 
    844         /* Ask VFS how many filesystems are mounted */
    845         rc = async_req_0_1(exch, VFS_IN_PING, &num_mounted_fs);
    846         if (rc != EOK)
    847                 goto exit;
    848 
    849         for (i = 0; i < num_mounted_fs; ++i) {
    850                 mtab_ent_t *mtab_ent;
    851 
    852                 mtab_ent = malloc(sizeof(mtab_ent_t));
    853                 if (!mtab_ent) {
    854                         rc = ENOMEM;
    855                         goto exit;
    856                 }
    857 
    858                 memset(mtab_ent, 0, sizeof(mtab_ent_t));
    859 
    860                 rc = async_data_read_start(exch, (void *) mtab_ent->mp,
    861                     MAX_PATH_LEN);
    862                 if (rc != EOK)
    863                         goto exit;
    864 
    865                 rc = async_data_read_start(exch, (void *) mtab_ent->opts,
    866                         MAX_MNTOPTS_LEN);
    867                 if (rc != EOK)
    868                         goto exit;
    869 
    870                 rc = async_data_read_start(exch, (void *) mtab_ent->fs_name,
    871                         FS_NAME_MAXLEN);
    872                 if (rc != EOK)
    873                         goto exit;
    874 
    875                 sysarg_t p[2];
    876 
    877                 rc = async_req_0_2(exch, VFS_IN_PING, &p[0], &p[1]);
    878                 if (rc != EOK)
    879                         goto exit;
    880 
    881                 mtab_ent->instance = p[0];
    882                 mtab_ent->service_id = p[1];
    883 
    884                 link_initialize(&mtab_ent->link);
    885                 list_append(&mtab_ent->link, mtab_list);
    886         }
    887 
    888 exit:
    889         async_wait_for(req, &rc);
    890         vfs_exchange_end(exch);
    891         return rc;
    892 }
    893 
    894802/** @}
    895803 */
Note: See TracChangeset for help on using the changeset viewer.