Attempt at building with CMake.
[bluesky.git] / bluesky.h
index c85fd70..856dd75 100644 (file)
--- a/bluesky.h
+++ b/bluesky.h
 #include <stdint.h>
 #include <glib.h>
 
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct S3Store;
+
+/* Reference-counted blocks of memory, used for passing data in and out of
+ * storage backends and in other places. */
+typedef struct {
+    gint refcount;
+    gchar *data;
+    gsize len;
+} BlueSkyRCStr;
+
+BlueSkyRCStr *bluesky_string_new(gpointer data, gsize len);
+void bluesky_string_ref(BlueSkyRCStr *string);
+void bluesky_string_unref(BlueSkyRCStr *string);
+BlueSkyRCStr *bluesky_string_dup(BlueSkyRCStr *string);
+
 /* File types.  The numeric values are chosen to match with those used in
  * NFSv3. */
 typedef enum {
@@ -32,6 +51,8 @@ typedef struct {
     gchar *name;                /* Descriptive name for the filesystem */
     GHashTable *inodes;         /* Cached inodes */
     uint64_t next_inum;         /* Next available inode for allocation */
+
+    struct S3Store *store;
 } BlueSkyFS;
 
 /* Inode number of the root directory. */
@@ -47,6 +68,8 @@ typedef struct {
     gint refcnt;                /* May be accessed atomically without lock */
     GMutex *lock;
 
+    BlueSkyFS *fs;
+
     BlueSkyFileType type;
     uint32_t mode;
     uint32_t uid, gid;
@@ -68,17 +91,19 @@ typedef struct {
     GArray *blocks;
 
     /* Directory-specific fields */
-    GSequence *dirents;
+    GSequence *dirents;         /* List of entries for READDIR */
+    GHashTable *dirhash;        /* Hash table by name for LOOKUP */
     uint64_t parent_inum;       /* inode for ".."; 0 if the root directory */
 } BlueSkyInode;
 
 /* A directory entry.  The name is UTF-8 and is a freshly-allocated string.
- * The name is hashed to a 64-bit value, and the directory entries are sorted
- * by hash value (the hash value can then be used as a cookie for resuming a
- * READDIR call). */
+ * Each directory entry is listed in two indices: dirents is indexed by cookie
+ * and dirhash by name.  The cookie is a randomly-assigned 32-bit value, unique
+ * within the directory, that remains unchanged until the entry is deleted.  It
+ * is used to provide a stable key for restarting a READDIR call. */
 typedef struct {
     gchar *name;
-    uint64_t hash;
+    uint32_t cookie;
     uint64_t inum;
 } BlueSkyDirent;
 
@@ -98,13 +123,14 @@ typedef enum {
 typedef struct {
     BlueSkyBlockType type;
     gchar *ref;                 /* Name of data block in the backing store */
-    gchar *data;                /* Pointer to data in memory */
+    BlueSkyRCStr *data;         /* Pointer to data in memory if cached */
 } BlueSkyBlock;
 
 BlueSkyFS *bluesky_new_fs(gchar *name);
 int64_t bluesky_get_current_time();
+void bluesky_inode_update_ctime(BlueSkyInode *inode, gboolean update_mtime);
 uint64_t bluesky_fs_alloc_inode(BlueSkyFS *fs);
-BlueSkyInode *bluesky_new_inode(uint64_t inum, BlueSkyFileType type);
+BlueSkyInode *bluesky_new_inode(uint64_t inum, BlueSkyFS *fs, BlueSkyFileType type);
 
 BlueSkyInode *bluesky_get_inode(BlueSkyFS *fs, uint64_t inum);
 void bluesky_insert_inode(BlueSkyFS *fs, BlueSkyInode *inode);
@@ -116,6 +142,21 @@ gboolean bluesky_directory_insert(BlueSkyInode *dir, gchar *name,
                                   uint64_t inum);
 void bluesky_directory_dump(BlueSkyInode *dir);
 
+void bluesky_block_touch(BlueSkyInode *inode, uint64_t i);
+void bluesky_block_fetch(BlueSkyFS *fs, BlueSkyBlock *block);
+void bluesky_block_flush(BlueSkyFS *fs, BlueSkyBlock *block);
 void bluesky_file_truncate(BlueSkyInode *inode, uint64_t size);
+void bluesky_file_write(BlueSkyInode *inode, uint64_t offset,
+                        const char *data, gint len);
+void bluesky_file_read(BlueSkyInode *inode, uint64_t offset,
+                       char *buf, gint len);
+
+struct S3Store *s3store_new();
+BlueSkyRCStr *s3store_get(struct S3Store *store, const gchar *key);
+void s3store_put(struct S3Store *store, const gchar *key, BlueSkyRCStr *val);
+
+#ifdef __cplusplus
+}
+#endif
 
 #endif