Changes in uspace/lib/fs/libfs.c [2d884ab:67632f7] in mainline


Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/fs/libfs.c

    r2d884ab r67632f7  
    4545#include <mem.h>
    4646#include <sys/stat.h>
     47#include <sys/statfs.h>
    4748#include <stdlib.h>
    4849
     
    7475static void libfs_open_node(libfs_ops_t *, fs_handle_t, ipc_callid_t,
    7576    ipc_call_t *);
     77static void libfs_statfs(libfs_ops_t *, fs_handle_t, ipc_callid_t, ipc_call_t *);
    7678
    7779static void vfs_out_mounted(ipc_callid_t rid, ipc_call_t *req)
     
    219221}
    220222
     223static void vfs_out_statfs(ipc_callid_t rid, ipc_call_t *req)
     224{
     225        libfs_statfs(libfs_ops, reg.fs_handle, rid, req);
     226}
    221227static void vfs_connection(ipc_callid_t iid, ipc_call_t *icall, void *arg)
    222228{
     
    276282                case VFS_OUT_SYNC:
    277283                        vfs_out_sync(callid, &call);
     284                        break;
     285                case VFS_OUT_STATFS:
     286                        vfs_out_statfs(callid, &call);
    278287                        break;
    279288                default:
     
    830839}
    831840
     841void libfs_statfs(libfs_ops_t *ops, fs_handle_t fs_handle, ipc_callid_t rid,
     842    ipc_call_t *request)
     843{
     844        service_id_t service_id = (service_id_t) IPC_GET_ARG1(*request);
     845        fs_index_t index = (fs_index_t) IPC_GET_ARG2(*request);
     846       
     847        fs_node_t *fn;
     848        int rc = ops->node_get(&fn, service_id, index);
     849        on_error(rc, answer_and_return(rid, rc));
     850       
     851        ipc_callid_t callid;
     852        size_t size;
     853        if ((!async_data_read_receive(&callid, &size)) ||
     854            (size != sizeof(struct statfs))) {
     855                ops->node_put(fn);
     856                async_answer_0(callid, EINVAL);
     857                async_answer_0(rid, EINVAL);
     858                return;
     859        }
     860       
     861        struct statfs statfs;
     862        memset(&statfs, 0, sizeof(struct statfs));
     863
     864        if (NULL != ops->size_block)   
     865                statfs.f_bsize = ops->size_block(service_id);
     866        if (NULL != ops->total_block)
     867                statfs.f_blocks = ops->total_block(service_id);
     868        if (NULL != ops->free_block)
     869                statfs.f_bfree = ops->free_block(service_id);
     870       
     871        ops->node_put(fn);
     872       
     873        async_data_read_finalize(callid, &statfs, sizeof(struct statfs));
     874        async_answer_0(rid, EOK);
     875}
     876
     877
    832878/** Open VFS triplet.
    833879 *
Note: See TracChangeset for help on using the changeset viewer.