#ifndef KSU_SUSFS_H #define KSU_SUSFS_H #include #include #include #include #include #include #define SUSFS_VERSION "v1.5.3" #if LINUX_VERSION_CODE < KERNEL_VERSION(5,0,0) #define SUSFS_VARIANT "NON-GKI" #else #define SUSFS_VARIANT "GKI" #endif /*********/ /* MACRO */ /*********/ #define getname_safe(name) (name == NULL ? ERR_PTR(-EINVAL) : getname(name)) #define putname_safe(name) (IS_ERR(name) ? NULL : putname(name)) /**********/ /* STRUCT */ /**********/ /* sus_path */ #ifdef CONFIG_KSU_SUSFS_SUS_PATH struct st_susfs_sus_path { unsigned long target_ino; char target_pathname[SUSFS_MAX_LEN_PATHNAME]; }; struct st_susfs_sus_path_hlist { unsigned long target_ino; char target_pathname[SUSFS_MAX_LEN_PATHNAME]; struct hlist_node node; }; #endif /* sus_mount */ #ifdef CONFIG_KSU_SUSFS_SUS_MOUNT struct st_susfs_sus_mount { char target_pathname[SUSFS_MAX_LEN_PATHNAME]; unsigned long target_dev; }; struct st_susfs_sus_mount_list { struct list_head list; struct st_susfs_sus_mount info; }; #endif /* sus_kstat */ #ifdef CONFIG_KSU_SUSFS_SUS_KSTAT struct st_susfs_sus_kstat { int is_statically; unsigned long target_ino; // the ino after bind mounted or overlayed char target_pathname[SUSFS_MAX_LEN_PATHNAME]; unsigned long spoofed_ino; unsigned long spoofed_dev; unsigned int spoofed_nlink; long long spoofed_size; long spoofed_atime_tv_sec; long spoofed_mtime_tv_sec; long spoofed_ctime_tv_sec; long spoofed_atime_tv_nsec; long spoofed_mtime_tv_nsec; long spoofed_ctime_tv_nsec; unsigned long spoofed_blksize; unsigned long long spoofed_blocks; }; struct st_susfs_sus_kstat_hlist { unsigned long target_ino; struct st_susfs_sus_kstat info; struct hlist_node node; }; #endif /* try_umount */ #ifdef CONFIG_KSU_SUSFS_TRY_UMOUNT struct st_susfs_try_umount { char target_pathname[SUSFS_MAX_LEN_PATHNAME]; int mnt_mode; }; struct st_susfs_try_umount_list { struct list_head list; struct st_susfs_try_umount info; }; #endif /* spoof_uname */ #ifdef CONFIG_KSU_SUSFS_SPOOF_UNAME struct st_susfs_uname { char release[__NEW_UTS_LEN+1]; char version[__NEW_UTS_LEN+1]; }; #endif /* open_redirect */ #ifdef CONFIG_KSU_SUSFS_OPEN_REDIRECT struct st_susfs_open_redirect { unsigned long target_ino; char target_pathname[SUSFS_MAX_LEN_PATHNAME]; char redirected_pathname[SUSFS_MAX_LEN_PATHNAME]; }; struct st_susfs_open_redirect_hlist { unsigned long target_ino; char target_pathname[SUSFS_MAX_LEN_PATHNAME]; char redirected_pathname[SUSFS_MAX_LEN_PATHNAME]; struct hlist_node node; }; #endif /* sus_su */ #ifdef CONFIG_KSU_SUSFS_SUS_SU struct st_sus_su { int mode; }; #endif /***********************/ /* FORWARD DECLARATION */ /***********************/ /* sus_path */ #ifdef CONFIG_KSU_SUSFS_SUS_PATH int susfs_add_sus_path(struct st_susfs_sus_path* __user user_info); int susfs_sus_ino_for_filldir64(unsigned long ino); #endif /* sus_mount */ #ifdef CONFIG_KSU_SUSFS_SUS_MOUNT int susfs_add_sus_mount(struct st_susfs_sus_mount* __user user_info); #ifdef CONFIG_KSU_SUSFS_AUTO_ADD_SUS_BIND_MOUNT int susfs_auto_add_sus_bind_mount(const char *pathname, struct path *path_target); #endif // #ifdef CONFIG_KSU_SUSFS_AUTO_ADD_SUS_BIND_MOUNT #ifdef CONFIG_KSU_SUSFS_AUTO_ADD_SUS_KSU_DEFAULT_MOUNT void susfs_auto_add_sus_ksu_default_mount(const char __user *to_pathname); #endif // #ifdef CONFIG_KSU_SUSFS_AUTO_ADD_SUS_KSU_DEFAULT_MOUNT #endif // #ifdef CONFIG_KSU_SUSFS_SUS_MOUNT /* sus_kstat */ #ifdef CONFIG_KSU_SUSFS_SUS_KSTAT int susfs_add_sus_kstat(struct st_susfs_sus_kstat* __user user_info); int susfs_update_sus_kstat(struct st_susfs_sus_kstat* __user user_info); void susfs_sus_ino_for_generic_fillattr(unsigned long ino, struct kstat *stat); void susfs_sus_ino_for_show_map_vma(unsigned long ino, dev_t *out_dev, unsigned long *out_ino); #endif /* try_umount */ #ifdef CONFIG_KSU_SUSFS_TRY_UMOUNT int susfs_add_try_umount(struct st_susfs_try_umount* __user user_info); void susfs_try_umount(uid_t target_uid); #ifdef CONFIG_KSU_SUSFS_AUTO_ADD_TRY_UMOUNT_FOR_BIND_MOUNT void susfs_auto_add_try_umount_for_bind_mount(struct path *path); #endif // #ifdef CONFIG_KSU_SUSFS_AUTO_ADD_TRY_UMOUNT_FOR_BIND_MOUNT #endif // #ifdef CONFIG_KSU_SUSFS_TRY_UMOUNT /* spoof_uname */ #ifdef CONFIG_KSU_SUSFS_SPOOF_UNAME int susfs_set_uname(struct st_susfs_uname* __user user_info); void susfs_spoof_uname(struct new_utsname* tmp); #endif /* set_log */ #ifdef CONFIG_KSU_SUSFS_ENABLE_LOG void susfs_set_log(bool enabled); #endif /* spoof_cmdline_or_bootconfig */ #ifdef CONFIG_KSU_SUSFS_SPOOF_CMDLINE_OR_BOOTCONFIG int susfs_set_cmdline_or_bootconfig(char* __user user_fake_boot_config); int susfs_spoof_cmdline_or_bootconfig(struct seq_file *m); #endif /* open_redirect */ #ifdef CONFIG_KSU_SUSFS_OPEN_REDIRECT int susfs_add_open_redirect(struct st_susfs_open_redirect* __user user_info); struct filename* susfs_get_redirected_path(unsigned long ino); #endif /* sus_su */ #ifdef CONFIG_KSU_SUSFS_SUS_SU int susfs_get_sus_su_working_mode(void); int susfs_sus_su(struct st_sus_su* __user user_info); #endif /* susfs_init */ void susfs_init(void); #endif