Date: Mon, 1 Nov 2010 07:16:24 GMT From: David Forsythe <dforsyth@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 185294 for review Message-ID: <201011010716.oA17GOwx046115@skunkworks.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://p4web.freebsd.org/@@185294?ac=10 Change 185294 by dforsyth@skunk on 2010/11/01 07:15:25 Simplify the repo and ftp repo. Affected files ... .. //depot/projects/soc2010/dforsyth_libpkg/libpkg/Makefile#9 edit .. //depot/projects/soc2010/dforsyth_libpkg/libpkg/freebsd_repository_ftp.c#4 edit .. //depot/projects/soc2010/dforsyth_libpkg/libpkg/freebsd_repository_ftp.h#4 edit .. //depot/projects/soc2010/dforsyth_libpkg/libpkg/pkg.h#11 edit .. //depot/projects/soc2010/dforsyth_libpkg/libpkg/pkg_types.h#4 edit .. //depot/projects/soc2010/dforsyth_libpkg/libpkg/repository.c#4 edit .. //depot/projects/soc2010/dforsyth_libpkg/libpkg/repository.h#4 edit .. //depot/projects/soc2010/dforsyth_libpkg/libpkg/repository_internal.h#4 edit Differences ... ==== //depot/projects/soc2010/dforsyth_libpkg/libpkg/Makefile#9 (text+ko) ==== @@ -14,6 +14,8 @@ database.c \ freebsd_plist.c \ freebsd_database_directorydb.c \ + repository.c \ + freebsd_repository_ftp.c \ util.c \ file.c \ depend.c \ ==== //depot/projects/soc2010/dforsyth_libpkg/libpkg/freebsd_repository_ftp.c#4 (text+ko) ==== @@ -12,11 +12,11 @@ #include <fcntl.h> #include <libgen.h> -#include "internal.h" +#include "repository.h" #include "freebsd_repository_ftp.h" -#define PKG_EXTENSION ".tbz" -#define URLBUF_LEN MAXHOSTNAMELEN + PATH_MAX +#define PKG_EXT ".tbz" +#define URL_MAX MAXHOSTNAMELEN + PATH_MAX /* * The FreeBSD FTP repository isn't terribly complex. Simply pass in the name @@ -24,119 +24,56 @@ * a file stream for the client. */ -static int _pkg_repository_ftp_open(struct pkg_repository *, const char *, - u_int); -static int _pkg_repository_ftp_close(struct pkg_repository *); -static FILE *_pkg_repository_ftp_fetch_pkg(struct pkg_repository *, - const char *, char **, size_t *, u_int); - -struct _freebsd_ftp { - /* Seems long enough... */ - char base[MAXHOSTNAMELEN]; - /* Book keeping. */ - int flags; +struct ftprepo { + char path[MAXHOSTNAMELEN]; }; -static struct pkg_repository_vtable _vt = { - .open = _pkg_repository_ftp_open, - .close = _pkg_repository_ftp_close, - .fetch_pkg = _pkg_repository_ftp_fetch_pkg -}; - -struct pkg_repository_vtable * -pkg_repository_ftp_vtable(void) +int +fbsd_ftprepo_open(struct pkg_repo *repo, const char *path) { - return (&_vt); -} + struct ftprepo *f; -void -pkg_repository_ftp_init(struct pkg_repository *rp) -{ - _pkg_repository_set_vtable(rp, &_vt); -} + f = calloc(1, sizeof(*f)); + if (f == NULL) return (PKG_NOT_OK); + + if (strncmp(path, "ftp://", 6) != 0) strcpy(f->path, "ftp://"); -static int -_pkg_repository_ftp_open(struct pkg_repository *rp, const char *base, - u_int flags) -{ - struct _freebsd_ftp *ftp; - struct url_stat st; - (void)st; + strcat(f->path, path); - /* Allocate and initialize. */ - ftp = calloc(1, sizeof(*ftp)); - if (ftp == NULL) { - return (PKG_NOT_OK); - } - strcpy(ftp->base, ""); - /* We need the ftp:// prefix for a valid url. */ - if (strncmp(base, "ftp://", 6) != 0) { - strcat(ftp->base, "ftp://"); - } - strcat(ftp->base, base); - ftp->flags = flags; + repo->internal = f; - /* Check to make sure the repository actually exists. */ - if (fetchStatURL(ftp->base, &st, NULL) < 0) { - free(ftp); - return (PKG_NOT_OK); - } - - /* Set the __internal pointer. */ - rp->internal = ftp; - return (PKG_OK); } -static int -_pkg_repository_ftp_close(struct pkg_repository *rp) +int +fbsd_ftprepo_close(struct pkg_repo *repo) { - struct _freebsd_ftp *ftp; + struct ftprepo *f; + + f = repo->internal; + + free(f); - ftp = rp->internal; - free(ftp); return (PKG_OK); } -static FILE * -_pkg_repository_ftp_fetch_pkg(struct pkg_repository *rp, - const char *name, char **fname, size_t *size, u_int flags) +FILE * +fbsd_ftprepo_fetch(struct pkg_repo *repo, const char *name) { - struct _freebsd_ftp *ftp; - char url[MAXHOSTNAMELEN + PATH_MAX]; /* *shrug* */ - const char *base; - struct url_stat st; FILE *fp; - - (void)flags; + char url[URL_MAX]; + struct ftprepo *f; + + f = repo->internal; - ftp = rp->internal; - - /* Build the entire URL for the fetch. */ - strcpy(url, ftp->base); - strcat(url, "/"); + strcpy(url, f->path); strcat(url, name); - strcat(url, PKG_EXTENSION); - - base = basename(url); - printf("%s\n", url); - - fp = fetchXGetURL(url, &st, NULL); - if (fp == NULL) { - /* XXX: I should really set up an error system in the library. - */ - warnx("freebsd_ftp fetch failed -> %s", fetchLastErrString); - return (NULL); - } + if (strcmp((name + strlen(name) - strlen(PKG_EXT)), PKG_EXT) != 0) + strcat(url, PKG_EXT); - base = basename(url); - *fname = strdup(base); + fp = fetchGetURL(url, NULL); - /* Optional. */ - if (size != NULL) { - *size = st.size; - } - return (fp); -} +} + ==== //depot/projects/soc2010/dforsyth_libpkg/libpkg/freebsd_repository_ftp.h#4 (text+ko) ==== @@ -5,8 +5,10 @@ #ifndef __PKGRP_FREEBSD_FTP_H__ #define __PKGRP_FREEBSD_FTP_H__ -#include "internal.h" +int fbsd_ftprepo_open(struct pkg_repo *, const char *); + +int fbsd_ftprepo_close(struct pkg_repo *); -struct pkg_repository_vtable *pkg_repository_ftp_vtable(void); +FILE *fbsd_ftprepo_fetch(struct pkg_repo *, const char *); #endif ==== //depot/projects/soc2010/dforsyth_libpkg/libpkg/pkg.h#11 (text+ko) ==== @@ -157,8 +157,7 @@ int pkg_repo_open(struct pkg_repo *, const char *); -FILE *pkg_repo_fetch(struct pkg_repo *, const char *, - uint32_t *); +FILE *pkg_repo_fetch(struct pkg_repo *, const char *); int pkg_repo_close(struct pkg_repo *); ==== //depot/projects/soc2010/dforsyth_libpkg/libpkg/pkg_types.h#4 (text+ko) ==== ==== //depot/projects/soc2010/dforsyth_libpkg/libpkg/repository.c#4 (text+ko) ==== @@ -3,99 +3,61 @@ * See LICENSE file for license details. */ +#include <assert.h> #include <stdio.h> #include <stdlib.h> -#include "internal.h" +#include "repository.h" +#include "freebsd_repository_ftp.h" -#define MAGIC 0x00000000 - -static void _pkg_repository_check_magic(struct pkg_repository *, const char *); - -static void -_pkg_repository_check_magic(struct pkg_repository *rp, const char *func) +struct pkg_repo * +pkg_repo_create(void) { - if (rp->magic != MAGIC) { - PKG_CLIENT_CRASH(func, "repository magic number mismatch"); - } -} + struct pkg_repo *repo; -void -_pkg_repository_set_vtable(struct pkg_repository *rp, - struct pkg_repository_vtable *vt) -{ - rp->vtable = vt; -} + repo = calloc(1, sizeof(*repo)); + if (repo == NULL) return (NULL); -struct pkg_repository * -pkg_repository_create(void) -{ - struct pkg_repository *rp; + repo->internal = NULL; + repo->open = fbsd_ftprepo_open; + repo->close = fbsd_ftprepo_close; + repo->fetch = fbsd_ftprepo_fetch; - rp = calloc(1, sizeof(*rp)); - if (rp == NULL) { - return (NULL); - } - - rp->internal = NULL; - rp->vtable = NULL; - rp->magic = MAGIC; - - return (rp); + return (repo); } int -pkg_repository_open(struct pkg_repository *rp, const char *location, - u_int flags) +pkg_repo_finish(struct pkg_repo *repo) { int r; - _pkg_repository_check_magic(rp, __func__); + if (repo->internal != NULL) { + r = pkg_repo_close(repo); + if (r != PKG_OK) return (r); + } - r = rp->vtable->open(rp, location, flags); - - return (r); + free(repo); + + return (PKG_OK); } -FILE * -pkg_repository_fetch_pkg(struct pkg_repository *rp, const char *name, - char **fname, size_t *size, u_int flags) +int +pkg_repo_open(struct pkg_repo *repo, const char *path) { - FILE *f; - - _pkg_repository_check_magic(rp, __func__); - - f = rp->vtable->fetch_pkg(rp, name, fname, size, flags); - if (f == NULL) { - return (NULL); - } - return (f); + assert(repo->internal == NULL); + return (repo->open(repo, path)); } int -pkg_repository_close(struct pkg_repository *rp) +pkg_repo_close(struct pkg_repo *repo) { - int r; - - _pkg_repository_check_magic(rp, __func__); - - r = rp->vtable->close(rp); - if (r != PKG_OK) { - return (r); - } - - rp->status = CLOSED; - - return (PKG_OK); + if (repo->internal == NULL) return (PKG_OK); + return (repo->close(repo)); } -void -pkg_repository_release(struct pkg_repository *rp) +FILE * +pkg_repo_fetch(struct pkg_repo *repo, const char *name) { - _pkg_repository_check_magic(rp, __func__); - - if (rp->status == OPEN) { - rp->vtable->close(rp); - } - free(rp); + assert(repo->internal != NULL); + return (repo->fetch(repo, name)); } ==== //depot/projects/soc2010/dforsyth_libpkg/libpkg/repository.h#4 (text+ko) ==== @@ -11,18 +11,12 @@ #include "pkg.h" -/* XXX: Init's for repository types. */ -void pkg_repository_ftp_init(struct pkg_repository *); +struct pkg_repo { + void *internal; -struct pkg_repository *pkg_repository_create(void); - -void pkg_repository_release(struct pkg_repository *); - -int pkg_repository_open(struct pkg_repository *, const char *, u_int); - -FILE *pkg_repository_fetch_pkg(struct pkg_repository *, const char *, char **, - size_t *, u_int); - -int pkg_repository_close(struct pkg_repository *); + int (*open) (struct pkg_repo *, const char *); + int (*close) (struct pkg_repo *); + FILE *(*fetch) (struct pkg_repo *, const char *); +}; #endif ==== //depot/projects/soc2010/dforsyth_libpkg/libpkg/repository_internal.h#4 (text+ko) ==== @@ -8,21 +8,4 @@ #include "repository.h" -struct pkg_repository_vtable { - int (*open) (struct pkg_repository *, const char *, u_int); - FILE *(*fetch_pkg) (struct pkg_repository *, const char *, char **, - size_t *, u_int); - int (*close) (struct pkg_repository *); -}; - -struct pkg_repository { - void *internal; - unsigned int magic; - status_t status; - struct pkg_repository_vtable *vtable; -}; - -void _pkg_repository_set_vtable(struct pkg_repository *, - struct pkg_repository_vtable *); - #endif
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201011010716.oA17GOwx046115>