Subversion Repositories HelenOS

Rev

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

Rev 2728 Rev 2730
Line 56... Line 56...
56
 
56
 
57
#define PLB_GET_CHAR(i)     (tmpfs_reg.plb_ro[(i) % PLB_SIZE])
57
#define PLB_GET_CHAR(i)     (tmpfs_reg.plb_ro[(i) % PLB_SIZE])
58
 
58
 
59
#define DENTRIES_BUCKETS    256
59
#define DENTRIES_BUCKETS    256
60
 
60
 
-
 
61
#define TMPFS_GET_INDEX(x)  (((tmpfs_dentry_t *)(x))->index)
-
 
62
#define TMPFS_GET_LNKCNT(x) 1
-
 
63
 
61
/*
64
/*
62
 * Hash table of all directory entries.
65
 * Hash table of all directory entries.
63
 */
66
 */
64
hash_table_t dentries;
67
hash_table_t dentries;
65
 
68
 
Line 125... Line 128...
125
    return true;
128
    return true;
126
}
129
}
127
 
130
 
128
/** Compare one component of path to a directory entry.
131
/** Compare one component of path to a directory entry.
129
 *
132
 *
130
 * @param dentry    Directory entry to compare the path component with.
133
 * @param nodep     Node to compare the path component with.
131
 * @param component Array of characters holding component name.
134
 * @param component Array of characters holding component name.
132
 *
135
 *
133
 * @return      True on match, false otherwise.
136
 * @return      True on match, false otherwise.
134
 */
137
 */
135
static bool match_component(tmpfs_dentry_t *dentry, const char *component)
138
static bool match_component(void *nodep, const char *component)
136
{
139
{
-
 
140
    tmpfs_dentry_t *dentry = (tmpfs_dentry_t *) nodep;
-
 
141
 
137
    return !strcmp(dentry->name, component);
142
    return !strcmp(dentry->name, component);
138
}
143
}
139
 
144
 
140
static unsigned long create_node(tmpfs_dentry_t *dentry,
145
static void *create_node(void *nodep,
141
    const char *component, int lflag)
146
    const char *component, int lflag)
142
{
147
{
-
 
148
    tmpfs_dentry_t *dentry = (tmpfs_dentry_t *) nodep;
-
 
149
 
143
    assert(dentry->type == TMPFS_DIRECTORY);
150
    assert(dentry->type == TMPFS_DIRECTORY);
144
    assert((lflag & L_FILE) ^ (lflag & L_DIRECTORY));
151
    assert((lflag & L_FILE) ^ (lflag & L_DIRECTORY));
145
 
152
 
146
    tmpfs_dentry_t *node = malloc(sizeof(tmpfs_dentry_t));
153
    tmpfs_dentry_t *node = malloc(sizeof(tmpfs_dentry_t));
147
    if (!node)
154
    if (!node)
148
        return 0;
155
        return NULL;
149
    size_t len = strlen(component);
156
    size_t len = strlen(component);
150
    char *name = malloc(len + 1);
157
    char *name = malloc(len + 1);
151
    if (!name) {
158
    if (!name) {
152
        free(node);
159
        free(node);
153
        return 0;
160
        return NULL;
154
    }
161
    }
155
    strcpy(name, component);
162
    strcpy(name, component);
156
 
163
 
157
    tmpfs_dentry_initialize(node);
164
    tmpfs_dentry_initialize(node);
158
    node->index = tmpfs_next_index++;
165
    node->index = tmpfs_next_index++;
Line 173... Line 180...
173
        dentry->child = node;
180
        dentry->child = node;
174
    }
181
    }
175
 
182
 
176
    /* Insert the new node into the dentry hash table. */
183
    /* Insert the new node into the dentry hash table. */
177
    hash_table_insert(&dentries, &node->index, &node->dh_link);
184
    hash_table_insert(&dentries, &node->index, &node->dh_link);
178
    return node->index;
185
    return (void *) node;
179
}
186
}
180
 
187
 
181
static int destroy_component(tmpfs_dentry_t *dentry)
188
static int destroy_component(void *nodeptr)
182
{
189
{
183
    return EPERM;
190
    return EPERM;
184
}
191
}
185
 
192
 
186
void tmpfs_lookup(ipc_callid_t rid, ipc_call_t *request)
193
void tmpfs_lookup(ipc_callid_t rid, ipc_call_t *request)
Line 239... Line 246...
239
                /* no components left and L_CREATE specified */
246
                /* no components left and L_CREATE specified */
240
                if (dcur->type != TMPFS_DIRECTORY) {
247
                if (dcur->type != TMPFS_DIRECTORY) {
241
                    ipc_answer_0(rid, ENOTDIR);
248
                    ipc_answer_0(rid, ENOTDIR);
242
                    return;
249
                    return;
243
                }
250
                }
244
                unsigned long index = create_node(dcur,
251
                void *nodep = create_node(dcur,
245
                    component, lflag);
252
                    component, lflag);
246
                if (index > 0) {
253
                if (nodep) {
247
                    ipc_answer_4(rid, EOK,
254
                    ipc_answer_5(rid, EOK,
248
                        tmpfs_reg.fs_handle, dev_handle,
255
                        tmpfs_reg.fs_handle, dev_handle,
249
                        index, 0);
256
                        TMPFS_GET_INDEX(nodep), 0,
-
 
257
                        TMPFS_GET_LNKCNT(nodep));
250
                } else {
258
                } else {
251
                    ipc_answer_0(rid, ENOSPC);
259
                    ipc_answer_0(rid, ENOSPC);
252
                }
260
                }
253
                return;
261
                return;
254
            }
262
            }
Line 286... Line 294...
286
            }
294
            }
287
            assert(len);
295
            assert(len);
288
            component[len] = '\0';
296
            component[len] = '\0';
289
            len = 0;
297
            len = 0;
290
               
298
               
291
            unsigned long index;
-
 
292
            index = create_node(dcur, component, lflag);
299
            void *nodep = create_node(dcur, component, lflag);
293
            if (index) {
300
            if (nodep) {
294
                ipc_answer_4(rid, EOK, tmpfs_reg.fs_handle,
301
                ipc_answer_5(rid, EOK, tmpfs_reg.fs_handle,
295
                    dev_handle, index, 0);
302
                    dev_handle, TMPFS_GET_INDEX(nodep), 0,
-
 
303
                    TMPFS_GET_LNKCNT(nodep));
296
            } else {
304
            } else {
297
                ipc_answer_0(rid, ENOSPC);
305
                ipc_answer_0(rid, ENOSPC);
298
            }
306
            }
299
            return;
307
            return;
300
        }
308
        }
Line 319... Line 327...
319
    if ((lflag & L_DIRECTORY) && (dcur->type != TMPFS_DIRECTORY)) {
327
    if ((lflag & L_DIRECTORY) && (dcur->type != TMPFS_DIRECTORY)) {
320
        ipc_answer_0(rid, ENOTDIR);
328
        ipc_answer_0(rid, ENOTDIR);
321
        return;
329
        return;
322
    }
330
    }
323
 
331
 
324
    ipc_answer_4(rid, EOK, tmpfs_reg.fs_handle, dev_handle, dcur->index,
332
    ipc_answer_5(rid, EOK, tmpfs_reg.fs_handle, dev_handle, dcur->index,
325
        dcur->size);
333
        dcur->size, TMPFS_GET_LNKCNT(dcur));
326
}
334
}
327
 
335
 
328
void tmpfs_read(ipc_callid_t rid, ipc_call_t *request)
336
void tmpfs_read(ipc_callid_t rid, ipc_call_t *request)
329
{
337
{
330
    int dev_handle = IPC_GET_ARG1(*request);
338
    int dev_handle = IPC_GET_ARG1(*request);