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