Subversion Repositories HelenOS

Rev

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

Rev 2705 Rev 2706
Line 243... Line 243...
243
    if (PLB_GET_CHAR(next) == '/')
243
    if (PLB_GET_CHAR(next) == '/')
244
        next++;     /* eat slash */
244
        next++;     /* eat slash */
245
   
245
   
246
    char component[NAME_MAX + 1];
246
    char component[NAME_MAX + 1];
247
    int len = 0;
247
    int len = 0;
248
    while (next <= last) {
248
    while (dtmp && next <= last) {
249
 
249
 
250
        /* collect the component */
250
        /* collect the component */
251
        if (PLB_GET_CHAR(next) != '/') {
251
        if (PLB_GET_CHAR(next) != '/') {
252
            if (len + 1 == NAME_MAX) {
252
            if (len + 1 == NAME_MAX) {
253
                /* comopnent length overflow */
253
                /* comopnent length overflow */
Line 293... Line 293...
293
        }
293
        }
294
 
294
 
295
        /* descent one level */
295
        /* descent one level */
296
        dcur = dtmp;
296
        dcur = dtmp;
297
        dtmp = dtmp->child;
297
        dtmp = dtmp->child;
-
 
298
    }
298
 
299
 
299
        /* handle miss: excessive components */
300
    /* handle miss: excessive components */
300
        if (!dtmp && next <= last) {
301
    if (!dtmp && next <= last) {
301
            if (lflag & L_CREATE) {
302
        if (lflag & L_CREATE) {
302
                if (dcur->type != TMPFS_DIRECTORY) {
303
            if (dcur->type != TMPFS_DIRECTORY) {
303
                    ipc_answer_0(rid, ENOTDIR);
304
                ipc_answer_0(rid, ENOTDIR);
-
 
305
                return;
-
 
306
            }
-
 
307
 
-
 
308
            /* collect next component */
-
 
309
            while (next <= last) {
-
 
310
                if (PLB_GET_CHAR(next) == '/') {
-
 
311
                    /* more than one component */
-
 
312
                    ipc_answer_0(rid, ENOENT);
304
                    return;
313
                    return;
305
                }
314
                }
306
 
-
 
307
                /* collect next component */
-
 
308
                while (next <= last) {
-
 
309
                    if (PLB_GET_CHAR(next) == '/') {
-
 
310
                        /* more than one component */
-
 
311
                        ipc_answer_0(rid, ENOENT);
-
 
312
                        return;
-
 
313
                    }
-
 
314
                    if (len + 1 == NAME_MAX) {
315
                if (len + 1 == NAME_MAX) {
315
                        /* component length overflow */
316
                    /* component length overflow */
316
                        ipc_answer_0(rid, ENAMETOOLONG);
317
                    ipc_answer_0(rid, ENAMETOOLONG);
317
                        return;
318
                    return;
318
                    }
-
 
319
                    component[len++] = PLB_GET_CHAR(next);
-
 
320
                    next++; /* process next character */
-
 
321
                }
319
                }
-
 
320
                component[len++] = PLB_GET_CHAR(next);
-
 
321
                next++; /* process next character */
-
 
322
            }
322
                assert(len);
323
            assert(len);
323
                component[len] = '\0';
324
            component[len] = '\0';
324
                len = 0;
325
            len = 0;
325
               
326
               
326
                unsigned long index;
327
            unsigned long index;
327
                index = create_node(dcur, component, lflag);
328
            index = create_node(dcur, component, lflag);
328
                if (index) {
329
            if (index) {
329
                    ipc_answer_4(rid, EOK,
330
                ipc_answer_4(rid, EOK, tmpfs_reg.fs_handle,
330
                        tmpfs_reg.fs_handle, dev_handle,
-
 
331
                        index, 0);
331
                    dev_handle, index, 0);
332
                } else {
332
            } else {
333
                    ipc_answer_0(rid, ENOSPC);
333
                ipc_answer_0(rid, ENOSPC);
334
                }
-
 
335
                return;
-
 
336
            }
334
            }
337
            ipc_answer_0(rid, ENOENT);
-
 
338
            return;
335
            return;
339
        }
336
        }
-
 
337
        ipc_answer_0(rid, ENOENT);
340
   
338
        return;
341
    }
339
    }
342
 
340
 
343
    /* handle hit */
341
    /* handle hit */
344
    if (lflag & L_DESTROY) {
342
    if (lflag & L_DESTROY) {
345
        int res = destroy_component(dcur);
343
        int res = destroy_component(dcur);