#ifndef _NWSALVAGE_H_ #define _NWSALVAGE_H_ #include #include #include typedef int (*nwsalvage_ini_getter)(int entry, char *str, size_t strsize, void *data); #define NWSALVAGE_ENABLE_INI_SECTION 51 #define NWSALVAGE_REPOSITORY_INI_SECTION 52 #define NWSALVAGE_FLAGS_INI_SECTION 53 #define NWSALVAGE_SIZE_LIMIT_INI_SECTION 55 #define NWSALVAGE_EXCLUDE_INI_SECTION 56 #define NWSALVAGE_EXCLUDE_DIR_INI_SECTION 57 #define NWSALVAGE_NOVERSIONS_INI_SECTION 58 #define NWSALVAGE_DEFAULT_ENABLED 1 #define NWSALVAGE_DEFAULT_RECYCLE_NAME ".recycle" #define NWSALVAGE_DEFAULT_METADATA_NAME ".salvage" #define NWSALVAGE_DEFAULT_FLAGS (NWSALVAGE_FLAG_KEEP_TREE | \ NWSALVAGE_FLAG_VERSIONS) #define NWSALVAGE_FLAG_KEEP_TREE 0x0001 /* k */ #define NWSALVAGE_FLAG_VERSIONS 0x0002 /* v */ #define NWSALVAGE_FLAG_TOUCH 0x0004 /* t */ #define NWSALVAGE_FLAG_TOUCH_MTIME 0x0008 /* m */ #define NWSALVAGE_REPOSITORY_NAME_MAX 64 #define NWSALVAGE_PATH_MAX 4096 #define NWSALVAGE_NAME_MAX 256 #define NWSALVAGE_USER_NAME_MAX 128 #define NWSALVAGE_FINDER_INFO_HEX_LEN 64 #define NWSALVAGE_PRODOS_INFO_HEX_LEN 12 #define NWSALVAGE_AFP_ENTRY_ID_MAX 32 #define NWSALVAGE_TRUSTEE_MAX 100 #define NWSALVAGE_PATTERN_MAX 32 #define NWSALVAGE_PATTERN_LEN_MAX 128 struct nwsalvage_config { int enabled; char recycle_repository[NWSALVAGE_REPOSITORY_NAME_MAX]; char metadata_repository[NWSALVAGE_REPOSITORY_NAME_MAX]; unsigned int flags; unsigned long long min_size; unsigned long long max_size; unsigned int exclude_count; char exclude_patterns[NWSALVAGE_PATTERN_MAX][NWSALVAGE_PATTERN_LEN_MAX]; unsigned int exclude_dir_count; char exclude_dir_patterns[NWSALVAGE_PATTERN_MAX][NWSALVAGE_PATTERN_LEN_MAX]; unsigned int noversions_count; char noversions_patterns[NWSALVAGE_PATTERN_MAX][NWSALVAGE_PATTERN_LEN_MAX]; }; struct nwsalvage_trustee_entry { unsigned long object_id; unsigned int rights; }; struct nwsalvage_deleted_entry { const char *source; const char *volume_name; const char *deleted_by; long deleted_at; const char *original_path; unsigned long original_parent_entry_id; const char *original_name; const char *recycle_relative_path; const char *salvage_relative_path; unsigned int attributes; unsigned long mode; unsigned long long size; long atime; long mtime; long ctime; const char *finder_info_hex; const char *prodos_info_hex; const char *afp_entry_id; unsigned int afp_attributes; unsigned long long resource_fork_size; unsigned int netware_archive_flags; unsigned int netware_archive_date; unsigned int netware_archive_time; unsigned long netware_archiver_id; unsigned int netware_fileinfo_flags; unsigned int netware_create_date; unsigned int netware_create_time; unsigned long netware_creator_id; unsigned long netware_modifier_id; unsigned int inherited_rights_mask; unsigned int trustee_count; struct nwsalvage_trustee_entry trustees[NWSALVAGE_TRUSTEE_MAX]; }; struct nwsalvage_metadata_entry { char source[NWSALVAGE_USER_NAME_MAX]; char volume_name[NWSALVAGE_REPOSITORY_NAME_MAX]; char deleted_by[NWSALVAGE_USER_NAME_MAX]; long deleted_at; char original_path[NWSALVAGE_PATH_MAX]; unsigned long original_parent_entry_id; char original_name[NWSALVAGE_NAME_MAX]; char recycle_relative_path[NWSALVAGE_PATH_MAX]; char salvage_relative_path[NWSALVAGE_PATH_MAX]; unsigned int attributes; unsigned long mode; unsigned long long size; long atime; long mtime; long ctime; char finder_info_hex[NWSALVAGE_FINDER_INFO_HEX_LEN + 1]; char prodos_info_hex[NWSALVAGE_PRODOS_INFO_HEX_LEN + 1]; char afp_entry_id[NWSALVAGE_AFP_ENTRY_ID_MAX]; unsigned int afp_attributes; unsigned long long resource_fork_size; unsigned int netware_archive_flags; unsigned int netware_archive_date; unsigned int netware_archive_time; unsigned long netware_archiver_id; unsigned int netware_fileinfo_flags; unsigned int netware_create_date; unsigned int netware_create_time; unsigned long netware_creator_id; unsigned long netware_modifier_id; unsigned int inherited_rights_mask; unsigned int trustee_count; struct nwsalvage_trustee_entry trustees[NWSALVAGE_TRUSTEE_MAX]; }; struct nwsalvage_scan_result { unsigned long scan_sequence; unsigned long scan_volume; unsigned long scan_directory_base; char metadata_path[NWSALVAGE_PATH_MAX]; char recycle_path[NWSALVAGE_PATH_MAX]; struct nwsalvage_metadata_entry metadata; }; int nwsalvage_config_defaults(struct nwsalvage_config *config); int nwsalvage_config_set_repositories(struct nwsalvage_config *config, const char *recycle_repository, const char *metadata_repository); int nwsalvage_config_parse_enabled(struct nwsalvage_config *config, const char *line); int nwsalvage_config_parse_repositories(struct nwsalvage_config *config, const char *line); int nwsalvage_config_parse_flags(struct nwsalvage_config *config, const char *line); int nwsalvage_config_parse_size_limits(struct nwsalvage_config *config, const char *line); int nwsalvage_config_parse_exclude(struct nwsalvage_config *config, const char *line); int nwsalvage_config_parse_exclude_dir(struct nwsalvage_config *config, const char *line); int nwsalvage_config_parse_noversions(struct nwsalvage_config *config, const char *line); int nwsalvage_config_load_from_ini(struct nwsalvage_config *config, nwsalvage_ini_getter getter, void *data); int nwsalvage_repository_name_valid(const char *name); int nwsalvage_relative_path_valid(const char *relative_path); int nwsalvage_build_recycle_relative_path(char *out, size_t out_len, const struct nwsalvage_config *config, const char *relative_path); int nwsalvage_build_metadata_relative_path(char *out, size_t out_len, const struct nwsalvage_config *config, const char *relative_path); int nwsalvage_build_recycle_path(char *out, size_t out_len, const struct nwsalvage_config *config, const char *volume_root, const char *relative_path); int nwsalvage_build_metadata_path(char *out, size_t out_len, const struct nwsalvage_config *config, const char *volume_root, const char *relative_path); int nwsalvage_write_metadata(const char *metadata_path, const struct nwsalvage_deleted_entry *entry); int nwsalvage_read_metadata(const char *metadata_path, struct nwsalvage_metadata_entry *entry); int nwsalvage_metadata_finder_info(const struct nwsalvage_metadata_entry *entry, unsigned char *out, size_t out_len); int nwsalvage_metadata_prodos_info(const struct nwsalvage_metadata_entry *entry, unsigned char *out, size_t out_len); /* * Scan one salvageable entry in a directory. scan_sequence must be * 0xffffffff for the first call, then the previously returned * scan_sequence for subsequent calls. */ int nwsalvage_scan_directory(int volume, const char *relative_dir, unsigned long directory_base, unsigned long scan_sequence, struct nwsalvage_scan_result *result); int nwsalvage_find_by_deleted_directory_number(int volume, unsigned long dos_directory_number, struct nwsalvage_scan_result *result); int nwsalvage_recover_scan_result(int volume, const struct nwsalvage_scan_result *scan, const char *dest_unixname, int task); int nwsalvage_purge_scan_result(const struct nwsalvage_scan_result *scan); /* * Capture a server-side delete before nw_unlink_node() would remove it. * Returns 0 when the file was moved to the recycle repository and metadata * was written. Returns 1 when salvage is disabled or the node is not * salvageable and the caller should continue with the normal unlink path. * Returns -1 on a real salvage failure; the caller should keep the live file. */ int nwsalvage_capture_node_delete(int volume, const char *unixname, const struct stat *stb); #endif