From owner-p4-projects@FreeBSD.ORG Sun Jun 21 04:53:19 2009 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 603A51065676; Sun, 21 Jun 2009 04:53:19 +0000 (UTC) Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 204711065675 for ; Sun, 21 Jun 2009 04:53:19 +0000 (UTC) (envelope-from dforsyth@FreeBSD.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id 0D2AF8FC13 for ; Sun, 21 Jun 2009 04:53:19 +0000 (UTC) (envelope-from dforsyth@FreeBSD.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.3/8.14.3) with ESMTP id n5L4rJLu037420 for ; Sun, 21 Jun 2009 04:53:19 GMT (envelope-from dforsyth@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.3/8.14.3/Submit) id n5L4rID8037418 for perforce@freebsd.org; Sun, 21 Jun 2009 04:53:18 GMT (envelope-from dforsyth@FreeBSD.org) Date: Sun, 21 Jun 2009 04:53:18 GMT Message-Id: <200906210453.n5L4rID8037418@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to dforsyth@FreeBSD.org using -f From: David Forsythe To: Perforce Change Reviews Cc: Subject: PERFORCE change 164788 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 21 Jun 2009 04:53:20 -0000 http://perforce.freebsd.org/chv.cgi?CH=164788 Change 164788 by dforsyth@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); } } }