#include <ppapi/c/pp_instance.h>
#include <ppapi/c/ppb.h>
+#include "nacl_io/ostypes.h"
#include "sdk_util/macros.h"
EXTERN_C_BEGIN
+typedef void (*nacl_io_exit_callback_t)(int status, void* user_data);
+
+typedef void (*nacl_io_mount_callback_t)(const char* source,
+ const char* target,
+ const char* filesystemtype,
+ unsigned long mountflags,
+ const void* data,
+ dev_t dev,
+ void* user_data);
+
/**
* Initialize nacl_io.
*
* NOTE: If you initialize nacl_io with this constructor, you cannot
- * use any mounts that require PPAPI; e.g. persistent storage, etc.
+ * use any filesystems that require PPAPI; e.g. persistent storage, etc.
*/
-void nacl_io_init();
+int nacl_io_init();
/**
* Initialize nacl_io with PPAPI support.
* |get_interface| can be retrieved via
* pp::Module::Get()->get_browser_interface()
*/
-void nacl_io_init_ppapi(PP_Instance instance,
- PPB_GetInterface get_interface);
+int nacl_io_init_ppapi(PP_Instance instance, PPB_GetInterface get_interface);
+
+/**
+ * Uninitialize nacl_io.
+ *
+ * This removes interception for POSIX C-library function and releases
+ * any associated resources.
+ */
+int nacl_io_uninit();
+void nacl_io_set_exit_callback(nacl_io_exit_callback_t exit_callback,
+ void* user_data);
/**
* Mount a new filesystem type.
* data: Unused.
*
* "html5fs": A filesystem that uses PPAPI FileSystem interface, which can be
- * read in JavaScript via the HTML5 FileSystem API. This mount
+ * read in JavaScript via the HTML5 FileSystem API. This filesystem
* provides the use of persistent storage. Please read the
* documentation in ppapi/c/ppb_file_system.h for more information.
* source: Unused.
* "PERSISTENT" and "TEMPORARY". The default is "PERSISTENT".
* "expected_size": The expected file-system size. Note that this does
* not request quota -- you must do that from JavaScript.
+ * "filesystem_resource": If specified, this is a string that contains
+ * the integer ID of the Filesystem resource to use instead of
+ * creating a new one. The "type" and "expected_size" parameters are
+ * ignored in this case. This parameter is useful when you pass a
+ * Filesystem resource from JavaScript, but still want to be able to
+ * call open/read/write/etc.
*
* "httpfs": A filesystem that reads from a URL via HTTP.
* source: The root URL to read from. All paths read from this filesystem
* unsigned long mountflags, const void *data) NOTHROW;
*/
+/**
+ * Register a new filesystem type, using a FUSE interface to implement it.
+ *
+ * Example:
+ * int my_open(const char* path, struct fuse_file_info*) {
+ * ...
+ * }
+ *
+ * int my_read(const char* path, char* buf, size_t count, off_t offset, struct
+ * fuse_file_info* info) {
+ * ...
+ * }
+ *
+ * struct fuse_operations my_fuse_ops = {
+ * ...
+ * my_open,
+ * NULL, // opendir() not implemented.
+ * my_read,
+ * ...
+ * };
+ *
+ * ...
+ *
+ * const char fs_type[] = "my_fs";
+ * int result = nacl_io_register_fs_type(fs_type, &my_fuse_ops);
+ * if (!result) {
+ * fprintf(stderr, "Error registering filesystem type %s.\n", fs_type);
+ * exit(1);
+ * }
+ *
+ * ...
+ *
+ * int result = mount("", "/fs/foo", fs_type, 0, NULL);
+ * if (!result) {
+ * fprintf(stderr, "Error mounting %s.\n", fs_type);
+ * exit(1);
+ * }
+ *
+ * See fuse.h for more information about the FUSE interface.
+ * Also see fuse.sourceforge.net for more information about FUSE in general.
+ *
+ * @param[in] fs_type The name of the new filesystem type.
+ * @param[in] fuse_ops A pointer to the FUSE interface that will be used to
+ * implement this filesystem type. This pointer must be valid for the
+ * lifetime of all filesystems and nodes that are created with it.
+ * @return 0 on success, -1 on failure (with errno set).
+ */
+struct fuse_operations;
+int nacl_io_register_fs_type(const char* fs_type,
+ struct fuse_operations* fuse_ops);
+
+/**
+ * Unregister a filesystem type, previously registered by
+ * nacl_io_register_fs_type().
+ *
+ * @param[in] fs_type The name of the filesystem type; the same identifier that
+ * was passed to nacl_io_register_fs_type().
+ * @return 0 on success, -1 on failure (with errno set).
+ */
+int nacl_io_unregister_fs_type(const char* fs_type);
+
+/**
+ * Set a mount callback.
+ *
+ * This callback is called whenever mount() succeeds. This callback can be used
+ * to get the dev number of the newly-mounted filesystem.
+ *
+ * @param[in] callback The callback to set, or NULL.
+ * @param[in] user_data User data that will be passed to the callback.
+ * @return 0 on success, -1 on failure.
+ */
+void nacl_io_set_mount_callback(nacl_io_mount_callback_t callback,
+ void* user_data);
+
EXTERN_C_END
-#endif /* LIBRARIES_NACL_IO_NACL_IO_H_ */
+#endif /* LIBRARIES_NACL_IO_NACL_IO_H_ */