1b886d83cSThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */
263e2b423SJohn Johansen /*
363e2b423SJohn Johansen  * AppArmor security module
463e2b423SJohn Johansen  *
563e2b423SJohn Johansen  * This file contains AppArmor filesystem definitions.
663e2b423SJohn Johansen  *
763e2b423SJohn Johansen  * Copyright (C) 1998-2008 Novell/SUSE
863e2b423SJohn Johansen  * Copyright 2009-2010 Canonical Ltd.
963e2b423SJohn Johansen  */
1063e2b423SJohn Johansen 
1163e2b423SJohn Johansen #ifndef __AA_APPARMORFS_H
1263e2b423SJohn Johansen #define __AA_APPARMORFS_H
1363e2b423SJohn Johansen 
14a71ada30SJohn Johansen extern struct path aa_null;
15a71ada30SJohn Johansen 
16c97204baSJohn Johansen enum aa_sfs_type {
17c97204baSJohn Johansen 	AA_SFS_TYPE_BOOLEAN,
18c97204baSJohn Johansen 	AA_SFS_TYPE_STRING,
19c97204baSJohn Johansen 	AA_SFS_TYPE_U64,
20c97204baSJohn Johansen 	AA_SFS_TYPE_FOPS,
21c97204baSJohn Johansen 	AA_SFS_TYPE_DIR,
229acd494bSKees Cook };
239acd494bSKees Cook 
24c97204baSJohn Johansen struct aa_sfs_entry;
259acd494bSKees Cook 
26c97204baSJohn Johansen struct aa_sfs_entry {
279acd494bSKees Cook 	const char *name;
289acd494bSKees Cook 	struct dentry *dentry;
299acd494bSKees Cook 	umode_t mode;
30c97204baSJohn Johansen 	enum aa_sfs_type v_type;
319acd494bSKees Cook 	union {
32e74abcf3SKees Cook 		bool boolean;
33a9bf8e9fSKees Cook 		char *string;
34e74abcf3SKees Cook 		unsigned long u64;
35c97204baSJohn Johansen 		struct aa_sfs_entry *files;
369acd494bSKees Cook 	} v;
379acd494bSKees Cook 	const struct file_operations *file_ops;
389acd494bSKees Cook };
399acd494bSKees Cook 
40c97204baSJohn Johansen extern const struct file_operations aa_sfs_seq_file_ops;
41e74abcf3SKees Cook 
42c97204baSJohn Johansen #define AA_SFS_FILE_BOOLEAN(_name, _value) \
43e74abcf3SKees Cook 	{ .name = (_name), .mode = 0444, \
44c97204baSJohn Johansen 	  .v_type = AA_SFS_TYPE_BOOLEAN, .v.boolean = (_value), \
45c97204baSJohn Johansen 	  .file_ops = &aa_sfs_seq_file_ops }
46c97204baSJohn Johansen #define AA_SFS_FILE_STRING(_name, _value) \
47a9bf8e9fSKees Cook 	{ .name = (_name), .mode = 0444, \
48c97204baSJohn Johansen 	  .v_type = AA_SFS_TYPE_STRING, .v.string = (_value), \
49c97204baSJohn Johansen 	  .file_ops = &aa_sfs_seq_file_ops }
50c97204baSJohn Johansen #define AA_SFS_FILE_U64(_name, _value) \
51e74abcf3SKees Cook 	{ .name = (_name), .mode = 0444, \
52c97204baSJohn Johansen 	  .v_type = AA_SFS_TYPE_U64, .v.u64 = (_value), \
53c97204baSJohn Johansen 	  .file_ops = &aa_sfs_seq_file_ops }
54c97204baSJohn Johansen #define AA_SFS_FILE_FOPS(_name, _mode, _fops) \
55c97204baSJohn Johansen 	{ .name = (_name), .v_type = AA_SFS_TYPE_FOPS, \
569acd494bSKees Cook 	  .mode = (_mode), .file_ops = (_fops) }
57c97204baSJohn Johansen #define AA_SFS_DIR(_name, _value) \
58c97204baSJohn Johansen 	{ .name = (_name), .v_type = AA_SFS_TYPE_DIR, .v.files = (_value) }
599acd494bSKees Cook 
6063e2b423SJohn Johansen extern void __init aa_destroy_aafs(void);
6163e2b423SJohn Johansen 
620d259f04SJohn Johansen struct aa_profile;
6398849dffSJohn Johansen struct aa_ns;
640d259f04SJohn Johansen 
650d259f04SJohn Johansen enum aafs_ns_type {
660d259f04SJohn Johansen 	AAFS_NS_DIR,
670d259f04SJohn Johansen 	AAFS_NS_PROFS,
680d259f04SJohn Johansen 	AAFS_NS_NS,
695ac8c355SJohn Johansen 	AAFS_NS_RAW_DATA,
70b7fd2c03SJohn Johansen 	AAFS_NS_LOAD,
71b7fd2c03SJohn Johansen 	AAFS_NS_REPLACE,
72b7fd2c03SJohn Johansen 	AAFS_NS_REMOVE,
73d9bf2c26SJohn Johansen 	AAFS_NS_REVISION,
740d259f04SJohn Johansen 	AAFS_NS_COUNT,
750d259f04SJohn Johansen 	AAFS_NS_MAX_COUNT,
760d259f04SJohn Johansen 	AAFS_NS_SIZE,
770d259f04SJohn Johansen 	AAFS_NS_MAX_SIZE,
780d259f04SJohn Johansen 	AAFS_NS_OWNER,
790d259f04SJohn Johansen 	AAFS_NS_SIZEOF,
800d259f04SJohn Johansen };
810d259f04SJohn Johansen 
820d259f04SJohn Johansen enum aafs_prof_type {
830d259f04SJohn Johansen 	AAFS_PROF_DIR,
840d259f04SJohn Johansen 	AAFS_PROF_PROFS,
850d259f04SJohn Johansen 	AAFS_PROF_NAME,
860d259f04SJohn Johansen 	AAFS_PROF_MODE,
87556d0be7SJohn Johansen 	AAFS_PROF_ATTACH,
88f8eb8a13SJohn Johansen 	AAFS_PROF_HASH,
895ac8c355SJohn Johansen 	AAFS_PROF_RAW_DATA,
905ac8c355SJohn Johansen 	AAFS_PROF_RAW_HASH,
915ac8c355SJohn Johansen 	AAFS_PROF_RAW_ABI,
920d259f04SJohn Johansen 	AAFS_PROF_SIZEOF,
930d259f04SJohn Johansen };
940d259f04SJohn Johansen 
950d259f04SJohn Johansen #define ns_dir(X) ((X)->dents[AAFS_NS_DIR])
960d259f04SJohn Johansen #define ns_subns_dir(X) ((X)->dents[AAFS_NS_NS])
970d259f04SJohn Johansen #define ns_subprofs_dir(X) ((X)->dents[AAFS_NS_PROFS])
985ac8c355SJohn Johansen #define ns_subdata_dir(X) ((X)->dents[AAFS_NS_RAW_DATA])
99b7fd2c03SJohn Johansen #define ns_subload(X) ((X)->dents[AAFS_NS_LOAD])
100b7fd2c03SJohn Johansen #define ns_subreplace(X) ((X)->dents[AAFS_NS_REPLACE])
101b7fd2c03SJohn Johansen #define ns_subremove(X) ((X)->dents[AAFS_NS_REMOVE])
102d9bf2c26SJohn Johansen #define ns_subrevision(X) ((X)->dents[AAFS_NS_REVISION])
1030d259f04SJohn Johansen 
1040d259f04SJohn Johansen #define prof_dir(X) ((X)->dents[AAFS_PROF_DIR])
1050d259f04SJohn Johansen #define prof_child_dir(X) ((X)->dents[AAFS_PROF_PROFS])
1060d259f04SJohn Johansen 
1075d5182caSJohn Johansen void __aa_bump_ns_revision(struct aa_ns *ns);
108c97204baSJohn Johansen void __aafs_profile_rmdir(struct aa_profile *profile);
109c97204baSJohn Johansen void __aafs_profile_migrate_dents(struct aa_profile *old,
1100d259f04SJohn Johansen 				   struct aa_profile *new);
111c97204baSJohn Johansen int __aafs_profile_mkdir(struct aa_profile *profile, struct dentry *parent);
112c97204baSJohn Johansen void __aafs_ns_rmdir(struct aa_ns *ns);
11398407f0aSJohn Johansen int __aafs_ns_mkdir(struct aa_ns *ns, struct dentry *parent, const char *name,
11498407f0aSJohn Johansen 		     struct dentry *dent);
1150d259f04SJohn Johansen 
1165d5182caSJohn Johansen struct aa_loaddata;
117*d61c57fdSJohn Johansen 
118*d61c57fdSJohn Johansen #ifdef CONFIG_SECURITY_APPARMOR_EXPORT_BINARY
1195d5182caSJohn Johansen void __aa_fs_remove_rawdata(struct aa_loaddata *rawdata);
1205d5182caSJohn Johansen int __aa_fs_create_rawdata(struct aa_ns *ns, struct aa_loaddata *rawdata);
121*d61c57fdSJohn Johansen #else
__aa_fs_remove_rawdata(struct aa_loaddata * rawdata)122*d61c57fdSJohn Johansen static inline void __aa_fs_remove_rawdata(struct aa_loaddata *rawdata)
123*d61c57fdSJohn Johansen {
124*d61c57fdSJohn Johansen 	/* empty stub */
125*d61c57fdSJohn Johansen }
126*d61c57fdSJohn Johansen 
__aa_fs_create_rawdata(struct aa_ns * ns,struct aa_loaddata * rawdata)127*d61c57fdSJohn Johansen static inline int __aa_fs_create_rawdata(struct aa_ns *ns,
128*d61c57fdSJohn Johansen 					 struct aa_loaddata *rawdata)
129*d61c57fdSJohn Johansen {
130*d61c57fdSJohn Johansen 	return 0;
131*d61c57fdSJohn Johansen }
132*d61c57fdSJohn Johansen #endif /* CONFIG_SECURITY_APPARMOR_EXPORT_BINARY */
1335d5182caSJohn Johansen 
13463e2b423SJohn Johansen #endif /* __AA_APPARMORFS_H */
135