interface vfs extends service { /* Register a filesystem driver */ ipcarg_t register(in_copy string name); /* Mount filesystem */ ipcarg_t mount(in ipcarg_t device, in ipcarg_t flags, in_copy string point, in_copy string opts, in_copy string fs); /* Open file */ ipcarg_t open(in ipcarg_t lflag, in ipcarg_t oflag, in ipcarg_t mode, in_copy string path, out ipcarg_t fd); /* Open file using node */ ipcarg_t open_node(in ipcarg_t fs_handle, in ipcarg_t dev_handle, in ipcarg_t index, in ipcarg_t oflag, out ipcarg_t fd); /* Read data from file */ ipcarg_t read(in ipcarg_t fd, out_copy stream data); /* Write data to file */ ipcarg_t write(in ipcarg_t fd, in_copy stream data); /* Seek in file */ ipcarg_t seek(in ipcarg_t fd, in ipcarg_t offset, in ipcarg_t whence); /* Truncate file */ ipcarg_t truncate(in ipcarg_t fd, in ipcarg_t size); /* Get file metadata */ ipcarg_t fstat(in ipcarg_t fd, out_copy stream stat); /* Get directory entry metadata */ ipcarg_t stat(in_copy string path, out_copy stream stat); /* Create directory */ ipcarg_t mkdir(in ipcarg_t mode, in_copy string path); /* Delete directory entry */ ipcarg_t unlink(in ipcarg_t lflag, in_copy string path); /* Rename directory entry */ ipcarg_t rename(in_copy string old, in_copy string new); /* Flush file buffers */ ipcarg_t sync(in ipcarg_t fd); /* In-protocol status value */ ipcarg_t ipc_m_ping(void); /* Close connection */ ipcarg_t ipc_m_phone_hungup(void); protocol: [vfs.bp] }; interface fs extends service { /* Notify filesystem that it was mounted */ ipcarg_t mounted(in ipcarg_t dev_handle, in_copy string opts); /* Mount filesystem */ ipcarg_t mount(in ipcarg_t device, in ipcarg_t flags, in_copy string point, in_copy string opts, ...); /* Open file by node */ ipcarg_t open_node(in ipcarg_t lflag, in ipcarg_t oflag, in ipcarg_t mode, ...); /* Lookup file */ ipcarg_t lookup(in ipcarg_t lflag, in ipcarg_t oflag, in ipcarg_t mode, ...); /* Read data from file */ ipcarg_t read(in ipcarg_t dev_handle, in ipcarg_t fs_index, in ipcarg_t offset, out_copy stream data); /* Write data to file */ ipcarg_t write(in ipcarg_t dev_handle, in ipcarg_t fs_index, in ipcarg_t offset, in_copy stream data); /* Truncate file */ ipcarg_t truncate(in ipcarg_t dev_handle, in ipcarg_t fs_index, in ipcarg_t size); /* Get directory entry metadata */ ipcarg_t stat(in ipcarg_t dev_handle, in ipcarg_t fs_index, out_copy stream stat); /* Flush file buffers */ ipcarg_t sync(in ipcarg_t dev_handle, in ipcarg_t fs_index); /* Notify on file close */ ipcarg_t close(in ipcarg_t dev_handle, in ipcarg_t fs_index); }; frame io_dispatcher { provides: vfs vfs; requires: [/uspace/lib/libc/requires] tmpfs tmpfs; fat fat; devfs devfs; ns ns; initialization: !ns.ipc_m_connect_to_me /* vfs */ protocol: [/uspace/lib/libc/protocol] }; architecture vfs { inst io_dispatcher io_dispatcher; inst tmpfs tmpfs; inst fat fat; inst devfs devfs; bind io_dispatcher:tmpfs to tmpfs:tmpfs; bind io_dispatcher:fat to fat:fat; bind io_dispatcher:devfs to devfs:devfs; bind tmpfs:vfs to io_dispatcher:vfs; bind fat:vfs to io_dispatcher:vfs; bind devfs:vfs to io_dispatcher:vfs; delegate vfs to io_dispatcher:vfs; [/uspace/lib/libc/subsume%io_dispatcher] [/uspace/lib/libc/subsume%tmpfs] [/uspace/lib/libc/subsume%fat] [/uspace/lib/libc/subsume%devfs] subsume io_dispatcher:ns to ns; subsume tmpfs:ns to ns; subsume fat:ns to ns; subsume devfs:ns to ns; subsume tmpfs:rd to rd; subsume fat:rd to rd; subsume devfs:devmap_client to devmap_client; subsume devfs:device to device; };