From 3d494a7ab27debd8842157c50c46d5bb49952671 Mon Sep 17 00:00:00 2001 From: Guillem Jover Date: Fri, 31 Aug 2018 01:49:20 +0200 Subject: libdpkg: Add new fsys-dir module This module handles setting and getting the filesystem root directory. --- lib/dpkg/Makefile.am | 1 + lib/dpkg/fsys-dir.c | 93 +++++++++++++++++++++++++++++++++++++++++++++++++ lib/dpkg/fsys.h | 4 +++ lib/dpkg/libdpkg.map | 4 +++ lib/dpkg/t/.gitignore | 1 + lib/dpkg/t/Makefile.am | 1 + lib/dpkg/t/t-fsys-dir.c | 65 ++++++++++++++++++++++++++++++++++ 7 files changed, 169 insertions(+) create mode 100644 lib/dpkg/fsys-dir.c create mode 100644 lib/dpkg/t/t-fsys-dir.c (limited to 'lib') diff --git a/lib/dpkg/Makefile.am b/lib/dpkg/Makefile.am index 58bd403ab..a2828af4b 100644 --- a/lib/dpkg/Makefile.am +++ b/lib/dpkg/Makefile.am @@ -70,6 +70,7 @@ libdpkg_la_SOURCES = \ fdio.c \ file.c \ fields.c \ + fsys-dir.c\ fsys-iter.c \ fsys-hash.c \ glob.c \ diff --git a/lib/dpkg/fsys-dir.c b/lib/dpkg/fsys-dir.c new file mode 100644 index 000000000..15335b23e --- /dev/null +++ b/lib/dpkg/fsys-dir.c @@ -0,0 +1,93 @@ +/* + * libdpkg - Debian packaging suite library routines + * fsys-dir.c - filesystem root directory functions + * + * Copyright © 2011, 2018 Guillem Jover + * + * This is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include +#include + +#include + +#include +#include +#include +#include + +static const char *fsys_dir = ""; + +/** + * Set current on-disk filesystem root directory. + * + * The directory is initially set to "", this function can be used to + * set the directory to a new value, or to set it to a default value if dir + * is NULL. For the latter the order is, value from environment variable + * DPKG_ROOT, and then the built-in default "", + * + * @param dir The new filesystem root directory, or NULL to set to default. + * + * @return The new filesystem root directory. + */ +const char * +dpkg_fsys_set_dir(const char *dir) +{ + char *new_dir; + + if (dir == NULL) { + const char *env; + + env = getenv("DPKG_ROOT"); + if (env) + dir = env; + else + dir = ""; + } + + new_dir = m_strdup(dir); + path_trim_slash_slashdot(new_dir); + + fsys_dir = new_dir; + + return fsys_dir; +} + +/** + * Get current on-disk filesystem root directory. + * + * @return The current filesystem root directory. + */ +const char * +dpkg_fsys_get_dir(void) +{ + return fsys_dir; +} + +/** + * Get a pathname to the current on-disk filesystem root directory. + * + * This function returns an allocated string, which should be freed with + * free(2). + * + * @param pathpart The pathpart to append to the new pathname. + * + * @return The newly allocated pathname. + */ +char * +dpkg_fsys_get_path(const char *pathpart) +{ + return str_fmt("%s/%s", fsys_dir, pathpart); +} diff --git a/lib/dpkg/fsys.h b/lib/dpkg/fsys.h index 8a2efbffa..72d76f715 100644 --- a/lib/dpkg/fsys.h +++ b/lib/dpkg/fsys.h @@ -190,4 +190,8 @@ struct filepackages_iterator *filepackages_iter_new(struct filenamenode *fnn); struct pkginfo *filepackages_iter_next(struct filepackages_iterator *iter); void filepackages_iter_free(struct filepackages_iterator *iter); +const char *dpkg_fsys_set_dir(const char *dir); +const char *dpkg_fsys_get_dir(void); +char *dpkg_fsys_get_path(const char *pathpart); + #endif /* LIBDPKG_FSYS_H */ diff --git a/lib/dpkg/libdpkg.map b/lib/dpkg/libdpkg.map index cb3062845..082732405 100644 --- a/lib/dpkg/libdpkg.map +++ b/lib/dpkg/libdpkg.map @@ -419,6 +419,10 @@ LIBDPKG_PRIVATE { filepackages_iter_next; filepackages_iter_free; + dpkg_fsys_set_dir; + dpkg_fsys_get_dir; + dpkg_fsys_get_path; + # Package on-disk filesystem database support parse_filehash; write_filelist_except; diff --git a/lib/dpkg/t/.gitignore b/lib/dpkg/t/.gitignore index db7126c04..5b019c86e 100644 --- a/lib/dpkg/t/.gitignore +++ b/lib/dpkg/t/.gitignore @@ -10,6 +10,7 @@ t-deb-version t-ehandle t-error t-file +t-fsys-dir t-fsys-hash t-headers-cpp t-macros diff --git a/lib/dpkg/t/Makefile.am b/lib/dpkg/t/Makefile.am index 9e83836e4..83c96f329 100644 --- a/lib/dpkg/t/Makefile.am +++ b/lib/dpkg/t/Makefile.am @@ -48,6 +48,7 @@ test_programs = \ t-pkg-queue \ t-pkg-hash \ t-pkg-show \ + t-fsys-dir \ t-fsys-hash \ t-trigger \ t-mod-db \ diff --git a/lib/dpkg/t/t-fsys-dir.c b/lib/dpkg/t/t-fsys-dir.c new file mode 100644 index 000000000..7dbe753d1 --- /dev/null +++ b/lib/dpkg/t/t-fsys-dir.c @@ -0,0 +1,65 @@ +/* + * libdpkg - Debian packaging suite library routines + * t-fsys.c - test filesystem handling + * + * Copyright © 2018 Guillem Jover + * + * This is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include +#include + +#include + +#include +#include + +static void +test_fsys_dir(void) +{ + char *dir; + + test_str(dpkg_fsys_get_dir(), ==, ""); + + dpkg_fsys_set_dir("/testdir"); + test_str(dpkg_fsys_get_dir(), ==, "/testdir"); + + dir = dpkg_fsys_get_path("testfile"); + test_str(dir, ==, "/testdir/testfile"); + free(dir); + + setenv("DPKG_ROOT", "/testenvdir", 1); + dpkg_fsys_set_dir(NULL); + test_str(dpkg_fsys_get_dir(), ==, "/testenvdir"); + + dir = dpkg_fsys_get_path("testfile"); + test_str(dir, ==, "/testenvdir/testfile"); + free(dir); + + unsetenv("DPKG_ROOT"); + dpkg_fsys_set_dir(NULL); + test_str(dpkg_fsys_get_dir(), ==, ""); + + dir = dpkg_fsys_get_path("testfile"); + test_str(dir, ==, "/testfile"); + free(dir); +} + +TEST_ENTRY(test) +{ + test_plan(7); + + test_fsys_dir(); +} -- cgit v1.2.3