diff options
author | Aaron Griffin <aaron@archlinux.org> | 2006-10-15 21:31:03 +0200 |
---|---|---|
committer | Aaron Griffin <aaron@archlinux.org> | 2006-10-15 21:31:03 +0200 |
commit | d37ad048732fbcef38aec001993553896dbe4198 (patch) | |
tree | c80472214aae0cd94c32ac00d613d38d51bc1adf /lib/libalpm/db.c | |
parent | 83381bd21748d79f46247fab17877bc5c440a8de (diff) | |
download | pacman-d37ad048732fbcef38aec001993553896dbe4198.tar.gz pacman-d37ad048732fbcef38aec001993553896dbe4198.tar.xz |
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)
Diffstat (limited to 'lib/libalpm/db.c')
-rw-r--r-- | lib/libalpm/db.c | 98 |
1 files changed, 91 insertions, 7 deletions
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 <jvinet@zeroflux.org> + * Copyright (c) 2005 by Aurelien Foret <orelien@chez.com> + * Copyright (c) 2005 by Christian Hamar <krics@linuxforum.hu> + * Copyright (c) 2006 by David Kimpe <dnaku@frugalware.org> + * Copyright (c) 2005, 2006 by Miklos Vajna <vmiklos@frugalware.org> * * 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 <sys/syslimits.h> +#include <sys/stat.h> +#endif + #include "config.h" #include <unistd.h> #include <stdio.h> @@ -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: */ |