Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 22 Jun 2009 04:19:42 GMT
From:      David Forsythe <dforsyth@FreeBSD.org>
To:        Perforce Change Reviews <perforce@FreeBSD.org>
Subject:   PERFORCE change 164836 for review
Message-ID:  <200906220419.n5M4Jg4N028399@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=164836

Change 164836 by dforsyth@squirrel on 2009/06/22 04:18:50

	Added a few fields to pkg_plist.

Affected files ...

.. //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkg.c#23 edit
.. //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkg.h#22 edit
.. //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkg_file.c#5 edit
.. //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkg_file.h#4 edit
.. //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkg_plist.c#15 edit
.. //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkg_plist.h#12 edit
.. //depot/projects/soc2009/dforsyth_libpkg/pkg_info/main.c#16 edit

Differences ...

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

@@ -237,6 +237,44 @@
 	return (pkg_plist_mtree_file(&p->plist));
 }
 
+/* Other properties. */
+
+int
+pkg_extract_in_place(struct pkg *p)
+{
+	if (p == NULL)
+		arg_rage_quit(__func__, "Not a valid package.", RAGE_AT_CLIENT);
+
+	if (pkg_parse_plist(p) != OK)
+		return (PKG_PARSE_NOT_OK);
+
+	return (pkg_plist_extract_in_place(&p->plist));
+}
+
+int
+pkg_preserve(struct pkg *p)
+{
+	if (p == NULL)
+		arg_rage_quit(__func__, "Not a valid package.", RAGE_AT_CLIENT);
+
+	if (pkg_parse_plist(p) != OK)
+		return (PKG_PARSE_NOT_OK);
+
+	return (pkg_plist_preserve(&p->plist));
+}
+
+int
+pkg_complete(struct pkg *p)
+{
+	if (p == NULL)
+		arg_rage_quit(__func__, "Not a valid package.", RAGE_AT_CLIENT);
+
+	if (pkg_parse_plist(p) != OK)
+		return (PKG_PARSE_NOT_OK);
+
+	return (pkg_plist_complete(&p->plist));
+}
+
 /* These need to be renamed. */
 
 void

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

@@ -67,6 +67,8 @@
 
 const char *pkg_file_group(struct pkg_file *pf);
 
+const char *pkg_file_mode(struct pkg_file *pf);
+
 int pkg_file_set_path(struct pkg_file *pf, const char *path);
 
 int pkg_file_set_md5(struct pkg_file *pf, const char *md5);
@@ -75,6 +77,8 @@
 
 int pkg_file_set_group(struct pkg_file *pf, const char *group);
 
+int pkg_file_set_mode(struct pkg_file *pf, const char *mode);
+
 /* pkg_dep */
 
 struct pkg_dep;
@@ -115,6 +119,12 @@
 
 char *pkg_mtree_file(struct pkg *p);
 
+int pkg_extract_in_place(struct pkg *p);
+
+int pkg_preserve(struct pkg *p);
+
+int pkg_complete(struct pkg *p);
+
 int pkg_set_ident(struct pkg *p, const char *ident);
 
 int pkg_set_name(struct pkg *p, const char *name);

==== //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkg_file.c#5 (text+ko) ====

@@ -4,6 +4,9 @@
 #include "pkg_file.h"
 #include "pkg.h"
 
+/* TODO: Evolve these functions to check for the actual existance of
+ * users, groups, mode validity.  Add md5 comparison functions, etc... */
+
 struct pkg_file *
 pkg_file_new()
 {	
@@ -32,6 +35,15 @@
 	return (pf->md5);
 }
 
+const char *
+pkg_file_mode(struct pkg_file *pf)
+{
+	if (pf == NULL)
+		return (NULL);
+
+	return (pf->mode);
+}
+
 /* If NULL is returned from pkg_file_owner or pkg_file_group, assume the
  * default owner and group. */
 
@@ -92,3 +104,13 @@
 	pf->group = group;
 	return (OK);
 }
+
+int
+pkg_file_set_mode(struct pkg_file *pf, const char *mode)
+{
+	if (pf == NULL)
+		return (NOT_OK);
+
+	pf->mode = mode;
+	return (OK);
+}

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

@@ -10,6 +10,7 @@
 	const char *md5;
 	const char *owner;
 	const char *group;
+	const char *mode;
 
 	TAILQ_ENTRY(pkg_file) next;
 };

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

@@ -16,10 +16,13 @@
 #include "pkgdb.h"
 #include "pkg.h"
 
+/* TODO: Create plist setter functions for building packages. */
+
 struct parse_state {
 	enum plist_elem last_elem;
 	char *owner;
 	char *group;
+	char *mode;
 };
 
 void
@@ -31,6 +34,7 @@
 	st->last_elem = PLIST_UNKNOWN;
 	st->owner = NULL;
 	st->group = NULL;
+	st->mode = NULL;
 }
 
 struct pkg_plist *
@@ -71,6 +75,10 @@
 	
 	/* TODO: Write this. */
 
+	pl->extract_in_place = 0;
+	pl->preserve = 0;
+	pl->complete = 0;
+	
 	pl->parsed = 0;
 }
 
@@ -101,6 +109,8 @@
 
 	if (pl == NULL)
 		return (NOT_OK);
+	
+	pkg_plist_reset(pl);
 
 	/* Not sure if this is how I still want to do this, but for now, hold
 	 * a copy of the text. */
@@ -109,8 +119,10 @@
 		return (MEMORY_ERR);
 
 	pl->text = textp;	
-	
-	/* XXX: Use fgets(), dummy. */
+
+	/* TODO: Use fgets(), and have the different lists have their own copy
+	 * of information so that packages can be freely manipulated without
+	 * worrying about ruining other instances of a package. */
 	pkg_plist_pkg_file_list_init(pl);
 	pkg_plist_pkg_dep_list_init(pl);
 	set_parse_state_default(&st);
@@ -128,7 +140,7 @@
 
 			/* Consider a dirty flag for these lists? */
 #if 0
-			if (s != 0) {
+			if (s != PARSE_OK) {
 				/* bad parse. */
 				/* free a bunch of stuff. */
 				return (NOT_OK);
@@ -183,13 +195,24 @@
 			ent = pl_entry_new(PLIST_EXEC, argument, NULL);
 		else if (strcmp(command, PLIST_CMD_UNEXEC) == 0)
 			ent = pl_entry_new(PLIST_UNEXEC, argument, NULL);
-		else if (strcmp(command, PLIST_CMD_MODE) == 0)
-			ent = pl_entry_new(PLIST_MODE, argument, NULL);
-		else if (strcmp(command, PLIST_CMD_OPTION) == 0)
-			ent = pl_entry_new(PLIST_OPTION, argument, NULL);
 #endif
-		else if (strcmp(command, PLIST_CMD_OWNER) == 0) {
-			if (line_len == strlen(PLIST_CMD_OWNER)  + 1)
+		else if (strcmp(command, PLIST_CMD_OPTION) == 0) {
+			if (strcmp(argument, PLIST_OPTION_EXTRACT_IN_PLACE) == 0) {
+				pl->extract_in_place = 1;
+			} else if (strcmp(argument, PLIST_OPTION_PRESERVE) == 0) {
+				pl->preserve = 1;
+			} else if (strcmp(argument, PLIST_OPTION_COMPLETE) == 0) {
+				pl->complete = 1;
+			} else
+				return (PARSE_FAIL); /* Strict. */
+			st->last_elem = PLIST_OPTION;
+		} else if (strcmp(command, PLIST_CMD_MODE) == 0) {
+			if (line_len == strlen(PLIST_CMD_MODE) + 1)
+				st->mode = NULL;
+			else
+				st->mode = argument;
+		} else if (strcmp(command, PLIST_CMD_OWNER) == 0) {
+			if (line_len == strlen(PLIST_CMD_OWNER) + 1)
 				/* Empty owner line, reset to NULL. */
 				st->owner = NULL;
 			else
@@ -208,8 +231,6 @@
 			/* Lots more stuff needs to go in here... what a terrible file
 			 * format... */
 
-			/* mmm... should probably pull this out into a different
-			 * function. */
 			if (line_len == strlen(PLIST_CMD_COMMENT) + 1) {
 				/* Empty comment. */
 			}
@@ -230,6 +251,8 @@
 			} else if (strcmp(argument, PLIST_COMMENT_ORIGIN) == 0) {
 				pl->origin = sep + 1;
 			} else if (strcmp(argument, PLIST_COMMENT_DEPORIGIN) == 0) {
+				/* NOTE: I'm going to have to adjust the parse so it can
+				 * deal with package versioning in dependencies. */
 				if (st->last_elem != PLIST_PKGDEP)
 					return (PARSE_FAIL);
 				/* add the the dependency list. */
@@ -294,6 +317,7 @@
 		pkg_file_set_md5(pf, NULL);
 		pkg_file_set_owner(pf, st->owner);
 		pkg_file_set_group(pf, st->group);
+		pkg_file_set_mode(pf, st->mode);
 		pkg_plist_pkg_file_list_append(pl, pf);
 		st->last_elem = PLIST_FILE;
 	}
@@ -301,6 +325,8 @@
 	return (s);
 }
 
+/* pkg_file list manipulation and access. */
+
 char *
 pkg_plist_name(struct pkg_plist *pl)
 {
@@ -337,7 +363,32 @@
 	return (pl->mtree_file);
 }
 
-/* pkg_file list manipulation and access. */
+int
+pkg_plist_extract_in_place(struct pkg_plist *pl)
+{
+	if (pl == NULL)
+		arg_rage_quit(__func__, "Not a valid plist.", RAGE_AT_LIBPKG);
+
+	return (pl->extract_in_place);
+}
+
+int
+pkg_plist_preserve(struct pkg_plist *pl)
+{
+	if (pl == NULL)
+		arg_rage_quit(__func__, "Not a valid plist.", RAGE_AT_LIBPKG);
+	
+	return (pl->preserve);
+}
+
+int
+pkg_plist_complete(struct pkg_plist *pl)
+{
+	if (pl == NULL)
+		arg_rage_quit(__func__, "Not a valid plist.", RAGE_AT_LIBPKG);
+
+	return (pl->complete);
+}
 
 /* I should really just write a set of generic routine to handle this
  * whole mess. */

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

@@ -56,6 +56,13 @@
 #define PLIST_COMMENT_DEPORIGIN	"DEPORIGIN"
 #define PLIST_COMMENT_MD5		"MD5"
 
+/* Options */
+
+#define PLIST_OPTION_EXTRACT_IN_PLACE "extract-in-place"
+#define PLIST_OPTION_PRESERVE "preserve"
+/* For dependency inclusive packages. */
+#define PLIST_OPTION_COMPLETE "complete"
+
 struct parse_state;
 
 struct pkg_plist {
@@ -66,7 +73,10 @@
 	char *origin;
 	char *display;
 	char *mtree_file;
-	
+	short extract_in_place;
+	short preserve;
+	short complete;
+
 	char *text; /* The entire plist */
 
 	struct pkg_file *pf_curr;
@@ -103,6 +113,10 @@
 char *pkg_plist_origin(struct pkg_plist *pl);
 char *pkg_plist_mtree_file(struct pkg_plist *pl);
 
+int pkg_plist_extract_in_place(struct pkg_plist *pl);
+int pkg_plist_preserve(struct pkg_plist *pl);
+int pkg_plist_complete(struct pkg_plist *pl);
+
 void pkg_plist_pkg_file_list_init(struct pkg_plist *pl);
 struct pkg_file *pkg_plist_pkg_file_list_first(struct pkg_plist *pl);
 struct pkg_file *pkg_plist_pkg_file_list_last(struct pkg_plist *pl);
@@ -124,4 +138,5 @@
 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/pkg_info/main.c#16 (text+ko) ====

@@ -14,13 +14,11 @@
 
 /* TODO: Write common error handling functions for pkg_tools. */
 
-#if 0
-static char opts[] = "a";
+static char opts[] = "abcdDe:EfgGhiIjkKl:LmoO:pPqQrRst:vVW:xX";
 static struct option lopts[] = {
-	{"all", no_argument, NULL, 'a'},
-	{NULL, 0, NULL, 0}, // <-- something that pkg_add in 7.2 forgot...
+	{ "all", no_argument, NULL, 'a'},
+	{NULL, 0, NULL, 0},
 };
-#endif
 
 /* Mock pkg_info for testing, */
 
@@ -73,15 +71,17 @@
 void
 parse_opts(int argc, char **argv)
 {
-	/* pointlessly set this. */
-	opt_all = 1;
-	char **a;
+	int a;
 
-	if (argc == 1)
+	if (argc == 1) {
+		opt_all = 1;
+		opt_show_comment = 1;
 		return;
-	
-	a = argv; /* give argv something to do. */
-	opt_show_all_info = 1;
+	}
+	while ((a = getopt_long(argc, argv, opts, lopts, NULL)) != -1) {
+		/* ... */
+		opt_show_all_info = 1;
+	}
 }
 
 void
@@ -130,6 +130,7 @@
 	const char *md5;
 	const char *owner;
 	const char *group;
+	const char *mode;
 
 	/* Just print the basic PKGNAME COMMENT scheme right now.  Other
 	 * information isn't collected by the library yet. */
@@ -155,6 +156,12 @@
 			(origin != NULL ? origin : BAD_OR_UNKNOWN_VALUE));
 		printf("\tmtree file: %s\n",
 			(mtree_file != NULL ? mtree_file : BAD_OR_UNKNOWN_VALUE));
+		printf("\textract in place: %s\n",
+			(pkg_extract_in_place(p) ? "YES" : "NO"));
+		printf("\tpreserve: %s\n",
+			(pkg_preserve(p) ? "YES" : "NO"));
+		printf("\tcomplete: %s\n",
+			(pkg_complete(p) ? "YES" : "NO"));
 		printf("\tfiles:\n");
 		pkg_ent_list_init(pkg_file, p);
 		while ((pf = pkg_ent_list_next(pkg_file, p)) != NULL) {
@@ -162,6 +169,7 @@
 			md5 = pkg_file_md5(pf);
 			owner = pkg_file_owner(pf);
 			group = pkg_file_group(pf);
+			mode = pkg_file_mode(pf);
 			printf("\t\t%s\n", 
 				(path != NULL ? path : BAD_OR_UNKNOWN_VALUE));
 			printf("\t\t\tMD5: %s\n", 
@@ -170,6 +178,8 @@
 				(owner != NULL ? owner : BAD_OR_UNKNOWN_VALUE));
 			printf("\t\t\tGROUP: %s\n", 
 				(group != NULL ? group : BAD_OR_UNKNOWN_VALUE));
+			printf("\t\t\tMODE: %s\n",
+				(mode != NULL ? mode : BAD_OR_UNKNOWN_VALUE));
 		}
 
 		printf("\tdepends:\n");



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200906220419.n5M4Jg4N028399>