/* File types. The numeric values are chosen to match with those used in
* NFSv3. */
-enum BlueSkyFileType {
- BLUESKY_INVALID = 0,
+typedef enum {
BLUESKY_REGULAR = 1,
BLUESKY_DIRECTORY = 2,
BLUESKY_BLOCK = 3,
BLUESKY_SYMLINK = 5,
BLUESKY_SOCKET = 6,
BLUESKY_FIFO = 7,
-};
+} BlueSkyFileType;
/* Filesystem state. Each filesystem which is exported is represented by a
* single bluesky_fs structure in memory. */
uint64_t next_inum; /* Next available inode for allocation */
} BlueSkyFS;
+/* Inode number of the root directory. */
+#define BLUESKY_ROOT_INUM 1
+
/* Timestamp, measured in microseconds since the Unix epoch. */
typedef int64_t bluesky_time;
gint refcnt; /* May be accessed atomically without lock */
GMutex *lock;
- int type;
+ BlueSkyFileType type;
uint32_t mode;
uint32_t uid, gid;
uint32_t nlink;
/* Directory-specific fields */
GSequence *dirents;
+ 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.
uint64_t inum;
} BlueSkyDirent ;
+BlueSkyFS *bluesky_new_fs(gchar *name);
int64_t bluesky_get_current_time();
uint64_t bluesky_fs_alloc_inode(BlueSkyFS *fs);
-BlueSkyInode *bluesky_new_inode(uint64_t inum);
+BlueSkyInode *bluesky_new_inode(uint64_t inum, BlueSkyFileType type);
+
+BlueSkyInode *bluesky_get_inode(BlueSkyFS *fs, uint64_t inum);
+void bluesky_insert_inode(BlueSkyFS *fs, BlueSkyInode *inode);
void bluesky_dirent_destroy(gpointer dirent);
uint64_t bluesky_directory_hash(gchar *name);