Initial import of pkg_filecheck, a tool to compare the file system

contents with the package database, reporting files that are in
the file system but not in the package database.
Written by Dieter Baron (dillo@) with man pages from Thomas Klausner (wiz@).
This commit is contained in:
wiz 2003-07-13 16:15:34 +00:00
parent 63fe7a77c8
commit e2494da4f7
9 changed files with 726 additions and 0 deletions

View file

@ -0,0 +1,3 @@
pkg_filecheck compares the file system contents with the list of
files recorded in the package database, and reports any files that
are in the file system, but not in the database.

View file

@ -0,0 +1,45 @@
# $NetBSD: Makefile,v 1.1.1.1 2003/07/13 16:15:34 wiz Exp $
#
DISTNAME= pkg_filecheck-0.1
WRKSRC= ${WRKDIR}
CATEGORIES= pkgtools devel
MASTER_SITES= # empty
DISTFILES= # empty
MAINTAINER= dillo@netbsd.org
#HOMEPAGE= http://www.netbsd.org/Documentation/netbsd/Packages.txt
COMMENT= check for files not owned by any package
USE_PERL5= run
EXTRACT_ONLY= # empty
NO_CHECKSUM= yes
NO_CONFIGURE= yes
CONF_FILES= ${PREFIX}/share/examples/pkg_filecheck/pkg_filecheck.conf \
${PKG_SYSCONFDIR}/pkg_filecheck.conf
do-build:
.for f in builddb.pl builddb.1 pkg_filecheck.conf pkg_filecheck.conf.5 \
pkg_filecheck.c pkg_filecheck.1
${SED} -e 's|@PREFIX@|${PREFIX}|g' \
-e 's|@PKG_SYSCONFDIR@|${PKG_SYSCONFDIR}|g' \
-e 's|@X11PREFIX@|${X11PREFIX}|g' \
< ${FILESDIR}/${f} \
> ${WRKSRC}/${f}
.endfor
cd ${WRKSRC} && ${MAKE} pkg_filecheck
do-install:
${INSTALL_SCRIPT} ${WRKSRC}/builddb.pl ${PREFIX}/bin/builddb
${INSTALL_PROGRAM} ${WRKSRC}/pkg_filecheck ${PREFIX}/bin/pkg_filecheck
${INSTALL_MAN} ${WRKSRC}/builddb.1 ${PREFIX}/man/man1
${INSTALL_MAN} ${WRKSRC}/pkg_filecheck.1 ${PREFIX}/man/man1
${INSTALL_MAN} ${WRKSRC}/pkg_filecheck.conf.5 ${PREFIX}/man/man5
${INSTALL_DATA_DIR} ${PREFIX}/share/examples/pkg_filecheck
${INSTALL_DATA} ${WRKSRC}/pkg_filecheck.conf \
${PREFIX}/share/examples/pkg_filecheck/pkg_filecheck.conf
.include "../../mk/bsd.pkg.install.mk"
.include "../../mk/bsd.pkg.mk"

View file

@ -0,0 +1,8 @@
@comment $NetBSD: PLIST,v 1.1.1.1 2003/07/13 16:15:34 wiz Exp $
bin/builddb
bin/pkg_filecheck
man/man1/builddb.1
man/man1/pkg_filecheck.1
man/man5/pkg_filecheck.conf.5
share/examples/pkg_filecheck/pkg_filecheck.conf
@dirrm share/examples/pkg_filecheck

View file

@ -0,0 +1,65 @@
.\" $NetBSD: builddb.1,v 1.1.1.1 2003/07/13 16:15:34 wiz Exp $
.\"
.\" Copyright (c) 2003 Thomas Klausner
.\" All rights reserved.
.\"
.\" Redistribution and use in source and binary forms, with or without
.\" modification, are permitted provided that the following conditions
.\" are met:
.\" 1. Redistributions of source code must retain the above copyright
.\" notice, this list of conditions and the following disclaimer.
.\" 2. Redistributions in binary form must reproduce the above copyright
.\" notice, this list of conditions and the following disclaimer in the
.\" documentation and/or other materials provided with the distribution.
.\"
.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR, THOMAS KLAUSNER,
.\" ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
.\" TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
.\" PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
.\" BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
.\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
.\" SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
.\" CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
.\" POSSIBILITY OF SUCH DAMAGE.
.\"
.Dd July 13, 2003
.Dt BUILDDB 1
.Os
.Sh NAME
.Nm builddb
.Nd create database from file system or tar file
.Sh SYNOPSIS
.Nm
.Op Fl hv
.Op Fl o Ar db-file
.Ar tar-file | Ar directory
.Op Ar ...
.Sh DESCRIPTION
.Nm
reads the tar file
.Ar tar-file
or the contents of the directory hierarchy starting at
.Ar directory
and creates a database from it which can be used by
.Nm pkg_filecheck .
.Pp
Supported options:
.Bl -tag -width XoXdbXfileX -offset indent
.It Fl h
Display a short help message.
.It Fl o Ar db-file
Use
.Ar db-file
as database output file instead of the default
.Pa /var/db/pkg/xdb.byfile.db .
.It Fl v
Verbose mode.
Report each file found.
.El
.Sh SEE ALSO
.Xr pkg_filecheck 1
.Sh BUGS
.Nm
is written in Perl.

View file

@ -0,0 +1,133 @@
#!@PREFIX@/bin/perl
# $NetBSD: builddb.pl,v 1.1.1.1 2003/07/13 16:15:34 wiz Exp $
#
# builddb -- build .byfile.db from tgz files or directory hierarchies.
# Copyright (C) 2000, 2003 Dieter Baron
#
# This file is part of img2eps, an image to EPS file converter.
# The author can be contacted at <dillo@giga.or.at>
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in
# the documentation and/or other materials provided with the
# distribution.
# 3. The name of the author may not be used to endorse or promote
# products derived from this software without specific prior
# written permission.
#
# THIS SOFTWARE IS PROVIDED BY DIETER BARON ``AS IS'' AND ANY EXPRESS
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
#
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL DIETER BARON BE LIABLE FOR ANY
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
use strict;
use Getopt::Std;
use DB_File;
my $prg;
my $options = 'hvo:';
my $usage = '[-hv] [-o db-file] tar-file|directory ...';
my %opt;
my ($verbose, $dbfile);
my %db;
my ($file, $pkg, $opkg);
#
# defaults
#
$verbose = 0;
$dbfile = '/var/db/pkg/xdb.byfile.db';
#
# command line handling
#
($prg) = ($0 =~ /([^\/]+)$/);
getopts($options, \%opt);
if ($opt{h}) {
print <<EOF;
usage: $prg $usage
-h display this help message
-o DB-FILE output to DB-FILE
-v verbose mode
EOF
exit 0;
}
if (@ARGV == 0) {
print STDERR "usage: $prg $usage\n";
exit 1;
}
$verbose = $opt{v} if ($opt{v});
$dbfile = $opt{o} if ($opt{o});
#
# setup
#
tie %db, 'DB_File', $dbfile, O_RDWR|O_CREAT, 0666, $DB_BTREE
or die "cannot open db `$dbfile': $!\n";
#
# process tar files
#
foreach $file (@ARGV) {
if (-f $file) {
unless (open LST, "tar -tzf $file |") {
warn "cannot list `$file': $!\n";
next;
}
($pkg) = ($file =~ m/([^\/]+)\.tgz$/);
}
elsif (-d $file) {
$pkg = $file;
$file = "`pwd`/$file" unless ($file =~ m!^/!);
unless (open LST, "find $file -type f |") {
warn "cannot list `$file': $!\n";
next;
}
}
else {
warn "no such file or directory: `$file'";
next;
}
while (<LST>) {
chomp;
if (exists($db{"$_\0"})) {
($opkg = $db{"$_\0"}) =~ s/\0//;
warn "overwriting `$_' (old: $opkg, new: $pkg)\n";
}
print "$pkg: $_\n" if ($verbose);
$db{"$_\0"} = "$pkg\0";
}
close LST;
}
#
# cleanup
#
untie %db;

View file

@ -0,0 +1,65 @@
.\" $NetBSD: pkg_filecheck.1,v 1.1.1.1 2003/07/13 16:15:34 wiz Exp $
.\"
.\" Copyright (c) 2003 Thomas Klausner
.\" All rights reserved.
.\"
.\" Redistribution and use in source and binary forms, with or without
.\" modification, are permitted provided that the following conditions
.\" are met:
.\" 1. Redistributions of source code must retain the above copyright
.\" notice, this list of conditions and the following disclaimer.
.\" 2. Redistributions in binary form must reproduce the above copyright
.\" notice, this list of conditions and the following disclaimer in the
.\" documentation and/or other materials provided with the distribution.
.\"
.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR, THOMAS KLAUSNER,
.\" ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
.\" TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
.\" PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
.\" BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
.\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
.\" SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
.\" CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
.\" POSSIBILITY OF SUCH DAMAGE.
.\"
.Dd July 13, 2003
.Dt PKG_FILECHECK 1
.Os
.Sh NAME
.Nm pkg_filecheck
.Nd compare file system contents with package database
.Sh SYNOPSIS
.Nm
.Op Fl h
.Op Fl c Ar config-file
.Sh DESCRIPTION
.Nm
reads the package tools database and and compares it with the actual
contents of the directory hierarchy starting at
.Pa @PREFIX@ ,
reporting any files that are on the file system, but not in the
database.
The database used and the hierarchy to be checked can be changed
in the config file.
.Pp
Supported options:
.Bl -tag -width XcXconfigXfileX -offset indent
.It Fl c Ar config-file
Use
.Ar config-file
as config file instead of the default
.Pa @PKG_SYSCONFDIR@/pkg_filecheck.conf .
.It Fl h
Display a very short help message.
.El
.Sh SEE ALSO
.Xr builddb 1
.Sh BUGS
.Nm
does not report files that are in the database, but not in the file
system.
You can use
.Dq Ic pkg_admin Ar check
for that.

View file

@ -0,0 +1,315 @@
/*
$NetBSD: pkg_filecheck.c,v 1.1.1.1 2003/07/13 16:15:34 wiz Exp $
pkg_filecheck.c -- check for files not owned by any package
Copyright (C) 2001 Dieter Baron
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in
the documentation and/or other materials provided with the
distribution.
3. The name of the author may not be used to endorse or promote
products derived from this software without specific prior
written permission.
THIS SOFTWARE IS PROVIDED BY DIETER BARON ``AS IS'' AND ANY EXPRESS
OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL DIETER BARON BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <sys/types.h>
#include <sys/stat.h>
#include <db.h>
#include <errno.h>
#include <fcntl.h>
#include <fts.h>
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
struct array {
void **p;
int len, alen;
};
char *prg;
static int check(char **dir, DB **db, char **ignore);
static int fts_sort(const FTSENT **e1, const FTSENT **e2);
static void push(struct array *a, void *el);
static int read_conf(char *fname, char ***dirp, DB ***dbp, char ***ignorep);
int
main(int argc, char *argv[])
{
DB **db;
char **dir, **ignore;
char *cfgfile;
int c, i, err;
prg = argv[0];
opterr = 0;
cfgfile = "@PKG_SYSCONFDIR@/pkg_filecheck.conf";
while ((c=getopt(argc, argv, "c:h")) != -1) {
switch (c) {
case 'c':
cfgfile = optarg;
break;
case 'h':
printf("usage: %s [-h] [-c config-file]\n", prg);
exit(0);
default:
fprintf(stderr, "usage: %s [-h] [-c config-file]\n", prg);
exit(1);
}
}
if (read_conf(cfgfile, &dir, &db, &ignore) < 0)
exit(1);
err = check(dir, db, ignore);
for (i=0; db[i]; i++)
db[i]->close(db[i]);
free(dir);
free(db);
free(ignore);
exit(err ? 1 : 0);
}
static int
check(char **dir, DB **db, char **ignore)
{
FTS *fts;
FTSENT *ent;
DBT key, val;
int i, found;
if ((fts=fts_open(dir, FTS_PHYSICAL, fts_sort)) == NULL) {
fprintf(stderr, "%s: cannot walk direcotry hierarchy: %s",
prg, strerror(errno));
return -1;
}
while ((ent=fts_read(fts))) {
switch (ent->fts_info) {
case FTS_F:
key.data = ent->fts_path;
key.size = ent->fts_pathlen+1;
found = 0;
for (i=0; db[i]; i++)
if (db[i]->get(db[i], &key, &val, 0) == 0) {
found = 1;
break;
}
if (!found)
printf("%s\n", ent->fts_path);
break;
case FTS_D:
if (ignore)
for (i=0; ignore[i]; i++)
if (strcmp(ignore[i], ent->fts_path) == 0) {
fts_set(fts, ent, FTS_SKIP);
break;
}
break;
case FTS_DNR:
fprintf(stderr, "%s: cannot read directory `%s', skipped: %s\n",
prg, ent->fts_path, strerror(ent->fts_errno));
break;
case FTS_NS:
fprintf(stderr, "%s: cannot stat file `%s', skipped: %s\n",
prg, ent->fts_path, strerror(ent->fts_errno));
break;
case FTS_ERR:
fprintf(stderr, "%s: directory traversal error: %s\n",
prg, strerror(ent->fts_errno));
break;
case FTS_DC:
case FTS_DP:
case FTS_SL:
case FTS_SLNONE:
case FTS_DEFAULT:
/* ignore */
break;
default:
fprintf(stderr, "%s: unknown FTSENT type %d ignored\n",
prg, ent->fts_info);
break;
}
}
fts_close(fts);
return 0;
}
static int
fts_sort(const FTSENT **e1, const FTSENT **e2)
{
return strcmp((*e1)->fts_name, (*e2)->fts_name);
}
static int
read_conf(char *fname, char ***dirp, DB ***dbp, char ***ignorep)
{
struct array dir, db, ignore;
FILE *f;
DB *cdb;
char b[8192], *curd, *dbname, *cmd, *p;
int lineno, err;
dir.p = db.p = ignore.p = NULL;
dir.len = db.len = ignore.len = 0;
dir.alen = db.alen = ignore.alen = 0;
if ((f=fopen(fname, "r")) == NULL) {
fprintf(stderr, "%s: cannot open config file `%s': %s\n",
prg, fname, strerror(errno));
return -1;
}
curd = NULL;
lineno = 0;
while (fgets(b, 8192, f)) {
lineno++;
if (b[0] == '#')
continue;
cmd = b+strspn(b, " \t");
p = cmd+strcspn(cmd, " \t\n");
*(p++) = '\0';
p += strspn(p, " \t");
if (*p == '\n' || *p == '\0')
continue;
if (p[strlen(p)-1] == '\n')
p[strlen(p)-1] = '\0';
if (strcmp(cmd, "dir") == 0) {
free(curd);
curd = strdup(p);
}
else if (strcmp(cmd, "db") == 0) {
if (curd) {
dbname = malloc(strlen(curd) + strlen(p) + 2);
sprintf(dbname, "%s/%s", curd, p);
}
else
dbname = p;
if ((cdb=dbopen(dbname, O_RDONLY, 0, DB_BTREE, NULL)) == NULL) {
fprintf(stderr, "%s:%s:%d: cannot open data base `%s': %s\n",
prg, fname, lineno, dbname, strerror(errno));
free(dir.p);
free(db.p);
free(ignore.p);
return -1;
}
else
push(&db, cdb);
if (curd)
free(dbname);
}
else if (strcmp(cmd, "check") == 0)
push(&dir, strdup(p));
else if (strcmp(cmd, "ignore") == 0)
push(&ignore, strdup(p));
else {
fprintf(stderr, "%s:%s:%d: unrecognized command `%s'\n",
prg, fname, lineno, cmd);
}
}
fclose(f);
err = 0;
if (dir.p == NULL) {
fprintf(stderr, "%s: no directories to check\n",
prg);
err = 1;
}
if (db.p == NULL) {
fprintf(stderr, "%s: no file data bases given\n",
prg);
err = 1;
}
if (err) {
free(dir.p);
free(db.p);
free(ignore.p);
return -1;
}
*dirp = (char **)dir.p;
*dbp = (DB **)db.p;
*ignorep = (char **)ignore.p;
return 0;
}
static void
push(struct array *a, void *el)
{
int alen;
void *p;
if (a->len + 2 > a->alen) {
if (a->alen > 1024)
alen = a->alen+1024;
else
alen = a->alen * 2;
if ((p=realloc(a->p, alen*sizeof(void *))) == NULL) {
fprintf(stderr, "%s: malloc failure\n", prg);
exit(1);
}
a->p = p;
a->alen = alen;
}
a->p[a->len++] = el;
a->p[a->len] = NULL;
}

View file

@ -0,0 +1,17 @@
# $NetBSD: pkg_filecheck.conf,v 1.1.1.1 2003/07/13 16:15:34 wiz Exp $
# location of package database
dir /var/db/pkg
# name of package database
db pkgdb.byfile.db
# installation prefix for packages
check @PREFIX@
# If not using xpkgwedge:
# xdb.byfile.db has to be created by running builddb
#db xdb.byfile.db
# installation prefix for X11-based packages
#check @X11PREFIX@
ignore @PREFIX@/etc
ignore @PREFIX@/var/scrollkeeper

View file

@ -0,0 +1,75 @@
.\" $NetBSD: pkg_filecheck.conf.5,v 1.1.1.1 2003/07/13 16:15:34 wiz Exp $
.\"
.\" Copyright (c) 2003 Thomas Klausner
.\" All rights reserved.
.\"
.\" Redistribution and use in source and binary forms, with or without
.\" modification, are permitted provided that the following conditions
.\" are met:
.\" 1. Redistributions of source code must retain the above copyright
.\" notice, this list of conditions and the following disclaimer.
.\" 2. Redistributions in binary form must reproduce the above copyright
.\" notice, this list of conditions and the following disclaimer in the
.\" documentation and/or other materials provided with the distribution.
.\"
.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR, THOMAS KLAUSNER,
.\" ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
.\" TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
.\" PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
.\" BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
.\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
.\" SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
.\" CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
.\" POSSIBILITY OF SUCH DAMAGE.
.\"
.Dd July 13, 2003
.Dt PKG_FILECHECK.CONF 5
.Os
.Sh NAME
.Nm pkg_filecheck.conf
.Nd
.Xr pkg_filecheck 1
configuration file
.Sh DESCRIPTION
.Nm
configures the behaviour of
.Xr pkg_filecheck 1 .
.Pp
Each line can contain one of the following keywords:
.Bl -tag -width XdbXdbfileX -offset indent
.It Sy check Ar dir
Directory hierarchy to check.
.It Sy db Ar dbfile
Read database
.Ar dbfile
as input file.
.Ar dbfile
currently may not contain a path, just a filename.
.It Sy dir Ar path
Directory containing the database files.
Affects the following
.Sy db
lines (until the next
.Sy dir
line or EOF).
.It Sy ignore Ar dir
Do not report files found in the directory
.Ar dir
(even if they are not in the databases).
.El
.Pp
All keywords can be specified multiple times.
.Pp
Empty lines or lines starting with a hash sign
.Pq Sq #
are ignored.
.Sh SEE ALSO
.Xr pkg_filecheck 1
.Sh BUGS
.Nm
only allows filenames, not paths, as
.Sy db
arguments.