PERFORCE change 185294 for review
David Forsythe
dforsyth at FreeBSD.org
Mon Nov 1 07:16:25 UTC 2010
http://p4web.freebsd.org/@@185294?ac=10
Change 185294 by dforsyth at 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
More information about the p4-projects
mailing list