Subversion Repositories HelenOS

Rev

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

Rev 2787 Rev 2925
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(dev_handle_t, fs_index_t);
-
 
74
static void tmpfs_node_put(void *);
74
static void *tmpfs_create_node(int);
75
static void *tmpfs_create_node(int);
75
static bool tmpfs_link_node(void *, void *, const char *);
76
static bool tmpfs_link_node(void *, void *, const char *);
76
static int tmpfs_unlink_node(void *, void *);
77
static int tmpfs_unlink_node(void *, void *);
77
static void tmpfs_destroy_node(void *);
78
static int tmpfs_destroy_node(void *);
78
 
79
 
79
/* Implementation of helper functions. */
80
/* Implementation of helper functions. */
80
static fs_index_t tmpfs_index_get(void *nodep)
81
static fs_index_t tmpfs_index_get(void *nodep)
81
{
82
{
82
    return ((tmpfs_dentry_t *) nodep)->index;
83
    return ((tmpfs_dentry_t *) nodep)->index;
Line 90... Line 91...
90
static unsigned tmpfs_lnkcnt_get(void *nodep)
91
static unsigned tmpfs_lnkcnt_get(void *nodep)
91
{
92
{
92
    return ((tmpfs_dentry_t *) nodep)->lnkcnt;
93
    return ((tmpfs_dentry_t *) nodep)->lnkcnt;
93
}
94
}
94
 
95
 
95
static void *tmpfs_child_get(void *nodep)
96
static bool tmpfs_has_children(void *nodep)
96
{
97
{
97
    return ((tmpfs_dentry_t *) nodep)->child;
98
    return ((tmpfs_dentry_t *) nodep)->child != NULL;
98
}
99
}
99
 
100
 
100
static void *tmpfs_sibling_get(void *nodep)
-
 
101
{
-
 
102
    return ((tmpfs_dentry_t *) nodep)->sibling;
-
 
103
}
-
 
104
 
-
 
105
static void *tmpfs_root_get(void)
101
static void *tmpfs_root_get(dev_handle_t dev_handle)
106
{
102
{
107
    return root;
103
    return root;
108
}
104
}
109
 
105
 
110
static char tmpfs_plb_get_char(unsigned pos)
106
static char tmpfs_plb_get_char(unsigned pos)
Line 124... Line 120...
124
 
120
 
125
/** libfs operations */
121
/** libfs operations */
126
libfs_ops_t tmpfs_libfs_ops = {
122
libfs_ops_t tmpfs_libfs_ops = {
127
    .match = tmpfs_match,
123
    .match = tmpfs_match,
128
    .node_get = tmpfs_node_get,
124
    .node_get = tmpfs_node_get,
-
 
125
    .node_put = tmpfs_node_put,
129
    .create = tmpfs_create_node,
126
    .create = tmpfs_create_node,
130
    .destroy = tmpfs_destroy_node,
127
    .destroy = tmpfs_destroy_node,
131
    .link = tmpfs_link_node,
128
    .link = tmpfs_link_node,
132
    .unlink = tmpfs_unlink_node,
129
    .unlink = tmpfs_unlink_node,
133
    .index_get = tmpfs_index_get,
130
    .index_get = tmpfs_index_get,
134
    .size_get = tmpfs_size_get,
131
    .size_get = tmpfs_size_get,
135
    .lnkcnt_get = tmpfs_lnkcnt_get,
132
    .lnkcnt_get = tmpfs_lnkcnt_get,
136
    .child_get = tmpfs_child_get,
133
    .has_children = tmpfs_has_children,
137
    .sibling_get = tmpfs_sibling_get,
-
 
138
    .root_get = tmpfs_root_get,
134
    .root_get = tmpfs_root_get,
139
    .plb_get_char = tmpfs_plb_get_char,
135
    .plb_get_char = tmpfs_plb_get_char,
140
    .is_directory = tmpfs_is_directory,
136
    .is_directory = tmpfs_is_directory,
141
    .is_file = tmpfs_is_file
137
    .is_file = tmpfs_is_file
142
};
138
};
Line 241... Line 237...
241
    return true;
237
    return true;
242
}
238
}
243
 
239
 
244
/** Compare one component of path to a directory entry.
240
/** Compare one component of path to a directory entry.
245
 *
241
 *
246
 * @param prnt      Node from which we descended.
242
 * @param parentp   Pointer to node from which we descended.
247
 * @param chld      Node to compare the path component with.
243
 * @param childp    Pointer to node to compare the path component with.
248
 * @param component Array of characters holding component name.
244
 * @param component Array of characters holding component name.
249
 *
245
 *
250
 * @return      True on match, false otherwise.
246
 * @return      True on match, false otherwise.
251
 */
247
 */
-
 
248
static bool
252
bool tmpfs_match(void *prnt, void *chld, const char *component)
249
tmpfs_match_one(tmpfs_dentry_t *parentp, tmpfs_dentry_t *childp,
-
 
250
    const char *component)
253
{
251
{
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;
252
    unsigned long key = (unsigned long) parentp;
258
    link_t *hlp = hash_table_find(&childp->names, &key);
253
    link_t *hlp = hash_table_find(&childp->names, &key);
259
    assert(hlp);
254
    assert(hlp);
260
    tmpfs_name_t *namep = hash_table_get_instance(hlp, tmpfs_name_t, link);
255
    tmpfs_name_t *namep = hash_table_get_instance(hlp, tmpfs_name_t, link);
261
 
-
 
262
    return !strcmp(namep->name, component);
256
    return !strcmp(namep->name, component);
263
}
257
}
264
 
258
 
-
 
259
void *tmpfs_match(void *prnt, const char *component)
-
 
260
{
-
 
261
    tmpfs_dentry_t *parentp = (tmpfs_dentry_t *) prnt;
-
 
262
    tmpfs_dentry_t *childp = parentp->child;
-
 
263
 
-
 
264
    while (childp && !tmpfs_match_one(parentp, childp, component))
-
 
265
        childp = childp->sibling;
-
 
266
 
-
 
267
    return (void *) childp;
-
 
268
}
-
 
269
 
265
void *
270
void *
266
tmpfs_node_get(fs_handle_t fs_handle, dev_handle_t dev_handle, fs_index_t index)
271
tmpfs_node_get(dev_handle_t dev_handle, fs_index_t index)
267
{
272
{
268
    unsigned long key = index;
273
    unsigned long key = index;
269
    link_t *lnk = hash_table_find(&dentries, &key);
274
    link_t *lnk = hash_table_find(&dentries, &key);
270
    if (!lnk)
275
    if (!lnk)
271
        return NULL;
276
        return NULL;
272
    return hash_table_get_instance(lnk, tmpfs_dentry_t, dh_link);
277
    return hash_table_get_instance(lnk, tmpfs_dentry_t, dh_link);
273
}
278
}
274
 
279
 
-
 
280
void tmpfs_node_put(void *node)
-
 
281
{
-
 
282
    /* nothing to do */
-
 
283
}
-
 
284
 
275
void *tmpfs_create_node(int lflag)
285
void *tmpfs_create_node(int lflag)
276
{
286
{
277
    assert((lflag & L_FILE) ^ (lflag & L_DIRECTORY));
287
    assert((lflag & L_FILE) ^ (lflag & L_DIRECTORY));
278
 
288
 
279
    tmpfs_dentry_t *node = malloc(sizeof(tmpfs_dentry_t));
289
    tmpfs_dentry_t *node = malloc(sizeof(tmpfs_dentry_t));
Line 362... Line 372...
362
    childp->lnkcnt--;
372
    childp->lnkcnt--;
363
 
373
 
364
    return EOK;
374
    return EOK;
365
}
375
}
366
 
376
 
367
void tmpfs_destroy_node(void *nodep)
377
int tmpfs_destroy_node(void *nodep)
368
{
378
{
369
    tmpfs_dentry_t *dentry = (tmpfs_dentry_t *) nodep;
379
    tmpfs_dentry_t *dentry = (tmpfs_dentry_t *) nodep;
370
   
380
   
371
    assert(!dentry->lnkcnt);
381
    assert(!dentry->lnkcnt);
372
    assert(!dentry->child);
382
    assert(!dentry->child);
Line 378... Line 388...
378
    hash_table_destroy(&dentry->names);
388
    hash_table_destroy(&dentry->names);
379
 
389
 
380
    if (dentry->type == TMPFS_FILE)
390
    if (dentry->type == TMPFS_FILE)
381
        free(dentry->data);
391
        free(dentry->data);
382
    free(dentry);
392
    free(dentry);
-
 
393
    return EOK;
383
}
394
}
384
 
395
 
385
void tmpfs_lookup(ipc_callid_t rid, ipc_call_t *request)
396
void tmpfs_lookup(ipc_callid_t rid, ipc_call_t *request)
386
{
397
{
387
    /* Initialize TMPFS. */
398
    /* Initialize TMPFS. */
Line 566... Line 577...
566
 
577
 
567
void tmpfs_destroy(ipc_callid_t rid, ipc_call_t *request)
578
void tmpfs_destroy(ipc_callid_t rid, ipc_call_t *request)
568
{
579
{
569
    dev_handle_t dev_handle = (dev_handle_t)IPC_GET_ARG1(*request);
580
    dev_handle_t dev_handle = (dev_handle_t)IPC_GET_ARG1(*request);
570
    fs_index_t index = (fs_index_t)IPC_GET_ARG2(*request);
581
    fs_index_t index = (fs_index_t)IPC_GET_ARG2(*request);
-
 
582
    int rc;
571
 
583
 
572
    link_t *hlp;
584
    link_t *hlp;
573
    unsigned long key = index;
585
    unsigned long key = index;
574
    hlp = hash_table_find(&dentries, &key);
586
    hlp = hash_table_find(&dentries, &key);
575
    if (!hlp) {
587
    if (!hlp) {
576
        ipc_answer_0(rid, ENOENT);
588
        ipc_answer_0(rid, ENOENT);
577
        return;
589
        return;
578
    }
590
    }
579
    tmpfs_dentry_t *dentry = hash_table_get_instance(hlp, tmpfs_dentry_t,
591
    tmpfs_dentry_t *dentry = hash_table_get_instance(hlp, tmpfs_dentry_t,
580
        dh_link);
592
        dh_link);
581
    tmpfs_destroy_node(dentry);
593
    rc = tmpfs_destroy_node(dentry);
582
    ipc_answer_0(rid, EOK);
594
    ipc_answer_0(rid, rc);
583
}
595
}
584
 
596
 
585
/**
597
/**
586
 * @}
598
 * @}
587
 */
599
 */