PERFORCE change 165430 for review

David Forsythe dforsyth at FreeBSD.org
Mon Jun 29 19:11:22 UTC 2009


http://perforce.freebsd.org/chv.cgi?CH=165430

Change 165430 by dforsyth at squirrel on 2009/06/29 19:11:00

	Tweaked some things to make pkg_sub work correctly.  Reorganization
	imminent.

Affected files ...

.. //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkg.c#28 edit
.. //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkg_private.h#11 edit
.. //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkg_sub.c#3 edit
.. //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkg_sub.h#3 edit
.. //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkgdb.c#19 edit
.. //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkgdb.h#13 edit
.. //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkgdb_hierdb.c#10 edit
.. //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkgdb_hierdb.h#6 edit
.. //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkgdb_private.h#4 edit

Differences ...

==== //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkg.c#28 (text+ko) ====

@@ -12,6 +12,7 @@
 #include "pkgdb_hierdb.h"
 #include "pkgdb.h"
 #include "pkg_private.h"
+#include "pkg_sub.h"
 #include "pkg.h"
 
 struct pkg {
@@ -25,11 +26,7 @@
 	char *required_by;
 
 	struct pkg_plist plist;
-	struct pkgdb_sub *sub;
 
-#if 0
-	TAILQ_ENTRY(pkg) next;
-#endif
 	short dirty;
 	/* Add an owner field? */
 };
@@ -54,6 +51,8 @@
  * name from plist, but it generally is.  This is the name used for the
  * directory in a hierdb. */
 
+
+/* TODO: All of these assignments need mem checks. */
 int
 pkg_set_ident(struct pkg *p, const char *ident)
 {

==== //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkg_private.h#11 (text+ko) ====

@@ -8,5 +8,4 @@
 #define MTREE_DIRS_FILE		"+MTREE_DIRS"
 #define REQUIRED_BY_FILE	"+REQUIRED_BY"
 
-
 #endif

==== //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkg_sub.c#3 (text+ko) ====

@@ -13,25 +13,32 @@
 #include "pkg.h"
 #include "pkg_sub.h"
 
+int 
+pkg_sub_cmp(struct pkg_sub *ps1, struct pkg_sub *ps2)
+{
+	return (strcmp(ps1->ident, ps2->ident));
+}
+
+/* TODO: Individual read flags. */
 int
-pkg_sub_mark_dirty(struct pkg_sub *ps)
+pkg_sub_mark_read(struct pkg_sub *ps)
 {
 	if (ps == NULL)
 		arg_rage_quit(__func__, "Not a valid package directory.",
 			RAGE_AT_LIBPKG);
 
-	ps->dirty = 1;
+	ps->read = 1;
 	return (PKG_SUB_OK);
 }
 
 int
-pkg_sub_mark_clean(struct pkg_sub *ps)
+pkg_sub_mark_unread(struct pkg_sub *ps)
 {
 	if (ps == NULL)
 		arg_rage_quit(__func__, "Not a valid package directory.",
 			RAGE_AT_LIBPKG);
 
-	ps->dirty = 0;
+	ps->read = 0;
 	return (PKG_SUB_OK);
 }
 
@@ -152,14 +159,36 @@
 	status |= pkg_sub_read_file_to_text(ps, MTREE_DIRS_FILE_ID);
 	status |= pkg_sub_read_file_to_text(ps, REQUIRED_BY_FILE_ID);
 	
-	
+	pkg_sub_mark_read(ps);
 	return (status);
 }
 
 int
 pkg_sub_reset(struct pkg_sub *ps)
 {
-	if (ps) ;;
+	if (ps == NULL) {
+		printf("%s: got null.\n", __func__);
+		exit(1);
+	}
+
+	free(ps->ident);
+	free(ps->path);
+	free(ps->comment_text);
+	free(ps->contents_text);
+	free(ps->desc_text);
+	free(ps->display_text);
+	free(ps->mtree_dirs_text);
+	free(ps->required_by_text);
+	
+	ps->ident = NULL;
+	ps->comment_text = NULL;
+	ps->contents_text = NULL;
+	ps->desc_text = NULL;
+	ps->display_text = NULL;
+	ps->mtree_dirs_text = NULL;
+	ps->required_by_text = NULL;
+	
+	pkg_sub_mark_unread(ps);
 	return (PKG_SUB_OK);
 }
 
@@ -178,33 +207,22 @@
 	pathp = path_build(pkgdb_db_root(db), ident);
 
 	if (pathp == NULL) {
-		free(pathp);
+		free(ps->ident);
+		ps->ident = NULL;
 		return (PKG_SUB_NOT_OK | PKG_SUB_MEMORY_ERR);
 	}
-
 	ps->path = pathp;
 
-/*
-	pkg_plist_delete(ps->pl);
-	ps->pl = NULL;
-*/	
-	free(ps->comment_text);
-	free(ps->contents_text);
-	free(ps->desc_text);
-	free(ps->display_text);
-	free(ps->mtree_dirs_text);
-	free(ps->required_by_text);
-	ps->comment_text = NULL;
-	ps->contents_text = NULL;
-	ps->desc_text = NULL;
-	ps->display_text = NULL;
-	ps->mtree_dirs_text = NULL;
-	ps->required_by_text = NULL;
+	return (PKG_SUB_OK);
+}
 
-	pkg_sub_mark_clean(ps);
-	ps->error = PKG_SUB_OK;
+const char *
+pkg_sub_ident(struct pkg_sub *ps)
+{
+	if (ps == NULL)
+		arg_rage_quit(__func__, "Not a valid pkg_sub.", RAGE_AT_LIBPKG);
 
-	return (PKG_SUB_OK);
+	return (ps->ident);
 }
 
 int
@@ -219,3 +237,119 @@
 
 	return (PKG_SUB_OK);
 }
+
+const char *
+pkg_sub_comment(struct pkg_sub *ps)
+{
+	if (ps == NULL)
+		arg_rage_quit(__func__, "Not a valid pkg_sub.", RAGE_AT_LIBPKG);
+
+	return (ps->comment_text);
+}
+
+int
+pkg_sub_set_comment(struct pkg_sub *ps, const char *comment)
+{
+	if (ps == NULL)
+		arg_rage_quit(__func__, "Not a valid pkg_sub.", RAGE_AT_LIBPKG);
+
+	ps->comment_text = (comment == NULL) ? NULL : strdup(comment);
+	return (PKG_SUB_OK);
+}
+
+const char *
+pkg_sub_contents(struct pkg_sub *ps)
+{
+	if (ps == NULL)
+		arg_rage_quit(__func__, "Not a valid pkg_sub.", RAGE_AT_LIBPKG);
+	
+	return (ps->contents_text);
+}
+
+int
+pkg_sub_set_contents(struct pkg_sub *ps, const char *contents)
+{
+	if (ps == NULL)
+		arg_rage_quit(__func__, "Not a valid pkg_sub.", RAGE_AT_LIBPKG);
+
+	ps->contents_text = (contents == NULL) ? NULL : strdup(contents);
+	return (PKG_SUB_OK);
+}
+
+const char *
+pkg_sub_desc(struct pkg_sub *ps)
+{
+	if (ps == NULL)
+		arg_rage_quit(__func__, "Not a valid pkg_sub.", RAGE_AT_LIBPKG);
+
+	return (ps->desc_text);
+}
+
+int
+pkg_sub_set_desc(struct pkg_sub *ps, const char *desc)
+{
+	if (ps == NULL)
+		arg_rage_quit(__func__, "Not a valid pkg_sub.", RAGE_AT_LIBPKG);
+
+	ps->desc_text = (desc == NULL) ? NULL : strdup(desc);
+	return (PKG_SUB_OK);
+}
+
+const char *
+pkg_sub_display(struct pkg_sub *ps)
+{
+	if (ps == NULL)
+		arg_rage_quit(__func__, "Not a valid pkg_sub.", RAGE_AT_LIBPKG);
+
+	return (ps->display_text);
+}
+
+int
+pkg_sub_set_display(struct pkg_sub *ps, const char *display)
+{
+	if (ps == NULL)
+		arg_rage_quit(__func__, "Not a valid pkg_sub.", RAGE_AT_LIBPKG);
+
+	ps->display_text = (display == NULL) ? NULL : strdup(display);
+	return (PKG_SUB_OK);
+}
+
+const char *
+pkg_sub_mtree_dirs(struct pkg_sub *ps)
+{
+	if (ps == NULL)
+		arg_rage_quit(__func__, "Not a valid pkg_sub.", RAGE_AT_LIBPKG);
+
+	return (ps->mtree_dirs_text);
+}
+
+int
+pkg_sub_set_mtree_dirs(struct pkg_sub *ps, const char *mtree_dirs)
+{
+	if (ps == NULL)
+		arg_rage_quit(__func__, "Not a valid pkg_sub.", RAGE_AT_LIBPKG);
+
+	ps->mtree_dirs_text = (mtree_dirs == NULL) ? 
+		NULL : strdup(mtree_dirs);
+	return (PKG_SUB_OK);
+}
+
+const char *
+pkg_sub_required_by(struct pkg_sub *ps)
+{
+	if (ps == NULL)
+		arg_rage_quit(__func__, "Not a valid pkg_sub.", RAGE_AT_LIBPKG);
+
+	return (ps->required_by_text);
+}
+
+int
+pkg_sub_set_required_by(struct pkg_sub *ps, const char *required_by)
+{
+	if (ps == NULL)
+		arg_rage_quit(__func__, "Not a valid pkg_sub.", RAGE_AT_LIBPKG);
+
+	ps->required_by_text = (required_by == NULL) ? 
+		NULL : strdup(required_by);
+	return (PKG_SUB_OK);
+}

==== //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkg_sub.h#3 (text+ko) ====

@@ -18,7 +18,7 @@
 	char *path;
 	
 	/* parsed plist. */
-	struct pkg_plist *pl;
+	// struct pkg_plist *pl;
 
 	/* relevant text. */
 	char *comment_text;
@@ -29,8 +29,7 @@
 	char *required_by_text;
 
 	/* status and error. */
-	short dirty;
-	int error;
+	short read;
 };
 
 enum pkg_sub_file_ident {
@@ -44,9 +43,11 @@
 
 struct pkg_sub;
 
-int pkg_sub_mark_dirty(struct pkg_sub *ps);
+int pkg_sub_cmp(struct pkg_sub *ps1, struct pkg_sub *ps2);
+
+int pkg_sub_mark_read(struct pkg_sub *ps);
 
-int pkg_sub_mark_clean(struct pkg_sub *ps);
+int pkg_sub_mark_unread(struct pkg_sub *ps);
 
 int pkg_sub_init(struct pkg_sub *ps, struct pkgdb *db, const char *ident);
 
@@ -63,6 +64,10 @@
 
 int pkg_sub_set_ident(struct pkg_sub *ps, const char *ident);
 
+const char *pkg_sub_path(struct pkg_sub *ps);
+
+int pkg_sub_set_path(struct pkg_sub *ps);
+
 const char *pkg_sub_contents(struct pkg_sub *ps);
 
 int pkg_sub_set_contents(struct pkg_sub *ps, const char *contents);

==== //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkgdb.c#19 (text+ko) ====

@@ -52,7 +52,7 @@
 {
 	if (!db->open)
 		return (DB_NOT_OPEN);
-
+	
 	return (db->pkgdb_db_init(db));
 }
 
@@ -99,14 +99,15 @@
 	/* Whenever a package is pulled from the db, we parse it again.  User
 	 * can have multiple copies of a package which do not share a state.
 	 * Is this a terrible idea?  Stay tuned to find out. */
+
 	pkg_reset(p);
 	ps = pkgdb_pkg_sub_list_next(db);
 	if (ps == NULL) {
 		return (DB_NO_PKG); /* Already at the end. */
 	}
-	status = OK;
+	pkgdb_hierdb_read_pkg_sub(db, ps);
+	status = pkgdb_generate_pkg_from_pkg_sub(db, p, ps);
 
-	
 	return (status);
 }
 
@@ -146,10 +147,43 @@
 
 	if (db || ident)
 		;;
+	
+	ps = (struct pkg_sub *)bsearch(ident, db->ps_list, db->ps_count,
+		sizeof(*ps), pkg_sub_cmp);
 
-	ps = NULL;
+	return (ps);
+}
+
+/* Populate a package based on a pkg subdirectory in the db. */
+
+int
+pkgdb_generate_pkg_from_pkg_sub(struct pkgdb *db, struct pkg *p, 
+	struct pkg_sub *ps)
+{
+	/* Does this need to be a pkgdb_ function? */
+	int status;
+
+	if (db == NULL)
+		arg_rage_quit(__func__, "Not a valid database.", RAGE_AT_LIBPKG);
 
-	return (ps);
+	if (p == NULL)
+		arg_rage_quit(__func__, "Not a valid package.", RAGE_AT_LIBPKG);
+	
+	if (ps == NULL)
+		arg_rage_quit(__func__, "Not a valid pkg_sub.", RAGE_AT_LIBPKG);
+	
+	pkg_reset(p);
+	
+	status = PKG_OK;
+	status |= pkg_set_ident(p, pkg_sub_ident(ps));
+	status |= pkg_set_comment(p, pkg_sub_comment(ps));
+	status |= pkg_set_contents(p, pkg_sub_comment(ps));
+	status |= pkg_set_description(p, pkg_sub_desc(ps));
+	status |= pkg_set_display(p, pkg_sub_display(ps));
+	status |= pkg_set_mtree_dirs(p, pkg_sub_mtree_dirs(ps));
+	status |= pkg_set_required_by(p, pkg_sub_required_by(ps));
+	
+	return (status);
 }
 
 void
@@ -167,7 +201,13 @@
 	if (db == NULL)
 		arg_rage_quit(__func__, "Not a valid database.", RAGE_AT_LIBPKG);
 
-	ps = NULL;	
+	if (db->ps_curr == NULL)
+		ps = db->ps_curr = db->ps_list;
+	else if (db->ps_curr < db->ps_last)
+		ps = ++db->ps_curr;
+	else
+		ps = NULL;
+
 	return (ps);
 }
 
@@ -202,6 +242,7 @@
 		arg_rage_quit(__func__, "Not a valid database.", RAGE_AT_LIBPKG);
 
 	db->ps_curr = NULL;
+	return;
 }
 
 char *

==== //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkgdb.h#13 (text+ko) ====

@@ -3,7 +3,7 @@
 
 #define VALID_DB(x) (x == NULL || x->MAGIC != DB_MAGIC) /* unused. */
 
-struct pkgdb;
+#include "pkg.h"
 
 void pkgdb_pkg_sub_list_free(struct pkgdb *db);
 
@@ -19,4 +19,9 @@
 
 struct pkg_sub *pkgdb_pkg_sub_get(struct pkgdb *db, const char *ident);
 
+int pkgdb_pkg_sub_list_create(struct pkgdb *db, int size);
+
+int pkgdb_generate_pkg_from_pkg_sub(struct pkgdb *db, struct pkg *p, 
+	struct pkg_sub *ps);
+
 #endif

==== //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkgdb_hierdb.c#10 (text+ko) ====

@@ -68,17 +68,18 @@
 	c = scandir(db->db_root, &ents, subdir_sel, alphasort);
 	if (c < 1)
 		return (NOT_OK | MEMORY_ERR);
-
-	ps_list = calloc(c, sizeof(*ps_list));
-	if (ps_list == NULL)
+	
+	ps_list = calloc(c, sizeof(struct pkg_sub));
+	if (status != OK)
 		return (NOT_OK | MEMORY_ERR);
+	
 
-	for (i = 0, cnt = 0; i < c; ++i) {
+	for (i = 0, cnt = 0; i < c; ++i, ++cnt) {
 		if (ents[i]->d_type != DT_DIR) {
 			--cnt;
 			continue;
 		}
-		status |= pkg_sub_init(ps_list + i, db, ents[i]->d_name);
+		status |= pkg_sub_init(ps_list + cnt, db, ents[i]->d_name);
 		if (PKG_SUB_MEM_ERR(status)) {
 			pkgdb_pkg_sub_list_free(db);
 			for (; i < c; ++i)
@@ -89,7 +90,9 @@
 		free(ents[i]);
 	}
 	free(ents);
+
 	db->ps_list = ps_list;
+	db->ps_last = db->ps_list + (cnt - 1);
 
 	db->ps_curr = NULL;
 	db->ps_count = cnt;
@@ -99,8 +102,7 @@
 }
 
 int
-pkgdb_hierdb_read_pkg_sub(struct pkgdb *db, struct pkg_sub *ps, 
-	const char *ident)
+pkgdb_hierdb_read_pkg_sub(struct pkgdb *db, struct pkg_sub *ps)
 {
 	int status;
 #if 0 /* The client doesn't know about the functions in this file. */
@@ -108,12 +110,9 @@
 #endif
 	if (db == NULL)
 		arg_rage_quit(__func__, "Not a valid database.", RAGE_AT_CLIENT);
-	if (ident == NULL)
-		arg_rage_quit(__func__, "Not a valid identification string.",
-			RAGE_AT_CLIENT);
-	pkg_sub_reset(ps);
+	
 	status = OK;
-	status |= pkg_sub_set_ident(ps, ident);
+	// status |= pkg_sub_set_ident(ps, ident);
 	/* Directory is verified here. */
 	// status |= pkgdb_sub_set_assign_db(db, ps);
 	

==== //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkgdb_hierdb.h#6 (text+ko) ====

@@ -8,8 +8,7 @@
 
 int pkgdb_hierdb_db_init(struct pkgdb *db);
 
-int pkgdb_hierdb_read_pkg_sub(struct pkgdb *db, struct pkg_sub *ps,
-	const char *ident);
+int pkgdb_hierdb_read_pkg_sub(struct pkgdb *db, struct pkg_sub *ps);
 
 /* int pkgdb_hierdb_db_close(struct pkgdb *db); */
 

==== //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkgdb_private.h#4 (text+ko) ====

@@ -15,11 +15,11 @@
 	
 	struct pkg_sub *ps_curr;
 	struct pkg_sub *ps_list;
+	struct pkg_sub *ps_last;
 
 	int (*pkgdb_db_open) (struct pkgdb *db, const char *db_root);
 	int (*pkgdb_db_init) (struct pkgdb *db);
-	int (*pkgdb_db_read_sub) (struct pkgdb *db, struct pkg_sub *ps,
-		const char *ident);
+	int (*pkgdb_db_read_sub) (struct pkgdb *db, struct pkg_sub *ps);
 	int (*pkgdb_db_close) (struct pkgdb *db);
 	int (*pkgdb_db_sync) (struct pkgdb *db);
 };


More information about the p4-projects mailing list