aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNed Ludd <solar@gentoo.org>2008-04-12 17:25:59 +0000
committerNed Ludd <solar@gentoo.org>2008-04-12 17:25:59 +0000
commitedaddbc6f3d7693be4d1d5194a056a85655c9708 (patch)
tree23d5921e615ec2e75207d2369df8fc7ac136f816 /qcheck.c
parentOn behalf of solar; add libq/compat.c with contains code for non-GNU platform... (diff)
downloadportage-utils-edaddbc6f3d7693be4d1d5194a056a85655c9708.tar.gz
portage-utils-edaddbc6f3d7693be4d1d5194a056a85655c9708.tar.bz2
portage-utils-edaddbc6f3d7693be4d1d5194a056a85655c9708.zip
- add -B option to only print bad files in qcheck. Make qmerge respect ROOT= for the world file
Diffstat (limited to 'qcheck.c')
-rw-r--r--qcheck.c65
1 files changed, 43 insertions, 22 deletions
diff --git a/qcheck.c b/qcheck.c
index 6edf37a1..71870801 100644
--- a/qcheck.c
+++ b/qcheck.c
@@ -1,7 +1,7 @@
/*
* Copyright 2005-2007 Gentoo Foundation
* Distributed under the terms of the GNU General Public License v2
- * $Header: /var/cvsroot/gentoo-projects/portage-utils/qcheck.c,v 1.39 2008/03/15 16:28:06 grobian Exp $
+ * $Header: /var/cvsroot/gentoo-projects/portage-utils/qcheck.c,v 1.40 2008/04/12 17:25:59 solar Exp $
*
* Copyright 2005-2007 Ned Ludd - <solar@gentoo.org>
* Copyright 2005-2007 Mike Frysinger - <vapier@gentoo.org>
@@ -9,7 +9,7 @@
#ifdef APPLET_qcheck
-#define QCHECK_FLAGS "eauAHT" COMMON_FLAGS
+#define QCHECK_FLAGS "eauAHTB" COMMON_FLAGS
static struct option const qcheck_long_opts[] = {
{"exact", no_argument, NULL, 'e'},
{"all", no_argument, NULL, 'a'},
@@ -17,6 +17,7 @@ static struct option const qcheck_long_opts[] = {
{"noafk", no_argument, NULL, 'A'},
{"nohash", no_argument, NULL, 'H'},
{"nomtime", no_argument, NULL, 'T'},
+ {"badonly", no_argument, NULL, 'B'},
COMMON_LONG_OPTS
};
static const char *qcheck_opts_help[] = {
@@ -26,11 +27,15 @@ static const char *qcheck_opts_help[] = {
"Ignore missing files",
"Ignore differing/unknown file chksums",
"Ignore differing file mtimes",
+ "Only print pkgs containing bad files excluding /etc.",
COMMON_OPTS_HELP
};
-static const char qcheck_rcsid[] = "$Id: qcheck.c,v 1.39 2008/03/15 16:28:06 grobian Exp $";
+static const char qcheck_rcsid[] = "$Id: qcheck.c,v 1.40 2008/04/12 17:25:59 solar Exp $";
#define qcheck_usage(ret) usage(ret, QCHECK_FLAGS, qcheck_long_opts, qcheck_opts_help, lookup_applet_idx("qcheck"))
+short bad_only = 0;
+#define qcprintf(fmt, args...) if (!bad_only) printf( _( fmt ), ## args)
+
int qcheck_main(int argc, char **argv)
{
DIR *dir, *dirp;
@@ -58,6 +63,7 @@ int qcheck_main(int argc, char **argv)
case 'A': chk_afk = 0; break;
case 'H': chk_hash = 0; break;
case 'T': chk_mtime = 0; break;
+ case 'B': bad_only = 1; break;
}
}
if ((argc == optind) && !search_all)
@@ -81,7 +87,6 @@ int qcheck_main(int argc, char **argv)
FILE *fp, *fpx;
if (*de->d_name == '.')
continue;
-
fp = fpx = NULL;
/* see if this cat/pkg is requested */
@@ -117,7 +122,7 @@ int qcheck_main(int argc, char **argv)
continue;
strncat(buf, "~", sizeof(buf));
num_files = num_files_ok = num_files_unknown = num_files_ignored = 0;
- printf("%sing %s%s/%s%s ...\n",
+ qcprintf("%sing %s%s/%s%s ...\n",
(qc_update ? "Updat" : "Check"),
GREEN, dentry->d_name, de->d_name, NORM);
if (qc_update) {
@@ -134,7 +139,9 @@ int qcheck_main(int argc, char **argv)
e = contents_parse_line(buf);
if (!e)
continue;
-
+ if (bad_only && strncmp(e->name, "/etc", 4) == 0) {
+ continue;
+ }
if (strcmp(portroot, "/") != 0) {
snprintf(filename, sizeof(filename), "%s%s", portroot, e->name);
e->name = filename;
@@ -145,7 +152,7 @@ int qcheck_main(int argc, char **argv)
if (lstat(e->name, &st)) {
/* make sure file exists */
if (chk_afk) {
- printf(" %sAFK%s: %s\n", RED, NORM, e->name);
+ qcprintf(" %sAFK%s: %s\n", RED, NORM, e->name);
} else {
--num_files;
++num_files_ignored;
@@ -165,7 +172,7 @@ int qcheck_main(int argc, char **argv)
}
if (!hash_algo) {
if (chk_hash) {
- printf(" %sUNKNOWN DIGEST%s: '%s' for '%s'\n", RED, NORM, e->digest, e->name);
+ qcprintf(" %sUNKNOWN DIGEST%s: '%s' for '%s'\n", RED, NORM, e->digest, e->name);
++num_files_unknown;
} else {
--num_files;
@@ -184,7 +191,7 @@ int qcheck_main(int argc, char **argv)
if (!verbose)
continue;
}
- printf(" %sPERM %4o%s: %s\n", RED, (unsigned int)(st.st_mode & 07777), NORM, e->name);
+ qcprintf(" %sPERM %4o%s: %s\n", RED, (unsigned int)(st.st_mode & 07777), NORM, e->name);
continue;
} else if (strcmp(e->digest, hashed_file)) {
if (chk_hash) {
@@ -196,10 +203,10 @@ int qcheck_main(int argc, char **argv)
case HASH_SHA1: digest_disp = "SHA1"; break;
default: digest_disp = "UNK"; break;
}
- printf(" %s%s-DIGEST%s: %s", RED, digest_disp, NORM, e->name);
+ qcprintf(" %s%s-DIGEST%s: %s", RED, digest_disp, NORM, e->name);
if (verbose)
- printf(" (recorded '%s' != actual '%s')", e->digest, hashed_file);
- printf("\n");
+ qcprintf(" (recorded '%s' != actual '%s')", e->digest, hashed_file);
+ qcprintf("\n");
} else {
--num_files;
++num_files_ignored;
@@ -210,10 +217,10 @@ int qcheck_main(int argc, char **argv)
continue;
} else if (e->mtime && e->mtime != st.st_mtime) {
if (chk_mtime) {
- printf(" %sMTIME%s: %s", RED, NORM, e->name);
+ qcprintf(" %sMTIME%s: %s", RED, NORM, e->name);
if (verbose)
- printf(" (recorded '%lu' != actual '%lu')", e->mtime, (unsigned long)st.st_mtime);
- printf("\n");
+ qcprintf(" (recorded '%lu' != actual '%lu')", e->mtime, (unsigned long)st.st_mtime);
+ qcprintf("\n");
/* This can only be an obj, dir and sym have no digest */
if (qc_update)
@@ -233,10 +240,10 @@ int qcheck_main(int argc, char **argv)
}
} else if (e->mtime && e->mtime != st.st_mtime) {
if (chk_mtime) {
- printf(" %sMTIME%s: %s", RED, NORM, e->name);
+ qcprintf(" %sMTIME%s: %s", RED, NORM, e->name);
if (verbose)
- printf(" (recorded '%lu' != actual '%lu')", e->mtime, (unsigned long)st.st_mtime);
- printf("\n");
+ qcprintf(" (recorded '%lu' != actual '%lu')", e->mtime, (unsigned long)st.st_mtime);
+ qcprintf("\n");
/* This can only be a sym */
if (qc_update)
@@ -265,18 +272,32 @@ int qcheck_main(int argc, char **argv)
if (!verbose)
continue;
}
- printf(" %2$s*%1$s %3$s%4$zu%1$s out of %3$s%5$zu%1$s file%6$s are good",
+ if (bad_only && num_files_ok != num_files) {
+ if (verbose)
+ printf("%s/%s\n", dentry->d_name, de->d_name);
+ else {
+ depend_atom *atom = NULL;
+ snprintf(buf, sizeof(buf), "%s/%s", dentry->d_name, de->d_name);
+ if ((atom = atom_explode(buf)) != NULL) {
+ printf("%s/%s\n", dentry->d_name, atom->PN);
+ atom_implode(atom);
+ } else {
+ printf("%s/%s\n", dentry->d_name, de->d_name);
+ }
+ }
+ }
+ qcprintf(" %2$s*%1$s %3$s%4$zu%1$s out of %3$s%5$zu%1$s file%6$s are good",
NORM, BOLD, BLUE, num_files_ok, num_files,
(num_files > 1 ? "s" : ""));
if (num_files_unknown)
- printf(" (Unable to digest %2$s%3$zu%1$s file%4$s)",
+ qcprintf(" (Unable to digest %2$s%3$zu%1$s file%4$s)",
NORM, BLUE, num_files_unknown,
(num_files_unknown > 1 ? "s" : ""));
if (num_files_ignored)
- printf(" (%2$s%3$zu%1$s file%4$s ignored)",
+ qcprintf(" (%2$s%3$zu%1$s file%4$s ignored)",
NORM, BLUE, num_files_ignored,
(num_files_ignored > 1 ? "s were" : " was"));
- printf("\n");
+ qcprintf("\n");
}
closedir(dirp);
chdir("..");