From owner-p4-projects@FreeBSD.ORG Mon Nov 1 07:16:25 2010 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 6020A1065679; Mon, 1 Nov 2010 07:16:25 +0000 (UTC) Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 004C61065674 for ; Mon, 1 Nov 2010 07:16:24 +0000 (UTC) (envelope-from dforsyth@FreeBSD.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:4f8:fff6::2d]) by mx1.freebsd.org (Postfix) with ESMTP id C59618FC14 for ; Mon, 1 Nov 2010 07:16:24 +0000 (UTC) Received: from skunkworks.freebsd.org (localhost [127.0.0.1]) by skunkworks.freebsd.org (8.14.4/8.14.4) with ESMTP id oA17GO4P046118 for ; Mon, 1 Nov 2010 07:16:24 GMT (envelope-from dforsyth@FreeBSD.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.4/8.14.4/Submit) id oA17GOwx046115 for perforce@freebsd.org; Mon, 1 Nov 2010 07:16:24 GMT (envelope-from dforsyth@FreeBSD.org) Date: Mon, 1 Nov 2010 07:16:24 GMT Message-Id: <201011010716.oA17GOwx046115@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to dforsyth@FreeBSD.org using -f From: David Forsythe To: Perforce Change Reviews Precedence: bulk Cc: Subject: PERFORCE change 185294 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 01 Nov 2010 07:16:25 -0000 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 #include -#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 #include #include -#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