Move parts of pacman_query into subfunctions (query_search, query_group, query_isfile)

Clean up pacman_query so functionality is actually in functions, similar to how
sync.c is organized. After doing this, it is easy to see similarity in the code
between sync.c and query.c, so we should be able to consolidate some of this.

Signed-off-by: Chantry Xavier <shiningxc@gmail.com>
Signed-off-by: Dan McGee <dan@archlinux.org>
This commit is contained in:
Chantry Xavier 2007-06-02 12:34:01 -04:00 committed by Dan McGee
parent fb10e0c797
commit fe2c58fc92
2 changed files with 250 additions and 195 deletions

View file

@ -1,7 +1,7 @@
/*
* query.c
*
* Copyright (c) 2002-2006 by Judd Vinet <jvinet@zeroflux.org>
* Copyright (c) 2002-2007 by Judd Vinet <jvinet@zeroflux.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
@ -59,74 +59,89 @@ static char *resolve_path(const char* file)
}
static void query_fileowner(pmdb_t *db, char *filename)
static int query_fileowner(alpm_list_t *targets)
{
struct stat buf;
int found = 0;
char *rpath;
alpm_list_t *i, *j;
int ret = 0;
alpm_list_t *t;
if(db == NULL) {
return;
}
if(filename == NULL || strlen(filename) == 0) {
if(targets == NULL) {
fprintf(stderr, _("error: no file was specified for --owns\n"));
return;
return(1);
}
for(t = targets; t; t = alpm_list_next(t)) {
int found = 0;
char *filename = alpm_list_getdata(t);
char *rpath;
struct stat buf;
alpm_list_t *i, *j;
if(stat(filename, &buf) == -1) {
fprintf(stderr, _("error: failed to read file '%s': %s\n"),
filename, strerror(errno));
return;
ret++;
continue;
}
if(S_ISDIR(buf.st_mode)) {
fprintf(stderr, _("error: cannot determine ownership of a directory\n"));
return;
ret++;
continue;
}
if(!(rpath = resolve_path(filename))) {
fprintf(stderr, _("error: cannot determine real path for '%s': %s\n"),
filename, strerror(errno));
return;
ret++;
continue;
}
for(i = alpm_db_getpkgcache(db); i && !found; i = alpm_list_next(i)) {
for(i = alpm_db_getpkgcache(db_local); i && !found; i = alpm_list_next(i)) {
pmpkg_t *info = alpm_list_getdata(i);
for(j = alpm_pkg_get_files(info); j && !found; j = alpm_list_next(j)) {
char path[PATH_MAX], *ppath;
snprintf(path, PATH_MAX, "%s%s", alpm_option_get_root(), (const char *)alpm_list_getdata(j));
snprintf(path, PATH_MAX, "%s%s",
alpm_option_get_root(), (const char *)alpm_list_getdata(j));
ppath = resolve_path(path);
if(ppath && strcmp(ppath, rpath) == 0) {
printf(_("%s is owned by %s %s\n"), rpath, alpm_pkg_get_name(info), alpm_pkg_get_version(info));
printf(_("%s is owned by %s %s\n"), rpath,
alpm_pkg_get_name(info), alpm_pkg_get_version(info));
found = 1;
}
free(ppath);
}
}
if(!found) {
fprintf(stderr, _("error: No package owns %s\n"), filename);
ret++;
}
free(rpath);
}
int pacman_query(alpm_list_t *targets)
{
alpm_list_t *sync_dbs = NULL, *i, *j, *k;
pmpkg_t *info = NULL;
char *package = NULL;
int ret = 0;
if(config->op_q_search) {
alpm_list_t *searchlist = alpm_db_search(db_local, targets);
if(searchlist == NULL) {
return(0);
return ret;
}
/* search the local database for a matching package */
static int query_search(alpm_list_t *targets)
{
alpm_list_t *i, *searchlist;
int freelist;
/* if we have a targets list, search for packages matching it */
if(targets) {
searchlist = alpm_db_search(db_local, targets);
freelist = 1;
} else {
searchlist = alpm_db_getpkgcache(db_local);
freelist = 0;
}
if(searchlist == NULL) {
return(1);
}
for(i = searchlist; i; i = alpm_list_next(i)) {
char *group = NULL;
alpm_list_t *grp;
@ -144,18 +159,104 @@ int pacman_query(alpm_list_t *targets)
if((grp = alpm_pkg_get_groups(pkg)) != NULL) {
group = alpm_list_getdata(grp);
printf(" (%s)\n ", (char *)alpm_list_getdata(grp));
} else {
printf("\n ");
printf(" (%s)", (char *)alpm_list_getdata(grp));
}
/* we need a newline and initial indent first */
printf("\n ");
indentprint(alpm_pkg_get_desc(pkg), 4);
printf("\n");
}
/* we only want to free if the list was a search list */
if(freelist) {
alpm_list_free(searchlist);
}
return(0);
}
static int query_group(alpm_list_t *targets)
{
alpm_list_t *i, *j;
char *package = NULL;
int ret = 0;
if(targets == NULL) {
for(j = alpm_db_getgrpcache(db_local); j; j = alpm_list_next(j)) {
pmgrp_t *grp = alpm_list_getdata(j);
alpm_list_t *p, *pkgnames;
const char *grpname;
grpname = alpm_grp_get_name(grp);
pkgnames = alpm_grp_get_pkgs(grp);
for(p = pkgnames; p; p = alpm_list_next(p)) {
printf("%s %s\n", grpname, (char *)alpm_list_getdata(p));
}
}
} else {
for(i = targets; i; i = alpm_list_next(i)) {
package = alpm_list_getdata(i);
pmgrp_t *grp = alpm_db_readgrp(db_local, package);
if(grp) {
alpm_list_t *p, *pkgnames = alpm_grp_get_pkgs(grp);
for(p = pkgnames; p; p = alpm_list_next(p)) {
printf("%s %s\n", package, (char *)alpm_list_getdata(p));
}
} else {
fprintf(stderr, _("error: group \"%s\" was not found\n"), package);
ret++;
}
}
}
return ret;
}
static int query_isfile(alpm_list_t *targets)
{
int ret = 0;
char *package = NULL;
alpm_list_t *i;
pmpkg_t *info = NULL;
if(targets == NULL) {
fprintf(stderr, _("error: no package file was specified for --file\n"));
return(1);
} else {
for(i = targets; i; i = alpm_list_next(i)) {
package = alpm_list_getdata(i);
if(alpm_pkg_load(package, &info) == -1) {
fprintf(stderr, _("error: failed to load package '%s' (%s)\n"),
package, alpm_strerror(pm_errno));
ret++;
continue;
}
if(config->op_q_info) {
dump_pkg_full(info, config->op_q_info);
}
if(config->op_q_list) {
dump_pkg_files(info);
}
if(!config->op_q_info && !config->op_q_list) {
printf("%s %s\n", alpm_pkg_get_name(info),
alpm_pkg_get_version(info));
}
alpm_pkg_free(info);
info = NULL;
}
}
return(ret);
}
int pacman_query(alpm_list_t *targets)
{
alpm_list_t *sync_dbs = NULL, *i, *j, *k;
pmpkg_t *info = NULL;
char *package = NULL;
int ret = 0;
if(config->op_q_search) {
ret = query_search(targets);
return(ret);
}
if(config->op_q_foreign) {
sync_dbs = alpm_option_get_syncdbs();
@ -178,73 +279,26 @@ int pacman_query(alpm_list_t *targets)
}
}
for(i = targets; i; i = alpm_list_next(i)) {
package = alpm_list_getdata(i);
/* looking for groups */
if(config->group) {
if(targets == NULL) {
for(j = alpm_db_getgrpcache(db_local); j; j = alpm_list_next(j)) {
pmgrp_t *grp = alpm_list_getdata(j);
alpm_list_t *p, *pkgnames;
const char *grpname;
grpname = alpm_grp_get_name(grp);
pkgnames = alpm_grp_get_pkgs(grp);
for(p = pkgnames; p; p = alpm_list_next(p)) {
printf("%s %s\n", grpname, (char *)alpm_list_getdata(p));
}
}
} else {
pmgrp_t *grp = alpm_db_readgrp(db_local, package);
if(grp) {
alpm_list_t *p, *pkgnames = alpm_grp_get_pkgs(grp);
for(p = pkgnames; p; p = alpm_list_next(p)) {
printf("%s %s\n", package, (char *)alpm_list_getdata(p));
}
} else {
fprintf(stderr, _("error: group \"%s\" was not found\n"), package);
ret++;
}
}
continue;
ret = query_group(targets);
return(ret);
}
/* output info for a .tar.gz package */
if(config->op_q_isfile) {
if(package == NULL) {
fprintf(stderr, _("error: no package file was specified for --file\n"));
return(1);
}
if(alpm_pkg_load(package, &info) == -1) {
fprintf(stderr, _("error: failed to load package '%s' (%s)\n"),
package, alpm_strerror(pm_errno));
return(1);
}
if(config->op_q_info) {
dump_pkg_full(info, config->op_q_info);
}
if(config->op_q_list) {
dump_pkg_files(info);
}
if(!config->op_q_info && !config->op_q_list) {
printf("%s %s\n", alpm_pkg_get_name(info),
alpm_pkg_get_version(info));
}
alpm_pkg_free(info);
info = NULL;
continue;
ret = query_isfile(targets);
return(ret);
}
/* determine the owner of a file */
if(config->op_q_owns) {
query_fileowner(db_local, package);
continue;
ret = query_fileowner(targets);
return(ret);
}
/* find packages in the db */
if(package == NULL) {
if(targets == NULL) {
/* no target */
for(i = alpm_db_getpkgcache(db_local); i; i = alpm_list_next(i)) {
pmpkg_t *tmpp = alpm_list_getdata(i);
@ -289,6 +343,8 @@ int pacman_query(alpm_list_t *targets)
}
}
} else {
for(i = targets; i; i = alpm_list_next(i)) {
package = alpm_list_getdata(i);
info = alpm_db_get_pkg(db_local, package);
if(info == NULL) {
fprintf(stderr, _("error: package \"%s\" not found\n"), package);

View file

@ -1,7 +1,7 @@
/*
* sync.c
*
* Copyright (c) 2002-2006 by Judd Vinet <jvinet@zeroflux.org>
* Copyright (c) 2002-2007 by Judd Vinet <jvinet@zeroflux.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
@ -221,6 +221,7 @@ static int sync_synctree(int level, alpm_list_t *syncs)
return(success > 0);
}
/* search the sync dbs for a matching package */
static int sync_search(alpm_list_t *syncs, alpm_list_t *targets)
{
alpm_list_t *i, *j, *ret;
@ -259,12 +260,10 @@ static int sync_search(alpm_list_t *syncs, alpm_list_t *targets)
if((grp = alpm_pkg_get_groups(pkg)) != NULL) {
group = alpm_list_getdata(grp);
printf(" (%s)\n", (char *)alpm_list_getdata(grp));
} else {
printf("\n");
}
/* we need an initial indent first */
printf(" ");
/* we need a newline and initial indent first */
printf("\n ");
indentprint(alpm_pkg_get_desc(pkg), 4);
printf("\n");
}