Rev 4585 | Rev 4593 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 4585 | Rev 4587 | ||
|---|---|---|---|
| Line 961... | Line 961... | ||
| 961 | ipc_answer_0(rid, rc); |
961 | ipc_answer_0(rid, rc); |
| 962 | } |
962 | } |
| 963 | 963 | ||
| 964 | void vfs_stat(ipc_callid_t rid, ipc_call_t *request) |
964 | void vfs_stat(ipc_callid_t rid, ipc_call_t *request) |
| 965 | { |
965 | { |
| - | 966 | size_t len; |
|
| - | 967 | ipc_callid_t callid; |
|
| - | 968 | ||
| - | 969 | if (!ipc_data_write_receive(&callid, &len)) { |
|
| - | 970 | ipc_answer_0(callid, EINVAL); |
|
| - | 971 | ipc_answer_0(rid, EINVAL); |
|
| - | 972 | return; |
|
| - | 973 | } |
|
| - | 974 | char *path = malloc(len + 1); |
|
| - | 975 | if (!path) { |
|
| - | 976 | ipc_answer_0(callid, ENOMEM); |
|
| - | 977 | ipc_answer_0(rid, ENOMEM); |
|
| - | 978 | return; |
|
| - | 979 | } |
|
| - | 980 | int rc; |
|
| - | 981 | if ((rc = ipc_data_write_finalize(callid, path, len))) { |
|
| - | 982 | ipc_answer_0(rid, rc); |
|
| - | 983 | free(path); |
|
| - | 984 | return; |
|
| - | 985 | } |
|
| - | 986 | path[len] = '\0'; |
|
| - | 987 | ||
| - | 988 | if (!ipc_data_read_receive(&callid, NULL)) { |
|
| - | 989 | free(path); |
|
| - | 990 | ipc_answer_0(callid, EINVAL); |
|
| - | 991 | ipc_answer_0(rid, EINVAL); |
|
| - | 992 | return; |
|
| - | 993 | } |
|
| - | 994 | ||
| - | 995 | vfs_lookup_res_t lr; |
|
| - | 996 | fibril_rwlock_read_lock(&namespace_rwlock); |
|
| - | 997 | rc = vfs_lookup_internal(path, L_NONE, &lr, NULL); |
|
| - | 998 | free(path); |
|
| - | 999 | if (rc != EOK) { |
|
| - | 1000 | fibril_rwlock_read_unlock(&namespace_rwlock); |
|
| - | 1001 | ipc_answer_0(callid, rc); |
|
| - | 1002 | ipc_answer_0(rid, rc); |
|
| - | 1003 | return; |
|
| - | 1004 | } |
|
| - | 1005 | vfs_node_t *node = vfs_node_get(&lr); |
|
| - | 1006 | if (!node) { |
|
| - | 1007 | fibril_rwlock_read_unlock(&namespace_rwlock); |
|
| - | 1008 | ipc_answer_0(callid, ENOMEM); |
|
| - | 1009 | ipc_answer_0(rid, ENOMEM); |
|
| - | 1010 | return; |
|
| - | 1011 | } |
|
| - | 1012 | ||
| - | 1013 | fibril_rwlock_read_unlock(&namespace_rwlock); |
|
| - | 1014 | ||
| - | 1015 | int fs_phone = vfs_grab_phone(node->fs_handle); |
|
| - | 1016 | aid_t msg; |
|
| - | 1017 | msg = async_send_3(fs_phone, VFS_OUT_STAT, node->dev_handle, |
|
| - | 1018 | node->index, false, NULL); |
|
| - | 1019 | ipc_forward_fast(callid, fs_phone, 0, 0, 0, IPC_FF_ROUTE_FROM_ME); |
|
| - | 1020 | async_wait_for(msg, &rc); |
|
| - | 1021 | vfs_release_phone(fs_phone); |
|
| - | 1022 | ||
| - | 1023 | ipc_answer_0(rid, rc); |
|
| - | 1024 | ||
| - | 1025 | vfs_node_put(node); |
|
| 966 | } |
1026 | } |
| 967 | 1027 | ||
| 968 | void vfs_mkdir(ipc_callid_t rid, ipc_call_t *request) |
1028 | void vfs_mkdir(ipc_callid_t rid, ipc_call_t *request) |
| 969 | { |
1029 | { |
| 970 | int mode = IPC_GET_ARG1(*request); |
1030 | int mode = IPC_GET_ARG1(*request); |