diff options
-rw-r--r-- | debian/changelog | 1 | ||||
-rw-r--r-- | lib/dpkg/Makefile.am | 1 | ||||
-rw-r--r-- | lib/dpkg/fsys-dir.c | 93 | ||||
-rw-r--r-- | lib/dpkg/fsys.h | 4 | ||||
-rw-r--r-- | lib/dpkg/libdpkg.map | 4 | ||||
-rw-r--r-- | lib/dpkg/t/.gitignore | 1 | ||||
-rw-r--r-- | lib/dpkg/t/Makefile.am | 1 | ||||
-rw-r--r-- | lib/dpkg/t/t-fsys-dir.c | 65 | ||||
-rw-r--r-- | po/POTFILES.in | 1 |
9 files changed, 171 insertions, 0 deletions
diff --git a/debian/changelog b/debian/changelog index eb68b75dc..6f9e4a0a6 100644 --- a/debian/changelog +++ b/debian/changelog @@ -27,6 +27,7 @@ dpkg (1.19.2) UNRELEASED; urgency=medium - Dpkg(1): Add POD documentation about the module hierarchy and API. * Code internals: - dpkg-split: Use nfstrnsave() instead of nfmalloc() + memcpy(). + - libdpkg: Add new fsys-dir module. * Build system: - Distribute a LICENSE file on CPAN. - Do not make the Build.PL script executable. 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 <guillem@debian.org> + * + * 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 <https://www.gnu.org/licenses/>. + */ + +#include <config.h> +#include <compat.h> + +#include <stdlib.h> + +#include <dpkg/dpkg.h> +#include <dpkg/string.h> +#include <dpkg/path.h> +#include <dpkg/fsys.h> + +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 <guillem@debian.org> + * + * 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 <https://www.gnu.org/licenses/>. + */ + +#include <config.h> +#include <compat.h> + +#include <stdlib.h> + +#include <dpkg/test.h> +#include <dpkg/fsys.h> + +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(); +} diff --git a/po/POTFILES.in b/po/POTFILES.in index 43212d541..1fc14b9f6 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -28,6 +28,7 @@ lib/dpkg/error.c lib/dpkg/fdio.c lib/dpkg/fields.c lib/dpkg/file.c +lib/dpkg/fsys-dir.c lib/dpkg/fsys-iter.c lib/dpkg/fsys-hash.c lib/dpkg/glob.c |