Subversion Repositories HelenOS

Rev

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

Rev 4584 Rev 4585
Line 639... Line 639...
639
   
639
   
640
    /* Success! Return the new file descriptor to the client. */
640
    /* Success! Return the new file descriptor to the client. */
641
    ipc_answer_1(rid, EOK, fd);
641
    ipc_answer_1(rid, EOK, fd);
642
}
642
}
643
 
643
 
644
void vfs_node(ipc_callid_t rid, ipc_call_t *request)
-
 
645
{
-
 
646
    int fd = IPC_GET_ARG1(*request);
-
 
647
   
-
 
648
    /* Lookup the file structure corresponding to the file descriptor. */
-
 
649
    vfs_file_t *file = vfs_file_get(fd);
-
 
650
    if (!file) {
-
 
651
        ipc_answer_0(rid, ENOENT);
-
 
652
        return;
-
 
653
    }
-
 
654
   
-
 
655
    ipc_answer_3(rid, EOK, file->node->fs_handle, file->node->dev_handle,
-
 
656
        file->node->index);
-
 
657
}
-
 
658
 
-
 
659
void vfs_device(ipc_callid_t rid, ipc_call_t *request)
-
 
660
{
-
 
661
    int fd = IPC_GET_ARG1(*request);
-
 
662
   
-
 
663
    /* Lookup the file structure corresponding to the file descriptor. */
-
 
664
    vfs_file_t *file = vfs_file_get(fd);
-
 
665
    if (!file) {
-
 
666
        ipc_answer_0(rid, ENOENT);
-
 
667
        return;
-
 
668
    }
-
 
669
   
-
 
670
    /*
-
 
671
     * Lock the open file structure so that no other thread can manipulate
-
 
672
     * the same open file at a time.
-
 
673
     */
-
 
674
    fibril_mutex_lock(&file->lock);
-
 
675
    int fs_phone = vfs_grab_phone(file->node->fs_handle);
-
 
676
   
-
 
677
    /* Make a VFS_OUT_DEVICE request at the destination FS server. */
-
 
678
    aid_t msg;
-
 
679
    ipc_call_t answer;
-
 
680
    msg = async_send_2(fs_phone, VFS_OUT_DEVICE, file->node->dev_handle,
-
 
681
        file->node->index, &answer);
-
 
682
 
-
 
683
    /* Wait for reply from the FS server. */
-
 
684
    ipcarg_t rc;
-
 
685
    async_wait_for(msg, &rc);
-
 
686
 
-
 
687
    vfs_release_phone(fs_phone);
-
 
688
    fibril_mutex_unlock(&file->lock);
-
 
689
   
-
 
690
    ipc_answer_1(rid, EOK, IPC_GET_ARG1(answer));
-
 
691
}
-
 
692
 
-
 
693
void vfs_sync(ipc_callid_t rid, ipc_call_t *request)
644
void vfs_sync(ipc_callid_t rid, ipc_call_t *request)
694
{
645
{
695
    int fd = IPC_GET_ARG1(*request);
646
    int fd = IPC_GET_ARG1(*request);
696
   
647
   
697
    /* Lookup the file structure corresponding to the file descriptor. */
648
    /* Lookup the file structure corresponding to the file descriptor. */
Line 974... Line 925...
974
 
925
 
975
    fibril_mutex_unlock(&file->lock);
926
    fibril_mutex_unlock(&file->lock);
976
    ipc_answer_0(rid, (ipcarg_t)rc);
927
    ipc_answer_0(rid, (ipcarg_t)rc);
977
}
928
}
978
 
929
 
-
 
930
void vfs_fstat(ipc_callid_t rid, ipc_call_t *request)
-
 
931
{
-
 
932
    int fd = IPC_GET_ARG1(*request);
-
 
933
    size_t size = IPC_GET_ARG2(*request);
-
 
934
    ipcarg_t rc;
-
 
935
 
-
 
936
    vfs_file_t *file = vfs_file_get(fd);
-
 
937
    if (!file) {
-
 
938
        ipc_answer_0(rid, ENOENT);
-
 
939
        return;
-
 
940
    }
-
 
941
 
-
 
942
    ipc_callid_t callid;
-
 
943
    if (!ipc_data_read_receive(&callid, NULL)) {
-
 
944
        ipc_answer_0(callid, EINVAL);
-
 
945
        ipc_answer_0(rid, EINVAL);
-
 
946
        return;
-
 
947
    }
-
 
948
 
-
 
949
    fibril_mutex_lock(&file->lock);
-
 
950
 
-
 
951
    int fs_phone = vfs_grab_phone(file->node->fs_handle);
-
 
952
   
-
 
953
    aid_t msg;
-
 
954
    msg = async_send_3(fs_phone, VFS_OUT_STAT, file->node->dev_handle,
-
 
955
        file->node->index, true, NULL);
-
 
956
    ipc_forward_fast(callid, fs_phone, 0, 0, 0, IPC_FF_ROUTE_FROM_ME);
-
 
957
    async_wait_for(msg, &rc);
-
 
958
    vfs_release_phone(fs_phone);
-
 
959
 
-
 
960
    fibril_mutex_unlock(&file->lock);
-
 
961
    ipc_answer_0(rid, rc);
-
 
962
}
-
 
963
 
-
 
964
void vfs_stat(ipc_callid_t rid, ipc_call_t *request)
-
 
965
{
-
 
966
}
-
 
967
 
979
void vfs_mkdir(ipc_callid_t rid, ipc_call_t *request)
968
void vfs_mkdir(ipc_callid_t rid, ipc_call_t *request)
980
{
969
{
981
    int mode = IPC_GET_ARG1(*request);
970
    int mode = IPC_GET_ARG1(*request);
982
 
971
 
983
    size_t len;
972
    size_t len;