Date: Mon, 29 Jun 2009 19:11:20 GMT From: David Forsythe <dforsyth@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 165430 for review Message-ID: <200906291911.n5TJBKhN068087@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=165430 Change 165430 by dforsyth@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); };
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200906291911.n5TJBKhN068087>