Date: Wed, 10 Nov 2010 04:25:43 GMT From: David Forsythe <dforsyth@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 185587 for review Message-ID: <201011100425.oAA4Phxe024498@skunkworks.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://p4web.freebsd.org/@@185587?ac=10 Change 185587 by dforsyth@skunk on 2010/11/10 04:25:19 Add release functions and clean up leaks. Get rid of some old junk. Affected files ... .. //depot/projects/soc2010/dforsyth_libpkg/libpkg/conflict.c#2 edit .. //depot/projects/soc2010/dforsyth_libpkg/libpkg/conflict.h#2 edit .. //depot/projects/soc2010/dforsyth_libpkg/libpkg/database.c#9 edit .. //depot/projects/soc2010/dforsyth_libpkg/libpkg/database.h#7 edit .. //depot/projects/soc2010/dforsyth_libpkg/libpkg/depend.c#4 edit .. //depot/projects/soc2010/dforsyth_libpkg/libpkg/depend.h#4 edit .. //depot/projects/soc2010/dforsyth_libpkg/libpkg/freebsd_database_directorydb.c#10 edit .. //depot/projects/soc2010/dforsyth_libpkg/libpkg/freebsd_database_directorydb.h#9 edit .. //depot/projects/soc2010/dforsyth_libpkg/libpkg/pkg.c#12 edit .. //depot/projects/soc2010/dforsyth_libpkg/libpkg/pkg.h#12 edit .. //depot/projects/soc2010/dforsyth_libpkg/libpkg/pkg_types.h#5 edit .. //depot/projects/soc2010/dforsyth_libpkg/pkg_install/pkg_info/pkg_info.c#8 edit Differences ... ==== //depot/projects/soc2010/dforsyth_libpkg/libpkg/conflict.c#2 (text+ko) ==== @@ -12,6 +12,12 @@ } void +pkg_conflict_release(struct pkg_conflict *c) +{ + free(c); +} + +void _pkg_conflict_set_expr(struct pkg_conflict *conflict, const char *expr) { strncpy(conflict->expr, expr, PATH_MAX); ==== //depot/projects/soc2010/dforsyth_libpkg/libpkg/conflict.h#2 (text+ko) ==== @@ -3,6 +3,8 @@ struct pkg_conflict *pkg_conflict_alloc(void); +void pkg_conflict_release(struct pkg_conflict *); + void _pkg_conflict_set_expr(struct pkg_conflict *, const char *); ==== //depot/projects/soc2010/dforsyth_libpkg/libpkg/database.c#9 (text+ko) ==== @@ -48,6 +48,7 @@ /* TODO: NULL out callback pointers. */ db->open = fbsd_directorydb_open; + db->close = fbsd_directorydb_close; db->all = fbsd_directorydb_all; db->get = fbsd_directorydb_get; @@ -57,6 +58,7 @@ int pkg_db_finish(struct pkg_db *db) { + /* Close if the db is open. */ if (db->internal != NULL) { if (pkg_db_close(db) != PKG_OK) { warnx("Could not close pkg_db (%s)\n", db->path); @@ -117,20 +119,7 @@ int pkg_db_close(struct pkg_db *db) { - int r; - - if (db->internal != NULL) { - if (db->close) { - r = db->close(db); - } else { - r = PKG_OK; - } - } else { - /* kaboom? */ - return (PKG_NOT_OK); - } - - return (r); + return (db->close(db)); } struct pkg * ==== //depot/projects/soc2010/dforsyth_libpkg/libpkg/database.h#7 (text+ko) ==== ==== //depot/projects/soc2010/dforsyth_libpkg/libpkg/depend.c#4 (text+ko) ==== @@ -11,6 +11,12 @@ return (calloc(1, sizeof(struct pkg_depend))); } +void +pkg_depend_release(struct pkg_depend *d) +{ + free(d); +} + const char * pkg_depend_name(struct pkg_depend *dep) { ==== //depot/projects/soc2010/dforsyth_libpkg/libpkg/depend.h#4 (text+ko) ==== @@ -19,6 +19,9 @@ #include "pkg_types.h" struct pkg_depend *pkg_depend_alloc(void); + +void pkg_depend_release(struct pkg_depend *); + #if 0 const char *pkg_depend_name(struct pkg_depend *); const char *pkg_depend_origin(struct pkg_depend *); ==== //depot/projects/soc2010/dforsyth_libpkg/libpkg/freebsd_database_directorydb.c#10 (text+ko) ==== @@ -32,31 +32,13 @@ * setup method is in place. */ #include "pkg_internal.h" -struct _read_plist { - struct pkg_property *plist; - char key[PATH_MAX]; - uint32_t parsed; - RB_ENTRY(_read_plist) entry; -}; - struct _directorydb { /* Location of the database. */ char path[PATH_MAX]; - /* Journal handle. */ - int journal; - char journal_path[PATH_MAX]; - char journal_dir_path[PATH_MAX]; - /* A NULL terminated list of keys the db currently has. */ char **keylist; - /* - * The time of our last access. If this has changed, another - * directorydb instance has changes something, so we need to refresh. - */ - time_t last; - RB_HEAD(plist_head, _read_plist) plist_head; }; @@ -81,11 +63,8 @@ static int fbsd_directorydb_read_pkg(struct _directorydb *, struct pkg *, uint32_t); -int fbsd_directorydb_finish(struct pkg_db *, - struct pkg *); +static int fbsd_directorydb_finish(struct pkg *); static char *read_file(const char *); -static int _read_plist_cmp(struct _read_plist *, - struct _read_plist *); static void fbsd_directorydb_pkg_setup(struct pkg_db *, struct pkg *, const char *); @@ -103,16 +82,17 @@ static int fbsd_directorydb_read_description(struct pkg *); -RB_GENERATE_STATIC(plist_head, _read_plist, entry, _read_plist_cmp); +static int fbsd_directorydb_has_backup(struct _directorydb *, + const char *); +static int _fbsd_directorydb_has_backup(const char *); + +static int fbsd_directorydb_resolve(struct _directorydb *, + const char *, int); +static int _fbsd_directorydb_resolve(const char *, int); #define PKG_DIRDB_MAGIC 0x11111111 -#define DB_DIRDB_MAGIC 0x11111111 +#define DB_DIRDB_MAGIC 0x11111111 -/* The journal file. */ -#define JOURNAL ".journal" -/* Where the journaler can store files for changes before a sync. */ -#define JOURNAL_DIR ".journal_sav" - #define journal_open(path) open(path, O_CREAT | O_APPEND | O_EXLOCK) #define _pkg_check_magic(p) assert(p->magic == PKG_DIRDB_MAGIC) @@ -129,18 +109,12 @@ return (fbsd_directorydb_read_pkg(d, pkg, src_mask)); \ } -static int -_read_plist_cmp(struct _read_plist *a, struct _read_plist *b) -{ - return (strcmp(a->key, b->key)); -} - /* Close a "connection" to a directorydb. */ int fbsd_directorydb_close(struct pkg_db *db) { struct _directorydb *d = db->internal; - close(d->journal); + free(d); return (0); } @@ -150,57 +124,18 @@ { struct _directorydb *d; struct stat sb; - int jfd; - printf("ddb open\n"); - + stat(path, &sb); + assert(S_ISDIR(sb.st_mode)); d = calloc(1, sizeof(*d)); - if (d == NULL) { - return (PKG_NOT_OK); - } + if (d == NULL) return (PKG_NOT_OK); strcpy(d->path, path); printf("path: %s\n", d->path); db->magic = DB_DIRDB_MAGIC; - RB_INIT(&d->plist_head); - (void)jfd; - (void)sb; -#if 0 - - /* Open the journal. */ - - strcpy(d->journal_path, d->path); - strcat(d->journal_path, JOURNAL); - - /* Grab the lock on the journal file, creating it if it doesn't exist. - * */ - if ((jfd = journal_open(d->journal_path)) < 0) { - return (PKG_NOT_OK); - } - - /* Make sure that the journal dir exists (create it if it doesn't). */ - strcpy(d->journal_dir_path, d->path); - strcpy(d->journal_dir_path, "/"); - strcpy(d->journal_dir_path, JOURNAL_DIR); - - if (stat(d->journal_dir_path, &sb) < 0) { - /* not there. */ - mkdir(d->journal_dir_path, 0755); - } else if (!S_ISDIR(sb.st_mode)) { - close(jfd); - return (PKG_NOT_OK); /* This could probably be FATAL */ - } - - /* Let the journal file go. */ - if (close(jfd) < 0) { - return (PKG_FATAL); - } -#endif - - /* Annnnd... go. */ db->internal = d; return (PKG_OK); @@ -237,6 +172,8 @@ pkg->add_conflict = fbsd_directorydb_add_conflict; pkg->add_file = fbsd_directorydb_add_file; + + pkg->finish = fbsd_directorydb_finish; } static int @@ -285,6 +222,7 @@ TAILQ_INSERT_TAIL(list, pkg, next); } fts_close(ftsp); + free(paths[0]); return (list); } @@ -317,16 +255,63 @@ char path[PATH_MAX]; d = db->internal; + + sprintf(path, "%s/%s", d->path, key); + + if (stat(path, &sb) < 0) return (0); + + return (S_ISDIR(sb.st_mode)); +} + +static int +fbsd_directorydb_has_backup(struct _directorydb *d, const char *name) +{ + char directory[PATH_MAX]; + + sprintf(directory, "%s/%s", d->path, name); + return (_fbsd_directorydb_has_backup(directory)); +} + +static int +fbsd_directorydb_resolve(struct _directorydb *d, const char *name, + int use_bak) +{ + char directory[PATH_MAX]; + + sprintf(directory, "%s/%s", d->path, name); + return (_fbsd_directorydb_resolve(directory, use_bak)); +} - strcpy(path, d->path); - strcat(path, "/"); - strcat(path, key); +/* XXX: Pull these out of the top level has_backup and resolve functions in case + * they change (for now at least). */ +static int +_fbsd_directorydb_has_backup(const char *directory) +{ + char bak_path[PATH_MAX]; + + assert(directory != NULL); + + sprintf(bak_path, "%s/%s", directory, "+CONTENTS.bak"); + return (access(bak_path, F_OK) == 0); +} + +static int +_fbsd_directorydb_resolve(const char *directory, int use_bak) +{ + char bak_path[PATH_MAX]; + char cur_path[PATH_MAX]; + + assert(directory != NULL); + + sprintf(bak_path, "%s/%s", directory, "+CONTENTS.bak"); + sprintf(cur_path, "%s/%s", directory, "+CONTENTS"); - if (stat(path, &sb) < 0) { - return (0); - } + if (use_bak) { + /* do replacement. */ + } else return (unlink(bak_path)); - return (S_ISDIR(sb.st_mode)); + /* NOT REACHED */ + return (-1); } int @@ -366,13 +351,9 @@ d = db->internal; - strcpy(path, d->path); - strcat(path, "/"); - strcat(path, key); + sprintf(path, "%s/%s", d->path, key); - if (stat(path, &sb) < 0) { - return (PKG_NOT_OK); - } + if (stat(path, &sb) < 0) return (PKG_NOT_OK); fbsd_directorydb_pkg_setup(db, pkg, key); @@ -380,10 +361,20 @@ } int -fbsd_directorydb_finish(struct pkg_db *db, struct pkg *pkg) +fbsd_directorydb_finish(struct pkg *pkg) { + const char *key; + struct pkg_db *db; + struct _directorydb *d; + _pkg_check_magic(pkg); - assert(pkg->source == db); + + key = pkg->key; + db = pkg->source; + d = db->internal; + + if (fbsd_directorydb_has_backup(d, key)) + fbsd_directorydb_resolve(d, key, 1); pkg_release(pkg); @@ -414,12 +405,13 @@ for (pi = pkg_entries; pi->info_name != NULL; pi++) { if (mask & pi->info_mask) { - _pkg_util_path_join(path, d->path, pkg->key); - _pkg_util_path_join(path, path, pi->file_name); + sprintf(path, "%s/%s/%s", d->path, pkg->key, + pi->file_name); if ((data = read_file(path)) == NULL) continue; r = fbsd_plist_parse(pkg, data, pi->info_name); + free(data); if (r != PKG_OK) return (r); } } ==== //depot/projects/soc2010/dforsyth_libpkg/libpkg/freebsd_database_directorydb.h#9 (text+ko) ==== ==== //depot/projects/soc2010/dforsyth_libpkg/libpkg/pkg.c#12 (text+ko) ==== @@ -12,6 +12,7 @@ #include "pkg.h" #include "pkg_internal.h" +#include "conflict.h" #include "file.h" #include "depend.h" @@ -46,6 +47,41 @@ void pkg_release(struct pkg *pkg) { + struct pkg_conflict *c, *nc; + struct pkg_depend *d, *nd; + struct pkg_file *f, *nf; + + if (pkg->conflicts != NULL) { + /* Do tailq deletion. */ + c = TAILQ_FIRST(pkg->conflicts); + while (c != NULL) { + nc = TAILQ_NEXT(c, next); + pkg_conflict_release(c); + c = nc; + } + free(pkg->conflicts); + } + + if (pkg->depends != NULL) { + d = TAILQ_FIRST(pkg->depends); + while (d != NULL) { + nd = TAILQ_NEXT(d, next); + pkg_depend_release(d); + d = nd; + } + free(pkg->depends); + } + + if (pkg->files != NULL) { + f = TAILQ_FIRST(pkg->files); + while (f != NULL) { + nf = TAILQ_NEXT(f, next); + pkg_file_release(f); + f = nf; + } + free(pkg->files); + } + free(pkg); } @@ -221,6 +257,34 @@ } int +pkg_finish(struct pkg *pkg) +{ + return (pkg->finish(pkg)); +} + +int +pkg_list_finish(struct pkg_list *pkgs) +{ + struct pkg *pkg; + + /* delete this way so that we can 'recover' on a bad pkg_finish. */ + + while (!TAILQ_EMPTY(pkgs)) { + pkg = TAILQ_FIRST(pkgs); + TAILQ_REMOVE(pkgs, pkg, next); + if (pkg->finish(pkg) != PKG_OK) { + /* finish failed, put pkg back at the head of the list + * and return not_ok. */ + TAILQ_INSERT_HEAD(pkgs, pkg, next); + return (PKG_NOT_OK); + } + } + free(pkgs); + + return (PKG_OK); +} + +int pkg_parse(struct pkg *p, char *data, const char *metaname) { return (p->parse(p, data, metaname)); ==== //depot/projects/soc2010/dforsyth_libpkg/libpkg/pkg.h#12 (text+ko) ==== @@ -70,6 +70,8 @@ */ int pkg_finish(struct pkg *); +int pkg_list_finish(struct pkg_list *); + /* * Retrieve the name of a package. */ ==== //depot/projects/soc2010/dforsyth_libpkg/libpkg/pkg_types.h#5 (text+ko) ==== @@ -70,6 +70,8 @@ int (*set_comment) (struct pkg *, const char *); int (*set_description) (struct pkg *, const char *); + + int (*finish) (struct pkg *); int (*parse) (struct pkg *, char *, const char *); ==== //depot/projects/soc2010/dforsyth_libpkg/pkg_install/pkg_info/pkg_info.c#8 (text+ko) ==== @@ -467,7 +467,8 @@ } } } - + + pkg_list_finish(pkgs); pkg_db_finish(db); return (r); }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201011100425.oAA4Phxe024498>