/* fuse-overlayfs: Overlay Filesystem in Userspace Copyright (C) 2019 Red Hat Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #ifndef FUSE_OVERLAYFS_H #define FUSE_OVERLAYFS_H #define _GNU_SOURCE #include #include #include #include #define ACL_XATTR "system.posix_acl_default" typedef struct hash_table Hash_table; struct ovl_ino { struct ovl_node *node; ino_t ino; dev_t dev; int lookups; mode_t mode; }; struct ovl_node { struct ovl_node *parent; Hash_table *children; struct ovl_layer *layer, *last_layer; ino_t tmp_ino; dev_t tmp_dev; char *path; char *name; int hidden_dirfd; int node_lookups; size_t name_hash; Hash_table *inodes; struct ovl_ino *ino; struct ovl_node *next_link; unsigned int in_readdir; size_t n_links; unsigned int do_unlink : 1; unsigned int do_rmdir : 1; unsigned int hidden : 1; unsigned int whiteout : 1; unsigned int loaded : 1; }; struct ovl_mapping { struct ovl_mapping *next; unsigned int host; unsigned int to; unsigned int len; }; struct ovl_data { struct fuse_session *se; char *uid_str; char *gid_str; struct ovl_mapping *uid_mappings; struct ovl_mapping *gid_mappings; char *mountpoint; char *lowerdir; char *context; char *upperdir; char *workdir; char *redirect_dir; char *plugins; int workdir_fd; int debug; struct ovl_layer *layers; Hash_table *inodes; struct ovl_node *root; char *timeout_str; double timeout; int threaded; int fsync; int noacl; int fast_ino_check; int writeback; int disable_xattrs; int xattr_permissions; int squash_to_root; int squash_to_uid; int squash_to_gid; int static_nlink; int volatile_mode; /* current uid/gid*/ uid_t uid; uid_t gid; /* process euid. */ uid_t euid; struct ovl_plugin_context *plugins_ctx; }; enum stat_override_mode { STAT_OVERRIDE_NONE, STAT_OVERRIDE_USER, STAT_OVERRIDE_PRIVILEGED, STAT_OVERRIDE_CONTAINERS, }; struct ovl_layer { struct ovl_layer *next; struct data_source *ds; struct ovl_data *ovl_data; char *path; int fd; bool low; void *data_source_private_data; int stat_override_mode; }; /* a data_source defines the methods for accessing a lower layer. */ struct data_source { int (*num_of_layers) (const char *opaque, const char *path); int (*load_data_source) (struct ovl_layer *l, const char *opaque, const char *path, int n_layer); int (*cleanup) (struct ovl_layer *l); int (*file_exists) (struct ovl_layer *l, const char *pathname); int (*statat) (struct ovl_layer *l, const char *path, struct stat *st, int flags, unsigned int mask); int (*fstat) (struct ovl_layer *l, int fd, const char *path, unsigned int mask, struct stat *st); void *(*opendir) (struct ovl_layer *l, const char *path); struct dirent *(*readdir) (void *dirp); int (*closedir) (void *dirp); int (*openat) (struct ovl_layer *l, const char *path, int flags, mode_t mode); int (*listxattr) (struct ovl_layer *l, const char *path, char *buf, size_t size); int (*getxattr) (struct ovl_layer *l, const char *path, const char *name, char *buf, size_t size); ssize_t (*readlinkat) (struct ovl_layer *l, const char *path, char *buf, size_t bufsiz); bool (*support_acls) (struct ovl_layer *l); }; /* passthrough to the file system. */ extern struct data_source direct_access_ds; #ifndef HAVE_STATX # define STATX_TYPE 0x00000001U /* Want/got stx_mode & S_IFMT */ # define STATX_MODE 0x00000002U /* Want/got stx_mode & ~S_IFMT */ # define STATX_NLINK 0x00000004U /* Want/got stx_nlink */ # define STATX_UID 0x00000008U /* Want/got stx_uid */ # define STATX_GID 0x00000010U /* Want/got stx_gid */ # define STATX_ATIME 0x00000020U /* Want/got stx_atime */ # define STATX_MTIME 0x00000040U /* Want/got stx_mtime */ # define STATX_CTIME 0x00000080U /* Want/got stx_ctime */ # define STATX_INO 0x00000100U /* Want/got stx_ino */ # define STATX_SIZE 0x00000200U /* Want/got stx_size */ # define STATX_BLOCKS 0x00000400U /* Want/got stx_blocks */ # define STATX_BASIC_STATS 0x000007ffU /* The stuff in the normal stat struct */ # define STATX_BTIME 0x00000800U /* Want/got stx_btime */ # define STATX_ALL 0x00000fffU /* All currently supported flags */ #endif #endif