Subversion Repositories HelenOS

Compare Revisions

Ignore whitespace Rev 2790 → Rev 2791

/trunk/uspace/lib/libfs/libfs.c
148,7 → 148,7
 
void *par = NULL;
void *cur = ops->root_get();
void *tmp = ops->child_get(cur);
void *tmp;
 
if (ops->plb_get_char(next) == '/')
next++; /* eat slash */
155,7 → 155,7
char component[NAME_MAX + 1];
int len = 0;
while (tmp && next <= last) {
while (ops->has_children(cur) && next <= last) {
 
/* collect the component */
if (ops->plb_get_char(next) != '/') {
176,8 → 176,7
len = 0;
 
/* match the component */
while (tmp && !ops->match(cur, tmp, component))
tmp = ops->sibling_get(tmp);
tmp = ops->match(cur, component);
 
/* handle miss: match amongst siblings */
if (!tmp) {
228,11 → 227,10
/* descend one level */
par = cur;
cur = tmp;
tmp = ops->child_get(tmp);
}
 
/* handle miss: excessive components */
if (!tmp && next <= last) {
if (!ops->has_children(cur) && next <= last) {
if (lflag & (L_CREATE | L_LINK)) {
if (!ops->is_directory(cur)) {
ipc_answer_0(rid, ENOTDIR);
/trunk/uspace/lib/libfs/libfs.h
42,7 → 42,7
#include <async.h>
 
typedef struct {
bool (* match)(void *, void *, const char *);
void * (* match)(void *, const char *);
void * (* node_get)(fs_handle_t, dev_handle_t, fs_index_t);
void * (* create)(int);
void (* destroy)(void *);
51,8 → 51,7
fs_index_t (* index_get)(void *);
size_t (* size_get)(void *);
unsigned (* lnkcnt_get)(void *);
void *(* child_get)(void *);
void *(* sibling_get)(void *);
bool (* has_children)(void *);
void *(* root_get)(void);
char (* plb_get_char)(unsigned pos);
bool (* is_directory)(void *);
/trunk/uspace/srv/fs/tmpfs/tmpfs_ops.c
69,7 → 69,7
*/
 
/* Forward declarations of static functions. */
static bool tmpfs_match(void *, void *, const char *);
static void *tmpfs_match(void *, const char *);
static void *tmpfs_node_get(fs_handle_t, dev_handle_t, fs_index_t);
static void *tmpfs_create_node(int);
static bool tmpfs_link_node(void *, void *, const char *);
92,16 → 92,11
return ((tmpfs_dentry_t *) nodep)->lnkcnt;
}
 
static void *tmpfs_child_get(void *nodep)
static bool tmpfs_has_children(void *nodep)
{
return ((tmpfs_dentry_t *) nodep)->child;
return ((tmpfs_dentry_t *) nodep)->child != NULL;
}
 
static void *tmpfs_sibling_get(void *nodep)
{
return ((tmpfs_dentry_t *) nodep)->sibling;
}
 
static void *tmpfs_root_get(void)
{
return root;
133,8 → 128,7
.index_get = tmpfs_index_get,
.size_get = tmpfs_size_get,
.lnkcnt_get = tmpfs_lnkcnt_get,
.child_get = tmpfs_child_get,
.sibling_get = tmpfs_sibling_get,
.has_children = tmpfs_has_children,
.root_get = tmpfs_root_get,
.plb_get_char = tmpfs_plb_get_char,
.is_directory = tmpfs_is_directory,
243,25 → 237,34
 
/** Compare one component of path to a directory entry.
*
* @param prnt Node from which we descended.
* @param chld Node to compare the path component with.
* @param parentp Pointer to node from which we descended.
* @param childp Pointer to node to compare the path component with.
* @param component Array of characters holding component name.
*
* @return True on match, false otherwise.
*/
bool tmpfs_match(void *prnt, void *chld, const char *component)
static bool
tmpfs_match_one(tmpfs_dentry_t *parentp, tmpfs_dentry_t *childp,
const char *component)
{
tmpfs_dentry_t *parentp = (tmpfs_dentry_t *) prnt;
tmpfs_dentry_t *childp = (tmpfs_dentry_t *) chld;
 
unsigned long key = (unsigned long) parentp;
link_t *hlp = hash_table_find(&childp->names, &key);
assert(hlp);
tmpfs_name_t *namep = hash_table_get_instance(hlp, tmpfs_name_t, link);
 
return !strcmp(namep->name, component);
}
 
void *tmpfs_match(void *prnt, const char *component)
{
tmpfs_dentry_t *parentp = (tmpfs_dentry_t *) prnt;
tmpfs_dentry_t *childp = parentp->child;
 
while (childp && !tmpfs_match_one(parentp, childp, component))
childp = childp->sibling;
 
return (void *) childp;
}
 
void *
tmpfs_node_get(fs_handle_t fs_handle, dev_handle_t dev_handle, fs_index_t index)
{