From ac897c83837f58568a9e0371ad97650ab0547a62 Mon Sep 17 00:00:00 2001 From: Juan RP Date: Tue, 27 Oct 2009 04:40:00 +0100 Subject: [PATCH] libxbps: move remote repo pkg-index sync code into its own file. --HG-- extra : convert_revision : xtraeme%40gmail.com-20091027034000-rsg33sjonqsu0d5t --- include/xbps_api.h | 6 +- lib/Makefile | 4 +- lib/repository.c | 205 ---------------------------------- lib/sync_remote_pkgidx.c | 235 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 241 insertions(+), 209 deletions(-) create mode 100644 lib/sync_remote_pkgidx.c diff --git a/include/xbps_api.h b/include/xbps_api.h index 3512840e..7e22f74f 100644 --- a/include/xbps_api.h +++ b/include/xbps_api.h @@ -174,8 +174,6 @@ int SYMEXPORT xbps_remove_pkg(const char *, const char *, bool); /* From lib/repository.c */ int SYMEXPORT xbps_register_repository(const char *); int SYMEXPORT xbps_unregister_repository(const char *); -int SYMEXPORT xbps_sync_repository_pkg_index(const char *); -char SYMEXPORT *xbps_get_remote_repo_string(const char *); /* From lib/requiredby.c */ int SYMEXPORT xbps_requiredby_pkg_add(prop_array_t, prop_dictionary_t); @@ -197,6 +195,10 @@ int SYMEXPORT xbps_get_pkg_state_dictionary(prop_dictionary_t, pkg_state_t *); int SYMEXPORT xbps_set_pkg_state_installed(const char *, pkg_state_t); int SYMEXPORT xbps_set_pkg_state_dictionary(prop_dictionary_t, pkg_state_t); +/* From lib/sync_remote_pkgidx.c */ +int SYMEXPORT xbps_sync_repository_pkg_index(const char *); +char SYMEXPORT *xbps_get_remote_repo_string(const char *); + /* From lib/unpack.c */ int SYMEXPORT xbps_unpack_binary_pkg(prop_dictionary_t, bool); diff --git a/lib/Makefile b/lib/Makefile index f1ff85c3..94748344 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -29,8 +29,8 @@ OBJS = fetch/common.o fetch/fetch.o fetch/file.o fetch/ftp.o fetch/http.o # libxbps OBJS += configure.o cmpver.o depends.o download.o fexec.o findpkg.o OBJS += humanize_number.o orphans.o plist.o purge.o register.o remove.o -OBJS += repository.o requiredby.o sha256.o sortdeps.o state.o unpack.o -OBJS += util.o +OBJS += repository.o requiredby.o sha256.o sortdeps.o state.o +OBJS += sync_remote_pkgidx.o unpack.o util.o all: libfetch libxbps.so libxbps.a .PHONY: all diff --git a/lib/repository.c b/lib/repository.c index 1eee5cb8..32492fa1 100644 --- a/lib/repository.c +++ b/lib/repository.c @@ -23,16 +23,12 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include #include #include #include #include #include -#include "fetch.h" - -static int mkpath(char *, mode_t); int SYMEXPORT xbps_register_repository(const char *uri) @@ -154,204 +150,3 @@ out: return rv; } - -char SYMEXPORT * -xbps_get_remote_repo_string(const char *uri) -{ - struct url *url; - size_t i; - char *p; - - if ((url = fetchParseURL(uri)) == NULL) - return NULL; - - /* - * Replace dots and slashes with underscores, so that - * provided URL: - * - * www.foo.org/blah/xbps/binpkg-repo - * - * becomes: - * - * www_foo_org_blah_xbps_binpkg_repo - * - */ - p = xbps_xasprintf("%s%s", url->host, url->doc); - fetchFreeURL(url); - if (p == NULL) - return NULL; - - for (i = 0; i < strlen(p); i++) { - if (p[i] == '.' || p[i] == '/') - p[i] = '_'; - } - - return p; -} - -int SYMEXPORT -xbps_sync_repository_pkg_index(const char *uri) -{ - struct url *url; - struct utsname un; - const char *rootdir = xbps_get_rootdir(); - char *rpidx, *dir, *lrepodir, *uri_fixedp = NULL; - int rv = 0; - - if (uname(&un) == -1) - return errno; - - if ((url = fetchParseURL(uri)) == NULL) - return errno; - - uri_fixedp = xbps_get_remote_repo_string(uri); - if (uri_fixedp == NULL) { - fetchFreeURL(url); - return errno; - } - - /* - * Create local arch repodir: - * - * /var/db/xbps/repo// - */ - lrepodir = xbps_xasprintf("%s/%s/repo/%s/%s", - rootdir, XBPS_META_PATH, uri_fixedp, un.machine); - if (lrepodir == NULL) { - fetchFreeURL(url); - free(uri_fixedp); - return errno; - } - if (mkpath(lrepodir, 0755) == -1) { - free(lrepodir); - free(uri_fixedp); - fetchFreeURL(url); - return errno; - } - /* - * Create local noarch repodir: - * - * /var/db/xbps/repo//noarch - */ - dir = xbps_xasprintf("%s/%s/repo/%s/noarch", - rootdir, XBPS_META_PATH, uri_fixedp); - free(uri_fixedp); - fetchFreeURL(url); - if (dir == NULL) { - free(lrepodir); - return errno; - } - if (mkpath(dir, 0755) == -1) { - free(dir); - free(lrepodir); - return errno; - } - free(dir); - /* - * Download pkg-index.plist file from repository. - */ - rpidx = xbps_xasprintf("%s/%s/%s", uri, un.machine, XBPS_PKGINDEX); - if (rpidx == NULL) { - free(lrepodir); - return errno; - } - rv = xbps_fetch_file(rpidx, lrepodir); - - free(rpidx); - free(lrepodir); - - return rv; -} - -/* - * The following is a modified function from NetBSD's src/bin/mkdir/mkdir.c - */ - -/* - * Copyright (c) 1983, 1992, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -/* - * mkpath -- create directories. - * path - path - * mode - file mode of terminal directory - */ -static int -mkpath(char *path, mode_t mode) -{ - struct stat sb; - char *slash = path; - int done = 0, rv; - mode_t dir_mode; - - /* - * The default file mode is a=rwx (0777) with selected permissions - * removed in accordance with the file mode creation mask. For - * intermediate path name components, the mode is the default modified - * by u+wx so that the subdirectories can always be created. - */ - if (mode == 0) - mode = (S_IRWXU | S_IRWXG | S_IRWXO) & ~umask(0); - - dir_mode = mode | S_IWUSR | S_IXUSR; - - for (;;) { - slash += strspn(slash, "/"); - slash += strcspn(slash, "/"); - - done = (*slash == '\0'); - *slash = '\0'; - - rv = mkdir(path, done ? mode : dir_mode); - if (rv < 0) { - /* - * Can't create; path exists or no perms. - * stat() path to determine what's there now. - */ - int sverrno; - - sverrno = errno; - if (stat(path, &sb) < 0) { - /* Not there; use mkdir()s error */ - errno = sverrno; - return -1; - } - if (!S_ISDIR(sb.st_mode)) { - /* Is there, but isn't a directory */ - errno = ENOTDIR; - return -1; - } - } - if (done) - break; - - *slash = '/'; - } - - return 0; -} diff --git a/lib/sync_remote_pkgidx.c b/lib/sync_remote_pkgidx.c new file mode 100644 index 00000000..d127be15 --- /dev/null +++ b/lib/sync_remote_pkgidx.c @@ -0,0 +1,235 @@ +/*- + * Copyright (c) 2009 Juan Romero Pardines. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include +#include +#include + +#include +#include "fetch.h" + +static int mkpath(char *, mode_t); + +char SYMEXPORT * +xbps_get_remote_repo_string(const char *uri) +{ + struct url *url; + size_t i; + char *p; + + if ((url = fetchParseURL(uri)) == NULL) + return NULL; + + /* + * Replace dots and slashes with underscores, so that + * provided URL: + * + * www.foo.org/blah/xbps/binpkg-repo + * + * becomes: + * + * www_foo_org_blah_xbps_binpkg_repo + * + */ + p = xbps_xasprintf("%s%s", url->host, url->doc); + fetchFreeURL(url); + if (p == NULL) + return NULL; + + for (i = 0; i < strlen(p); i++) { + if (p[i] == '.' || p[i] == '/') + p[i] = '_'; + } + + return p; +} + +int SYMEXPORT +xbps_sync_repository_pkg_index(const char *uri) +{ + struct url *url; + struct utsname un; + char *rpidx, *dir, *lrepodir, *uri_fixedp = NULL; + int rv = 0; + + if (uname(&un) == -1) + return errno; + + if ((url = fetchParseURL(uri)) == NULL) + return errno; + + uri_fixedp = xbps_get_remote_repo_string(uri); + if (uri_fixedp == NULL) { + fetchFreeURL(url); + return errno; + } + + /* + * Create local arch repodir: + * + * /var/db/xbps/repo// + */ + lrepodir = xbps_xasprintf("%s/%s/repo/%s/%s", + xbps_get_rootdir(), XBPS_META_PATH, uri_fixedp, un.machine); + if (lrepodir == NULL) { + fetchFreeURL(url); + free(uri_fixedp); + return errno; + } + if (mkpath(lrepodir, 0755) == -1) { + free(lrepodir); + free(uri_fixedp); + fetchFreeURL(url); + return errno; + } + /* + * Create local noarch repodir: + * + * /var/db/xbps/repo//noarch + */ + dir = xbps_xasprintf("%s/%s/repo/%s/noarch", + xbps_get_rootdir(), XBPS_META_PATH, uri_fixedp); + free(uri_fixedp); + fetchFreeURL(url); + if (dir == NULL) { + free(lrepodir); + return errno; + } + if (mkpath(dir, 0755) == -1) { + free(dir); + free(lrepodir); + return errno; + } + free(dir); + /* + * Download pkg-index.plist file from repository. + */ + rpidx = xbps_xasprintf("%s/%s/%s", uri, un.machine, XBPS_PKGINDEX); + if (rpidx == NULL) { + free(lrepodir); + return errno; + } + rv = xbps_fetch_file(rpidx, lrepodir); + + free(rpidx); + free(lrepodir); + + return rv; +} + +/* + * The following is a modified function from NetBSD's src/bin/mkdir/mkdir.c + */ + +/* + * Copyright (c) 1983, 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* + * mkpath -- create directories. + * path - path + * mode - file mode of terminal directory + */ +static int +mkpath(char *path, mode_t mode) +{ + struct stat sb; + char *slash = path; + int done = 0, rv; + mode_t dir_mode; + + /* + * The default file mode is a=rwx (0777) with selected permissions + * removed in accordance with the file mode creation mask. For + * intermediate path name components, the mode is the default modified + * by u+wx so that the subdirectories can always be created. + */ + if (mode == 0) + mode = (S_IRWXU | S_IRWXG | S_IRWXO) & ~umask(0); + + dir_mode = mode | S_IWUSR | S_IXUSR; + + for (;;) { + slash += strspn(slash, "/"); + slash += strcspn(slash, "/"); + + done = (*slash == '\0'); + *slash = '\0'; + + rv = mkdir(path, done ? mode : dir_mode); + if (rv < 0) { + /* + * Can't create; path exists or no perms. + * stat() path to determine what's there now. + */ + int sverrno; + + sverrno = errno; + if (stat(path, &sb) < 0) { + /* Not there; use mkdir()s error */ + errno = sverrno; + return -1; + } + if (!S_ISDIR(sb.st_mode)) { + /* Is there, but isn't a directory */ + errno = ENOTDIR; + return -1; + } + } + if (done) + break; + + *slash = '/'; + } + + return 0; +}