Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/vfs/vfs_lookup.c

    r1e4cada r991f645  
    3838#include "vfs.h"
    3939#include <ipc/ipc.h>
     40#include <macros.h>
    4041#include <async.h>
    4142#include <errno.h>
    42 #include <string.h>
     43#include <str.h>
    4344#include <stdarg.h>
    4445#include <bool.h>
     
    99100        entry.len = len;
    100101
    101         off_t first;    /* the first free index */
    102         off_t last;     /* the last free index */
     102        size_t first;   /* the first free index */
     103        size_t last;    /* the last free index */
    103104
    104105        if (list_empty(&plb_head)) {
     
    162163        aid_t req = async_send_5(phone, VFS_OUT_LOOKUP, (ipcarg_t) first,
    163164            (ipcarg_t) (first + len - 1) % PLB_SIZE,
    164             (ipcarg_t) root->dev_handle, (ipcarg_t) lflag, (ipcarg_t) index,
     165            (ipcarg_t) root->devmap_handle, (ipcarg_t) lflag, (ipcarg_t) index,
    165166            &answer);
    166167       
    167168        ipcarg_t rc;
    168169        async_wait_for(req, &rc);
    169         vfs_release_phone(phone);
     170        vfs_release_phone(root->fs_handle, phone);
    170171       
    171172        fibril_mutex_lock(&plb_mutex);
     
    177178        memset(plb, 0, cnt2);
    178179        fibril_mutex_unlock(&plb_mutex);
    179 
    180         if ((rc == EOK) && (result)) {
    181                 result->triplet.fs_handle = (fs_handle_t) IPC_GET_ARG1(answer);
    182                 result->triplet.dev_handle = (dev_handle_t) IPC_GET_ARG2(answer);
    183                 result->triplet.index = (fs_index_t) IPC_GET_ARG3(answer);
    184                 result->size = (size_t) IPC_GET_ARG4(answer);
    185                 result->lnkcnt = (unsigned) IPC_GET_ARG5(answer);
    186                 if (lflag & L_FILE)
     180       
     181        if (((int) rc < EOK) || (!result))
     182                return (int) rc;
     183       
     184        result->triplet.fs_handle = (fs_handle_t) rc;
     185        result->triplet.devmap_handle = (devmap_handle_t) IPC_GET_ARG1(answer);
     186        result->triplet.index = (fs_index_t) IPC_GET_ARG2(answer);
     187        result->size =
     188            (aoff64_t) MERGE_LOUP32(IPC_GET_ARG3(answer), IPC_GET_ARG4(answer));
     189        result->lnkcnt = (unsigned int) IPC_GET_ARG5(answer);
     190       
     191        if (lflag & L_FILE)
     192                result->type = VFS_NODE_FILE;
     193        else if (lflag & L_DIRECTORY)
     194                result->type = VFS_NODE_DIRECTORY;
     195        else
     196                result->type = VFS_NODE_UNKNOWN;
     197       
     198        return EOK;
     199}
     200
     201/** Perform a node open operation.
     202 *
     203 * @return EOK on success or an error code from errno.h.
     204 *
     205 */
     206int vfs_open_node_internal(vfs_lookup_res_t *result)
     207{
     208        int phone = vfs_grab_phone(result->triplet.fs_handle);
     209       
     210        ipc_call_t answer;
     211        aid_t req = async_send_2(phone, VFS_OUT_OPEN_NODE,
     212            (ipcarg_t) result->triplet.devmap_handle,
     213            (ipcarg_t) result->triplet.index, &answer);
     214       
     215        ipcarg_t rc;
     216        async_wait_for(req, &rc);
     217        vfs_release_phone(result->triplet.fs_handle, phone);
     218       
     219        if (rc == EOK) {
     220                result->size =
     221                    MERGE_LOUP32(IPC_GET_ARG1(answer), IPC_GET_ARG2(answer));
     222                result->lnkcnt = (unsigned int) IPC_GET_ARG3(answer);
     223                if (IPC_GET_ARG4(answer) & L_FILE)
    187224                        result->type = VFS_NODE_FILE;
    188                 else if (lflag & L_DIRECTORY)
     225                else if (IPC_GET_ARG4(answer) & L_DIRECTORY)
    189226                        result->type = VFS_NODE_DIRECTORY;
    190227                else
    191228                        result->type = VFS_NODE_UNKNOWN;
    192229        }
    193 
     230       
    194231        return rc;
    195232}
    196233
    197 /** Perform a node open operation.
    198  *
    199  * @return EOK on success or an error code from errno.h.
    200  *
    201  */
    202 int vfs_open_node_internal(vfs_lookup_res_t *result)
    203 {
    204         int phone = vfs_grab_phone(result->triplet.fs_handle);
    205        
    206         ipc_call_t answer;
    207         aid_t req = async_send_2(phone, VFS_OUT_OPEN_NODE,
    208             (ipcarg_t) result->triplet.dev_handle,
    209             (ipcarg_t) result->triplet.index, &answer);
    210        
    211         ipcarg_t rc;
    212         async_wait_for(req, &rc);
    213         vfs_release_phone(phone);
    214        
    215         if (rc == EOK) {
    216                 result->size = (size_t) IPC_GET_ARG1(answer);
    217                 result->lnkcnt = (unsigned) IPC_GET_ARG2(answer);
    218                 if (IPC_GET_ARG3(answer) & L_FILE)
    219                         result->type = VFS_NODE_FILE;
    220                 else if (IPC_GET_ARG3(answer) & L_DIRECTORY)
    221                         result->type = VFS_NODE_DIRECTORY;
    222                 else
    223                         result->type = VFS_NODE_UNKNOWN;
    224         }
    225        
    226         return rc;
    227 }
    228 
    229234/**
    230235 * @}
Note: See TracChangeset for help on using the changeset viewer.