Subversion Repositories HelenOS

Rev

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

Rev 2706 Rev 2707
Line 209... Line 209...
209
}
209
}
210
 
210
 
211
static unsigned long create_node(tmpfs_dentry_t *dentry,
211
static unsigned long create_node(tmpfs_dentry_t *dentry,
212
    const char *component, int lflag)
212
    const char *component, int lflag)
213
{
213
{
-
 
214
    assert(dentry->type == TMPFS_DIRECTORY);
-
 
215
    assert((lflag & L_FILE) ^ (lflag & L_DIRECTORY));
-
 
216
 
-
 
217
    tmpfs_dentry_t *node = malloc(sizeof(tmpfs_dentry_t));
-
 
218
    if (!node)
214
    return 0;
219
        return 0;
-
 
220
    size_t len = strlen(component);
-
 
221
    char *name = malloc(len + 1);
-
 
222
    if (!name) {
-
 
223
        free(node);
-
 
224
        return 0;
-
 
225
    }
-
 
226
    strcpy(name, component);
-
 
227
 
-
 
228
    tmpfs_dentry_initialize(node);
-
 
229
    node->index = tmpfs_next_index++;
-
 
230
    node->name = name;
-
 
231
    node->parent = dentry;
-
 
232
    if (lflag & L_DIRECTORY)
-
 
233
        node->type = TMPFS_DIRECTORY;
-
 
234
    else
-
 
235
        node->type = TMPFS_FILE;
-
 
236
 
-
 
237
    /* Insert the new node into the namespace. */
-
 
238
    if (dentry->child) {
-
 
239
        tmpfs_dentry_t *tmp = dentry->child;
-
 
240
        while (tmp->sibling)
-
 
241
            tmp = tmp->sibling;
-
 
242
        tmp->sibling = node;
-
 
243
    } else {
-
 
244
        dentry->child = node;
-
 
245
    }
-
 
246
 
-
 
247
    /* Insert the new node into the dentry hash table. */
-
 
248
    hash_table_insert(&dentries, &node->index, &node->dh_link);
-
 
249
    return node->index;
215
}
250
}
216
 
251
 
217
static int destroy_component(tmpfs_dentry_t *dentry)
252
static int destroy_component(tmpfs_dentry_t *dentry)
218
{
253
{
219
    return EPERM;
254
    return EPERM;
Line 254... Line 289...
254
                ipc_answer_0(rid, ENAMETOOLONG);
289
                ipc_answer_0(rid, ENAMETOOLONG);
255
                return;
290
                return;
256
            }
291
            }
257
            component[len++] = PLB_GET_CHAR(next);
292
            component[len++] = PLB_GET_CHAR(next);
258
            next++; /* process next character */
293
            next++; /* process next character */
259
            if (next <= last)
294
            if (next <= last)
260
                continue;
295
                continue;
261
        }
296
        }
262
 
297
 
263
        assert(len);
298
        assert(len);
264
        component[len] = '\0';
299
        component[len] = '\0';
Line 277... Line 312...
277
                    ipc_answer_0(rid, ENOTDIR);
312
                    ipc_answer_0(rid, ENOTDIR);
278
                    return;
313
                    return;
279
                }
314
                }
280
                unsigned long index = create_node(dcur,
315
                unsigned long index = create_node(dcur,
281
                    component, lflag);
316
                    component, lflag);
282
                if (index) {
317
                if (index > 0) {
283
                    ipc_answer_4(rid, EOK,
318
                    ipc_answer_4(rid, EOK,
284
                        tmpfs_reg.fs_handle, dev_handle,
319
                        tmpfs_reg.fs_handle, dev_handle,
285
                        index, 0);
320
                        index, 0);
286
                } else {
321
                } else {
287
                    ipc_answer_0(rid, ENOSPC);
322
                    ipc_answer_0(rid, ENOSPC);