From owner-p4-projects@FreeBSD.ORG Tue Jun 16 03:13:27 2009 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 77370106566C; Tue, 16 Jun 2009 03:13:27 +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 EE31B1065677 for ; Tue, 16 Jun 2009 03:13:26 +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 DA7D68FC22 for ; Tue, 16 Jun 2009 03:13:26 +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 n5G3DQMt072094 for ; Tue, 16 Jun 2009 03:13:26 GMT (envelope-from dforsyth@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.3/8.14.3/Submit) id n5G3DQJM072092 for perforce@freebsd.org; Tue, 16 Jun 2009 03:13:26 GMT (envelope-from dforsyth@FreeBSD.org) Date: Tue, 16 Jun 2009 03:13:26 GMT Message-Id: <200906160313.n5G3DQJM072092@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 164478 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: Tue, 16 Jun 2009 03:13:28 -0000 http://perforce.freebsd.org/chv.cgi?CH=164478 Change 164478 by dforsyth@squirrel on 2009/06/16 03:12:57 Almost finished moving to new scheme. This code builds with a bunch of warnings, but pkg_info spits out comments atleast. Still need to go back and revise error codes. Affected files ... .. //depot/projects/soc2009/dforsyth_libpkg/libpkg/Makefile#7 edit .. //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkg.c#18 edit .. //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkg.h#18 edit .. //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkg_util.c#6 edit .. //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkgdb_hierdb.c#6 edit .. //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkgdb_hierdb.h#4 edit .. //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkgdb_hierdb_pkgdb_sub.c#6 edit .. //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkgdb_hierdb_pkgdb_sub.h#5 edit .. //depot/projects/soc2009/dforsyth_libpkg/pkg_info/main.c#12 edit Differences ... ==== //depot/projects/soc2009/dforsyth_libpkg/libpkg/Makefile#7 (text+ko) ==== @@ -1,7 +1,8 @@ LIB= pkg INCS= pkg.h WARNS= 6 -SRCS= pkgdb.c pkg_plist.c pkg.c pkg_util.c pkg_file.c pkg_dep.c pkgdb_hierdb.c pkgdb_hierdb_pkgdb_sub.c +SRCS= pkgdb.c pkgdb_hierdb.c pkgdb_hierdb_pkgdb_sub.c pkg.c pkg_util.c \ + pkg_file.c pkg_dep.c pkg_plist.c NO_MAN= yes .include ==== //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkg.c#18 (text+ko) ==== @@ -48,14 +48,35 @@ * twice, but until I'm sure about what I'm going to do with all of the * information, pkgs can have their own copies of the data. */ +/* Set the identity for this package (does not have to be the same as the + * name from plist, but it generally is. This is the name used for the + * directory in a hierdb. */ + +int +pkg_set_ident(struct pkg *p, const char *ident) +{ + 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; + + return (OK); +} + /* Set the short comment for this package */ int pkg_set_comment(struct pkg *p, const char *comment) { if (p == NULL) arg_rage_quit(__func__, "Not a valid package.", RAGE_AT_CLIENT); - - p->comment = strdup(comment); + + if (comment != NULL) + p->comment = strdup(comment); + else + p->comment = NULL; return (OK); } @@ -67,9 +88,12 @@ { if (p == NULL) arg_rage_quit(__func__, "Not a valid package.", RAGE_AT_CLIENT); + + if (contents != NULL) + p->contents = strdup(contents); + else + p->contents = NULL; - p->contents = strdup(contents); - return (OK); } @@ -79,7 +103,10 @@ if (p == NULL) arg_rage_quit(__func__, "Not a valid package.", RAGE_AT_CLIENT); - p->description = strdup(description); + if (description != NULL) + p->description = strdup(description); + else + p->description = NULL; return (OK); } @@ -90,7 +117,10 @@ if (p == NULL) arg_rage_quit(__func__, "Not a valid package.", RAGE_AT_CLIENT); - p->display = strdup(display); + if (display != NULL) + p->display = strdup(display); + else + p->display = NULL; return (OK); } @@ -101,7 +131,10 @@ if (p == NULL) arg_rage_quit(__func__, "Not a valid package.", RAGE_AT_CLIENT); - p->mtree_dirs = strdup(mtree_dirs); + if (mtree_dirs != NULL) + p->mtree_dirs = strdup(mtree_dirs); + else + p->mtree_dirs = NULL; return (OK); } @@ -112,7 +145,10 @@ if (p == NULL) arg_rage_quit(__func__, "Not a valid package.", RAGE_AT_CLIENT); - p->required_by = strdup(required_by); + if (required_by != NULL) + p->required_by = strdup(required_by); + else + p->required_by = NULL; return (OK); } @@ -221,7 +257,7 @@ p->display = NULL; p->mtree_dirs = NULL; p->required_by = NULL; - pkg_plist(&p->plist); + pkg_plist_reset(&p->plist); } /* TODO: Make an note in the manual for libpkg that pkg_free should not be ==== //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkg.h#18 (text+ko) ==== @@ -8,6 +8,8 @@ /* These error codes are no good. Switch to contextual errors/macros. */ +/* General Errors. */ + #define OK 0x00000000 #define NOT_OK 0x00000001 #define MEMORY_ERR 0x00000002 @@ -15,6 +17,8 @@ #define RAGE_AT_CLIENT 0x00000008 #define RAGE_AT_LIBPKG 0x00000010 +/* PKGDB Errors. */ + #define DB_BAD_ROOT 0x10000000 #define DB_NOT_OPEN 0x20000000 #define DB_OPEN 0x40000000 @@ -28,6 +32,8 @@ #define SUB_NO_FILE 0x00200000 #define SUB_EMPTY_FILE 0x00400000 +/* PKG Errors. */ + #define NO_PKG 0x00800000 /* pkg_file */ @@ -124,8 +130,6 @@ int pkgdb_db_close(struct pkgdb *db); -void pkgdb_db_delete(struct pkgdb *db); - int pkgdb_pkg_next(struct pkgdb *db, struct pkg *p); int pkgdb_pkg_get(struct pkgdb *db, struct pkg *p, const char *ident); ==== //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkg_util.c#6 (text+ko) ==== @@ -40,27 +40,25 @@ path_build(const char *prefix, const char *suffix) { size_t l; - int slash; char *new_path; - slash = 0; l = strlen(prefix); - if (prefix[l - 1] != '/') - slash = 1; - l += strlen(suffix) + slash; - new_path = malloc(l + 1); - if (new_path == NULL) - return (NULL); - strcpy(new_path, prefix); - if (slash) - strcat(new_path, '/'); - strcat(new_path, suffix); + if (prefix[l - 1] == '/') { + new_path = malloc(l + strlen(suffix) + 1); + strcpy(new_path, prefix); + strcat(new_path, suffix); + } else { + new_path = malloc(l + strlen(suffix) + 2); + strcpy(new_path, prefix); + strcat(new_path, "/"); + strcat(new_path, suffix); + } return (new_path); } void -argument_rage_quit(const char *function, const char *message, int ret) +arg_rage_quit(const char *function, const char *message, int ret) { fprintf(stderr, "Bad argument in %s: %s\n", function, message); exit(ret); ==== //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkgdb_hierdb.c#6 (text+ko) ==== @@ -7,6 +7,7 @@ #include #include "pkg_util.h" +#include "pkg_private.h" #include "pkg.h" #include "pkgdb.h" #include "pkgdb_private.h" @@ -33,11 +34,11 @@ s = lstat(db_root, &sb); if (s < 0 || !S_ISDIR(sb.st_mode) || S_ISLNK(sb.st_mode)) - return (DB_INVALID_ROOT); + return (DB_BAD_ROOT); db->db_root = strdup(db_root); if (db->db_root == NULL) - return (DB_MEMORY_ERR); + return (MEMORY_ERR); db->dirty = 1; db->open = 1; @@ -45,7 +46,7 @@ db->sub_count = 0; - return (DB_OK); + return (OK); } int @@ -60,33 +61,34 @@ #if 0 if (!VALID_DB(db)) #endif - if (db == NULL); + if (db == NULL) arg_rage_quit(__func__, "Not a valid database.", RAGE_AT_CLIENT); /* TODO: Add dirty check. */ c = scandir(db->db_root, &ents, subdir_sel, alphasort); if (c < 1) - return (DB_NO_READ | DB_MEMORY_ERR); + return (NOT_OK | MEMORY_ERR); + pkgdb_pkgdb_sub_list_init(db); for (i = 0, cnt = 0; i < c; ++i) { sub = pkgdb_sub_new(); status = pkgdb_hierdb_read_pkgdb_sub(db, sub, ents[i]->d_name); - if (SUB_MEMORY_ERR & status) { + if (MEMORY_ERR & status) { /* Ruh roh Shaggy! */ pkgdb_pkgdb_sub_list_free(db); for (; i < c; ++i) free(ents[i]); free(ents); - return (DB_MEMORY_ERR); - } else if ((SUB_NO_CONTENTS & status) || (SUB_BAD_IDENT & status)) + return (MEMORY_ERR); + } else if ((SUB_NO_CONTENTS & status) || (BAD_IDENT & status)) /* * This is a directory that is of no use to us. I am * enforcing strict rules on what is and isn't a package. If * there is no plist, or the plist is empty, this is not a * package, and we don't care about it. */ - pkg_delete(p); + pkgdb_sub_delete(sub); else { pkgdb_pkgdb_sub_list_append(db, sub); cnt++; @@ -99,7 +101,7 @@ db->sub_count = cnt; db->dirty = 0; - return (DB_OK); + return (OK); } /* This function will properly initialize a pkgdb_sub for a pkgdb to use. @@ -118,28 +120,28 @@ arg_rage_quit(__func__, "Not a valid identification string.", RAGE_AT_CLIENT); #endif - pkg_reset(sub); - status = SUB_OK; - status |= pkgdb_sub_set_ident(ident); + pkgdb_sub_reset(sub); + status = OK; + status |= pkgdb_sub_set_ident(sub, ident); status |= pkgdb_sub_set_assign_db(db, sub); - if ((SUB_MEMORY_ERR & status) || (SUB_BAD_IDENT & status)) + if ((MEMORY_ERR & status) || (BAD_IDENT & status)) return (status); /* Hope you have your reading glasses on... */ - status = SUB_OK; - status |= pkgdb_sub_reat_file_to_text(db, sub, COMMENT_FILE) & - (SUB_EMPTY_FILE | SUB_NO_FILE) ? SUB_NO_COMMENT : SUB_OK; - status |= pkgdb_sub_read_file_to_text(db, sub, CONTENTS_FILE) & - (SUB_EMPTY_FILE | SUB_NO_FILE) ? SUB_NO_CONTENTS : SUB_OK; - status |= pkgdb_sub_read_file_to_text(db, sub, DESC_FILE) & - (SUB_EMPTY_FILE | SUB_NO_FILE) ? SUB_NO_DESC : SUB_OK; - status |= pkgdb_sub_read_file_to_text(db, sub, DISPLAY_FILE) & - (SUB_EMPTY_FILE | SUB_NO_FILE) ? SUB_NO_DISPLAY : SUB_OK; - status |= pkgdb_sub_read_file_to_text(db, sub, MTREE_DIRS_FILE) & - (SUB_EMPTY_FILE | SUB_NO_FILE) ? SUB_NO_MTREE_DIRS : SUB_OK; - status |= pkgdb_sub_read_file_to_text(db, sub, REQUIRED_BY_FILE:) & - (SUB_EMPTY_FILE | SUB_NO_FILE) ? SUB_NO_REQUIRED_BY : SUB_OK; + status = OK; + status |= pkgdb_sub_read_file_to_text(sub, COMMENT_FILE) & + (SUB_EMPTY_FILE | SUB_NO_FILE) ? SUB_NO_COMMENT : OK; + status |= pkgdb_sub_read_file_to_text(sub, CONTENTS_FILE) & + (SUB_EMPTY_FILE | SUB_NO_FILE) ? SUB_NO_CONTENTS : OK; + status |= pkgdb_sub_read_file_to_text(sub, DESC_FILE) & + (SUB_EMPTY_FILE | SUB_NO_FILE) ? SUB_NO_DESC : OK; + status |= pkgdb_sub_read_file_to_text(sub, DISPLAY_FILE) & + (SUB_EMPTY_FILE | SUB_NO_FILE) ? SUB_NO_DISPLAY : OK; + status |= pkgdb_sub_read_file_to_text(sub, MTREE_DIRS_FILE) & + (SUB_EMPTY_FILE | SUB_NO_FILE) ? SUB_NO_MTREE_DIRS : OK; + status |= pkgdb_sub_read_file_to_text(sub, REQUIRED_BY_FILE) & + (SUB_EMPTY_FILE | SUB_NO_FILE) ? SUB_NO_REQUIRED_BY : OK; return (status); } ==== //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkgdb_hierdb.h#4 (text+ko) ==== @@ -10,6 +10,8 @@ int pkgdb_hierdb_read_pkgdb_sub(struct pkgdb *db, struct pkgdb_sub *dbs, const char *ident); -int pkgdb_hierdb_db_close(struct pkgdb *db); +/* int pkgdb_hierdb_db_close(struct pkgdb *db); */ + +int pkgdb_hierdb_db_sync(struct pkgdb *db); #endif ==== //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkgdb_hierdb_pkgdb_sub.c#6 (text+ko) ==== @@ -1,7 +1,15 @@ +#include +#include +#include + #include #include +#include +#include +#include "pkg_util.h" #include "pkgdb_hierdb_pkgdb_sub.h" +#include "pkg_private.h" #include "pkg.h" #define BAD_ARG_RAGE arg_rage_quit(__func__, "Not a valid pkgdb_sub.", RAGE_AT_LIBPKG); @@ -24,8 +32,8 @@ free(dbs->ident); dbs->ident = strdup(ident); if (dbs->ident == NULL) - return (SUB_MEMORY_ERR); - return (SUB_OK); + return (MEMORY_ERR); + return (OK); } int @@ -38,30 +46,30 @@ #if 0 if (!VALID_DB(owner)) #endif - if (db == NULL) + if (owner == NULL) arg_rage_quit(__func__, "Owner must be a valid database.", - RAGE_AT_LIB); + RAGE_AT_LIBPKG); if (dbs == NULL) arg_rage_quit(__func__, "dbs must be a valid sub structure.", - RAGE_AT_LIB); + RAGE_AT_LIBPKG); - dbs->owner_db = db; + dbs->owner_db = owner; dbs->path = path_build(pkgdb_db_root(dbs->owner_db), dbs->ident); - if (path == NULL) - return (SUB_MEMORY_ERR); + if (dbs->path == NULL) + return (MEMORY_ERR); - s = lstat(path, &sb); + s = lstat(dbs->path, &sb); /* Also, we don't handle links (yet). */ - if (s < 0 || !S_ISDIR(sb.st_mode) || S_ISLINK(sb.st_mode)) { + if (s < 0 || !S_ISDIR(sb.st_mode) || S_ISLNK(sb.st_mode)) { free(dbs->path); - return (SUB_BAD_IDENT); + return (BAD_IDENT); } - return (SUB_OK); + return (OK); } int -pkgdb_sub_read_file_to_text(struct pkgdb *dbs, const char *filename) +pkgdb_sub_read_file_to_text(struct pkgdb_sub *sub, const char *filename) { int s; struct stat sb; @@ -69,7 +77,7 @@ char *text; char *path_to_file; - path_to_file = path_build(dbs->path, filename); + path_to_file = path_build(sub->path, filename); s = lstat(path_to_file, &sb); if (s < 0 || !S_ISREG(sb.st_mode)) { free(path_to_file); @@ -80,7 +88,7 @@ return (SUB_EMPTY_FILE); } - text = pkgdb_sub_get_field(text, dbs, filename); + /* text = pkgdb_sub_get_field(text, sub, filename); */ fd = open(path_to_file, O_RDONLY); free(path_to_file); @@ -90,7 +98,7 @@ text = malloc(sb.st_size + 1); if (text == NULL) { close(fd); - return (SUB_MEMORY_ERR); + return (MEMORY_ERR); } s = read(fd, text, sb.st_size); close(fd); @@ -98,27 +106,29 @@ free(text); return (SUB_NO_FILE); /* Could be a lie, maybe check errno? */ } + text[sb.st_size] = '\0'; + /* This is dumb. But I forgot how computers work and wrote this * function like a moron. So I'm stuck with it until I feel like * coming back to it. */ if (strcmp(filename, COMMENT_FILE) == 0) - dbs->comment_text = text; + sub->comment_text = text; else if (strcmp(filename, CONTENTS_FILE) == 0) - dbs->contents_text = text; + sub->contents_text = text; else if (strcmp(filename, DESC_FILE) == 0) - dbs->desc_text = text; + sub->desc_text = text; else if (strcmp(filename, DISPLAY_FILE) == 0) - dbs->display_text = text; + sub->display_text = text; else if (strcmp(filename, MTREE_DIRS_FILE) == 0) - dbs->mtree_dirs_text = text; + sub->mtree_dirs_text = text; else if (strcmp(filename, REQUIRED_BY_FILE) == 0) - dbs->required_by_text = text; + sub->required_by_text = text; else { free(text); return (SUB_NO_FILE); /* No where to put it. */ } - return (SUB_OK); + return (OK); } char * @@ -176,7 +186,7 @@ } char * -pkgdb_sub_required_by(struct pkgdb_sub *dbs); +pkgdb_sub_required_by(struct pkgdb_sub *dbs) { if (dbs == NULL) BAD_ARG_RAGE; @@ -209,7 +219,7 @@ } void -pkgdb_sub_free(struct pkgdb_sub *dbs) +pkgdb_sub_delete(struct pkgdb_sub *dbs) { if (dbs == NULL) return; ==== //depot/projects/soc2009/dforsyth_libpkg/libpkg/pkgdb_hierdb_pkgdb_sub.h#5 (text+ko) ==== @@ -27,7 +27,7 @@ int pkgdb_sub_set_assign_db(struct pkgdb *owner, struct pkgdb_sub *dbs); -int pkgdb_sub_read_file_to_text(struct pkgdb_sub *dbs, const char *filename); +int pkgdb_sub_read_file_to_text(struct pkgdb_sub *sub, const char *filename); char *pkgdb_sub_ident(struct pkgdb_sub *dbs); @@ -47,6 +47,6 @@ void pkgdb_sub_reset(struct pkgdb_sub *dbs); -void pkgdb_sub_free(struct pkgdb_sub *dbs); +void pkgdb_sub_delete(struct pkgdb_sub *dbs); #endif ==== //depot/projects/soc2009/dforsyth_libpkg/pkg_info/main.c#12 (text+ko) ==== @@ -59,7 +59,7 @@ perform_on_db(db); - pkgdb_db_delete(db); + pkgdb_delete(db); return (EXIT_SUCCESS); } @@ -144,8 +144,8 @@ printf("\tcwd: %s\n", cwd); printf("\torigin: %s\n", origin); printf("\tfiles:\n"); - pkg_file_list_init(p); - while ((pf = pkg_file_list_next(p)) != NULL) { + 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 =