Date: Sun, 8 Jun 2008 22:12:23 GMT From: Anders Nore <andenore@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 143136 for review Message-ID: <200806082212.m58MCNQi006241@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=143136 Change 143136 by andenore@andenore_laptop on 2008/06/08 22:11:43 Alot of syntax changing, mostly spaces replaced by tabs. I have added a pkg_convert program that converts some of the data to a bdb database, and the information is used in the pkg_info program by the functions isinstalledpkg() and matchinstalled(). A set of database helper functions is added to the library as well. Affected files ... .. //depot/projects/soc2008/andenore_pkginstall/src/usr.sbin/pkg_install/add/Makefile#2 edit .. //depot/projects/soc2008/andenore_pkginstall/src/usr.sbin/pkg_install/convert/Makefile#1 add .. //depot/projects/soc2008/andenore_pkginstall/src/usr.sbin/pkg_install/convert/converter.c#1 add .. //depot/projects/soc2008/andenore_pkginstall/src/usr.sbin/pkg_install/convert/pkg_convert.1#1 add .. //depot/projects/soc2008/andenore_pkginstall/src/usr.sbin/pkg_install/create/Makefile#2 edit .. //depot/projects/soc2008/andenore_pkginstall/src/usr.sbin/pkg_install/delete/Makefile#2 edit .. //depot/projects/soc2008/andenore_pkginstall/src/usr.sbin/pkg_install/info/Makefile#2 edit .. //depot/projects/soc2008/andenore_pkginstall/src/usr.sbin/pkg_install/info/main.c#2 edit .. //depot/projects/soc2008/andenore_pkginstall/src/usr.sbin/pkg_install/info/perform.c#2 edit .. //depot/projects/soc2008/andenore_pkginstall/src/usr.sbin/pkg_install/info/show.c#2 edit .. //depot/projects/soc2008/andenore_pkginstall/src/usr.sbin/pkg_install/lib/database.c#1 add .. //depot/projects/soc2008/andenore_pkginstall/src/usr.sbin/pkg_install/lib/lib.h#2 edit .. //depot/projects/soc2008/andenore_pkginstall/src/usr.sbin/pkg_install/lib/match.c#2 edit .. //depot/projects/soc2008/andenore_pkginstall/src/usr.sbin/pkg_install/lib/plist.c#2 edit .. //depot/projects/soc2008/andenore_pkginstall/src/usr.sbin/pkg_install/lib/str.c#2 edit .. //depot/projects/soc2008/andenore_pkginstall/src/usr.sbin/pkg_install/version/Makefile#2 edit Differences ... ==== //depot/projects/soc2008/andenore_pkginstall/src/usr.sbin/pkg_install/add/Makefile#2 (text+ko) ==== ==== //depot/projects/soc2008/andenore_pkginstall/src/usr.sbin/pkg_install/create/Makefile#2 (text+ko) ==== ==== //depot/projects/soc2008/andenore_pkginstall/src/usr.sbin/pkg_install/delete/Makefile#2 (text+ko) ==== ==== //depot/projects/soc2008/andenore_pkginstall/src/usr.sbin/pkg_install/info/Makefile#2 (text+ko) ==== ==== //depot/projects/soc2008/andenore_pkginstall/src/usr.sbin/pkg_install/info/main.c#2 (text+ko) ==== @@ -51,193 +51,197 @@ whead = malloc(sizeof(struct which_head)); if (whead == NULL) err(2, NULL); - TAILQ_INIT(whead); + TAILQ_INIT(whead); - pkgs = start = argv; - if (argc == 1) { - MatchType = MATCH_ALL; - Flags = SHOW_INDEX; - } - else while ((ch = getopt(argc, argv, Options)) != -1) { - switch(ch) { - case 'a': - MatchType = MATCH_ALL; - break; + if(cacheExists() == TRUE) { + openDatabase(PKG_DBCACHE_FILE); + } - case 'b': - UseBlkSz = TRUE; - break; - - case 'v': - Verbose++; - /* Reasonable definition of 'everything' */ - Flags = SHOW_COMMENT | SHOW_DESC | SHOW_PLIST | SHOW_INSTALL | - SHOW_DEINSTALL | SHOW_REQUIRE | SHOW_DISPLAY | SHOW_MTREE; - break; - - case 'E': - Flags |= SHOW_PKGNAME; - break; - - case 'I': - Flags |= SHOW_INDEX; - break; - - case 'p': - Flags |= SHOW_PREFIX; - break; - - case 'c': - Flags |= SHOW_COMMENT; - break; - - case 'd': - Flags |= SHOW_DESC; - break; - - case 'D': - Flags |= SHOW_DISPLAY; - break; - - case 'f': - Flags |= SHOW_PLIST; - break; - - case 'g': - Flags |= SHOW_CKSUM; - break; - - case 'G': - MatchType = MATCH_EXACT; - break; - - case 'i': - Flags |= SHOW_INSTALL; - break; - - case 'j': - Flags |= SHOW_REQUIRE; - break; - - case 'k': - Flags |= SHOW_DEINSTALL; - break; - - case 'K': - KeepPackage = TRUE; - break; - - case 'r': - Flags |= SHOW_DEPEND; - break; - - case 'R': - Flags |= SHOW_REQBY; - break; - - case 'L': - Flags |= SHOW_FILES; - break; - - case 'm': - Flags |= SHOW_MTREE; - break; - - case 's': - Flags |= SHOW_SIZE; - break; - - case 'o': - Flags |= SHOW_ORIGIN; - break; - - case 'O': - LookUpOrigin = strdup(optarg); - if (LookUpOrigin == NULL) - err(2, NULL); - break; - - case 'V': - Flags |= SHOW_FMTREV; - break; - - case 'l': - InfoPrefix = optarg; - break; - - case 'q': - Quiet = TRUE; - break; - - case 'Q': - Quiet = TRUE; - QUIET = TRUE; - break; - - case 't': - strlcpy(PlayPen, optarg, sizeof(PlayPen)); - break; - - case 'x': - MatchType = MATCH_REGEX; - break; - - case 'X': - MatchType = MATCH_EREGEX; - break; - - case 'e': - CheckPkg = optarg; - break; - - case 'W': - { - struct which_entry *entp; - - entp = calloc(1, sizeof(struct which_entry)); - if (entp == NULL) - err(2, NULL); - - strlcpy(entp->file, optarg, PATH_MAX); - entp->skip = FALSE; - TAILQ_INSERT_TAIL(whead, entp, next); - break; - } - - case 'P': - Flags = SHOW_PTREV; - break; - - case 'h': - case '?': - default: - usage(); - break; - } + pkgs = start = argv; + if (argc == 1) { + MatchType = MATCH_ALL; + Flags = SHOW_INDEX; + } else + while ((ch = getopt(argc, argv, Options)) != -1) { + switch(ch) { + case 'a': + MatchType = MATCH_ALL; + break; + + case 'b': + UseBlkSz = TRUE; + break; + + case 'v': + Verbose++; + /* Reasonable definition of 'everything' */ + Flags = SHOW_COMMENT | SHOW_DESC | SHOW_PLIST | SHOW_INSTALL | + SHOW_DEINSTALL | SHOW_REQUIRE | SHOW_DISPLAY | SHOW_MTREE; + break; + + case 'E': + Flags |= SHOW_PKGNAME; + break; + + case 'I': + Flags |= SHOW_INDEX; + break; + + case 'p': + Flags |= SHOW_PREFIX; + break; + + case 'c': + Flags |= SHOW_COMMENT; + break; + + case 'd': + Flags |= SHOW_DESC; + break; + + case 'D': + Flags |= SHOW_DISPLAY; + break; + + case 'f': + Flags |= SHOW_PLIST; + break; + + case 'g': + Flags |= SHOW_CKSUM; + break; + + case 'G': + MatchType = MATCH_EXACT; + break; + + case 'i': + Flags |= SHOW_INSTALL; + break; + + case 'j': + Flags |= SHOW_REQUIRE; + break; + + case 'k': + Flags |= SHOW_DEINSTALL; + break; + + case 'K': + KeepPackage = TRUE; + break; + + case 'r': + Flags |= SHOW_DEPEND; + break; + + case 'R': + Flags |= SHOW_REQBY; + break; + + case 'L': + Flags |= SHOW_FILES; + break; + + case 'm': + Flags |= SHOW_MTREE; + break; + + case 's': + Flags |= SHOW_SIZE; + break; + + case 'o': + Flags |= SHOW_ORIGIN; + break; + + case 'O': + LookUpOrigin = strdup(optarg); + if (LookUpOrigin == NULL) + err(2, NULL); + break; + + case 'V': + Flags |= SHOW_FMTREV; + break; + + case 'l': + InfoPrefix = optarg; + break; + + case 'q': + Quiet = TRUE; + break; + + case 'Q': + Quiet = TRUE; + QUIET = TRUE; + break; + + case 't': + strlcpy(PlayPen, optarg, sizeof(PlayPen)); + break; + + case 'x': + MatchType = MATCH_REGEX; + break; + + case 'X': + MatchType = MATCH_EREGEX; + break; + + case 'e': + CheckPkg = optarg; + break; + + case 'W': + { + struct which_entry *entp; + + entp = calloc(1, sizeof(struct which_entry)); + if (entp == NULL) + err(2, NULL); + + strlcpy(entp->file, optarg, PATH_MAX); + entp->skip = FALSE; + TAILQ_INSERT_TAIL(whead, entp, next); + break; + } + + case 'P': + Flags = SHOW_PTREV; + break; + + case 'h': + case '?': + default: + usage(); + break; + } } argc -= optind; argv += optind; - if (Flags & SHOW_PTREV) { - if (!Quiet) - printf("Package tools revision: "); - printf("%d\n", PKG_INSTALL_VERSION); - exit(0); - } + if (Flags & SHOW_PTREV) { + if (!Quiet) + printf("Package tools revision: "); + printf("%d\n", PKG_INSTALL_VERSION); + exit(0); + } /* Set some reasonable defaults */ - if (!Flags) - Flags = SHOW_COMMENT | SHOW_DESC | SHOW_REQBY; + if (!Flags) + Flags = SHOW_COMMENT | SHOW_DESC | SHOW_REQBY; /* Get all the remaining package names, if any */ - while (*argv) { + while (*argv) { /* * Don't try to apply heuristics if arguments are regexs or if * the argument refers to an existing file. */ if (MatchType != MATCH_REGEX && MatchType != MATCH_EREGEX && !isfile(*argv) && !isURL(*argv)) - while ((pkgs_split = strrchr(*argv, (int)'/')) != NULL) { + while ((pkgs_split = strrchr(*argv, (int)'/')) != NULL) { *pkgs_split++ = '\0'; /* * If character after the '/' is alphanumeric or shell @@ -246,18 +250,19 @@ * quest. */ if (isalnum(*pkgs_split) || ((MatchType == MATCH_GLOB) && \ - strpbrk(pkgs_split, "*?[]") != NULL)) { - *argv = pkgs_split; - break; + strpbrk(pkgs_split, "*?[]") != NULL)) { + *argv = pkgs_split; + break; } } *pkgs++ = *argv++; - } + } /* If no packages, yelp */ if (pkgs == start && MatchType != MATCH_ALL && !CheckPkg && TAILQ_EMPTY(whead) && LookUpOrigin == NULL) - warnx("missing package name(s)"), usage(); + warnx("missing package name(s)"), usage(); + *pkgs = NULL; return pkg_perform(start); } @@ -265,7 +270,7 @@ static void usage() { - fprintf(stderr, "%s\n%s\n%s\n%s\n%s\n", + fprintf(stderr, "%s\n%s\n%s\n%s\n%s\n", "usage: pkg_info [-bcdDEfgGiIjkKLmopPqQrRsvVxX] [-e package] [-l prefix]", " [-t template] -a | pkg-name ...", " pkg_info [-qQ] -W filename", ==== //depot/projects/soc2008/andenore_pkginstall/src/usr.sbin/pkg_install/info/perform.c#2 (text+ko) ==== @@ -43,44 +43,44 @@ signal(SIGINT, cleanup); /* Overriding action? */ - if (Flags & SHOW_PKGNAME) { - return matched_packages(pkgs); - } else if (CheckPkg) { - return isinstalledpkg(CheckPkg) > 0 ? 0 : 1; + if (Flags & SHOW_PKGNAME) { + return matched_packages(pkgs); + } else if (CheckPkg) { + return isinstalledpkg(CheckPkg) > 0 ? 0 : 1; /* Not reached */ - } else if (!TAILQ_EMPTY(whead)) { - return find_pkg(whead); - } else if (LookUpOrigin != NULL) { - return find_pkgs_by_origin(LookUpOrigin); - } + } else if (!TAILQ_EMPTY(whead)) { + return find_pkg(whead); + } else if (LookUpOrigin != NULL) { + return find_pkgs_by_origin(LookUpOrigin); + } - if (MatchType != MATCH_EXACT) { - matched = matchinstalled(MatchType, pkgs, &errcode); - if (errcode != 0) - return 1; - /* Not reached */ - - if (matched != NULL) - pkgs = matched; - else switch (MatchType) { - case MATCH_GLOB: - break; - case MATCH_ALL: - warnx("no packages installed"); - return 0; - /* Not reached */ - case MATCH_REGEX: - case MATCH_EREGEX: - warnx("no packages match pattern(s)"); - return 1; - /* Not reached */ - default: - break; - } + if (MatchType != MATCH_EXACT) { + matched = matchinstalled(MatchType, pkgs, &errcode); + if (errcode != 0) + return 1; + /* Not reached */ + + if (matched != NULL) + pkgs = matched; + else switch (MatchType) { + case MATCH_GLOB: + break; + case MATCH_ALL: + warnx("no packages installed"); + return 0; + /* Not reached */ + case MATCH_REGEX: + case MATCH_EREGEX: + warnx("no packages match pattern(s)"); + return 1; + /* Not reached */ + default: + break; + } } for (i = 0; pkgs[i]; i++) - err_cnt += pkg_do(pkgs[i]); + err_cnt += pkg_do(pkgs[i]); return err_cnt; } @@ -100,93 +100,92 @@ int code = 0; if (isURL(pkg)) { - if ((cp = fileGetURL(NULL, pkg, KeepPackage)) != NULL) { - if (!getcwd(fname, FILENAME_MAX)) - upchuck("getcwd"); - isTMP = TRUE; + if ((cp = fileGetURL(NULL, pkg, KeepPackage)) != NULL) { + if (!getcwd(fname, FILENAME_MAX)) + upchuck("getcwd"); + isTMP = TRUE; + } else { + goto bail; + } + } else if (fexists(pkg) && isfile(pkg)) { + int len; + + if (*pkg != '/') { + if (!getcwd(fname, FILENAME_MAX)) + upchuck("getcwd"); + len = strlen(fname); + snprintf(&fname[len], FILENAME_MAX - len, "/%s", pkg); + } + else + strcpy(fname, pkg); + cp = fname; } else { - goto bail; + if ((cp = fileFindByPath(NULL, pkg)) != NULL) + strncpy(fname, cp, FILENAME_MAX); } - } - else if (fexists(pkg) && isfile(pkg)) { - int len; - if (*pkg != '/') { - if (!getcwd(fname, FILENAME_MAX)) - upchuck("getcwd"); - len = strlen(fname); - snprintf(&fname[len], FILENAME_MAX - len, "/%s", pkg); + if (cp) { + if (!isURL(pkg)) { + /* + * Apply a crude heuristic to see how much space the package will + * take up once it's unpacked. I've noticed that most packages + * compress an average of 75%, but we're only unpacking the + files so + * be very optimistic. + */ + if (stat(fname, &sb) == FAIL) { + warnx("can't stat package file '%s'", fname); + code = 1; + goto bail; + } + Home = make_playpen(PlayPen, sb.st_size / 2); + if (unpack(fname, "'+*'")) { + warnx("error during unpacking, no info for '%s' available", pkg); + code = 1; + goto bail; + } + } + } + /* It's not an uninstalled package, try and find it among the installed */ + else { + int isinstalled = isinstalledpkg(pkg); + if (isinstalled < 0) { + warnx("the package info for package '%s' is corrupt", pkg); + return 1; + } else if (isinstalled == 0) { + warnx("can't find package '%s' installed or in a file!", pkg); + return 1; + } + sprintf(log_dir, "%s/%s", LOG_DIR, pkg); + if (chdir(log_dir) == FAIL) { + warnx("can't change directory to '%s'!", log_dir); + return 1; + } + installed = TRUE; } - else - strcpy(fname, pkg); - cp = fname; - } - else { - if ((cp = fileFindByPath(NULL, pkg)) != NULL) - strncpy(fname, cp, FILENAME_MAX); - } - if (cp) { - if (!isURL(pkg)) { - /* - * Apply a crude heuristic to see how much space the package will - * take up once it's unpacked. I've noticed that most packages - * compress an average of 75%, but we're only unpacking the + files so - * be very optimistic. - */ - if (stat(fname, &sb) == FAIL) { - warnx("can't stat package file '%s'", fname); - code = 1; - goto bail; - } - Home = make_playpen(PlayPen, sb.st_size / 2); - if (unpack(fname, "'+*'")) { - warnx("error during unpacking, no info for '%s' available", pkg); + + /* Suck in the contents list */ + plist.head = plist.tail = NULL; + fp = fopen(CONTENTS_FNAME, "r"); + if (!fp) { + warnx("unable to open %s file", CONTENTS_FNAME); code = 1; goto bail; - } } - } - /* It's not an uninstalled package, try and find it among the installed */ - else { - int isinstalled = isinstalledpkg(pkg); - if (isinstalled < 0) { - warnx("the package info for package '%s' is corrupt", pkg); - return 1; - } else if (isinstalled == 0) { - warnx("can't find package '%s' installed or in a file!", pkg); - return 1; - } - sprintf(log_dir, "%s/%s", LOG_DIR, pkg); - if (chdir(log_dir) == FAIL) { - warnx("can't change directory to '%s'!", log_dir); - return 1; - } - installed = TRUE; - } + /* If we have a prefix, add it now */ + read_plist(&plist, fp); + fclose(fp); - /* Suck in the contents list */ - plist.head = plist.tail = NULL; - fp = fopen(CONTENTS_FNAME, "r"); - if (!fp) { - warnx("unable to open %s file", CONTENTS_FNAME); - code = 1; - goto bail; - } - /* If we have a prefix, add it now */ - read_plist(&plist, fp); - fclose(fp); - - /* + /* * Index is special info type that has to override all others to make * any sense. */ - if (Flags & SHOW_INDEX) { - char tmp[FILENAME_MAX]; + if (Flags & SHOW_INDEX) { + char tmp[FILENAME_MAX]; - snprintf(tmp, FILENAME_MAX, "%-19s ", pkg); - show_index(tmp, COMMENT_FNAME); - } - else { + snprintf(tmp, FILENAME_MAX, "%-19s ", pkg); + show_index(tmp, COMMENT_FNAME); + } + else { /* Start showing the package contents */ if (!Quiet) printf("%sInformation for %s:\n\n", InfoPrefix, pkg); @@ -329,6 +328,7 @@ /* * Look through package dbs in LOG_DIR and find which * packages installed the files in which_list. + * TODO: Speedup with bdb cache */ static int find_pkg(struct which_head *which_list) ==== //depot/projects/soc2008/andenore_pkginstall/src/usr.sbin/pkg_install/info/show.c#2 (text+ko) ==== @@ -248,7 +248,12 @@ } } -/* Calculate and show size of all installed package files (except ignored ones) */ +/* Calculate and show size of all installed package files (except ignored ones) + * TODO: Make size easier to read (It should be unnecessary to set BLOCKSIZE in + * environment). If the files are static in size, maybe it could be cached + * instead of calculated every time. Could also be made default to show. + * + */ void show_size(const char *title, Package *plist) { ==== //depot/projects/soc2008/andenore_pkginstall/src/usr.sbin/pkg_install/lib/lib.h#2 (text+ko) ==== @@ -35,6 +35,7 @@ #include <stdlib.h> #include <string.h> #include <unistd.h> +#include <db.h> /* Macros */ #define SUCCESS (0) @@ -70,6 +71,8 @@ #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" /* The names of our "special" files */ #define CONTENTS_FNAME "+CONTENTS" @@ -114,6 +117,8 @@ #define PLIST_FMT_VER_MAJOR 1 #define PLIST_FMT_VER_MINOR 1 +#define DEBUG(s) printf(s) + enum _plist_t { PLIST_FILE, PLIST_CWD, PLIST_CMD, PLIST_CHMOD, PLIST_CHOWN, PLIST_CHGRP, PLIST_COMMENT, PLIST_IGNORE, @@ -173,6 +178,8 @@ void str_lowercase(char *); char *strconcat(const char *, const char *); char *get_string(char *, int, FILE *); +char **get_string_array(char *str, char delim); +void free_string_array(char **str_arr); /* File */ Boolean fexists(const char *); @@ -238,11 +245,24 @@ int verscmp(Package *, int, int); int version_cmp(const char *, const char *); +/* Database */ +Boolean cacheExists(); +DB *opendb(const char *filename); +void openDatabase(const char *filename); +int dbput(const DB *db, DBT *key, DBT *data); +int dbget(const DB *db, DBT *key, DBT *data); +char *dbgetdata(const char *aKey); +Boolean dbKeyExists(const char *aKey); +int closedb(DB *db); +int dbscan(const DB *db, DBT *key, DBT *data); + /* Externs */ extern Boolean Quiet; extern Boolean Fake; -extern Boolean Force; +extern Boolean Force; +extern Boolean CacheExists; extern int AutoAnswer; extern int Verbose; +extern DB *database; #endif /* _INST_LIB_LIB_H_ */ ==== //depot/projects/soc2008/andenore_pkginstall/src/usr.sbin/pkg_install/lib/match.c#2 (text+ko) ==== @@ -53,6 +53,8 @@ * Returns NULL-terminated list with matching names. * Names in list returned are dynamically allocated and should * not be altered by the caller. + * + * TODO: Make use of bdb cache to speed things up */ char ** matchinstalled(match_t MatchType, char **patterns, int *retval) @@ -67,80 +69,95 @@ store = storecreate(store); if (store == NULL) { - if (retval != NULL) - *retval = 1; - return NULL; + if (retval != NULL) + *retval = 1; + + return NULL; } if (retval != NULL) - *retval = 0; + *retval = 0; if (!isdir(paths[0])) { - if (retval != NULL) - *retval = 1; - return NULL; - /* Not reached */ + if (retval != NULL) + *retval = 1; + return NULL; + /* Not reached */ } /* Count number of patterns */ if (patterns != NULL) { - for (len = 0; patterns[len]; len++) {} - lmatched = alloca(sizeof(*lmatched) * len); - if (lmatched == NULL) { - warnx("%s(): alloca() failed", __func__); - if (retval != NULL) - *retval = 1; - return NULL; - } + for (len = 0; patterns[len]; len++) {} + lmatched = alloca(sizeof(*lmatched) * len); + if (lmatched == NULL) { + warnx("%s(): alloca() failed", __func__); + if (retval != NULL) + *retval = 1; + return NULL; + } } else - len = 0; - - for (i = 0; i < len; i++) + len = 0; + + for (i = 0; i < len; i++) lmatched[i] = FALSE; - ftsp = fts_open((char * const *)(uintptr_t)paths, FTS_LOGICAL | FTS_NOCHDIR | FTS_NOSTAT, fname_cmp); - if (ftsp != NULL) { - while ((f = fts_read(ftsp)) != NULL) { - if (f->fts_info == FTS_D && f->fts_level == 1) { - fts_set(ftsp, f, FTS_SKIP); - matched = NULL; - errcode = 0; - if (MatchType == MATCH_ALL) - matched = f->fts_name; - else - for (i = 0; patterns[i]; i++) { - errcode = pattern_match(MatchType, patterns[i], f->fts_name); - if (errcode == 1) { - matched = f->fts_name; - lmatched[i] = TRUE; - errcode = 0; + /* TODO: Make use of cache to get directory names */ + if (CacheExists == TRUE) { + DEBUG("USING CACHE\n"); + DBT key, data; + while(dbscan(database, &key, &data) == 0) { + matched = key.data; + DEBUG(matched); + storeappend(store, matched); + } + return store->store; + } else { + DEBUG("Does not use cache!\n"); + } + + ftsp = fts_open((char * const *)(uintptr_t)paths, FTS_LOGICAL | FTS_NOCHDIR | FTS_NOSTAT, fname_cmp); + if (ftsp != NULL) { + while ((f = fts_read(ftsp)) != NULL) { + if (f->fts_info == FTS_D && f->fts_level == 1) { + fts_set(ftsp, f, FTS_SKIP); + matched = NULL; + errcode = 0; + if (MatchType == MATCH_ALL) + matched = f->fts_name; + else + for (i = 0; patterns[i]; i++) { + errcode = pattern_match(MatchType, patterns[i], f->fts_name); + if (errcode == 1) { + matched = f->fts_name; + lmatched[i] = TRUE; + errcode = 0; + } + if (matched != NULL || errcode != 0) + break; + } + if (errcode == 0 && matched != NULL) + errcode = storeappend(store, matched); + if (errcode != 0) { + if (retval != NULL) + *retval = 1; + return NULL; + /* Not reached */ + } } - if (matched != NULL || errcode != 0) - break; - } - if (errcode == 0 && matched != NULL) - errcode = storeappend(store, matched); - if (errcode != 0) { - if (retval != NULL) - *retval = 1; - return NULL; - /* Not reached */ } - } + fts_close(ftsp); } - fts_close(ftsp); - } - if (MatchType == MATCH_GLOB) { - for (i = 0; i < len; i++) - if (lmatched[i] == FALSE) - storeappend(store, patterns[i]); - } + if (MatchType == MATCH_GLOB) { + for (i = 0; i < len; i++) + if (lmatched[i] == FALSE) + storeappend(store, patterns[i]); + } - if (store->used == 0) - return NULL; - else - return store->store; + if (store->used == 0) + return NULL; + else + return store->store; } int @@ -236,6 +253,7 @@ /* * Synopsis is similar to matchinstalled(), but use origin * as a key for matching packages. + * TODO: Use bdb cache */ char ** matchallbyorigin(const char **origins, int *retval) @@ -359,35 +377,43 @@ * * Return 1 if the specified package is installed, * 0 if not, and -1 if an error occured. + * TODO: Use bdb cache lookup */ int isinstalledpkg(const char *name) { - int result; - char *buf, *buf2; - struct iip_memo *memo; + int result; + char *buf, *buf2; + struct iip_memo *memo; - LIST_FOREACH(memo, &iip_memo, iip_link) { + LIST_FOREACH(memo, &iip_memo, iip_link) { if (strcmp(memo->iip_name, name) == 0) - return memo->iip_result; - } - - buf2 = NULL; - asprintf(&buf, "%s/%s", LOG_DIR, name); - if (buf == NULL) - goto errout; - if (!isdir(buf) || access(buf, R_OK) == FAIL) { - result = 0; - } else { - asprintf(&buf2, "%s/%s", buf, CONTENTS_FNAME); - if (buf2 == NULL) - goto errout; + return memo->iip_result; + } + + /* If we have cache available use it to perform fast lookup */ + if(CacheExists) { + return dbKeyExists(name); + } else + DEBUG("Not using cache!\n"); + + buf2 = NULL; + asprintf(&buf, "%s/%s", LOG_DIR, name); + if (buf == NULL) >>> TRUNCATED FOR MAIL (1000 lines) <<<
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200806082212.m58MCNQi006241>