Primitive path_lookup()
[akaros.git] / kern / include / vfs.h
index 93e8524..5abbe97 100644 (file)
@@ -85,8 +85,11 @@ struct qstr {
 /* Helpful structure to pass around during lookup operations.  At each point,
  * it tracks the the answer, the name of the previous, how deep the symlink
  * following has gone, and the symlink pathnames.  *dentry and *mnt up the
- * refcnt of those objects too, so whoever receives this will need to decref.
- * We'll see how this works out... */
+ * refcnt of those objects too, so whoever 'receives; this will need to decref.
+ * This is meant to be pinning only the 'answer' to a path_lookup, and not the
+ * intermediate steps.  The intermediates get pinned due to the existence of
+ * their children in memory.  Internally, the VFS will refcnt any item whenever
+ * it is in this struct. */
 #define MAX_SYMLINK_DEPTH 6 // arbitrary.
 struct nameidata {
        struct dentry                           *dentry;                /* dentry of the obj */
@@ -99,6 +102,15 @@ struct nameidata {
        int                                                     intent;                 /* access type for the file */
 };
 
+/* nameidata lookup flags and access type fields */
+#define LOOKUP_FOLLOW          0x01    /* if the last is a symlink, follow */
+#define LOOKUP_DIRECTORY       0x02    /* last component must be a directory */
+#define LOOKUP_CONTINUE        0x04    /* still filenames to go */
+#define LOOKUP_PARENT          0x08    /* lookup the dir that includes the item */
+#define LOOKUP_OPEN            0x10    /* intent is to open a file */
+#define LOOKUP_CREATE          0x11    /* create a file if it doesn't exist */
+#define LOOKUP_ACCESS          0x12    /* access / check user permissions */
+
 /* Every object that has pages, like an inode or the swap (or even direct block
  * devices) has a page_map, tracking which of its pages are currently in memory.
  * It is a map, per object, from index to physical page frame. */
@@ -413,6 +425,8 @@ extern struct kmem_cache *file_kcache;
 /* Misc VFS functions */
 void vfs_init(void);
 void qstr_builder(struct dentry *dentry, char *l_name);
+int path_lookup(char *path, int flags, struct nameidata *nd);
+void path_release(struct nameidata *nd);
 
 /* Superblock functions */
 struct super_block *get_sb(void);
@@ -425,6 +439,9 @@ struct dentry *get_dentry(struct super_block *sb, struct dentry *parent,
                           char *name);
 void dcache_put(struct dentry *dentry);
 
+/* Inode Functions */
+int check_perms(struct inode *inode, int access_mode);
+
 /* File functions */
 ssize_t generic_file_read(struct file *file, char *buf, size_t count,
                           off_t *offset);
@@ -437,4 +454,9 @@ int pm_insert_page(struct page_map *pm, unsigned long index, struct page *page);
 int pm_remove_page(struct page_map *pm, struct page *page);
 int file_load_page(struct file *file, unsigned long index, struct page **pp);
 
+/* Process-related File management functions */
+struct file *get_file_from_fd(struct files_struct *open_files, int fd);
+struct file *put_file_from_fd(struct files_struct *open_files, int file_desc);
+int insert_file(struct files_struct *open_files, struct file *file);
+
 #endif /* ROS_KERN_VFS_H */