Subversion Repositories HelenOS

Rev

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

Rev 4443 Rev 4445
Line 484... Line 484...
484
    free(opts);
484
    free(opts);
485
}
485
}
486
 
486
 
487
void vfs_open(ipc_callid_t rid, ipc_call_t *request)
487
void vfs_open(ipc_callid_t rid, ipc_call_t *request)
488
{
488
{
489
    async_serialize_start();
-
 
490
   
-
 
491
    if (!vfs_files_init()) {
489
    if (!vfs_files_init()) {
492
        ipc_answer_0(rid, ENOMEM);
490
        ipc_answer_0(rid, ENOMEM);
493
        async_serialize_end();
-
 
494
        return;
491
        return;
495
    }
492
    }
496
 
493
 
497
    /*
494
    /*
498
     * The POSIX interface is open(path, oflag, mode).
495
     * The POSIX interface is open(path, oflag, mode).
Line 512... Line 509...
512
     * L_DIRECTORY.
509
     * L_DIRECTORY.
513
     */
510
     */
514
    if ((lflag & (L_FILE | L_DIRECTORY)) == 0 ||
511
    if ((lflag & (L_FILE | L_DIRECTORY)) == 0 ||
515
        (lflag & (L_FILE | L_DIRECTORY)) == (L_FILE | L_DIRECTORY)) {
512
        (lflag & (L_FILE | L_DIRECTORY)) == (L_FILE | L_DIRECTORY)) {
516
        ipc_answer_0(rid, EINVAL);
513
        ipc_answer_0(rid, EINVAL);
517
        async_serialize_end();
-
 
518
        return;
514
        return;
519
    }
515
    }
520
 
516
 
521
    if (oflag & O_CREAT)
517
    if (oflag & O_CREAT)
522
        lflag |= L_CREATE;
518
        lflag |= L_CREATE;
Line 526... Line 522...
526
    ipc_callid_t callid;
522
    ipc_callid_t callid;
527
 
523
 
528
    if (!ipc_data_write_receive(&callid, &len)) {
524
    if (!ipc_data_write_receive(&callid, &len)) {
529
        ipc_answer_0(callid, EINVAL);
525
        ipc_answer_0(callid, EINVAL);
530
        ipc_answer_0(rid, EINVAL);
526
        ipc_answer_0(rid, EINVAL);
531
        async_serialize_end();
-
 
532
        return;
527
        return;
533
    }
528
    }
534
    char *path = malloc(len + 1);
529
    char *path = malloc(len + 1);
535
    if (!path) {
530
    if (!path) {
536
        ipc_answer_0(callid, ENOMEM);
531
        ipc_answer_0(callid, ENOMEM);
537
        ipc_answer_0(rid, ENOMEM);
532
        ipc_answer_0(rid, ENOMEM);
538
        async_serialize_end();
-
 
539
        return;
533
        return;
540
    }
534
    }
541
    int rc;
535
    int rc;
542
    if ((rc = ipc_data_write_finalize(callid, path, len))) {
536
    if ((rc = ipc_data_write_finalize(callid, path, len))) {
543
        ipc_answer_0(rid, rc);
537
        ipc_answer_0(rid, rc);
544
        free(path);
538
        free(path);
545
        async_serialize_end();
-
 
546
        return;
539
        return;
547
    }
540
    }
548
    path[len] = '\0';
541
    path[len] = '\0';
549
   
542
   
550
    /*
543
    /*
Line 565... Line 558...
565
            rwlock_write_unlock(&namespace_rwlock);
558
            rwlock_write_unlock(&namespace_rwlock);
566
        else
559
        else
567
            rwlock_read_unlock(&namespace_rwlock);
560
            rwlock_read_unlock(&namespace_rwlock);
568
        ipc_answer_0(rid, rc);
561
        ipc_answer_0(rid, rc);
569
        free(path);
562
        free(path);
570
        async_serialize_end();
-
 
571
        return;
563
        return;
572
    }
564
    }
573
 
565
 
574
    /* Path is no longer needed. */
566
    /* Path is no longer needed. */
575
    free(path);
567
    free(path);
Line 588... Line 580...
588
                node->dev_handle, node->index, 0);
580
                node->dev_handle, node->index, 0);
589
            if (rc) {
581
            if (rc) {
590
                rwlock_write_unlock(&node->contents_rwlock);
582
                rwlock_write_unlock(&node->contents_rwlock);
591
                vfs_node_put(node);
583
                vfs_node_put(node);
592
                ipc_answer_0(rid, rc);
584
                ipc_answer_0(rid, rc);
593
                async_serialize_end();
-
 
594
                return;
585
                return;
595
            }
586
            }
596
            node->size = 0;
587
            node->size = 0;
597
        }
588
        }
598
        rwlock_write_unlock(&node->contents_rwlock);
589
        rwlock_write_unlock(&node->contents_rwlock);
Line 604... Line 595...
604
     */
595
     */
605
    int fd = vfs_fd_alloc();
596
    int fd = vfs_fd_alloc();
606
    if (fd < 0) {
597
    if (fd < 0) {
607
        vfs_node_put(node);
598
        vfs_node_put(node);
608
        ipc_answer_0(rid, fd);
599
        ipc_answer_0(rid, fd);
609
        async_serialize_end();
-
 
610
        return;
600
        return;
611
    }
601
    }
612
    vfs_file_t *file = vfs_file_get(fd);
602
    vfs_file_t *file = vfs_file_get(fd);
613
    file->node = node;
603
    file->node = node;
614
    if (oflag & O_APPEND)
604
    if (oflag & O_APPEND)
Line 624... Line 614...
624
    vfs_node_addref(node);
614
    vfs_node_addref(node);
625
    vfs_node_put(node);
615
    vfs_node_put(node);
626
 
616
 
627
    /* Success! Return the new file descriptor to the client. */
617
    /* Success! Return the new file descriptor to the client. */
628
    ipc_answer_1(rid, EOK, fd);
618
    ipc_answer_1(rid, EOK, fd);
629
    async_serialize_end();
-
 
630
}
619
}
631
 
620
 
632
void vfs_close(ipc_callid_t rid, ipc_call_t *request)
621
void vfs_close(ipc_callid_t rid, ipc_call_t *request)
633
{
622
{
634
    int fd = IPC_GET_ARG1(*request);
623
    int fd = IPC_GET_ARG1(*request);