Skip site navigation (1)Skip section navigation (2)
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>