Subversion Repositories HelenOS

Rev

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

Rev 2770 Rev 2791
Line 67... Line 67...
67
/*
67
/*
68
 * Implementation of the libfs interface.
68
 * Implementation of the libfs interface.
69
 */
69
 */
70
 
70
 
71
/* Forward declarations of static functions. */
71
/* Forward declarations of static functions. */
72
static bool tmpfs_match(void *, void *, const char *);
72
static void *tmpfs_match(void *, const char *);
73
static void *tmpfs_node_get(fs_handle_t, dev_handle_t, fs_index_t);
73
static void *tmpfs_node_get(fs_handle_t, dev_handle_t, fs_index_t);
74
static void *tmpfs_create_node(int);
74
static void *tmpfs_create_node(int);
75
static bool tmpfs_link_node(void *, void *, const char *);
75
static bool tmpfs_link_node(void *, void *, const char *);
76
static int tmpfs_unlink_node(void *, void *);
76
static int tmpfs_unlink_node(void *, void *);
77
static void tmpfs_destroy_node(void *);
77
static void tmpfs_destroy_node(void *);
Line 90... Line 90...
90
static unsigned tmpfs_lnkcnt_get(void *nodep)
90
static unsigned tmpfs_lnkcnt_get(void *nodep)
91
{
91
{
92
    return ((tmpfs_dentry_t *) nodep)->lnkcnt;
92
    return ((tmpfs_dentry_t *) nodep)->lnkcnt;
93
}
93
}
94
 
94
 
95
static void *tmpfs_child_get(void *nodep)
95
static bool tmpfs_has_children(void *nodep)
96
{
96
{
97
    return ((tmpfs_dentry_t *) nodep)->child;
97
    return ((tmpfs_dentry_t *) nodep)->child != NULL;
98
}
-
 
99
 
-
 
100
static void *tmpfs_sibling_get(void *nodep)
-
 
101
{
-
 
102
    return ((tmpfs_dentry_t *) nodep)->sibling;
-
 
103
}
98
}
104
 
99
 
105
static void *tmpfs_root_get(void)
100
static void *tmpfs_root_get(void)
106
{
101
{
107
    return root;
102
    return root;
Line 131... Line 126...
131
    .link = tmpfs_link_node,
126
    .link = tmpfs_link_node,
132
    .unlink = tmpfs_unlink_node,
127
    .unlink = tmpfs_unlink_node,
133
    .index_get = tmpfs_index_get,
128
    .index_get = tmpfs_index_get,
134
    .size_get = tmpfs_size_get,
129
    .size_get = tmpfs_size_get,
135
    .lnkcnt_get = tmpfs_lnkcnt_get,
130
    .lnkcnt_get = tmpfs_lnkcnt_get,
136
    .child_get = tmpfs_child_get,
131
    .has_children = tmpfs_has_children,
137
    .sibling_get = tmpfs_sibling_get,
-
 
138
    .root_get = tmpfs_root_get,
132
    .root_get = tmpfs_root_get,
139
    .plb_get_char = tmpfs_plb_get_char,
133
    .plb_get_char = tmpfs_plb_get_char,
140
    .is_directory = tmpfs_is_directory,
134
    .is_directory = tmpfs_is_directory,
141
    .is_file = tmpfs_is_file
135
    .is_file = tmpfs_is_file
142
};
136
};
Line 241... Line 235...
241
    return true;
235
    return true;
242
}
236
}
243
 
237
 
244
/** Compare one component of path to a directory entry.
238
/** Compare one component of path to a directory entry.
245
 *
239
 *
246
 * @param prnt      Node from which we descended.
240
 * @param parentp   Pointer to node from which we descended.
247
 * @param chld      Node to compare the path component with.
241
 * @param childp    Pointer to node to compare the path component with.
248
 * @param component Array of characters holding component name.
242
 * @param component Array of characters holding component name.
249
 *
243
 *
250
 * @return      True on match, false otherwise.
244
 * @return      True on match, false otherwise.
251
 */
245
 */
-
 
246
static bool
252
bool tmpfs_match(void *prnt, void *chld, const char *component)
247
tmpfs_match_one(tmpfs_dentry_t *parentp, tmpfs_dentry_t *childp,
-
 
248
    const char *component)
253
{
249
{
254
    tmpfs_dentry_t *parentp = (tmpfs_dentry_t *) prnt;
-
 
255
    tmpfs_dentry_t *childp = (tmpfs_dentry_t *) chld;
-
 
256
 
-
 
257
    unsigned long key = (unsigned long) parentp;
250
    unsigned long key = (unsigned long) parentp;
258
    link_t *hlp = hash_table_find(&childp->names, &key);
251
    link_t *hlp = hash_table_find(&childp->names, &key);
259
    assert(hlp);
252
    assert(hlp);
260
    tmpfs_name_t *namep = hash_table_get_instance(hlp, tmpfs_name_t, link);
253
    tmpfs_name_t *namep = hash_table_get_instance(hlp, tmpfs_name_t, link);
261
 
-
 
262
    return !strcmp(namep->name, component);
254
    return !strcmp(namep->name, component);
263
}
255
}
264
 
256
 
-
 
257
void *tmpfs_match(void *prnt, const char *component)
-
 
258
{
-
 
259
    tmpfs_dentry_t *parentp = (tmpfs_dentry_t *) prnt;
-
 
260
    tmpfs_dentry_t *childp = parentp->child;
-
 
261
 
-
 
262
    while (childp && !tmpfs_match_one(parentp, childp, component))
-
 
263
        childp = childp->sibling;
-
 
264
 
-
 
265
    return (void *) childp;
-
 
266
}
-
 
267
 
265
void *
268
void *
266
tmpfs_node_get(fs_handle_t fs_handle, dev_handle_t dev_handle, fs_index_t index)
269
tmpfs_node_get(fs_handle_t fs_handle, dev_handle_t dev_handle, fs_index_t index)
267
{
270
{
268
    unsigned long key = index;
271
    unsigned long key = index;
269
    link_t *lnk = hash_table_find(&dentries, &key);
272
    link_t *lnk = hash_table_find(&dentries, &key);