Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
Array instead of tailq for packages
Philippe Pepiot committed 15 years ago
commit dace271155393682ab9011cb6eacdd8a3fd83edd
parent b1965c3
5 files changed +32 -43
modified libpkg/pkg.c
@@ -14,10 +14,10 @@

#define METADATA_GLOB "+{DEINSTALL,INSTALL,MTREE_DIRS}"

-
static int pkg_create_from_dir(char *, char *, struct archive *);
+
static int pkg_create_from_dir(char *, const char *, struct archive *);

static int
-
pkg_create_from_dir(char *path, char *root, struct archive *pkg_archive)
+
pkg_create_from_dir(char *path, const char *root, struct archive *pkg_archive)
{
	struct archive_entry *entry;
	char glob_pattern[MAXPATHLEN + sizeof(METADATA_GLOB)];
@@ -25,12 +25,10 @@ pkg_create_from_dir(char *path, char *root, struct archive *pkg_archive)
	int fd, j;
	size_t len, i = 0;
	char buf[BUFSIZ];
-
	struct stat st;
	cJSON *manifest, *files, *file;
	char *buffer;
	char manifestpath[MAXPATHLEN], fpath[MAXPATHLEN];
	char *filepath;
-
	void *filebuf;
	struct archive *ar;

	ar = archive_read_disk_new();
@@ -121,7 +119,7 @@ pkg_create_from_dir(char *path, char *root, struct archive *pkg_archive)
}

int
-
pkg_create(char *pkgname, pkg_formats format, char *outdir, char *rootdir)
+
pkg_create(char *pkgname, pkg_formats format, const char *outdir, const char *rootdir)
{
	struct pkgdb db;
	struct pkg *pkg;
@@ -159,10 +157,10 @@ pkg_create(char *pkgname, pkg_formats format, char *outdir, char *rootdir)
		return (-1);
	}

-
	TAILQ_FOREACH(pkg, &db.pkgs, entry) {
-
		printf("Creating package %s/%s-%s.%s\n", outdir, pkg->name, pkg->version, ext);
-
		snprintf(pkgpath, sizeof(pkgpath), "%s/%s-%s/", pkgdb_dir ? pkgdb_dir : PKG_DBDIR, pkg->name, pkg->version);
-
		snprintf(archive_path, sizeof(archive_path), "%s/%s-%s.%s", outdir, pkg->name, pkg->version, ext);
+
	PKGDB_FOREACH(pkg, &db) {
+
		printf("Creating package %s/%s.%s\n", outdir, pkg->name_version, ext);
+
		snprintf(pkgpath, sizeof(pkgpath), "%s/%s/", pkgdb_dir ? pkgdb_dir : PKG_DBDIR, pkg->name_version);
+
		snprintf(archive_path, sizeof(archive_path), "%s/%s.%s", outdir, pkg->name_version, ext);

		pkg_archive = archive_write_new();

modified libpkg/pkg.h
@@ -3,24 +3,27 @@

#include <cdb.h>
#include <stdio.h> /* for size_t */
-
#include <sys/queue.h>

struct pkg {
+
	char *name_version;
	const char *name;
	const char *version;
	const char *origin;
	const char *comment;
	const char *desc;
-
	TAILQ_ENTRY(pkg) entry;
-
	TAILQ_HEAD(, pkg) deps;
+
	struct pkg **deps; /* null-terminated */
};

struct pkgdb {
-
	TAILQ_HEAD(, pkg) pkgs;
+
	struct pkg **pkgs; /* null-terminated */
	size_t count;
+
	size_t i;
	struct cdb db;
};

+
#define PKGDB_FOREACH(pkg, db) for ((db)->i = 0, (pkg) = (db)->pkgs[0]; \
+
		(pkg) != NULL; (pkg) = (db)->pkgs[++(db)->i])
+

typedef enum pkg_formats { TAR, TGZ, TBZ, TXZ } pkg_formats;
-
int pkg_create(char *, pkg_formats, char *, char *);
+
int pkg_create(char *, pkg_formats, const char *, const char *);
#endif
modified libpkg/pkgdb.c
@@ -22,11 +22,11 @@ pkgdb_free(struct pkgdb *db)
	cdb_free(&db->db);
	close(fd);

-
	while (!TAILQ_EMPTY(&db->pkgs)) {
-
		pkg = TAILQ_FIRST(&db->pkgs);
-
		TAILQ_REMOVE(&db->pkgs, pkg, entry);
+
	PKGDB_FOREACH(pkg, db) {
+
		free(pkg->name_version);
		free(pkg);
	}
+
	free(db->pkgs);
}

size_t
modified libpkg/pkgdb_cache.c
@@ -104,7 +104,6 @@ pkg_idx_query(struct cdb *db, int idx)
		return NULL;

	pkg = malloc(sizeof(*pkg));
-
	TAILQ_INIT(&pkg->deps);
	db_get(pkg->name, db);

	pkg->version = db_query(db, PKGDB_VERSION, idx);
@@ -299,12 +298,8 @@ pkgdb_cache_init(struct pkgdb *db, const char *pattern)
{
	int count, i;
	struct pkg *pkg;
-
	struct pkg **pkgs;
-
	TAILQ_HEAD(, pkg) head;
	char *name;

-
	TAILQ_INIT(&head);
-
	TAILQ_INIT(&db->pkgs);
	db->count = 0;

	if (pkgdb_open(&db->db, O_RDONLY) == -1)
@@ -317,6 +312,8 @@ pkgdb_cache_init(struct pkgdb *db, const char *pattern)

	cdb_read(&db->db, &count, sizeof(count), cdb_datapos(&db->db));

+
	db->pkgs = calloc(count+1, sizeof(struct pkg *));
+

	for (i = 0; i < count; i++) {
		/* get package */
		if ((pkg = pkg_idx_query(&db->db, i)) == NULL)
@@ -329,27 +326,18 @@ pkgdb_cache_init(struct pkgdb *db, const char *pattern)
		}

		if (!pattern || strncmp(name, pattern, strlen(pattern)) == 0) {
-
			TAILQ_INSERT_TAIL(&head, pkg, entry);
-
			db->count++;
-
		}
-
		else
+
			pkg->name_version = name;
+
			db->pkgs[db->count++] = pkg;
+
		} else {
			free(pkg);
-

-
		free(name);
+
			free(name);
+
		}
	}

	/* sort packages */
-
	pkgs = calloc(db->count, sizeof(struct pkg));
-
	i = 0;
-
	TAILQ_FOREACH(pkg, &head, entry)
-
		pkgs[i++] = pkg;
-

-
	qsort(pkgs, db->count, sizeof(*pkgs), pkg_cmp);
-

-
	for (i = 0; i < (int)db->count; i++)
-
		TAILQ_INSERT_TAIL(&db->pkgs, pkgs[i], entry);
-

-
	free(pkgs);
+
	db->pkgs = realloc(db->pkgs, (db->count+1) * sizeof(struct pkg *));
+
	db->pkgs[db->count] = NULL;
+
	qsort(db->pkgs, db->count, sizeof(struct pkg *), pkg_cmp);

	return;
}
modified pkg/info.c
@@ -16,14 +16,14 @@ cmd_info(int argc, char **argv)

	if (pkgdb_count(&db) == 1) {
		/* one match */
-
		pkg = TAILQ_FIRST(&db.pkgs);
-
		printf("Information for %s-%s\n", pkg->name, pkg->version);
+
		pkg = db.pkgs[0];
+
		printf("Information for %s\n", pkg->name_version);
		printf("Comment:\n%s\n\n", pkg->comment);
		printf("Description:\n%s\n\n", pkg->desc);
	}
	else if (pkgdb_count(&db) > 1) {
-
		TAILQ_FOREACH(pkg, &db.pkgs, entry) {
-
			printf("%s-%s: %s\n", pkg->name, pkg->version, pkg->comment);
+
		PKGDB_FOREACH(pkg, &db) {
+
			printf("%s: %s\n", pkg->name_version, pkg->comment);
		}
	}