From d37ad048732fbcef38aec001993553896dbe4198 Mon Sep 17 00:00:00 2001 From: Aaron Griffin Date: Sun, 15 Oct 2006 19:31:03 +0000 Subject: Merged frugalware changes (too many to list). Also added some config file handling changes (support [sections] to carry over to included files - this helps with backwards compatibility with existing pacman config files) --- lib/libalpm/db.c | 98 ++++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 91 insertions(+), 7 deletions(-) (limited to 'lib/libalpm/db.c') diff --git a/lib/libalpm/db.c b/lib/libalpm/db.c index 0bdbbf73..668628b4 100644 --- a/lib/libalpm/db.c +++ b/lib/libalpm/db.c @@ -2,6 +2,10 @@ * db.c * * Copyright (c) 2002-2006 by Judd Vinet + * Copyright (c) 2005 by Aurelien Foret + * Copyright (c) 2005 by Christian Hamar + * Copyright (c) 2006 by David Kimpe + * Copyright (c) 2005, 2006 by Miklos Vajna * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -19,6 +23,11 @@ * USA. */ +#if defined(__APPLE__) || defined(__OpenBSD__) +#include +#include +#endif + #include "config.h" #include #include @@ -35,9 +44,14 @@ #include "log.h" #include "util.h" #include "error.h" +#include "server.h" #include "db.h" +#include "handle.h" +#include "cache.h" #include "alpm.h" +extern pmhandle_t *handle; + pmdb_t *_alpm_db_new(char *root, char* dbpath, char *treename) { pmdb_t *db; @@ -45,23 +59,24 @@ pmdb_t *_alpm_db_new(char *root, char* dbpath, char *treename) db = (pmdb_t *)malloc(sizeof(pmdb_t)); if(db == NULL) { _alpm_log(PM_LOG_ERROR, _("malloc failed: could not allocate %d bytes"), - sizeof(pmdb_t)); + sizeof(pmdb_t)); RET_ERR(PM_ERR_MEMORY, NULL); } db->path = (char *)malloc(strlen(root)+strlen(dbpath)+strlen(treename)+2); if(db->path == NULL) { _alpm_log(PM_LOG_ERROR, _("malloc failed: could not allocate %d bytes"), - strlen(root)+strlen(dbpath)+strlen(treename)+2); + strlen(root)+strlen(dbpath)+strlen(treename)+2); FREE(db); RET_ERR(PM_ERR_MEMORY, NULL); } sprintf(db->path, "%s%s/%s", root, dbpath, treename); - STRNCPY(db->treename, treename, DB_TREENAME_LEN); + STRNCPY(db->treename, treename, PATH_MAX); db->pkgcache = NULL; db->grpcache = NULL; + db->servers = NULL; return(db); } @@ -70,12 +85,11 @@ void _alpm_db_free(void *data) { pmdb_t *db = data; - if(db == NULL) { - return; - } - + FREELISTSERVERS(db->servers); free(db->path); free(db); + + return; } int _alpm_db_cmp(const void *db1, const void *db2) @@ -83,4 +97,74 @@ int _alpm_db_cmp(const void *db1, const void *db2) return(strcmp(((pmdb_t *)db1)->treename, ((pmdb_t *)db2)->treename)); } +PMList *_alpm_db_search(pmdb_t *db, PMList *needles) +{ + PMList *i, *j, *k, *ret = NULL; + + for(i = needles; i; i = i->next) { + char *targ; + int retval; + + if(i->data == NULL) { + continue; + } + targ = strdup(i->data); + + for(j = _alpm_db_get_pkgcache(db); j; j = j->next) { + pmpkg_t *pkg = j->data; + char *haystack; + int match = 0; + + /* check name */ + haystack = strdup(pkg->name); + retval = _alpm_reg_match(haystack, targ); + if(retval < 0) { + /* bad regexp */ + FREE(haystack); + return(NULL); + } else if(retval) { + match = 1; + } + FREE(haystack); + + /* check description */ + if(!match) { + haystack = strdup(pkg->desc); + retval = _alpm_reg_match(haystack, targ); + if(retval < 0) { + /* bad regexp */ + FREE(haystack); + return(NULL); + } else if(retval) { + match = 1; + } + FREE(haystack); + } + + /* check provides */ + if(!match) { + for(k = pkg->provides; k; k = k->next) { + haystack = strdup(k->data); + retval = _alpm_reg_match(haystack, targ); + if(retval < 0) { + /* bad regexp */ + FREE(haystack); + return(NULL); + } else if(retval) { + match = 1; + } + FREE(haystack); + } + } + + if(match) { + ret = _alpm_list_add(ret, pkg); + } + } + + FREE(targ); + } + + return(ret); +} /* vim: set ts=2 sw=2 noet: */ -- cgit v1.2.3-24-g4f1b