Subversion Repositories HelenOS

Rev

Rev 2753 | Rev 2766 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 2753 Rev 2763
Line 38... Line 38...
38
#include "vfs.h"
38
#include "vfs.h"
39
#include <ipc/ipc.h>
39
#include <ipc/ipc.h>
40
#include <async.h>
40
#include <async.h>
41
#include <errno.h>
41
#include <errno.h>
42
#include <string.h>
42
#include <string.h>
-
 
43
#include <stdarg.h>
43
#include <bool.h>
44
#include <bool.h>
44
#include <futex.h>
45
#include <futex.h>
45
#include <libadt/list.h>
46
#include <libadt/list.h>
46
#include <atomic.h>
47
#include <atomic.h>
47
#include <vfs/canonify.h>
48
#include <vfs/canonify.h>
Line 63... Line 64...
63
 *          of the whole VFS tree.
64
 *          of the whole VFS tree.
64
 *
65
 *
65
 * @return      EOK on success or an error code from errno.h.
66
 * @return      EOK on success or an error code from errno.h.
66
 */
67
 */
67
int vfs_lookup_internal(char *path, int lflag, vfs_lookup_res_t *result,
68
int vfs_lookup_internal(char *path, int lflag, vfs_lookup_res_t *result,
68
    vfs_pair_t *altroot)
69
    vfs_pair_t *altroot, ...)
69
{
70
{
70
    vfs_pair_t *root;
71
    vfs_pair_t *root;
71
 
72
 
72
    if (altroot)
73
    if (altroot)
73
        root = altroot;
74
        root = altroot;
Line 80... Line 81...
80
    size_t len;
81
    size_t len;
81
    path = canonify(path, &len);
82
    path = canonify(path, &len);
82
    if (!path)
83
    if (!path)
83
        return EINVAL;
84
        return EINVAL;
84
   
85
   
-
 
86
    unsigned long index = 0;
-
 
87
    if (lflag & L_LINK) {
-
 
88
        va_list ap;
-
 
89
 
-
 
90
        va_start(ap, altroot);
-
 
91
        index = va_arg(ap, unsigned long);
-
 
92
        va_end(ap);
-
 
93
    }
-
 
94
   
85
    futex_down(&plb_futex);
95
    futex_down(&plb_futex);
86
 
96
 
87
    plb_entry_t entry;
97
    plb_entry_t entry;
88
    link_initialize(&entry.plb_link);
98
    link_initialize(&entry.plb_link);
89
    entry.len = len;
99
    entry.len = len;
Line 147... Line 157...
147
    memcpy(&plb[first], path, cnt1);
157
    memcpy(&plb[first], path, cnt1);
148
    memcpy(plb, &path[cnt1], cnt2);
158
    memcpy(plb, &path[cnt1], cnt2);
149
 
159
 
150
    ipc_call_t answer;
160
    ipc_call_t answer;
151
    int phone = vfs_grab_phone(root->fs_handle);
161
    int phone = vfs_grab_phone(root->fs_handle);
152
    aid_t req = async_send_4(phone, VFS_LOOKUP, (ipcarg_t) first,
162
    aid_t req = async_send_5(phone, VFS_LOOKUP, (ipcarg_t) first,
153
        (ipcarg_t) (first + len - 1) % PLB_SIZE,
163
        (ipcarg_t) (first + len - 1) % PLB_SIZE,
154
        (ipcarg_t) root->dev_handle, (ipcarg_t) lflag, &answer);
164
        (ipcarg_t) root->dev_handle, (ipcarg_t) lflag, (ipcarg_t) index,
-
 
165
        &answer);
155
    vfs_release_phone(phone);
166
    vfs_release_phone(phone);
156
 
167
 
157
    ipcarg_t rc;
168
    ipcarg_t rc;
158
    async_wait_for(req, &rc);
169
    async_wait_for(req, &rc);
159
 
170