From 79c333899d318bf9b1eec3837833c7f0229d1906 Mon Sep 17 00:00:00 2001 From: David Oberhollenzer Date: Sun, 1 Sep 2019 14:11:51 +0200 Subject: Move some application specific stuff out of libutil This commit does the following: - canonicalize_name is moved to libfstree - source_date_epoch is only used inside libfstree, so it's also moved over and can later be completely internalized - print_version is moved over to sqfshelper. Mainly so it doesn't end up in libsquashfs.so for no sane reason. Signed-off-by: David Oberhollenzer --- include/fstree.h | 17 ++++++++++++ include/util.h | 16 ----------- lib/Makemodule.am | 8 +++--- lib/fstree/canonicalize_name.c | 61 ++++++++++++++++++++++++++++++++++++++++++ lib/fstree/source_date_epoch.c | 45 +++++++++++++++++++++++++++++++ lib/sqfshelper/print_version.c | 29 ++++++++++++++++++++ lib/util/canonicalize_name.c | 61 ------------------------------------------ lib/util/print_version.c | 29 -------------------- lib/util/source_date_epoch.c | 45 ------------------------------- tests/Makemodule.am | 2 +- tests/canonicalize_name.c | 2 +- 11 files changed, 159 insertions(+), 156 deletions(-) create mode 100644 lib/fstree/canonicalize_name.c create mode 100644 lib/fstree/source_date_epoch.c create mode 100644 lib/sqfshelper/print_version.c delete mode 100644 lib/util/canonicalize_name.c delete mode 100644 lib/util/print_version.c delete mode 100644 lib/util/source_date_epoch.c diff --git a/include/fstree.h b/include/fstree.h index 5b853f3..7ee105b 100644 --- a/include/fstree.h +++ b/include/fstree.h @@ -339,4 +339,21 @@ uint64_t find_equal_blocks(file_info_t *file, file_info_t *list, void optimize_unpack_order(fstree_t *fs, size_t num_jobs, file_info_t *out[num_jobs]); + +/* + Convert back to forward slashed, remove all preceeding and trailing slashes, + collapse all sequences of slashes, remove all path components that are '.' + and returns failure state if one of the path components is '..'. + + Returns 0 on success. +*/ +int canonicalize_name(char *filename); + +/* + If the environment variable SOURCE_DATE_EPOCH is set to a parsable number + that fits into an unsigned 32 bit value, return its value. Otherwise, + default to 0. + */ +uint32_t get_source_date_epoch(void); + #endif /* FSTREE_H */ diff --git a/include/util.h b/include/util.h index ba95b03..651a958 100644 --- a/include/util.h +++ b/include/util.h @@ -46,15 +46,6 @@ typedef struct sparse_map_t { uint64_t count; } sparse_map_t; -/* - Convert back to forward slashed, remove all preceeding and trailing slashes, - collapse all sequences of slashes, remove all path components that are '.' - and returns failure state if one of the path components is '..'. - - Returns 0 on success. -*/ -int canonicalize_name(char *filename); - /* A wrapper around the write() system call. It retries the write if it is interrupted by a signal or only part of the data was written. Returns 0 @@ -108,13 +99,6 @@ int popd(void); */ int padd_file(int outfd, uint64_t size, size_t blocksize); -/* - If the environment variable SOURCE_DATE_EPOCH is set to a parsable number - that fits into an unsigned 32 bit value, return its value. Otherwise, - default to 0. - */ -uint32_t get_source_date_epoch(void); - /* Helper for allocating data structures with flexible array members. diff --git a/lib/Makemodule.am b/lib/Makemodule.am index bc08cc9..7b63274 100644 --- a/lib/Makemodule.am +++ b/lib/Makemodule.am @@ -6,6 +6,8 @@ libfstree_a_SOURCES += lib/fstree/add_by_path.c lib/fstree/xattr.c libfstree_a_SOURCES += lib/fstree/node_from_path.c include/fstree.h libfstree_a_SOURCES += lib/fstree/gen_file_list.c lib/fstree/deduplicate.c libfstree_a_SOURCES += lib/fstree/optimize_unpack_order.c +libfstree_a_SOURCES += lib/fstree/canonicalize_name.c +libfstree_a_SOURCES += lib/fstree/source_date_epoch.c libfstree_a_CFLAGS = $(AM_CFLAGS) $(LIBSELINUX_CFLAGS) libfstree_a_CPPFLAGS = $(AM_CPPFLAGS) @@ -26,17 +28,17 @@ libsqfshelper_a_SOURCES += lib/sqfshelper/write_dir.c libsqfshelper_a_SOURCES += lib/sqfshelper/write_inode.c libsqfshelper_a_SOURCES += lib/sqfshelper/write_export_table.c libsqfshelper_a_SOURCES += lib/sqfshelper/xattr_reader.c +libsqfshelper_a_SOURCES += lib/sqfshelper/print_version.c libsqfshelper_a_SOURCES += include/data_reader.h lib/sqfshelper/data_reader.c libsqfshelper_a_SOURCES += include/data_writer.h lib/sqfshelper/data_writer.c libsqfshelper_a_SOURCES += include/xattr_reader.h lib/sqfshelper/write_xattr.c -libutil_la_SOURCES = lib/util/canonicalize_name.c lib/util/write_data.c +libutil_la_SOURCES = lib/util/write_data.c libutil_la_SOURCES += lib/util/read_data.c include/util.h -libutil_la_SOURCES += lib/util/print_version.c lib/util/mkdir_p.c +libutil_la_SOURCES += lib/util/mkdir_p.c libutil_la_SOURCES += lib/util/str_table.c include/str_table.h libutil_la_SOURCES += lib/util/dirstack.c lib/util/padd_file.c libutil_la_SOURCES += lib/util/read_data_at.c lib/util/alloc.c -libutil_la_SOURCES += lib/util/source_date_epoch.c libutil_la_CFLAGS = $(AM_CFLAGS) libutil_la_CPPFLAGS = $(AM_CPPFLAGS) diff --git a/lib/fstree/canonicalize_name.c b/lib/fstree/canonicalize_name.c new file mode 100644 index 0000000..15c02be --- /dev/null +++ b/lib/fstree/canonicalize_name.c @@ -0,0 +1,61 @@ +/* SPDX-License-Identifier: GPL-3.0-or-later */ +/* + * canonicalize_name.c + * + * Copyright (C) 2019 David Oberhollenzer + */ +#include "config.h" + +#include "fstree.h" + +static void normalize_slashes(char *filename) +{ + char *dst = filename, *src = filename; + + while (*src == '/' || *src == '\\') + ++src; + + while (*src != '\0') { + if (*src == '/' || *src == '\\') { + while (*src == '/' || *src == '\\') + ++src; + if (*src == '\0') + break; + *(dst++) = '/'; + } else { + *(dst++) = *(src++); + } + } + + *dst = '\0'; +} + +int canonicalize_name(char *filename) +{ + char *dst = filename, *src = filename; + + normalize_slashes(filename); + + while (*src != '\0') { + if (src[0] == '.') { + if (src[1] == '\0') + break; + if (src[1] == '/') { + src += 2; + continue; + } + if (src[1] == '.' && (src[2] == '/' || src[2] == '\0')) + return -1; + } + + while (*src != '\0' && *src != '/') + *(dst++) = *(src++); + + if (*src == '/') + *(dst++) = *(src++); + } + + *dst = '\0'; + normalize_slashes(filename); + return 0; +} diff --git a/lib/fstree/source_date_epoch.c b/lib/fstree/source_date_epoch.c new file mode 100644 index 0000000..bbf2e42 --- /dev/null +++ b/lib/fstree/source_date_epoch.c @@ -0,0 +1,45 @@ +/* SPDX-License-Identifier: GPL-3.0-or-later */ +/* + * source_date_epoch.h + * + * Copyright (C) 2019 David Oberhollenzer + */ +#include "config.h" +#include "fstree.h" + +#include +#include +#include + +uint32_t get_source_date_epoch(void) +{ + const char *str, *ptr; + uint32_t x, tval = 0; + + str = getenv("SOURCE_DATE_EPOCH"); + + if (str == NULL || *str == '\0') + return 0; + + for (ptr = str; *ptr != '\0'; ++ptr) { + if (!isdigit(*ptr)) + goto fail_nan; + + x = (*ptr) - '0'; + + if (tval > (UINT32_MAX - x) / 10) + goto fail_ov; + + tval = tval * 10 + x; + } + + return tval; +fail_ov: + fprintf(stderr, "WARNING: SOURCE_DATE_EPOCH=%s does not fit into " + "32 bit integer\n", str); + return 0; +fail_nan: + fprintf(stderr, "WARNING: SOURCE_DATE_EPOCH=%s is not a positive " + "number\n", str); + return 0; +} diff --git a/lib/sqfshelper/print_version.c b/lib/sqfshelper/print_version.c new file mode 100644 index 0000000..b23e2bd --- /dev/null +++ b/lib/sqfshelper/print_version.c @@ -0,0 +1,29 @@ +/* SPDX-License-Identifier: GPL-3.0-or-later */ +/* + * print_version.c + * + * Copyright (C) 2019 David Oberhollenzer + */ +#include "config.h" + +#include "util.h" + +#include + +#define LICENSE_SHORT "GPLv3+" +#define LICENSE_LONG "GNU GPL version 3 or later" +#define LICENSE_URL "https://gnu.org/licenses/gpl.html" + +extern char *__progname; + +static const char *version_string = +"%s (%s) %s\n" +"Copyright (c) 2019 David Oberhollenzer et al\n" +"License " LICENSE_SHORT ": " LICENSE_LONG " <" LICENSE_URL ">.\n" +"This is free software: you are free to change and redistribute it.\n" +"There is NO WARRANTY, to the extent permitted by law.\n"; + +void print_version(void) +{ + printf(version_string, __progname, PACKAGE_NAME, PACKAGE_VERSION); +} diff --git a/lib/util/canonicalize_name.c b/lib/util/canonicalize_name.c deleted file mode 100644 index f99bc2a..0000000 --- a/lib/util/canonicalize_name.c +++ /dev/null @@ -1,61 +0,0 @@ -/* SPDX-License-Identifier: GPL-3.0-or-later */ -/* - * canonicalize_name.c - * - * Copyright (C) 2019 David Oberhollenzer - */ -#include "config.h" - -#include "util.h" - -static void normalize_slashes(char *filename) -{ - char *dst = filename, *src = filename; - - while (*src == '/' || *src == '\\') - ++src; - - while (*src != '\0') { - if (*src == '/' || *src == '\\') { - while (*src == '/' || *src == '\\') - ++src; - if (*src == '\0') - break; - *(dst++) = '/'; - } else { - *(dst++) = *(src++); - } - } - - *dst = '\0'; -} - -int canonicalize_name(char *filename) -{ - char *dst = filename, *src = filename; - - normalize_slashes(filename); - - while (*src != '\0') { - if (src[0] == '.') { - if (src[1] == '\0') - break; - if (src[1] == '/') { - src += 2; - continue; - } - if (src[1] == '.' && (src[2] == '/' || src[2] == '\0')) - return -1; - } - - while (*src != '\0' && *src != '/') - *(dst++) = *(src++); - - if (*src == '/') - *(dst++) = *(src++); - } - - *dst = '\0'; - normalize_slashes(filename); - return 0; -} diff --git a/lib/util/print_version.c b/lib/util/print_version.c deleted file mode 100644 index b23e2bd..0000000 --- a/lib/util/print_version.c +++ /dev/null @@ -1,29 +0,0 @@ -/* SPDX-License-Identifier: GPL-3.0-or-later */ -/* - * print_version.c - * - * Copyright (C) 2019 David Oberhollenzer - */ -#include "config.h" - -#include "util.h" - -#include - -#define LICENSE_SHORT "GPLv3+" -#define LICENSE_LONG "GNU GPL version 3 or later" -#define LICENSE_URL "https://gnu.org/licenses/gpl.html" - -extern char *__progname; - -static const char *version_string = -"%s (%s) %s\n" -"Copyright (c) 2019 David Oberhollenzer et al\n" -"License " LICENSE_SHORT ": " LICENSE_LONG " <" LICENSE_URL ">.\n" -"This is free software: you are free to change and redistribute it.\n" -"There is NO WARRANTY, to the extent permitted by law.\n"; - -void print_version(void) -{ - printf(version_string, __progname, PACKAGE_NAME, PACKAGE_VERSION); -} diff --git a/lib/util/source_date_epoch.c b/lib/util/source_date_epoch.c deleted file mode 100644 index 1397e52..0000000 --- a/lib/util/source_date_epoch.c +++ /dev/null @@ -1,45 +0,0 @@ -/* SPDX-License-Identifier: GPL-3.0-or-later */ -/* - * source_date_epoch.h - * - * Copyright (C) 2019 David Oberhollenzer - */ -#include "config.h" -#include "util.h" - -#include -#include -#include - -uint32_t get_source_date_epoch(void) -{ - const char *str, *ptr; - uint32_t x, tval = 0; - - str = getenv("SOURCE_DATE_EPOCH"); - - if (str == NULL || *str == '\0') - return 0; - - for (ptr = str; *ptr != '\0'; ++ptr) { - if (!isdigit(*ptr)) - goto fail_nan; - - x = (*ptr) - '0'; - - if (tval > (UINT32_MAX - x) / 10) - goto fail_ov; - - tval = tval * 10 + x; - } - - return tval; -fail_ov: - fprintf(stderr, "WARNING: SOURCE_DATE_EPOCH=%s does not fit into " - "32 bit integer\n", str); - return 0; -fail_nan: - fprintf(stderr, "WARNING: SOURCE_DATE_EPOCH=%s is not a positive " - "number\n", str); - return 0; -} diff --git a/tests/Makemodule.am b/tests/Makemodule.am index b242bd2..4b17b34 100644 --- a/tests/Makemodule.am +++ b/tests/Makemodule.am @@ -1,5 +1,5 @@ test_canonicalize_name_SOURCES = tests/canonicalize_name.c -test_canonicalize_name_LDADD = libutil.la +test_canonicalize_name_LDADD = libfstree.a test_mknode_simple_SOURCES = tests/mknode_simple.c test_mknode_simple_LDADD = libfstree.a diff --git a/tests/canonicalize_name.c b/tests/canonicalize_name.c index 64ca766..d67bc1e 100644 --- a/tests/canonicalize_name.c +++ b/tests/canonicalize_name.c @@ -6,7 +6,7 @@ */ #include "config.h" -#include "util.h" +#include "fstree.h" #include #include -- cgit v1.2.3