Home | History | Annotate | Download | only in nacl_io
      1 /* Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2  * Use of this source code is governed by a BSD-style license that can be
      3  * found in the LICENSE file. */
      4 
      5 #ifndef LIBRARIES_NACL_IO_NACL_IO_H_
      6 #define LIBRARIES_NACL_IO_NACL_IO_H_
      7 
      8 #include <ppapi/c/pp_instance.h>
      9 #include <ppapi/c/ppb.h>
     10 
     11 #include "nacl_io/ostypes.h"
     12 #include "sdk_util/macros.h"
     13 
     14 EXTERN_C_BEGIN
     15 
     16 typedef void (*nacl_io_exit_callback_t)(int status, void* user_data);
     17 
     18 typedef void (*nacl_io_mount_callback_t)(const char* source,
     19                                          const char* target,
     20                                          const char* filesystemtype,
     21                                          unsigned long mountflags,
     22                                          const void* data,
     23                                          dev_t dev,
     24                                          void* user_data);
     25 
     26 /**
     27  * Initialize nacl_io.
     28  *
     29  * NOTE: If you initialize nacl_io with this constructor, you cannot
     30  * use any filesystems that require PPAPI; e.g. persistent storage, etc.
     31  */
     32 int nacl_io_init();
     33 
     34 /**
     35  * Initialize nacl_io with PPAPI support.
     36  *
     37  * Usage:
     38  *   PP_Instance instance;
     39  *   PPB_GetInterface get_interface;
     40  *   nacl_io_init(instance, get_interface);
     41  *
     42  * If you are using the PPAPI C interface:
     43  *   |instance| is passed to your instance in the DidCreate function.
     44  *   |get_interface| is passed to your module in the PPP_InitializeModule
     45  *   function.
     46  *
     47  * If you are using the PPAPI C++ interface:
     48  *   |instance| can be retrieved via the pp::Instance::pp_instance() method.
     49  *   |get_interface| can be retrieved via
     50  *       pp::Module::Get()->get_browser_interface()
     51  */
     52 int nacl_io_init_ppapi(PP_Instance instance, PPB_GetInterface get_interface);
     53 
     54 /**
     55  * Uninitialize nacl_io.
     56  *
     57  * This removes interception for POSIX C-library function and releases
     58  * any associated resources.
     59  */
     60 int nacl_io_uninit();
     61 
     62 void nacl_io_set_exit_callback(nacl_io_exit_callback_t exit_callback,
     63                                void* user_data);
     64 
     65 /**
     66  * Mount a new filesystem type.
     67  *
     68  * This function is declared in <sys/mount.h>, but we document it here
     69  * because nacl_io is controlled primarily through mount(2)/umount(2).
     70  *
     71  * Some parameters are dependent on the filesystem type being mounted.
     72  *
     73  * The |data| parameter, if used, is always parsed as a string of comma
     74  * separated key-value pairs:
     75  *   e.g. "key1=param1,key2=param2"
     76  *
     77  *
     78  * filesystem types:
     79  *   "memfs": An in-memory filesystem.
     80  *     source: Unused.
     81  *     data: Unused.
     82  *
     83  *   "dev": A filesystem with various utility nodes. Some examples:
     84  *          "null": equivalent to /dev/null.
     85  *          "zero": equivalent to /dev/zero.
     86  *          "urandom": equivalent to /dev/urandom.
     87  *          "console[0-3]": logs to the JavaScript console with varying log
     88  *              levels.
     89  *          "tty": Posts a message to JavaScript, which will send a "message"
     90  *              event from this module's embed element.
     91  *     source: Unused.
     92  *     data: Unused.
     93  *
     94  *   "html5fs": A filesystem that uses PPAPI FileSystem interface, which can be
     95  *              read in JavaScript via the HTML5 FileSystem API. This filesystem
     96  *              provides the use of persistent storage. Please read the
     97  *              documentation in ppapi/c/ppb_file_system.h for more information.
     98  *     source: Unused.
     99  *     data: A string of parameters:
    100  *       "type": Which type of filesystem to mount. Valid values are
    101  *           "PERSISTENT" and "TEMPORARY". The default is "PERSISTENT".
    102  *       "expected_size": The expected file-system size. Note that this does
    103  *           not request quota -- you must do that from JavaScript.
    104  *       "filesystem_resource": If specified, this is a string that contains
    105  *           the integer ID of the Filesystem resource to use instead of
    106  *           creating a new one. The "type" and "expected_size" parameters are
    107  *           ignored in this case. This parameter is useful when you pass a
    108  *           Filesystem resource from JavaScript, but still want to be able to
    109  *           call open/read/write/etc.
    110  *
    111  *   "httpfs": A filesystem that reads from a URL via HTTP.
    112  *     source: The root URL to read from. All paths read from this filesystem
    113  *             will be appended to this root.
    114  *             e.g. If source == "http://example.com/path", reading from
    115  *             "foo/bar.txt" will attempt to read from the URL
    116  *             "http://example.com/path/foo/bar.txt".
    117  *     data: A string of parameters:
    118  *       "allow_cross_origin_requests": If "true", then reads from this
    119  *           filesystem will follow the CORS standard for cross-origin requests.
    120  *           See http://www.w3.org/TR/access-control.
    121  *       "allow_credentials": If "true", credentials are sent with cross-origin
    122  *           requests. If false, no credentials are sent with the request and
    123  *           cookies are ignored in the response.
    124  *       All other key/value pairs are assumed to be headers to use with
    125  *       HTTP requests.
    126  *
    127  *   "passthroughfs": A filesystem that passes all requests through to the
    128  *                    underlying NaCl calls. The primary use of this filesystem
    129  *                    is to allow reading NMF resources.
    130  *     source: Unused.
    131  *     data: Unused.
    132  *
    133  *
    134  * @param[in] source Depends on the filesystem type. See above.
    135  * @param[in] target The absolute path to mount the filesystem.
    136  * @param[in] filesystemtype The name of the filesystem type to mount. See
    137  *     above for examples.
    138  * @param[in] mountflags Unused.
    139  * @param[in] data Depends on the filesystem type. See above.
    140  * @return 0 on success, -1 on failure (with errno set).
    141  *
    142  * int mount(const char* source, const char* target, const char* filesystemtype,
    143  *         unsigned long mountflags, const void *data) NOTHROW;
    144  */
    145 
    146 /**
    147  * Register a new filesystem type, using a FUSE interface to implement it.
    148  *
    149  * Example:
    150  *   int my_open(const char* path, struct fuse_file_info*) {
    151  *     ...
    152  *   }
    153  *
    154  *   int my_read(const char* path, char* buf, size_t count, off_t offset, struct
    155  *               fuse_file_info* info) {
    156  *     ...
    157  *   }
    158  *
    159  *   struct fuse_operations my_fuse_ops = {
    160  *     ...
    161  *     my_open,
    162  *     NULL,  // opendir() not implemented.
    163  *     my_read,
    164  *     ...
    165  *   };
    166  *
    167  *   ...
    168  *
    169  *   const char fs_type[] = "my_fs";
    170  *   int result = nacl_io_register_fs_type(fs_type, &my_fuse_ops);
    171  *   if (!result) {
    172  *     fprintf(stderr, "Error registering filesystem type %s.\n", fs_type);
    173  *     exit(1);
    174  *   }
    175  *
    176  *   ...
    177  *
    178  *   int result = mount("", "/fs/foo", fs_type, 0, NULL);
    179  *   if (!result) {
    180  *     fprintf(stderr, "Error mounting %s.\n", fs_type);
    181  *     exit(1);
    182  *   }
    183  *
    184  * See fuse.h for more information about the FUSE interface.
    185  * Also see fuse.sourceforge.net for more information about FUSE in general.
    186  *
    187  * @param[in] fs_type The name of the new filesystem type.
    188  * @param[in] fuse_ops A pointer to the FUSE interface that will be used to
    189  *     implement this filesystem type. This pointer must be valid for the
    190  *     lifetime of all filesystems and nodes that are created with it.
    191  * @return 0 on success, -1 on failure (with errno set).
    192  */
    193 struct fuse_operations;
    194 int nacl_io_register_fs_type(const char* fs_type,
    195                              struct fuse_operations* fuse_ops);
    196 
    197 /**
    198  * Unregister a filesystem type, previously registered by
    199  * nacl_io_register_fs_type().
    200  *
    201  * @param[in] fs_type The name of the filesystem type; the same identifier that
    202  *     was passed to nacl_io_register_fs_type().
    203  * @return 0 on success, -1 on failure (with errno set).
    204  */
    205 int nacl_io_unregister_fs_type(const char* fs_type);
    206 
    207 /**
    208  * Set a mount callback.
    209  *
    210  * This callback is called whenever mount() succeeds. This callback can be used
    211  * to get the dev number of the newly-mounted filesystem.
    212  *
    213  * @param[in] callback The callback to set, or NULL.
    214  * @param[in] user_data User data that will be passed to the callback.
    215  * @return 0 on success, -1 on failure.
    216  */
    217 void nacl_io_set_mount_callback(nacl_io_mount_callback_t callback,
    218                                 void* user_data);
    219 
    220 EXTERN_C_END
    221 
    222 #endif /* LIBRARIES_NACL_IO_NACL_IO_H_ */
    223