rpm/lib/tre.c

143 lines
3.7 KiB
C

#include "system.h"
#define _RPMSX_INTERNAL
#include <rpmsx.h>
#include <popt.h>
#include "debug.h"
static int add_assoc = 1;
/*
* Command-line options.
*/
static int change = 1;
static int quiet = 0;
#define QPRINTF(args...) do { if (!quiet) printf(args); } while (0)
static int use_stdin = 0;
static int verbose = 0;
static int warn_no_match = 0;
static char *rootpath = NULL;
static int rootpathlen = 0;
static struct poptOption optionsTable[] = {
{ "debug", 'd', POPT_ARG_VAL, &_rpmsx_debug, -1,
N_("show what specification matched each file"), NULL },
{ "nochange", 'n', POPT_ARG_VAL, &change, 0,
N_("do not change any file labels"), NULL },
{ "quiet", 'q', POPT_ARG_VAL, &quiet, 1,
N_("be quiet (suppress non-error output)"), NULL },
{ "root", 'r', POPT_ARG_STRING|POPT_ARGFLAG_SHOW_DEFAULT, &rootpath, 0,
N_("use an alternate root path"), N_("ROOT") },
{ "stdin", 's', POPT_ARG_VAL, &use_stdin, 1,
N_("use stdin for a list of files instead of searching a partition"), NULL },
{ "verbose", 'v', POPT_ARG_VAL, &warn_no_match, 1,
N_("show changes in file labels"), NULL },
{ "warn", 'W', POPT_ARG_VAL, &warn_no_match, 1,
N_("warn about entries that have no matching file"), NULL },
POPT_AUTOHELP
POPT_TABLEEND
};
int main(int argc, char **argv)
{
poptContext optCon;
const char ** av;
const char * arg;
rpmsx sx;
int ec = EXIT_FAILURE; /* assume failure. */
int rc;
int i;
#if HAVE_MCHECK_H && HAVE_MTRACE
/*@-noeffect@*/
mtrace(); /* Trace malloc only if MALLOC_TRACE=mtrace-output-file. */
/*@=noeffect@*/
#endif
setprogname(argv[0]); /* Retrofit glibc __progname */
/* XXX glibc churn sanity */
if (__progname == NULL) {
if ((__progname = strrchr(argv[0], '/')) != NULL) __progname++;
else __progname = argv[0];
}
(void) setlocale(LC_ALL, "" );
(void) bindtextdomain(PACKAGE, LOCALEDIR);
(void) textdomain(PACKAGE);
optCon = poptGetContext(__progname, argc, (const char **)argv, optionsTable, 0);
/* Process all options, whine if unknown. */
while ((rc = poptGetNextOpt(optCon)) > 0) {
switch (rc) {
default:
/*@-nullpass@*/
fprintf(stderr, _("%s: option table misconfigured (%d)\n"),
__progname, rc);
/*@=nullpass@*/
goto exit;
/*@notreached@*/ /*@switchbreak@*/ break;
}
}
if (rc < -1) {
/*@-nullpass@*/
fprintf(stderr, "%s: %s: %s\n", __progname,
poptBadOption(optCon, POPT_BADOPTION_NOALIAS),
poptStrerror(rc));
/*@=nullpass@*/
goto exit;
}
/* trim trailing /, if present */
if (rootpath != NULL) {
rootpathlen = strlen(rootpath);
while (rootpath[rootpathlen - 1] == '/')
rootpath[--rootpathlen] = 0;
}
av = poptGetArgs(optCon);
/* Parse the specification file. */
sx = rpmsxNew(NULL);
if (_rpmsx_debug) {
sx = rpmsxInit(sx, 1);
if (sx != NULL)
while ((i = rpmsxNext(sx)) >= 0) {
const char * pattern = rpmsxPattern(sx);
const char * type = rpmsxType(sx);
const char * context = rpmsxContext(sx);
fprintf(stderr, "%5d: %s\t%s\t%s\n", i,
pattern, (type ? type : ""), context);
}
}
if (av != NULL)
while ((arg = *av++) != NULL) {
const char * context = rpmsxFContext(sx, arg, S_IFREG);
fprintf(stderr, "%s: %s\n", arg, context);
}
sx = rpmsxFree(sx);
/*
* Apply the specifications to the file systems.
*/
ec = 0;
exit:
optCon = poptFreeContext(optCon);
#if HAVE_MCHECK_H && HAVE_MTRACE
/*@-noeffect@*/
muntrace(); /* Trace malloc only if MALLOC_TRACE=mtrace-output-file. */
/*@=noeffect@*/
#endif
return ec;
}