PERFORCE change 144138 for review
Anders Nore
andenore at FreeBSD.org
Thu Jun 26 10:40:25 UTC 2008
http://perforce.freebsd.org/chv.cgi?CH=144138
Change 144138 by andenore at andenore_laptop on 2008/06/26 10:40:03
Added support for environment variable PKG_DBCACHE_FILE that can be used to specify the location of the cache file.
Affected files ...
.. //depot/projects/soc2008/andenore_pkginstall/src/usr.sbin/pkg_install/CHANGES#4 edit
.. //depot/projects/soc2008/andenore_pkginstall/src/usr.sbin/pkg_install/add/main.c#3 edit
.. //depot/projects/soc2008/andenore_pkginstall/src/usr.sbin/pkg_install/add/perform.c#3 edit
.. //depot/projects/soc2008/andenore_pkginstall/src/usr.sbin/pkg_install/convert/convert.h#1 add
.. //depot/projects/soc2008/andenore_pkginstall/src/usr.sbin/pkg_install/convert/converter.h#1 add
.. //depot/projects/soc2008/andenore_pkginstall/src/usr.sbin/pkg_install/convert/main.c#2 edit
.. //depot/projects/soc2008/andenore_pkginstall/src/usr.sbin/pkg_install/convert/perform.c#4 edit
.. //depot/projects/soc2008/andenore_pkginstall/src/usr.sbin/pkg_install/convert/pkg_convert.1#3 edit
.. //depot/projects/soc2008/andenore_pkginstall/src/usr.sbin/pkg_install/create/perform.c#3 edit
.. //depot/projects/soc2008/andenore_pkginstall/src/usr.sbin/pkg_install/delete/main.c#3 edit
.. //depot/projects/soc2008/andenore_pkginstall/src/usr.sbin/pkg_install/delete/perform.c#3 edit
.. //depot/projects/soc2008/andenore_pkginstall/src/usr.sbin/pkg_install/info/main.c#5 edit
.. //depot/projects/soc2008/andenore_pkginstall/src/usr.sbin/pkg_install/lib/database.c#5 edit
.. //depot/projects/soc2008/andenore_pkginstall/src/usr.sbin/pkg_install/lib/lib.h#6 edit
.. //depot/projects/soc2008/andenore_pkginstall/src/usr.sbin/pkg_install/version/main.c#4 edit
Differences ...
==== //depot/projects/soc2008/andenore_pkginstall/src/usr.sbin/pkg_install/CHANGES#4 (text+ko) ====
@@ -24,6 +24,8 @@
- Added global variable 'database' of type DB* (the database object)
- Added database helper functions
- Added function to cache a Packagelist (cache_plist())
+ - The environment variable PKG_DBCAHE_FILE can be set to make the file
+ location different than the default /var/db/pkg/pkgcache.db
Create:
- The -O option has been modified to cache information when installing ports
==== //depot/projects/soc2008/andenore_pkginstall/src/usr.sbin/pkg_install/add/main.c#3 (text+ko) ====
@@ -111,7 +111,7 @@
if(cacheExists()) {
printf("add.main(): cacheExists()\n");
- openDatabase(PKG_DBCACHE_FILE);
+ openDatabase();
}
start = argv;
==== //depot/projects/soc2008/andenore_pkginstall/src/usr.sbin/pkg_install/add/perform.c#3 (text+ko) ====
@@ -535,7 +535,7 @@
*/
/* make sure we've opened the database */
- openDatabase(PKG_DBCACHE_FILE);
+ openDatabase();
/* save package name (fast lookup in isinstalledpkg) */
printf("Saving package: %s Plist.name\n", Plist.name);
==== //depot/projects/soc2008/andenore_pkginstall/src/usr.sbin/pkg_install/convert/main.c#2 (text+ko) ====
@@ -1,15 +1,19 @@
#include <stdlib.h>
#include <lib.h>
-static char Options[] = "v";
-static void usage();
+static char Options[] = "vthepk:";
+
+char *Key = NULL;
+Boolean CheckExists = FALSE;
+Boolean Print = FALSE;
+Boolean Textual = TRUE;
int
main(int argc, char **argv) {
char **pkgs; /* null terminated array of installed pkgnames */
int retval, ch;
- openDatabase(PKG_DBCACHE_FILE);
+ openDatabase();
atexit(closeDatabase);
signal(SIGHUP, cleanup);
@@ -20,6 +24,20 @@
case 'v':
Verbose++;
break;
+ case 'e':
+ CheckExists = TRUE;
+ break;
+ case 't':
+ Textual = FALSE;
+ break;
+ case 'p':
+ Print = TRUE;
+ break;
+ case '?':
+ case 'k':
+ Key = optarg;
+ break;
+ case 'h':
default:
usage();
break;
@@ -36,11 +54,15 @@
} else {
printf("No packages to convert\n");
}
+
+ return 0;
}
-static void
+void
usage()
{
- fprintf(stderr, "usage: pkg_convert [-v]\n");
+ fprintf(stderr, "usage:\t%s\n\t%s\n",
+ "pkg_convert [-vtep] [-k key]",
+ "pkg_convert");
exit(1);
}
==== //depot/projects/soc2008/andenore_pkginstall/src/usr.sbin/pkg_install/convert/perform.c#4 (text+ko) ====
@@ -5,6 +5,7 @@
#include <err.h>
#include "lib.h"
+#include "convert.h"
static int pkg_do(char *);
@@ -13,8 +14,44 @@
{
int i, error;
error = 0;
+ DBT data;
+
+ if (CheckExists) {
+ if (!Key) {
+ warnx("You must specify a key with -k\n");
+ usage();
+ exit(1);
+ }
+ Boolean exists = dbKeyExists(Key, &data);
+ if (Textual) {
+ if (Verbose)
+ printf("%s exists:\t", Key);
+ printf("%s\n", exists ? "TRUE" : "FALSE");
+ } else {
+ printf("%s\n", exists ? "1" : "0");
+ }
+
+ return 0;
+ }
+
+ if (Print) {
+ if (Key != NULL) {
+ if (dbKeyExists(Key, &data))
+ printf("%s -> %s\n", Key, (char *)data.data);
+ else
+ printf("%s: does not exist\n", Key);
+ } else {
+ DBT key;
+ while (dbscan(database, &key, &data) == 0) {
+ printf("%s -> %s\n", (char *)key.data, (char *)data.data);
+ }
+ }
+
+ return 0;
+ }
+
for (i=0; pkgs[i] != NULL; i++) {
- pkg_do(pkgs[i]);
+ error += pkg_do(pkgs[i]);
}
return error;
@@ -30,17 +67,13 @@
pkg_do(char *pkgname)
{
char tmp[PATH_MAX];
- DBT key, data;
-
+ FILE *fp;
+ Package pkg;
+
/*
* Add Which indexing i.e. index files installed by package and they point
* to the installed package (alot of redundant data)
*/
- FILE *fp;
- Package pkg;
- PackingList itr;
- char *cwd = NULL;
- Boolean skip = FALSE;
pkg.head = pkg.tail = NULL;
pkg.name = pkg.origin = NULL;
@@ -56,53 +89,11 @@
fclose(fp);
if (pkg.name == NULL || pkg.origin == NULL) {
- warnx("%s does not appear to be a valid package!", pkg);
+ warnx("%s does not appear to be a valid package!", pkg.name);
return 1;
}
return cache_plist(&pkg, Verbose);
-
-
-// key.size = strlen(pkg.name) + 1;
-// key.data = pkg.name;
-// data.size = strlen(pkg.origin) + 1;
-// data.data = pkg.origin;
-//
-// if(!Quiet)
-// printf("Saving package: %s\n", key.data);
-// dbsave(&key, &data);
-//
-// for (itr = pkg.head; itr != pkg.tail; itr = itr->next) {
-// if (itr->type == PLIST_CWD && skip == FALSE) {
-// cwd = itr->name;
-// }
-// else if (itr->type == PLIST_IGNORE) {
-// skip = TRUE;
-// if(Verbose && itr->next)
-// printf("\tIgnored: %s\n", itr->next->name);
-//
-// continue;
-// }
-// else if (itr->type == PLIST_FILE && skip == FALSE) {
-// /* Save abspath of file installed in key, and pkgname in data */
-// char *entry = NULL;
-// asprintf(&entry, "%s/%s", cwd, itr->name);
-//
-// key.size = strlen(entry) + 1;
-// key.data = entry;
-// data.size = strlen(pkgname) + 1;
-// data.data = pkgname;
-//
-// if(Verbose)
-// printf("\tSaving entry %s -> %s\n", key.data, data.data);
-// dbsave(&key, &data);
-// free(entry);
-// }
-// skip = FALSE;
-// }
-// free_plist(&pkg);
-
- return 0;
}
@@ -119,3 +110,4 @@
}
}
+
==== //depot/projects/soc2008/andenore_pkginstall/src/usr.sbin/pkg_install/convert/pkg_convert.1#3 (text+ko) ====
@@ -34,6 +34,10 @@
.Bl -tag -width indent
.It Fl v
Turn on verbose output.
+.It Fl e Ar key
+Checks if key is in database.
+.It Fl t
+Turns off textual output for key-check (outputs 1 if key exists 0 if not).
.El
.Sh FILES
.Bl -tag -width /var/db/pkg -compact
==== //depot/projects/soc2008/andenore_pkginstall/src/usr.sbin/pkg_install/create/perform.c#3 (text+ko) ====
@@ -50,10 +50,10 @@
const char *suf;
/* Preliminary setup */
- if (InstalledPkg == NULL)
- sanity_check();
- if (Verbose && !PlistOnly)
- printf("Creating package %s\n", pkg);
+ if (InstalledPkg == NULL)
+ sanity_check();
+ if (Verbose && !PlistOnly)
+ printf("Creating package %s\n", pkg);
/* chop suffix off if already specified, remembering if we want to compress */
len = strlen(pkg);
@@ -240,7 +240,7 @@
* See /usr/ports/Mk/bsd.port.mk (in the fake-pkg target)
*/
if (PlistOnly) {
- openDatabase(PKG_DBCACHE_FILE);
+ openDatabase();
check_list(home, &plist);
int retval = cache_plist(&plist, FALSE);
@@ -257,92 +257,100 @@
/* Make first "real contents" pass over it */
check_list(home, &plist);
- (void) umask(022); /*
- * Make sure gen'ed directories, files don't have
- * group or other write bits.
- */
- /* copy_plist(home, &plist); */
- /* mark_plist(&plist); */
+ (void) umask(022);
+ /*
+ * Make sure gen'ed directories, files don't have
+ * group or other write bits.
+ */
+
+ /* copy_plist(home, &plist); */
+ /* mark_plist(&plist); */
- /* Now put the release specific items in */
- add_plist(&plist, PLIST_CWD, ".");
- write_file(COMMENT_FNAME, Comment);
- add_plist(&plist, PLIST_IGNORE, NULL);
- add_plist(&plist, PLIST_FILE, COMMENT_FNAME);
- add_cksum(&plist, plist.tail, COMMENT_FNAME);
- write_file(DESC_FNAME, Desc);
- add_plist(&plist, PLIST_IGNORE, NULL);
- add_plist(&plist, PLIST_FILE, DESC_FNAME);
- add_cksum(&plist, plist.tail, DESC_FNAME);
-
- if (Install) {
- copy_file(home, Install, INSTALL_FNAME);
+ /* Now put the release specific items in */
+ add_plist(&plist, PLIST_CWD, ".");
+ write_file(COMMENT_FNAME, Comment);
add_plist(&plist, PLIST_IGNORE, NULL);
- add_plist(&plist, PLIST_FILE, INSTALL_FNAME);
- add_cksum(&plist, plist.tail, INSTALL_FNAME);
- }
- if (PostInstall) {
- copy_file(home, PostInstall, POST_INSTALL_FNAME);
+ add_plist(&plist, PLIST_FILE, COMMENT_FNAME);
+ add_cksum(&plist, plist.tail, COMMENT_FNAME);
+ write_file(DESC_FNAME, Desc);
add_plist(&plist, PLIST_IGNORE, NULL);
- add_plist(&plist, PLIST_FILE, POST_INSTALL_FNAME);
- add_cksum(&plist, plist.tail, POST_INSTALL_FNAME);
- }
- if (DeInstall) {
- copy_file(home, DeInstall, DEINSTALL_FNAME);
- add_plist(&plist, PLIST_IGNORE, NULL);
- add_plist(&plist, PLIST_FILE, DEINSTALL_FNAME);
- add_cksum(&plist, plist.tail, DEINSTALL_FNAME);
- }
- if (PostDeInstall) {
- copy_file(home, PostDeInstall, POST_DEINSTALL_FNAME);
- add_plist(&plist, PLIST_IGNORE, NULL);
- add_plist(&plist, PLIST_FILE, POST_DEINSTALL_FNAME);
- add_cksum(&plist, plist.tail, POST_DEINSTALL_FNAME);
- }
- if (Require) {
- copy_file(home, Require, REQUIRE_FNAME);
- add_plist(&plist, PLIST_IGNORE, NULL);
- add_plist(&plist, PLIST_FILE, REQUIRE_FNAME);
- add_cksum(&plist, plist.tail, REQUIRE_FNAME);
- }
- if (Display) {
- copy_file(home, Display, DISPLAY_FNAME);
- add_plist(&plist, PLIST_IGNORE, NULL);
- add_plist(&plist, PLIST_FILE, DISPLAY_FNAME);
- add_cksum(&plist, plist.tail, DISPLAY_FNAME);
- add_plist(&plist, PLIST_DISPLAY, DISPLAY_FNAME);
- }
- if (Mtree) {
- copy_file(home, Mtree, MTREE_FNAME);
- add_plist(&plist, PLIST_IGNORE, NULL);
- add_plist(&plist, PLIST_FILE, MTREE_FNAME);
- add_cksum(&plist, plist.tail, MTREE_FNAME);
- add_plist(&plist, PLIST_MTREE, MTREE_FNAME);
- }
+ add_plist(&plist, PLIST_FILE, DESC_FNAME);
+ add_cksum(&plist, plist.tail, DESC_FNAME);
+
+ if (Install) {
+ copy_file(home, Install, INSTALL_FNAME);
+ add_plist(&plist, PLIST_IGNORE, NULL);
+ add_plist(&plist, PLIST_FILE, INSTALL_FNAME);
+ add_cksum(&plist, plist.tail, INSTALL_FNAME);
+ }
+
+ if (PostInstall) {
+ copy_file(home, PostInstall, POST_INSTALL_FNAME);
+ add_plist(&plist, PLIST_IGNORE, NULL);
+ add_plist(&plist, PLIST_FILE, POST_INSTALL_FNAME);
+ add_cksum(&plist, plist.tail, POST_INSTALL_FNAME);
+ }
+
+ if (DeInstall) {
+ copy_file(home, DeInstall, DEINSTALL_FNAME);
+ add_plist(&plist, PLIST_IGNORE, NULL);
+ add_plist(&plist, PLIST_FILE, DEINSTALL_FNAME);
+ add_cksum(&plist, plist.tail, DEINSTALL_FNAME);
+ }
+
+ if (PostDeInstall) {
+ copy_file(home, PostDeInstall, POST_DEINSTALL_FNAME);
+ add_plist(&plist, PLIST_IGNORE, NULL);
+ add_plist(&plist, PLIST_FILE, POST_DEINSTALL_FNAME);
+ add_cksum(&plist, plist.tail, POST_DEINSTALL_FNAME);
+ }
+
+ if (Require) {
+ copy_file(home, Require, REQUIRE_FNAME);
+ add_plist(&plist, PLIST_IGNORE, NULL);
+ add_plist(&plist, PLIST_FILE, REQUIRE_FNAME);
+ add_cksum(&plist, plist.tail, REQUIRE_FNAME);
+ }
+
+ if (Display) {
+ copy_file(home, Display, DISPLAY_FNAME);
+ add_plist(&plist, PLIST_IGNORE, NULL);
+ add_plist(&plist, PLIST_FILE, DISPLAY_FNAME);
+ add_cksum(&plist, plist.tail, DISPLAY_FNAME);
+ add_plist(&plist, PLIST_DISPLAY, DISPLAY_FNAME);
+ }
+
+ if (Mtree) {
+ copy_file(home, Mtree, MTREE_FNAME);
+ add_plist(&plist, PLIST_IGNORE, NULL);
+ add_plist(&plist, PLIST_FILE, MTREE_FNAME);
+ add_cksum(&plist, plist.tail, MTREE_FNAME);
+ add_plist(&plist, PLIST_MTREE, MTREE_FNAME);
+ }
- /* Finally, write out the packing list */
- fp = fopen(CONTENTS_FNAME, "w");
- if (!fp) {
- cleanup(0);
- errx(2, "%s: can't open file %s for writing",
- __func__, CONTENTS_FNAME);
- }
- write_plist(&plist, fp);
- if (fclose(fp)) {
- cleanup(0);
- errx(2, "%s: error while closing %s",
- __func__, CONTENTS_FNAME);
- }
+ /* Finally, write out the packing list */
+ fp = fopen(CONTENTS_FNAME, "w");
+ if (!fp) {
+ cleanup(0);
+ errx(2, "%s: can't open file %s for writing",
+ __func__, CONTENTS_FNAME);
+ }
+ write_plist(&plist, fp);
+ if (fclose(fp)) {
+ cleanup(0);
+ errx(2, "%s: error while closing %s",
+ __func__, CONTENTS_FNAME);
+ }
- /* And stick it into a tar ball */
- make_dist(home, pkg, suf, &plist);
+ /* And stick it into a tar ball */
+ make_dist(home, pkg, suf, &plist);
- /* Cleanup */
- free(Comment);
- free(Desc);
- free_plist(&plist);
- leave_playpen();
- return TRUE; /* Success */
+ /* Cleanup */
+ free(Comment);
+ free(Desc);
+ free_plist(&plist);
+ leave_playpen();
+ return TRUE; /* Success */
}
static void
==== //depot/projects/soc2008/andenore_pkginstall/src/usr.sbin/pkg_install/delete/main.c#3 (text+ko) ====
@@ -49,7 +49,7 @@
struct stat stat_s;
if(cacheExists()) {
- openDatabase(PKG_DBCACHE_FILE);
+ openDatabase();
atexit(closeDatabase);
}
==== //depot/projects/soc2008/andenore_pkginstall/src/usr.sbin/pkg_install/delete/perform.c#3 (text+ko) ====
==== //depot/projects/soc2008/andenore_pkginstall/src/usr.sbin/pkg_install/info/main.c#5 (text+ko) ====
@@ -55,7 +55,7 @@
/* If cache exists, open it */
if(cacheExists() == TRUE) {
- openDatabase(PKG_DBCACHE_FILE);
+ openDatabase();
atexit(closeDatabase);
}
==== //depot/projects/soc2008/andenore_pkginstall/src/usr.sbin/pkg_install/lib/database.c#5 (text+ko) ====
@@ -30,7 +30,7 @@
* TODO: Check if the database is corrupt? Up-to-date?
*/
Boolean cacheExists() {
- if(isfile(PKG_DBCACHE_FILE)) {
+ if(isfile(DBCACHE_FILE)) {
CacheExists = TRUE;
return TRUE;
}
@@ -44,19 +44,27 @@
/*
* Opens/creates database file given the filename with read/write permission for user/group
*/
-DB *opendb(const char *filename) {
+DB *
+opendb(const char *filename)
+{
return dbopen(filename, O_CREAT | O_RDWR, 0666, DB_BTREE, &btinfo);
}
/*
* TODO: Add warnings, verbose check and such
+ * return 0 on success.
*/
-void openDatabase(const char *filename) {
+int
+openDatabase()
+{
+ printf("Opendatabase: %s\n", DBCACHE_FILE);
// DEBUG("openDatabase()\n");
- if(database == NULL)
- database = opendb(filename);
+ if(database == NULL)
+ database = opendb(DBCACHE_FILE);
else
DEBUG("openDatabase(): database already open\n");
+
+ return ( database == NULL );
}
/*
==== //depot/projects/soc2008/andenore_pkginstall/src/usr.sbin/pkg_install/lib/lib.h#6 (text+ko) ====
@@ -71,8 +71,13 @@
#define PKG_DBDIR "PKG_DBDIR"
/* macro to get name of directory where we put logging information */
#define LOG_DIR (getenv(PKG_DBDIR) ? getenv(PKG_DBDIR) : DEF_LOG_DIR)
-/* Path to the BDB cache file */
-#define PKG_DBCACHE_FILE "/usr/home/duckjen/projects/soc2008/src/usr.sbin/pkg_install/pkgcache.db"
+
+/* Default location of the BDB cache file */
+#define DEF_DBCACHE_FILE "/var/db/pkg/pkgcache.db"
+/* just in case we change the environment variable name */
+#define PKG_DBCACHE_FILE "PKG_DBCACHE_FILE"
+/* macro to get location of cache file where we index information */
+#define DBCACHE_FILE (getenv(PKG_DBCACHE_FILE) ? getenv(PKG_DBCACHE_FILE) : DEF_DBCACHE_FILE)
/* The names of our "special" files */
#define CONTENTS_FNAME "+CONTENTS"
@@ -248,7 +253,7 @@
/* Database */
Boolean cacheExists();
DB *opendb(const char *filename);
-void openDatabase(const char *filename);
+int openDatabase();
int dbsave(const DBT *key, const DBT *data);
int dbAddPackage(const char *pkgname, const char *pkgdata);
int dbget(const DB *db, DBT *key, DBT *data);
==== //depot/projects/soc2008/andenore_pkginstall/src/usr.sbin/pkg_install/version/main.c#4 (text+ko) ====
@@ -43,7 +43,7 @@
int ch, cmp = 0;
if(cacheExists()) {
- openDatabase(PKG_DBCACHE_FILE);
+ openDatabase();
atexit(closeDatabase);
}
More information about the p4-projects
mailing list