richard@300: /* richard@300: * Copyright (C) 2008 Kristian Høgsberg richard@300: * Copyright (C) 2008 Red Hat, Inc ali@475: * Copyright (C) 2009, 2011-2012, 2014, 2016 J. Ali Harlow richard@300: * richard@300: * This program is free software; you can redistribute it and/or modify richard@300: * it under the terms of the GNU General Public License as published by richard@300: * the Free Software Foundation; either version 2 of the License, or richard@300: * (at your option) any later version. richard@300: * richard@300: * This program is distributed in the hope that it will be useful, richard@300: * but WITHOUT ANY WARRANTY; without even the implied warranty of richard@300: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the richard@300: * GNU General Public License for more details. richard@300: * richard@300: * You should have received a copy of the GNU General Public License along richard@300: * with this program; if not, write to the Free Software Foundation, Inc., richard@300: * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. richard@300: */ richard@300: rhughes@241: #ifndef _RAZOR_INTERNAL_H_ rhughes@241: #define _RAZOR_INTERNAL_H_ rhughes@241: ali@416: #ifdef MSWIN_API ali@416: #include ali@416: #endif krh@248: #include krh@248: #include richard@302: #include ali@360: #include richard@302: richard@302: #include "razor.h" ali@364: #include "types/types.h" krh@248: ali@403: /* GCC extensions */ krh@269: #if defined(__GNUC__) && __GNUC__ >= 4 krh@269: #define RAZOR_EXPORT __attribute__ ((visibility("default"))) krh@269: #else krh@269: #define RAZOR_EXPORT krh@269: #endif krh@269: krh@271: #define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0])) krh@373: #define PADDING(value, base) (-(value) & (base - 1)) krh@373: #define ALIGN(value, base) ((value) + PADDING(value, base)) ali@475: ali@475: #define str_has_prefix(s, prefix) (!strncmp(s, prefix, strlen(prefix))) ali@475: krh@248: void *zalloc(size_t size); krh@248: krh@248: struct razor_set_section { jbowes@318: uint32_t name; krh@248: uint32_t offset; krh@248: uint32_t size; krh@248: }; krh@248: krh@248: struct razor_set_header { krh@248: uint32_t magic; krh@248: uint32_t version; jbowes@318: uint32_t num_sections; krh@248: }; krh@248: jbowes@318: #define RAZOR_MAGIC 0x525a4442 krh@248: jbowes@318: #define RAZOR_STRING_POOL "string_pool" jbowes@318: #define RAZOR_PACKAGES "packages" jbowes@318: #define RAZOR_PROPERTIES "properties" jbowes@318: #define RAZOR_PACKAGE_POOL "package_pool" jbowes@318: #define RAZOR_PROPERTY_POOL "property_pool" ali@372: #define RAZOR_PREFIX_POOL "prefix_pool" jbowes@258: jbowes@318: #define RAZOR_DETAILS_STRING_POOL "details_string_pool" jbowes@258: jbowes@318: #define RAZOR_FILES "files" jbowes@318: #define RAZOR_FILE_POOL "file_pool" jbowes@318: #define RAZOR_FILE_STRING_POOL "file_string_pool" krh@248: ali@369: struct razor_script { ali@369: uint32_t program; ali@369: uint32_t body; ali@369: }; ali@369: krh@248: struct razor_package { ali@324: unsigned int name : 24; ali@324: unsigned int flags : 8; krh@248: uint32_t version; krh@248: uint32_t arch; jbowes@258: uint32_t summary; jbowes@258: uint32_t description; jbowes@258: uint32_t url; jbowes@258: uint32_t license; krh@248: struct list_head properties; krh@248: struct list_head files; ali@372: struct list_head install_prefixes; ali@369: struct razor_script preun; ali@369: struct razor_script postun; krh@248: }; krh@248: jbowes@258: krh@248: struct razor_property { krh@248: uint32_t name; krh@248: uint32_t flags; krh@248: uint32_t version; krh@248: struct list_head packages; krh@248: }; krh@248: krh@248: struct razor_entry { krh@248: uint32_t name : 24; krh@248: uint32_t flags : 8; krh@248: uint32_t start; krh@248: struct list_head packages; krh@248: }; krh@248: krh@248: #define RAZOR_ENTRY_LAST 0x80 krh@248: krh@248: struct razor_set { ali@403: uint32_t header_version; krh@248: struct array string_pool; krh@248: struct array packages; krh@248: struct array properties; krh@248: struct array files; krh@248: struct array package_pool; krh@248: struct array property_pool; krh@248: struct array file_pool; ali@372: struct array prefix_pool; jbowes@258: struct array file_string_pool; jbowes@258: struct array details_string_pool; krh@373: struct razor_mapped_file *mapped_files; ali@403: int lock_fd, ref_count; ali@424: enum razor_set_flags flags; krh@248: }; krh@248: krh@248: struct import_entry { krh@248: uint32_t package; krh@248: char *name; krh@248: }; krh@248: krh@248: struct import_directory { krh@248: uint32_t name, count; krh@248: struct array files; krh@248: struct array packages; krh@248: struct import_directory *last; krh@248: }; krh@248: krh@248: struct razor_importer { krh@248: struct razor_set *set; krh@248: struct hashtable table; jbowes@258: struct hashtable file_table; jbowes@258: struct hashtable details_table; krh@248: struct razor_package *package; krh@248: struct array properties; krh@248: struct array files; krh@248: struct array file_requires; ali@372: struct array install_prefixes; krh@248: }; krh@248: krh@248: struct razor_package_iterator { krh@248: struct razor_set *set; krh@248: struct razor_package *package, *end; krh@248: struct list *index; ali@458: void *alloced_index; krh@248: }; krh@248: krh@248: void krh@248: razor_package_iterator_init_for_property(struct razor_package_iterator *pi, krh@248: struct razor_set *set, krh@248: struct razor_property *property); krh@248: krh@248: struct razor_property_iterator { krh@248: struct razor_set *set; krh@248: struct razor_property *property, *end; krh@248: struct list *index; krh@248: }; krh@248: ali@351: struct razor_file_iterator { ali@351: struct razor_set *set; ali@351: struct array path; ali@351: struct list *index; ali@377: int post_order; ali@351: }; ali@351: ali@462: struct razor_string_iterator { ali@462: struct razor_set *set; ali@462: struct list *index; ali@462: }; ali@462: ali@388: int ali@475: razor_set_acquire_lock(struct razor_set *set, const char *path, int exclusive); ali@388: krh@248: struct razor_entry * krh@248: razor_set_find_entry(struct razor_set *set, krh@248: struct razor_entry *dir, const char *pattern); krh@248: krh@248: struct razor_merger * krh@248: razor_merger_create(struct razor_set *set1, struct razor_set *set2); krh@248: void krh@248: razor_merger_add_package(struct razor_merger *merger, krh@248: struct razor_package *package); krh@248: struct razor_set * ali@369: razor_merger_commit(struct razor_merger *merger); ali@369: void ali@369: razor_merger_package_add_script(struct razor_merger *merger, ali@369: struct razor_package *package, ali@369: enum razor_property_flags script, ali@369: const char *program, const char *body); ali@369: void ali@369: razor_merger_destroy(struct razor_merger *merger); krh@248: ali@352: int run_lua_script(const char *root, const char *name, const char *body, ali@376: ssize_t len, int arg1); ali@352: ali@369: int razor_run_script(const char *root, enum razor_property_flags script, ali@475: const char *program, const char *body, int arg1, ali@475: struct razor_error **error); ali@475: ali@475: /* URI functions */ ali@475: ali@475: struct razor_uri { ali@475: char *scheme; ali@475: char *userinfo; ali@475: char *host; ali@475: char *port; ali@475: char *path; ali@475: char *query; ali@475: char *fragment; ali@475: }; ali@475: ali@475: void razor_uri_destroy(struct razor_uri *ru); ali@475: int razor_uri_parse_uri(struct razor_uri *ru, const char *uri, int absolute, ali@475: struct razor_error **error); ali@475: int razor_uri_parse_relative_ref(struct razor_uri *ru, const char *uri, ali@475: struct razor_error **error); ali@475: int razor_uri_parse(struct razor_uri *ru, const char *uri, ali@475: struct razor_error **error); ali@475: void razor_uri_normalize(struct razor_uri *ru); ali@475: char *razor_uri_get_authority(const struct razor_uri *ru) RAZOR_MALLOC; ali@475: char *razor_uri_recompose(const struct razor_uri *ru) RAZOR_MALLOC; ali@475: void razor_uri_resolve(struct razor_uri *T, const struct razor_uri *base, ali@475: const struct razor_uri *R); ali@475: ali@475: char *razor_resolve_uri_root(const char *root_uri, const char *relative_uri, ali@475: int is_relative, struct razor_error **error) ali@475: RAZOR_MALLOC; ali@475: ali@475: int razor_file_mkdir(const char *path, mode_t mode, struct razor_error **error); ali@475: int razor_file_unlink(const char *path, struct razor_error **error); ali@475: int razor_file_open(const char *path, int flags, mode_t mode, ali@475: struct razor_error **error); ali@475: int razor_file_move(const char *path, const char *dest, ali@475: struct razor_error **error); ali@475: void *razor_file_get_contents(const char *path, size_t *length, int _private, ali@475: struct razor_error **error); ali@475: int razor_file_free_contents(void *addr, size_t length); ali@475: int razor_file_is_directory(const char *path, struct razor_error **error); ali@475: char *razor_file_mkdtemp_near(const char *path, const char *_template, ali@475: struct razor_error **error); ali@475: void *razor_file_opendir(const char *path, struct razor_error **error); ali@475: char *razor_file_readdir(void *dir, struct razor_error **error); ali@475: int razor_file_closedir(void *dir, struct razor_error **error); ali@475: ali@475: char *razor_path_from_parsed_uri(const struct razor_uri *ru, ali@475: struct razor_error **error); ali@369: rhughes@241: /* Utility functions */ rhughes@241: richard@302: void richard@302: razor_package_get_details_varg(struct razor_set *set, richard@302: struct razor_package *package, richard@302: va_list args); ali@369: void razor_rpm_get_details_varg(struct razor_rpm *rpm, va_list args); richard@302: rhughes@241: typedef int (*razor_compare_with_data_func_t)(const void *p1, rhughes@241: const void *p, rhughes@241: void *data); rhughes@241: uint32_t * rhughes@241: razor_qsort_with_data(void *base, size_t nelem, size_t size, rhughes@241: razor_compare_with_data_func_t compare, void *data); rhughes@241: ali@372: struct environment { ali@372: int is_set; ali@372: struct array vars, string_pool; ali@372: }; ali@372: ali@372: void environment_init(struct environment *env); ali@372: void environment_add_variable(struct environment *env, ali@372: const char *variable, const char *value); ali@372: void environment_set(struct environment *env); ali@372: void environment_unset(struct environment *env); ali@372: void environment_release(struct environment *env); ali@372: ali@416: #ifdef MSWIN_API ali@416: char *razor_utf16_to_utf8(const wchar_t *utf16, int len); ali@416: wchar_t *razor_utf8_to_utf16(const char *utf8, int len); ali@416: #endif ali@416: ali@491: char *razor_abspath(const char *path); ali@491: ali@423: /* Error functions */ ali@423: struct razor_error { ali@447: int domain; ali@447: int code; ali@447: char *object; ali@423: char *str; ali@447: char *obj_str; ali@439: char *summary; ali@423: char *msg; ali@423: }; ali@423: ali@447: #define razor_error_new_posix(object) \ ali@447: razor_error_new_str(RAZOR_POSIX_ERROR, errno, object, strerror(errno)) ali@447: #define razor_set_error_posix(error, object) \ ali@447: if (error) \ ali@447: *(error) = razor_error_new_posix(object); \ ali@447: else ali@475: #define razor_set_error(error, domain, code, object, str) \ ali@475: if (error) \ ali@475: *(error) = razor_error_new_str(domain, code, object, str); \ ali@475: else ali@447: ali@423: #ifdef MSWIN_API ali@447: struct razor_error *razor_error_new_mswin(const wchar_t *object, DWORD error); ali@447: struct razor_error *razor_error_new_str2(int domain, int code, ali@447: const wchar_t *object, ali@447: const char *str); ali@423: ali@447: #define razor_set_error_mswin(error, object, err) \ ali@424: if (error) \ ali@447: *(error) = razor_error_new_mswin(object, err); \ ali@424: else ali@447: #define razor_set_error2(error, domain, code, object, str) \ ali@424: if (error) \ ali@447: *(error) = razor_error_new_str2(domain, code, object, str); \ ali@424: else ali@424: #endif /* MSWIN_API */ ali@423: ali@416: /* Atomic functions */ ali@416: ali@416: #if HAVE_WINDOWS_KTM ali@416: struct razor_atomic { ali@416: HANDLE transaction; ali@416: int n_files; ali@416: struct razor_atomic_file { ali@416: wchar_t *path; ali@416: HANDLE h; ali@416: } *files; ali@416: int in_undo; ali@423: struct razor_error *error; ali@416: }; ali@416: #elif ENABLE_ATOMIC ali@416: struct atomic_action { ali@416: struct atomic_action *next; ali@416: enum atomic_action_type { ali@416: /* Complex actions */ ali@416: ACTION_MAKE_DIRS, ali@416: ACTION_REMOVE, ali@416: /* Primitive actions */ ali@416: ACTION_CREATE_DIR, ali@416: #if HAVE_SYMLINK ali@416: ACTION_CREATE_SYMLINK, ali@416: #endif ali@416: ACTION_MOVE, ali@416: } type; ali@416: struct { ali@475: char *uri; ali@416: union atomic_action_args { ali@416: struct { ali@416: char *root; ali@416: } make_dirs; ali@416: struct { ali@416: mode_t mode; ali@416: } create_dir; ali@416: #if HAVE_SYMLINK ali@416: struct { ali@416: char *target; ali@416: } create_symlink; ali@416: #endif ali@416: struct { ali@416: char *dest; ali@416: } move; ali@416: } u; ali@416: } args; ali@416: }; ali@416: ali@416: struct razor_atomic { ali@416: struct atomic_action *actions; ali@416: char *description; ali@416: char *toplevel; ali@416: unsigned next_file_tag; ali@416: int in_undo; ali@423: struct razor_error *error; ali@416: }; ali@416: ali@416: char *atomic_action_attic_tmpnam(struct razor_atomic *atomic); ali@416: struct atomic_action * ali@416: atomic_action_list_prepend(struct atomic_action *list, ali@416: struct atomic_action *action); ali@416: struct atomic_action *atomic_action_new(enum atomic_action_type type); ali@416: void atomic_action_free(struct atomic_action *action); ali@416: struct atomic_action *atomic_action_list_reverse(struct atomic_action *list); ali@416: struct atomic_action * ali@416: atomic_action_do(struct razor_atomic *atomic, struct atomic_action *action); ali@416: void ali@416: atomic_action_undo(struct razor_atomic *atomic, struct atomic_action *action); ali@416: #else /* !HAVE_WINDOWS_KTM && !ENABLE_ATOMIC */ ali@416: struct razor_atomic { ali@416: int in_undo; ali@423: struct razor_error *error; ali@416: }; ali@416: #endif ali@416: ali@475: char *razor_resolve_database_file(const char *root_uri, const char *filename, ali@475: struct razor_error **error); ali@475: ali@416: int razor_allow_all_root_names(void); ali@416: int razor_valid_root_name(const char *name); ali@416: ali@441: #define RAZOR_ASCII_ISALPHA(c) \ ali@441: ((c) >= 'A' && (c) <= 'Z' || (c) >= 'a' && (c) <= 'z') ali@441: ali@441: #ifdef MSWIN_API ali@441: #define SKIP_DRIVE_LETTER(path) \ ali@498: ((RAZOR_ASCII_ISALPHA((path)[0]) && (path)[1] == ':') ? \ ali@441: (path) + 2 : (path)) ali@441: #else ali@441: #define SKIP_DRIVE_LETTER(path) (path) ali@441: #endif /* MSWIN_API */ ali@441: rhughes@241: #endif /* _RAZOR_INTERNAL_H_ */