Date: Sat, 30 May 2009 09:07:53 GMT From: David Forsythe <dforsyth@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 163072 for review Message-ID: <200905300907.n4U97ra4009399@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=163072 Change 163072 by dforsyth@squirrel on 2009/05/30 09:07:16 Ripped a bunch of stuff apart. Committing mostly for backup. Affected files ... .. //depot/projects/soc2009/dforsyth_libpkg/pkg.c#5 edit .. //depot/projects/soc2009/dforsyth_libpkg/pkg.h#4 edit .. //depot/projects/soc2009/dforsyth_libpkg/pkg_info.c#1 add .. //depot/projects/soc2009/dforsyth_libpkg/pkg_util.c#1 add .. //depot/projects/soc2009/dforsyth_libpkg/pkg_util.h#1 add .. //depot/projects/soc2009/dforsyth_libpkg/pkgdb.c#5 edit .. //depot/projects/soc2009/dforsyth_libpkg/pkgdb.h#2 edit Differences ... ==== //depot/projects/soc2009/dforsyth_libpkg/pkg.c#5 (text+ko) ==== @@ -2,76 +2,35 @@ #include <stdlib.h> #include <string.h> +#include <sys/queue.h> + +#include "pkg_util.h" #include "pkg.h" -struct pkg { - TAILQ_ENTRY(pkg) next; - - char *ident; /* User given name for this pkg. */ - - char *pkg_name; /* name taken from contents file. */ - char *pkg_comment; - char *cwd; - int pkg_rev; - - int has_comment; - int has_contents; - int has_display; - int has_mtree_dirs; - int has_desc; - int has_required_by; -}; - /* Create a new pkg. */ struct pkg * pkg_new(const char *ident) { struct pkg *p; + char *new_ident; if (ident == NULL) return (NULL); - p = malloc(sizeof(*p)); - if (p == NULL) - return (p); - memset(p, 0, sizeof(*p)); - - p->ident = strdup(ident); - if (p->ident == NULL) { - pkg_free(p); + p = calloc(1, sizeof(*p)); + new_ident = strdup(ident); + if (p == NULL || new_ident == NULL) { + free(new_ident); + free(p); return (NULL); } + p->ident = new_ident; return (p); } -/* Read in, verify, and assign the information in p's contents file. */ - -int -set_pkg_contents(struct pkg *p, char *p_c /* <-- place holder. */) -{ - if (p == NULL) - return (-1); - if (p_c == NULL) - return (-1); - - return (0); -} - /* Read in contents of comment file. */ - -int -set_pkg_comment(struct pkg *p, char *pkg_comment) -{ - if (p == NULL) - return (-1); - if (pkg_comment == NULL) - return (-1); - - return (0); -} - char * pkg_ident(struct pkg *p) { @@ -82,21 +41,12 @@ } char * -pkg_name(struct pkg *p) +pkg_comment(struct pkg *p) { if (p == NULL) return (NULL); - return (p->pkg_name); -} - -char * -pkg_comment(struct pkg *p) -{ - if (p == NULL) - return (NULL); - - return (p->pkg_comment); + return (p->comment); } void @@ -104,11 +54,7 @@ { if (p == NULL) return; - + free(p->ident); - free(p->pkg_name); - free(p->pkg_comment); - free(p->cwd); - free(p); } ==== //depot/projects/soc2009/dforsyth_libpkg/pkg.h#4 (text+ko) ==== @@ -1,30 +1,36 @@ #ifndef __PKG_H__ #define __PKG_H__ -#define COMMENT_FILE "+COMMENT" -#define CONTENTS_FILE "+CONTENTS" -#define DESC_FILE "+DESC" -#define DISPLAY_FILE "+DISPLAY" -#define MTREE_DIRS_FILE "+MTREE_DIRS" +struct pkg_file { + char *name; + char *path; + char *md5; +}; -/* pkgdb. */ -struct pkgdb; -struct pkg_head; -struct dirent; +struct pkg_contents { + int rev; + char *name; + char **file_list; /* place holder */ + char *cwd; + char **conflict; +}; -struct pkgdb *pkgdb_new_hierdb(const char *db_root); +struct pkg { + TAILQ_ENTRY(pkg) next; /* Hide meh */ -int pkgdb_reset(struct pkgdb *db); -struct pkgdb_subdir *pkgdb_read_pkg(struct pkgdb *db, const char *name); -struct pkg *pkgdb_next_pkg(struct pkgdb *db); - -void pkgdb_free_hierdb(struct pkgdb *db); - -int subdir_sel(struct dirent *ent); -void free_ptr_array(void **arr, int c); - -/* pkg. */ -struct pkg; + char *ident; /* User given name for this pkg. */ + char *path; + + char *comment; + struct pkg_contents *contents; + + int has_comment; + int has_contents; + int has_display; + int has_mtree_dirs; + int has_desc; + int has_required_by; +}; struct pkg *pkg_new(const char *ident); ==== //depot/projects/soc2009/dforsyth_libpkg/pkgdb.c#5 (text+ko) ==== @@ -7,31 +7,10 @@ #include <sys/stat.h> #include <dirent.h> +#include "pkg_util.h" +#include "pkgdb.h" #include "pkg.h" -struct pkgdb { - int dirty; /* changes have been made to this database. */ - - char *db_root; - - int p_count; - struct pkg *p_curr; - TAILQ_HEAD(pkg_head, pkg) p_head; - - /* Callbacks */ - /* tuuuummmmbbbllleeewwwweeeedddddd*/ -}; - -struct pkg { - TAILQ_ENTRY(pkg) next; - - char *name; - char *path; - int file_count; - char **file_list; - int dirty; -}; - /* Everything in here is written with the current database setup in mind. * I'll add some stuff for flat databases later. */ @@ -44,7 +23,6 @@ struct stat sb; struct pkgdb *db; char *new_db_root; - struct p_head *new_p_headp; if (db_root == NULL) return (NULL); @@ -54,110 +32,76 @@ return (NULL); db = calloc(1, sizeof(*db)); - new_db_root = strdup(db_root); - // new_p_headp = calloc(1, sizeof(*db->p_headp)); - if (db == NULL || new_db_root == NULL/* || new_p_headp == NULL*/) { + new_db_root = path_strdup(db_root); + if (db == NULL || new_db_root == NULL) { free(db); free(new_db_root); - // free(new_p_headp); return (NULL); } db->db_root = new_db_root; - // db->p_headp = new_p_headp; - TAILQ_INIT(&db->p_head); - db->sd_count = 0; + db->p_count = 0; db->dirty = 1; + /* Set the callbacks for database access */ + return (db); } -/* Don't know if I'll leave this in here, the dirty var is completely - * internal... */ -int -pkgdb_is_dirty(struct pkgdb *db) -{ - if (db == NULL) - return (-1); - - return (db->dirty); -} - -int -pkgdb_set_dirty(struct pkgdb *db) -{ - if (db == NULL) - return (-1); - - return (db->dirty = 1); -} - -int -pkgdb_set_not_dirty(struct pkgdb *db) -{ - if (db == NULL) - return (-1); - - return (db->dirty = 0); -} - /* Read in the names of all subdirectories in db->db_root, and add them to * the db's package list. Set the current package to the head of the * list. The packages in db's package list are not verified. Returns the * number of subdirectories in the database. */ int -pkgdb_reset(struct pkgdb *db) +pkgdb_init_hierdb(struct pkgdb *db) { int i; - struct pkg *sd; + int p_count; + struct pkg *p; struct dirent **ents; if (db == NULL) return (-1); - + + TAILQ_INIT(&db->p_head); if (db->dirty == 0) { - /* No changes since the last reset, don't bother walking the + /* No changes since the last init, don't bother walking the * database again. */ db->p_curr = TAILQ_FIRST(&db->p_head); - return (db->sd_count); + return (db->p_count); } - db->sd_count = scandir(db->db_root, &ents, subdir_sel, alphasort); + p_count = scandir(db->db_root, &ents, subdir_sel, alphasort); /* Clear out old list. */ pkgdb_free_pkg_list(db); /* Later on I should look into inserting changes into the existing * list, rather than just bombing the whole thing. */ - TAILQ_INIT(&db->p_head); - for (i = 0; i < db->sd_count; ++i) { - sd = pkgdb_read_pkg(db, ents[i]->d_name); - if (sd == NULL) { + for (i = 0; i < p_count; ++i) { + p = pkgdb_read_pkg_hierdb(db, ents[i]->d_name); + if (p == NULL) { pkgdb_free_pkg_list(db); free(ents); return (-1); } - TAILQ_INSERT_TAIL(&db->p_head, sd, next); + TAILQ_INSERT_TAIL(&db->p_head, p, next); free(ents[i]); } free(ents); + db->p_curr = TAILQ_FIRST(&db->p_head); + db->p_count = p_count; db->dirty = 0; - return (db->sd_count); + return (db->p_count); } -int -subdir_sel(struct dirent *ent) -{ - if (strcmp(ent->d_name, ".") != 0 && strcmp(ent->d_name, "..") != 0) - return (1); - return (0); -} +/* Read in all the package information we can right here. */ struct pkg * -pkgdb_read_pkg(struct pkgdb *db, const char *ident) +pkgdb_read_pkg_hierdb(struct pkgdb *db, const char *ident) { int i; int c; @@ -165,10 +109,11 @@ char *path; struct stat sb; struct pkg *p; + struct dirent *e; struct dirent **ents; - p = pkg_new(name); - path = pkgdb_path(db, p); + p = pkg_new(ident); + path = pkgdb_pkg_path(db, p); if (p == NULL || path == NULL) { pkg_free(p); free(path); @@ -180,12 +125,30 @@ free(path); return (NULL); } - + c = scandir(path, &ents, subdir_sel, alphasort); for (i = 0; i < c; ++i) { - /* Check file names and set values in p. */ - - free(ents[i]); + s = 0; /* Reset s */ + /* Go through all the files in this package, grab the information + * that we need. */ + e = ents + i; + s = pkg_info_identify_file(e); + switch (s) { + case IS_COMMENTS: + /* Read the comments file into the comments field of this + * package. */ + break; + case IS_CONTENTS: + /* Do contents parsing stuff. Like... + p->contents = pkg_info_parse_contents_file(p, + CONTENTS_FILE); */ + break; + case IS_MTREE_DIRS: + break; + default: + /* This is an irrelevant file. */ + } + free(e); } free(ents); @@ -193,23 +156,52 @@ return (p); } +/* Grab a package from the database via ident. No need to initialize, + * this is a direct query. */ + +/* +struct pkg * +pkgdb_query_pkg(struct pkgdb *db, const char *ident) +{ + Need to add callbacks before do this. +} +*/ + +char * +pkgdb_pkg_path(struct pkgdb *db, struct pkg *p) +{ + char *new_path; + + if (db == NULL || p == NULL) { + return (NULL); + } + + new_path = malloc(strlen(db->db_root) + strlen(p->ident) + 1); + if (new_path == NULL) + return (NULL); + + strcpy(new_path, db->db_root); + strcat(new_path, p->ident); + + return (new_path); +} + /* Move the current subdir pointer to the next one in the list. Return * the previous subdir. Return NULL if there are no more left. */ struct pkg * pkgdb_next_pkg(struct pkgdb *db) { - struct pkg *sd; + struct pkg *p; if (db == NULL) return (NULL); + + if ((p = db->p_curr) == NULL) + return (NULL); - sd = db->p_curr; - if (sd == NULL) - return (NULL); - db->p_curr = TAILQ_NEXT(db->p_curr, next); - return (sd); + return (p); } /* Free a hierdb. */ @@ -228,14 +220,14 @@ void pkgdb_free_pkg_list(struct pkgdb *db) { - struct pkg *sd; - struct pkg *sdn; + struct pkg *p; + struct pkg *pn; - sd = TAILQ_FIRST(&db->p_head); - while (sd != NULL) { - sdn = TAILQ_NEXT(sd, next); - pkg_free(sd); - sd = sdn; + p = TAILQ_FIRST(&db->p_head); + while (p != NULL) { + pn = TAILQ_NEXT(p, next); + pkg_free(p); + p = pn; } TAILQ_INIT(&db->p_head); } ==== //depot/projects/soc2009/dforsyth_libpkg/pkgdb.h#2 (text+ko) ==== @@ -1,4 +1,40 @@ #ifndef __PKGDB_H__ #define __PKGDB_H__ +#define COMMENT_FILE "+COMMENT" +#define CONTENTS_FILE "+CONTENTS" +#define DESC_FILE "+DESC" +#define DISPLAY_FILE "+DISPLAY" +#define MTREE_DIRS_FILE "+MTREE_DIRS" +#define REQUIRED_BY_FILE "+REQUIRED_BY" + +#include <sys/queue.h> + +struct pkgdb { + int dirty; /* changes have been made to this database. */ + + char *db_root; + + int p_count; + struct pkg *p_curr; + TAILQ_HEAD(pkg_head, next) p_head; + + /* Callbacks */ + /* tuuuummmmbbbllleeewwwweeeedddddd*/ +}; +// struct pkg_head; + +struct pkgdb *pkgdb_new_hierdb(const char *db_root); + +int pkgdb_init_hierdb(struct pkgdb *db); +struct pkg *pkgdb_read_pkg_hierdb(struct pkgdb *db, const char *ident); +struct pkg *pkgdb_next_pkg(struct pkgdb *db); + +struct pkg *pkgdb_query_pkg(struct pkgdb *db, const char *ident); + +char *pkgdb_pkg_path(struct pkgdb *db, struct pkg *p); + +void pkgdb_free_hierdb(struct pkgdb *db); +void pkgdb_free_pkg_list(struct pkgdb *db); + #endif
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200905300907.n4U97ra4009399>