PERFORCE change 164788 for review

David Forsythe dforsyth at FreeBSD.org
Sun Jun 21 04:53:20 UTC 2009


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

Change 164788 by dforsyth at squirrel on 2009/06/21 04:53:16

	Parse NOW takes in dependencies and their origins.  Last push was a
	dud.

Affected files ...

.. //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkg.c#21 edit
.. //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkg.h#20 edit
.. //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkg_dep.c#4 edit
.. //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkg_dep.h#3 edit
.. //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkg_error.h#2 edit
.. //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkg_plist.c#13 edit
.. //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkg_plist.h#10 edit
.. //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkg_util.h#7 edit
.. //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkgdb.c#16 edit
.. //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkgdb_hierdb_pkgdb_sub.c#9 edit
.. //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkgdb_private.h#2 edit
.. //depot/projects/soc2009/dforsyth_libpkg/pkg_info/main.c#14 edit

Differences ...

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

@@ -27,7 +27,9 @@
 	struct pkg_plist plist;
 	struct pkgdb_sub *sub;
 
+#if 0
 	TAILQ_ENTRY(pkg) next;
+#endif
 	short dirty;
 	/* Add an owner field? */
 };
@@ -58,10 +60,8 @@
 	if (p == NULL)
 		arg_rage_quit(__func__, "Not a valid package.", RAGE_AT_CLIENT);
 	
-	if (ident != NULL)
-		p->ident = strdup(ident);
-	else
-		p->ident = NULL;
+	free(p->ident);
+	p->ident = (ident != NULL) ? strdup(ident) : NULL;
 
 	return (OK);
 }
@@ -76,13 +76,13 @@
 	if (p == NULL)
 		arg_rage_quit(__func__, "Not a valid package.", RAGE_AT_CLIENT);
 	
-	p->comment = NULL;
-	if (comment != NULL) {
-		p->comment = strdup(comment);
-		/* Blot out trailing \n */
+	free(p->comment);
+	p->comment = (comment != NULL) ? strdup(comment) : NULL;
+	if (p->comment != NULL) {
+		/* Blot out trailing \n, if it's there. */
 		c = (int)'\n';
 		f = strrchr(p->comment, c);
-		if (f != NULL)
+		if (f != NULL && *(f + 1) == '\0')
 			*f = '\0';
 	}
 
@@ -99,10 +99,8 @@
 	
 	/* Yes this makes for 3 copies of the text in memory at once, but just
 	 * until I decide how I want to handle 'dirty' packages. */
-	if (contents != NULL)
-		p->contents = strdup(contents);
-	else
-		p->contents = NULL;
+	free(p->contents);
+	p->contents = (contents != NULL) ? strdup(contents) : NULL;
 
 	return (OK);
 }
@@ -112,12 +110,10 @@
 {
 	if (p == NULL)
 		arg_rage_quit(__func__, "Not a valid package.", RAGE_AT_CLIENT);
+	
+	free(p->description);
+	p->description = (description != NULL) ? strdup(description) : NULL;
 
-	if (description != NULL)
-		p->description = strdup(description);
-	else
-		p->description = NULL;
-
 	return (OK);
 }
 
@@ -126,11 +122,9 @@
 {
 	if (p == NULL)
 		arg_rage_quit(__func__, "Not a valid package.", RAGE_AT_CLIENT);
-
-	if (display != NULL)
-		p->display = strdup(display);
-	else
-		p->display = NULL;
+	
+	free(p->display);
+	p->display = (display != NULL) ? strdup(display) : NULL;
 
 	return (OK);
 }
@@ -140,12 +134,10 @@
 {
 	if (p == NULL)
 		arg_rage_quit(__func__, "Not a valid package.", RAGE_AT_CLIENT);
+	
+	free(p->mtree_dirs);
+	p->mtree_dirs = (mtree_dirs != NULL) ? strdup(mtree_dirs) : NULL;
 
-	if (mtree_dirs != NULL)
-		p->mtree_dirs = strdup(mtree_dirs);
-	else
-		p->mtree_dirs = NULL;
-
 	return (OK);
 }
 
@@ -155,10 +147,8 @@
 	if (p == NULL)
 		arg_rage_quit(__func__, "Not a valid package.", RAGE_AT_CLIENT);
 
-	if (required_by != NULL)
-		p->required_by = strdup(required_by);
-	else
-		p->required_by = NULL;
+	free(p->required_by);
+	p->required_by = (required_by != NULL) ? strdup(required_by) : NULL;
 
 	return (OK);
 }
@@ -177,7 +167,6 @@
 	}
 
 	pkg_plist_reset(&p->plist);
-	
 	status = pkg_plist_parse_contents_from_text(&p->plist, p->contents);
 
 	return (status);
@@ -206,6 +195,12 @@
 char *
 pkg_name(struct pkg *p)
 {
+	if (p == NULL)
+		arg_rage_quit(__func__, "Not a valid package.", RAGE_AT_CLIENT);
+
+	if (pkg_parse_plist(p) != OK)
+		return (NULL);
+
 	return (pkg_plist_name(&p->plist));
 }
 
@@ -215,6 +210,8 @@
 	if (p == NULL)
 		arg_rage_quit(__func__, "Not a valid package.", RAGE_AT_CLIENT);
 	
+	if (pkg_parse_plist(p) != OK)
+		return (NULL);
 	return (pkg_plist_cwd(&p->plist));
 }
 
@@ -224,6 +221,8 @@
 	if (p == NULL)
 		arg_rage_quit(__func__, "Not a valid package.", RAGE_AT_CLIENT);
 	
+	if (pkg_parse_plist(p) != OK)
+		return (NULL);
 	return (pkg_plist_origin(&p->plist));
 }
 
@@ -241,14 +240,28 @@
 struct pkg_file *
 pkg_pkg_file_list_next(struct pkg *p)
 {
-	struct pkg_file *pf;
+	if (p == NULL)
+		arg_rage_quit(__func__, "Not a valid package.", RAGE_AT_CLIENT);
+
+	return (pkg_plist_pkg_file_list_next(&p->plist));
+}
+
+void
+pkg_pkg_dep_list_init(struct pkg *p)
+{
+	if (p == NULL)
+		arg_rage_quit(__func__, "Not a valid package.", RAGE_AT_CLIENT);
+
+	return (pkg_plist_pkg_dep_list_reset(&p->plist));
+}
 
+struct pkg_dep *
+pkg_pkg_dep_list_next(struct pkg *p)
+{
 	if (p == NULL)
 		arg_rage_quit(__func__, "Not a valid package.", RAGE_AT_CLIENT);
 
-	pf = pkg_plist_pkg_file_list_next(&p->plist);
-	
-	return (pf);
+	return (pkg_plist_pkg_dep_list_next(&p->plist));
 }
 
 void
@@ -267,7 +280,7 @@
 	pkg_plist_reset(&p->plist);
 }
 
-/* TODO: Make an note in the manual for libpkg that pkg_free should not be
+/* TODO: Make an note in the manual for libpkg that pkg_delete should not be
  * called on pkgs that are not explicitly created by the client. */
 
 void

==== //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkg.h#20 (text+ko) ====

@@ -20,33 +20,38 @@
 /* PKGDB Errors. */
 
 #define DB_OK				0x00000000
-#define DB_NOT_OK			0x00000001
-#define DB_BAD_ROOT			0x00000002
-#define DB_NOT_OPEN			0x00000004
-#define DB_OPEN				0x00000008
-#define DB_NO_PKG			0x00000010
+#define DB_NOT_OK			0x10000000
+#define DB_BAD_ROOT			0x20000000
+#define DB_NOT_OPEN			0x40000000
+#define DB_OPEN				0x80000000
+#define DB_NO_PKG			0x01000000
 
 /* These should probably go to _private */
 #define SUB_OK				0x00000000
-#define SUB_NO_COMMENT		0x00000001
-#define SUB_NO_CONTENTS		0x00000002
-#define SUB_NO_DESC			0x00000004
-#define SUB_NO_DISPLAY		0x00000008
-#define SUB_NO_MTREE_DIRS	0x00000010
-#define SUB_NO_REQUIRED_BY	0x00000020
-#define SUB_NO_FILE			0x00000040
-#define SUB_EMPTY_FILE		0x00000080
+#define SUB_NO_COMMENT		0x10000000
+#define SUB_NO_CONTENTS		0x20000000
+#define SUB_NO_DESC			0x40000000
+#define SUB_NO_DISPLAY		0x80000000
+#define SUB_NO_MTREE_DIRS	0x01000000
+#define SUB_NO_REQUIRED_BY	0x02000000
+#define SUB_NO_FILE			0x04000000
+#define SUB_EMPTY_FILE		0x08000000
 
 /* PKG Errors. */
 
 #define PKG_OK				0x00000000
-#define PKG_NOT_OK			0x00000001
-#define PKG_PARSE_NOT_OK	0x00000002
-#define PKG_NO_COMMENT		0x00000004
-#define PKG_NO_DESC			0x00000008
-#define PKG_NO_DISPLAY		0x00000010
-#define PKG_NO_MTREE_DIRS	0x00000020
-#define PKG_NO_REQUIRED_BY	0x00000040
+#define PKG_NOT_OK			0x10000000
+#define PKG_PARSE_NOT_OK	0x20000000
+#define PKG_NO_COMMENT		0x40000000
+#define PKG_NO_DESC			0x80000000
+#define PKG_NO_DISPLAY		0x01000000
+#define PKG_NO_MTREE_DIRS	0x02000000
+#define PKG_NO_REQUIRED_BY	0x04000000
+#define PKG_CORRUPT			0x08000000
+
+/* Parse errors. */
+#define PARSE_OK			0x00000000
+#define PARSE_FAIL			0x10000000
 
 /* pkg_file */
 
@@ -70,6 +75,20 @@
 
 int pkg_file_set_group(struct pkg_file *pf, const char *group);
 
+/* pkg_dep */
+
+struct pkg_dep;
+
+struct pkg_dep *pkg_dep_new(void);
+
+struct pkg_dep *pkg_dep_set_name(struct pkg_dep *pd, const char *name);
+
+struct pkg_dep *pkg_dep_set_origin(struct pkg_dep *pd, const char *origin);
+
+const char *pkg_dep_name(struct pkg_dep *pd);
+
+const char *pkg_dep_origin(struct pkg_dep *pd);
+
 /* pkg */
 
 /* Add mtree stuff later. */
@@ -126,6 +145,10 @@
 
 int pkg_pkg_file_remove(struct pkg *p, struct pkg_file *pf);
 
+void pkg_pkg_dep_list_init(struct pkg *p);
+
+struct pkg_dep *pkg_pkg_dep_list_next(struct pkg *p);
+
 void pkg_delete(struct pkg *p);
 
 /* pkgdb */
@@ -152,6 +175,6 @@
 int pkgdb_db_sync(struct pkgdb *db);
 #endif
 
-void pkgdb_delete(struct pkgdb *db);
+void pkgdb_db_delete(struct pkgdb *db);
 
 #endif

==== //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkg_dep.c#4 (text+ko) ====

@@ -5,15 +5,11 @@
 #include "pkg.h"
 
 struct pkg_dep *
-pkg_dep_new(const char *name, const char *origin)
+pkg_dep_new()
 {
 	struct pkg_dep *pd;
 
 	pd = calloc(1, sizeof(*pd));
-	if (pd != NULL) {
-		pd->name = name;
-		pd->origin = origin;
-	}
 
 	return (pd);
 }

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

@@ -12,7 +12,8 @@
 	TAILQ_ENTRY(pkg_dep) next;
 };
 
-struct pkg_dep *pkg_dep_new(const char *name, const char *origin);
+#if 0
+struct pkg_dep *pkg_dep_new(void);
 
 struct pkg_dep *pkg_dep_set_name(struct pkg_dep *pd, const char *name);
 
@@ -21,5 +22,6 @@
 const char *pkg_dep_name(struct pkg_dep *pd);
 
 const char *pkg_dep_origin(struct pkg_dep *pd);
+#endif
 
 #endif

==== //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkg_error.h#2 (text+ko) ====

@@ -1,0 +1,5 @@
+#ifndef __PKG_ERROR_H__
+#define __PKG_ERROR_H__
+
+
+#endif

==== //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkg_plist.c#13 (text+ko) ====

@@ -42,6 +42,18 @@
 	return (pl);
 }
 
+void
+pkg_plist_free(struct pkg_plist *pl)
+{
+	/* TODO: Write this function. */
+#if 0
+	pkg_plist_pkg_list_free(pl);
+	pkg_plist_pkg_dep_free(pl);
+#endif
+	free(pl);
+	return;
+}
+
 int 
 pkg_plist_parsed(struct pkg_plist *pl)
 {
@@ -100,6 +112,7 @@
 	
 	/* XXX: Use fgets(), dummy. */
 	pkg_plist_pkg_file_list_init(pl);
+	pkg_plist_pkg_dep_list_init(pl);
 	set_parse_state_default(&st);
 	for (p = textp; *p != '\0'; p++) {
 		if (*p == '\n') {
@@ -143,11 +156,12 @@
 	char *argument;
 	char *sep;
 	struct pkg_file *pf;
+	struct pkg_dep *pd;
 
 	if (line == NULL)
 		return (-1);
 	
-	s = 0;
+	s = PARSE_OK;
 	line_len = strlen(line);
 	if (*line == '@') {
 		sep = strchr(line, ' ');
@@ -183,7 +197,7 @@
 				
 			st->last_elem = PLIST_OWNER;
 		} else if (strcmp(command, PLIST_CMD_GROUP) == 0) {
-			if (line_len == strlen(PLIST_CMD_OWNER) + 1)
+			if (line_len == strlen(PLIST_CMD_GROUP) + 1)
 				/* Empty group line, reset to NULL. */
 				st->owner = NULL;
 			else
@@ -198,8 +212,6 @@
 			 * function. */
 			if (line_len == strlen(PLIST_CMD_COMMENT) + 1) {
 				/* Empty comment. */
-				st->last_elem = PLIST_COMMENT;
-				return (0);
 			}
 			sep = strchr(argument, ':');
 			if (sep == NULL) {
@@ -208,27 +220,35 @@
 				 * them out. Maybe later, add a new command that specifies
 				 * comments that should be printed when displaying
 				 * information from the plist. */
-				return (0);
+				return (PARSE_OK);
 			}
 			*sep = '\0';
 			if (strcmp(argument, PLIST_COMMENT_PKG_REV) == 0) {
-				/* TODO: Keeping rev as s string for now.  String based
+				/* TODO: Keeping rev as a string for now.  String based
 				 * version comparison is dumb, convert to int. */
 				pl->rev = sep + 1;
-				st->last_elem = PLIST_COMMENT;
 			} else if (strcmp(argument, PLIST_COMMENT_ORIGIN) == 0) {
 				pl->origin = sep + 1;
-				st->last_elem = PLIST_COMMENT;
 			} else if (strcmp(argument, PLIST_COMMENT_DEPORIGIN) == 0) {
 				if (st->last_elem != PLIST_PKGDEP)
-					return (1);
+					return (PARSE_FAIL);
 				/* add the the dependency list. */
+				pd = pkg_plist_pkg_dep_list_last(pl);
+				pkg_dep_set_origin(pd, sep + 1);
 			} else if (strcmp(argument, PLIST_COMMENT_MD5) == 0) {
 				if (st->last_elem != PLIST_FILE)
-					return (1);
+					return (PARSE_FAIL);
 				pf = pkg_plist_pkg_file_list_last(pl);
 				pkg_file_set_md5(pf, sep + 1);
+			} else {
+				/* Comment we don't know anything about. */
 			}
+			st->last_elem = PLIST_COMMENT;
+		} else if (strcmp(command, PLIST_CMD_PKGDEP) == 0) {
+			pd = pkg_dep_new();
+			pkg_dep_set_name(pd, argument);
+			pkg_plist_pkg_dep_list_append(pl, pd);
+			st->last_elem = PLIST_PKGDEP;
 		}
 #if 0
 		else if (strcmp(command, PLIST_CMD_NOINST) == 0) {
@@ -249,7 +269,10 @@
 			ent = pl_entry_new(PLIST_DIRRM, argument, NULL);
 #endif
 		else if (strcmp(command, PLIST_CMD_MTREE) == 0) {
-			pl->mtree_file = argument;
+			if (pl->mtree_file == NULL)
+				pl->mtree_file = argument;
+			else
+				return (PARSE_FAIL); /* strict. */
 			st->last_elem = PLIST_MTREE;
 		}
 		else if (strcmp(command, PLIST_CMD_DISPLAY) == 0) {
@@ -258,8 +281,10 @@
 		}
 #if 0
 		else {
-			/* If we cant identify the command, set it unknown and gather
-			 * whatever information we can. */
+			/* If we cant identify the command, we have to return
+			 * PARSE_FAIL.  Apparently their are quite a few undocumented
+			 * commands for plists.  If we don't know a given command, we
+			 * could really mess something up. */
 			ent = pl_entry_new(PLIST_UNKNOWN, argument, NULL);
 		}
 #endif
@@ -371,12 +396,69 @@
 	TAILQ_INSERT_TAIL(&pl->pf_head, pf, next);
 }
 
+/* pkg_dep list manipulation and access. */
+/* generalize plz. */
+
+void
+pkg_plist_pkg_dep_list_reset(struct pkg_plist *pl)
+{
+	if (pl == NULL)
+		return;
+
+	pl->pd_curr = NULL;
+}
+
+void
+pkg_plist_pkg_dep_list_init(struct pkg_plist *pl)
+{
+	if (pl == NULL)
+		return;
+
+	TAILQ_INIT(&pl->pd_head);
+}
+
+struct pkg_dep *
+pkg_plist_pkg_dep_list_last(struct pkg_plist *pl)
+{
+	if (pl == NULL)
+		arg_rage_quit(__func__, "Not a valid plist.", RAGE_AT_LIBPKG);
+
+	return (TAILQ_LAST(&pl->pd_head, pd_head));
+}
+
 void
-pkg_plist_free(struct pkg_plist *pl)
+pkg_plist_pkg_dep_list_append(struct pkg_plist *pl, struct pkg_dep *pd)
+{
+	if (pl == NULL || pd == NULL)
+		return;
+	
+	TAILQ_INSERT_TAIL(&pl->pd_head, pd, next);
+}
+
+struct pkg_dep *
+pkg_plist_pkg_dep_list_next(struct pkg_plist *pl)
 {
-	/* TODO: Write this function. */
-	free(pl);
-	return;
+	struct pkg_dep *pd;
+
+	if (pl == NULL)
+		return (NULL);
+	
+	if (pl->pd_curr == NULL) 
+		pd = pkg_plist_pkg_dep_list_first(pl);
+	else
+		pd = TAILQ_NEXT(pl->pd_curr, next);
+	
+	if (pd != NULL)
+		pl->pd_curr = pd;
+	
+	return (pd);
 }
 
-/* pkg_dep list manipulation and access. */
+struct pkg_dep *
+pkg_plist_pkg_dep_list_first(struct pkg_plist *pl)
+{
+	if (pl == NULL)
+		arg_rage_quit(__func__, "Not a valid plist.", RAGE_AT_LIBPKG);
+	
+	return (TAILQ_FIRST(&pl->pd_head));
+}

==== //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkg_plist.h#10 (text+ko) ====

@@ -43,9 +43,10 @@
 #define PLIST_CMD_IGNORE_INST	"ignore_inst"
 #define PLIST_CMD_NAME			"name"
 #define PLIST_CMD_DIRRM 		"dirrm"
+#define PLIST_CMD_DIRRMTRY		"dirrmtry"
 #define PLIST_CMD_MTREE			"mtree"
 #define PLIST_CMD_DISPLAY		"display"
-#define PLIST_CMD_PKGDEG		"pkgdep"
+#define PLIST_CMD_PKGDEP		"pkgdep"
 #define PLIST_CMD_CONFLICTS		"conflicts"
 
 /* Meta comments. */
@@ -111,4 +112,15 @@
 
 void pkg_plist_free(struct pkg_plist *pl);
 
+/* pkg_dep */
+void pkg_plist_pkg_dep_list_init(struct pkg_plist *pl);
+
+struct pkg_dep *pkg_plist_pkg_dep_list_last(struct pkg_plist *pl);
+
+void pkg_plist_pkg_dep_list_append(struct pkg_plist *pl, 
+	struct pkg_dep *pd);
+
+void pkg_plist_pkg_dep_list_reset(struct pkg_plist *pl);
+struct pkg_dep *pkg_plist_pkg_dep_list_next(struct pkg_plist *pl);
+struct pkg_dep *pkg_plist_pkg_dep_list_first(struct pkg_plist *pl);
 #endif

==== //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkg_util.h#7 (text+ko) ====

@@ -9,6 +9,8 @@
 
 char *path_build(const char *prefix, const char *suffix);
 
+char *strrep(char *dest, char *src);
+
 void arg_rage_quit(const char *function, const char *message, int ret);
 
 #endif

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

@@ -74,7 +74,7 @@
 }
 
 void 
-pkgdb_delete(struct pkgdb *db)
+pkgdb_db_delete(struct pkgdb *db)
 {
 	if (db == NULL)
 		arg_rage_quit(__func__, "Not a valid database.", RAGE_AT_CLIENT);
@@ -101,8 +101,9 @@
 	 * Is this a terrible idea?  Stay tuned to find out. */
 	pkg_reset(p);
 	sub = pkgdb_pkgdb_sub_list_next(db);
-	if (sub == NULL)
+	if (sub == NULL) {
 		return (DB_NO_PKG); /* Already at the end. */
+	}
 	status = OK;
 	status |=pkg_set_ident(p, pkgdb_sub_ident(sub));
 	/* Status should be pointless to check here, because the init loop
@@ -116,7 +117,6 @@
 	/* I'm not sure all of these have to be loaded, but we can make a
 	 * decision about that later. */
 	
-	status |= pkg_parse_plist(p);
 	/* Error codes to the client. */
 	return (status);
 }
@@ -133,49 +133,50 @@
 void
 pkgdb_pkgdb_sub_list_free(struct pkgdb *db)
 {	
-	struct pkgdb_sub *dbs1;
-	struct pkgdb_sub *dbs2;
+	struct pkgdb_sub *sub1;
+	struct pkgdb_sub *sub2;
 
 	if (db == NULL)
 		arg_rage_quit(__func__, "Not a valid database.", RAGE_AT_LIBPKG);
 	
 	pkgdb_pkgdb_sub_list_init(db);
-	dbs1 = pkgdb_pkgdb_sub_list_first(db);
-	while (dbs1 != NULL) {
-		dbs2 = pkgdb_pkgdb_sub_list_next(db);
-		pkgdb_sub_delete(dbs1);
-		dbs1 = dbs2;
+	sub1 = pkgdb_pkgdb_sub_list_first(db);
+	while (sub1 != NULL) {
+		sub2 = pkgdb_pkgdb_sub_list_next(db);
+		pkgdb_sub_reset(sub1);
+		sub1 = sub2;
 	}
 }
 
 struct pkgdb_sub *
 pkgdb_pkgdb_sub_list_next(struct pkgdb *db)
 {
-	struct pkgdb_sub *dbs;
+	struct pkgdb_sub *sub;
 
 	if (db == NULL)
 		arg_rage_quit(__func__, "Not a valid database.", RAGE_AT_LIBPKG);
 
 	if (db->sub_curr == NULL)
-		dbs = TAILQ_FIRST(&db->sub_head);
+		sub = pkgdb_pkgdb_sub_list_first(db);
 	else
-		dbs = TAILQ_NEXT(db->sub_curr, next);
+		sub = TAILQ_NEXT(db->sub_curr, next);
+
+	if (sub != NULL)
+		db->sub_curr = sub;
 	
-	db->sub_curr = dbs;
-	return (dbs);
+	return (sub);
 }
 
 struct pkgdb_sub *
 pkgdb_pkgdb_sub_list_first(struct pkgdb *db)
 {
-	struct pkgdb_sub *dbs;
+	struct pkgdb_sub *sub;
 
 	if (db == NULL)
 		arg_rage_quit(__func__, "Not a valid database.", RAGE_AT_LIBPKG);
 
-	dbs = TAILQ_FIRST(&db->sub_head);
-
-	return (dbs);
+	sub = TAILQ_FIRST(&db->sub_head);
+	return (sub);
 }
 
 void
@@ -187,7 +188,7 @@
 	if (sub == NULL)
 		arg_rage_quit(__func__, "Not a valid sub directory.",
 			RAGE_AT_LIBPKG);
-
+	
 	TAILQ_INSERT_TAIL(&db->sub_head, sub, next);
 }
 
@@ -196,7 +197,7 @@
 {
 	if (db == NULL)
 		arg_rage_quit(__func__, "Not a valid database.", RAGE_AT_LIBPKG);
-	
+
 	TAILQ_INIT(&db->sub_head);
 }
 

==== //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkgdb_hierdb_pkgdb_sub.c#9 (text+ko) ====

@@ -199,9 +199,10 @@
 void
 pkgdb_sub_reset(struct pkgdb_sub *dbs)
 {
-	if (dbs == NULL)
+	if (dbs == NULL) {
+		printf("uh oh.");
 		return;
-	
+	}
 	free(dbs->ident);
 	free(dbs->path);
 	free(dbs->comment_text);

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

@@ -15,7 +15,7 @@
 
 	int sub_count;
 	struct pkgdb_sub *sub_curr;
-	
+
 	TAILQ_HEAD(sub_head, pkgdb_sub) sub_head;
 
 	int (*pkgdb_db_open) (struct pkgdb *db, const char *db_root);

==== //depot/projects/soc2009/dforsyth_libpkg/pkg_info/main.c#14 (text+ko) ====

@@ -59,7 +59,7 @@
 
 	perform_on_db(db);
 	
-	pkgdb_delete(db);
+	// pkgdb_db_delete(db);
 	return (EXIT_SUCCESS);
 }
 
@@ -119,6 +119,9 @@
 print_pkg_information(struct pkg *p)
 {
 	struct pkg_file *pf;
+	struct pkg_dep *pd;
+	const char *ident;
+	const char *comment;
 	const char *name;
 	const char *cwd;
 	const char *origin;
@@ -129,34 +132,48 @@
 
 	/* Just print the basic PKGNAME COMMENT scheme right now.  Other
 	 * information isn't collected by the library yet. */
-	if (!opt_show_all_info)
+	if (!opt_show_all_info) {
 		/* Use pkg_ident because old pkg_info goes by directory name. */
-		printf("%s %s\n", pkg_ident(p), pkg_comment(p));
-	else {
+		ident = pkg_ident(p);
+		comment = pkg_comment(p);
+		printf("%s %s\n", 
+			(ident != NULL ? ident : BAD_OR_UNKNOWN_VALUE), 
+			(comment != NULL ? comment : BAD_OR_UNKNOWN_VALUE));
+	} else {
 		/* Testing plist interaction. */
-		name = 
-			((name = pkg_name(p)) == NULL ? BAD_OR_UNKNOWN_VALUE : name);
-		cwd = ((cwd = pkg_cwd(p)) == NULL ? BAD_OR_UNKNOWN_VALUE : cwd);
-		origin = 
-			((origin = pkg_origin(p)) == NULL ? BAD_OR_UNKNOWN_VALUE : origin);
+		name = pkg_name(p);
+		cwd = pkg_cwd(p);
+		origin = pkg_origin(p);
 		
-		printf("%s:\n", name);
-		printf("\tcwd: %s\n", cwd);
-		printf("\torigin: %s\n", origin);
+		printf("%s:\n", 
+			(name != NULL ? name : BAD_OR_UNKNOWN_VALUE));
+		printf("\tcwd: %s\n", 
+			(cwd != NULL ? name : BAD_OR_UNKNOWN_VALUE));
+		printf("\torigin: %s\n", 
+			(origin != NULL ? origin : BAD_OR_UNKNOWN_VALUE));
 		printf("\tfiles:\n");
 		pkg_pkg_file_list_init(p);
 		while ((pf = pkg_pkg_file_list_next(p)) != NULL) {
-			path = 
-				((path = pkg_file_path(pf)) == NULL ? BAD_OR_UNKNOWN_VALUE : path);
-			md5 = 
-				((md5 = pkg_file_md5(pf)) == NULL ? BAD_OR_UNKNOWN_VALUE : md5);
-			owner = 
-				((owner = pkg_file_owner(pf)) == NULL ? BAD_OR_UNKNOWN_VALUE : owner);
-			group = 
-				((group = pkg_file_group(pf)) == NULL ? BAD_OR_UNKNOWN_VALUE : group);
-			printf("\t\t%s\n\t\t\tMD5: %s\n\t\t\tOWNER: %s\n\t\t\t",
-				path, md5, owner);
-			printf("GROUP: %s\n", owner);
+			path = pkg_file_path(pf);
+			md5 = pkg_file_md5(pf);
+			owner = pkg_file_owner(pf);
+			group = pkg_file_group(pf);
+			printf("\t\t%s\n", 
+				(path != NULL ? path : BAD_OR_UNKNOWN_VALUE));
+			printf("\t\t\tMD5: %s\n", 
+				(md5 != NULL ? md5 : BAD_OR_UNKNOWN_VALUE));
+			printf("\t\t\tOWNER: %s\n", 
+				(owner != NULL ? owner : BAD_OR_UNKNOWN_VALUE));
+			printf("\t\t\tGROUP: %s\n", 
+				(group != NULL ? group : BAD_OR_UNKNOWN_VALUE));
+		}
+
+		printf("\tdepends:\n");
+		pkg_pkg_dep_list_init(p);
+		while ((pd = pkg_pkg_dep_list_next(p)) != NULL) {
+			name = pkg_dep_name(pd);
+			origin = pkg_dep_origin(pd);
+			printf("\t\t%s : %s\n", name, origin);
 		}
 	}
 }


More information about the p4-projects mailing list