#endif
#include "build/rpmbuild.h"
-
-#include "query.h"
+#include "popt/popt.h"
#include "url.h"
static char * permsString(int mode);
char * owner, char * group, int uid, int gid,
char * linkto);
+#define POPT_QUERYFORMAT 1000
+#define POPT_WHATREQUIRES 1001
+#define POPT_WHATPROVIDES 1002
+#define POPT_QUERYBYNUMBER 1003
+#define POPT_TRIGGEREDBY 1004
+#define POPT_DUMP 1005
+
+static void queryArgCallback(poptContext con, enum poptCallbackReason reason,
+ const struct poptOption * opt, const char * arg,
+ struct rpmQueryArguments * data);
+
+struct poptOption rpmQuerySourcePoptTable[] = {
+ { NULL, '\0', POPT_ARG_CALLBACK | POPT_CBFLAG_INC_DATA,
+ queryArgCallback, 0, NULL, NULL },
+ { "file", 'f', 0, 0, 'f', "query package owning file", "FILE" },
+ { "group", 'g', 0, 0, 'g', "query packages in group", "GROUP" },
+ { "package", 'p', 0, 0, 'p', "query a package file" },
+ { "triggeredby", '\0', 0, 0, POPT_TRIGGEREDBY,
+ "query the pacakges triggered by the package", "PACKAGE" },
+ { "whatrequires", '\0', 0, 0, POPT_WHATREQUIRES,
+ "query the packages which require a capability", "CAPABILITY" },
+ { "whatprovides", '\0', 0, 0, POPT_WHATPROVIDES,
+ "query the packages which provide a capability", "CAPABILITY" },
+ { 0, 0, 0, 0, 0 }
+};
+
+struct poptOption rpmQueryPoptTable[] = {
+ { NULL, '\0', POPT_ARG_CALLBACK | POPT_CBFLAG_INC_DATA,
+ queryArgCallback, 0, NULL, NULL },
+ { "configfiles", 'c', 0, 0, 'c', "list all configuration files" },
+ { "docfiles", 'd', 0, 0, 'd', "list all documetnation files" },
+ { "dump", '\0', 0, 0, POPT_DUMP, "dump basic file information" },
+ { "list", 'l', 0, 0, 'l', "list files in package" },
+ { "qf", '\0', POPT_ARG_STRING | POPT_ARGFLAG_DOC_HIDDEN, 0,
+ POPT_QUERYFORMAT },
+ { "querybynumber", '\0', POPT_ARGFLAG_DOC_HIDDEN, 0,
+ POPT_QUERYBYNUMBER },
+ { "queryformat", '\0', POPT_ARG_STRING, 0, POPT_QUERYFORMAT,
+ "use the following query format", "QUERYFORMAT" },
+ { "state", 's', 0, 0, 's', "display the states of the listed files" },
+ { "verbose", 'v', 0, 0, 'v', "display a verbose filelisting" },
+ { 0, 0, 0, 0, 0 }
+};
+
+static void queryArgCallback(poptContext con, enum poptCallbackReason reason,
+ const struct poptOption * opt, const char * arg,
+ struct rpmQueryArguments * data) {
+ int len;
+
+ switch (opt->val) {
+ case 'c': data->flags |= QUERY_FOR_CONFIG | QUERY_FOR_LIST; break;
+ case 'd': data->flags |= QUERY_FOR_DOCS | QUERY_FOR_LIST; break;
+ case 'l': data->flags |= QUERY_FOR_LIST; break;
+ case 's': data->flags |= QUERY_FOR_STATE | QUERY_FOR_LIST; break;
+ case POPT_DUMP: data->flags |= QUERY_FOR_DUMPFILES | QUERY_FOR_LIST; break;
+
+ case 'a': data->source |= QUERY_ALL; data->sourceCount++; break;
+ case 'f': data->source |= QUERY_PATH; data->sourceCount++; break;
+ case 'g': data->source |= QUERY_GROUP; data->sourceCount++; break;
+ case 'p': data->source |= QUERY_RPM; data->sourceCount++; break;
+ case POPT_WHATPROVIDES: data->source |= QUERY_WHATPROVIDES;
+ data->sourceCount++; break;
+ case POPT_WHATREQUIRES: data->source |= QUERY_WHATREQUIRES;
+ data->sourceCount++; break;
+ case POPT_QUERYBYNUMBER: data->source |= QUERY_DBOFFSET;
+ data->sourceCount++; break;
+ case POPT_TRIGGEREDBY: data->source |= QUERY_TRIGGEREDBY;
+ data->sourceCount++; break;
+
+ case POPT_QUERYFORMAT:
+ if (data->queryFormat) {
+ len = strlen(data->queryFormat) + strlen(arg) + 1;
+ data->queryFormat = realloc(data->queryFormat, len);
+ strcat(data->queryFormat, arg);
+ } else {
+ data->queryFormat = malloc(strlen(arg) + 1);
+ strcpy(data->queryFormat, arg);
+ }
+ break;
+ }
+}
+
static int queryHeader(Header h, char * chptr) {
char * str;
char * error;
}
}
-int doQuery(char * prefix, enum querysources source, int queryFlags,
+int rpmQuery(char * prefix, enum rpmQuerySources source, int queryFlags,
char * arg, char * queryFormat) {
Header h;
int offset;
return retcode;
}
-void queryPrintTags(void) {
+void rpmDisplayQueryTags(FILE * f) {
const struct headerTagTableEntry * t;
int i;
const struct headerSprintfExtension * ext = rpmHeaderFormats;
for (i = 0, t = rpmTagTable; i < rpmTagTableSize; i++, t++) {
- fprintf(stdout, "%s\n", t->name + 7);
+ fprintf(f, "%s\n", t->name + 7);
}
while (ext->name) {
if (ext->type == HEADER_EXT_TAG)
- fprintf(stdout, "%s\n", ext->name + 7), ext++;
+ fprintf(f, "%s\n", ext->name + 7), ext++;
else if (ext->type == HEADER_EXT_MORE)
ext = ext->u.more;
else
#include "query.h"
#include "verify.h"
-#define GETOPT_QUERYFORMAT 1000
-#define GETOPT_WHATREQUIRES 1001
-#define GETOPT_WHATPROVIDES 1002
#define GETOPT_REBUILD 1003
#define GETOPT_RECOMPILE 1004
#define GETOPT_ADDSIGN 1005
#define GETOPT_RESIGN 1006
#define GETOPT_BUILDROOT 1007
-#define GETOPT_QUERYBYNUMBER 1009
#define GETOPT_DBPATH 1010
#define GETOPT_TIMECHECK 1012
#define GETOPT_REBUILDDB 1013
#define GETOPT_INSTALL 1014
#define GETOPT_RMSOURCE 1015
#define GETOPT_RELOCATE 1016
-#define GETOPT_TRIGGEREDBY 1017
#define GETOPT_SHOWRC 1018
#define GETOPT_BUILDPLATFORM 1019
#define GETOPT_BUILDARCH 1020
static char * arch;
static int badReloc;
static int clean;
-static int dump;
static int excldocs;
static int force;
static char * ftpPort;
static int rpm_version;
+static struct rpmQueryArguments queryArgs;
/* the structure describing the options we take and the defaults */
static struct poptOption optionsTable[] = {
{ "addsign", '\0', 0, 0, GETOPT_ADDSIGN },
{ "buildroot", '\0', POPT_ARG_STRING, 0, GETOPT_BUILDROOT },
{ "checksig", 'K', 0, 0, 'K' },
{ "clean", '\0', 0, &clean, 0 },
- { "configfiles", 'c', 0, 0, 'c' },
{ "dbpath", '\0', POPT_ARG_STRING, 0, GETOPT_DBPATH },
- { "docfiles", 'd', 0, 0, 'd' },
- { "dump", '\0', 0, &dump, 0 },
{ "erase", 'e', 0, 0, 'e' },
{ "excludedocs", '\0', 0, &excldocs, 0},
- { "file", 'f', 0, 0, 'f' },
{ "force", '\0', 0, &force, 0 },
{ "ftpport", '\0', POPT_ARG_STRING, &ftpPort, 0},
{ "ftpproxy", '\0', POPT_ARG_STRING, &ftpProxy, 0},
- { "group", 'g', 0, 0, 'g' },
{ "hash", 'h', 0, &showHash, 0 },
{ "help", '\0', 0, &help, 0 },
{ NULL, 'i', 0, 0, 'i' },
/* info and install both using 'i' is dumb */
{ "install", '\0', 0, 0, GETOPT_INSTALL },
{ "justdb", '\0', 0, &justdb, 0 },
- { "list", 'l', 0, 0, 'l' },
{ "nodeps", '\0', 0, &noDeps, 0 },
{ "nofiles", '\0', 0, &noFiles, 0 },
{ "nolang", '\0', 0, &noLang, 0 },
{ "noscripts", '\0', 0, &noScripts, 0 },
{ "notriggers", '\0', 0, &noTriggers, 0 },
{ "oldpackage", '\0', 0, &oldPackage, 0 },
- { "package", 'p', 0, 0, 'p' },
{ "percent", '\0', 0, &showPercents, 0 },
{ "pipe", '\0', POPT_ARG_STRING, &pipeOutput, 0 },
{ "prefix", '\0', POPT_ARG_STRING, &prefix, 0 },
- { "qf", '\0', POPT_ARG_STRING, 0, GETOPT_QUERYFORMAT },
- { "query", 'q', 0, 0, 'q' },
- { "querybynumber", '\0', 0, 0, GETOPT_QUERYBYNUMBER },
- { "queryformat", '\0', POPT_ARG_STRING, 0, GETOPT_QUERYFORMAT },
+ { "query", 'q', 0, NULL, 'q' },
{ "querytags", '\0', 0, &queryTags, 0 },
{ "quiet", '\0', 0, &quiet, 0 },
{ "rcfile", '\0', POPT_ARG_STRING, &rcfile, 0 },
{ "short-circuit", '\0', 0, &shortCircuit, 0 },
{ "showrc", '\0', 0, &showrc, GETOPT_SHOWRC },
{ "sign", '\0', 0, &signIt, 0 },
- { "state", 's', 0, 0, 's' },
{ "tarball", 't', POPT_ARG_STRING, 0, 't' },
{ "test", '\0', 0, &test, 0 },
{ "timecheck", '\0', POPT_ARG_STRING, 0, GETOPT_TIMECHECK },
- { "triggeredby", '\0', 0, 0, GETOPT_TRIGGEREDBY },
{ "upgrade", 'U', 0, 0, 'U' },
{ "uninstall", 'u', 0, 0, 'u' },
{ "verbose", 'v', 0, 0, 'v' },
{ "verify", 'V', 0, 0, 'V' },
{ NULL, 'y', 0, 0, 'V' },
{ "version", '\0', 0, &rpm_version, 0 },
- { "whatrequires", '\0', 0, 0, GETOPT_WHATREQUIRES },
- { "whatprovides", '\0', 0, 0, GETOPT_WHATPROVIDES },
+ { NULL, '\0', POPT_ARG_INCLUDE_TABLE,
+ rpmQuerySourcePoptTable, 0, (void *) &queryArgs, NULL },
+ { NULL, '\0', POPT_ARG_INCLUDE_TABLE,
+ rpmQueryPoptTable, 0, (void *) &queryArgs, NULL },
{ 0, 0, 0, 0, 0 }
};
int main(int argc, char ** argv) {
enum modes bigMode = MODE_UNKNOWN;
- enum querysources querySource = QUERY_PACKAGE;
+ enum rpmQuerySources querySource = QUERY_PACKAGE;
enum verifysources verifySource = VERIFY_PACKAGE;
int arg, len;
- int queryFor = 0;
int installFlags = 0, uninstallFlags = 0, interfaceFlags = 0;
int buildAmount = 0;
int gotDbpath = 0, building = 0, verifyFlags;
int checksigFlags = 0;
int timeCheck = 0;
int addSign = NEW_SIGNATURE;
- char * queryFormat = NULL;
char buildChar = ' ';
char * specFile;
char * tce;
arch = NULL;
badReloc = 0;
clean = 0;
- dump = 0;
excldocs = 0;
force = 0;
ftpProxy = NULL;
rpmSetVerbosity(RPMMESS_NORMAL); /* XXX silly use by showrc */
poptResetContext(optCon);
+ if (queryArgs.queryFormat) free(queryArgs.queryFormat);
+ memset(&queryArgs, 0, sizeof(queryArgs));
while ((arg = poptGetNextOpt(optCon)) > 0) {
optArg = poptGetOptArg(optCon);
installFlags |= RPMINSTALL_UPGRADE;
break;
- case 's':
- queryFor |= QUERY_FOR_LIST | QUERY_FOR_STATE;
- break;
-
- case 'l':
- queryFor |= QUERY_FOR_LIST;
- break;
-
- case 'd':
- queryFor |= QUERY_FOR_DOCS | QUERY_FOR_LIST;
- break;
-
- case 'c':
- queryFor |= QUERY_FOR_CONFIG | QUERY_FOR_LIST;
- break;
-
case 'p':
if (querySource != QUERY_PACKAGE && querySource != QUERY_RPM)
argerror(_("one type of query/verify may be performed at a " "time"));
verifySource = VERIFY_EVERY;
break;
- case GETOPT_QUERYFORMAT:
- if (queryFormat) {
- len = strlen(queryFormat) + strlen(optArg) + 1;
- queryFormat = realloc(queryFormat, len);
- strcat(queryFormat, optArg);
- } else {
- queryFormat = malloc(strlen(optArg) + 1);
- strcpy(queryFormat, optArg);
- }
- break;
-
+#ifdef FOO
case GETOPT_WHATREQUIRES:
if (querySource != QUERY_PACKAGE &&
querySource != QUERY_WHATREQUIRES)
"time"));
querySource = QUERY_TRIGGEREDBY;
break;
+#endif
case GETOPT_REBUILD:
if (bigMode != MODE_UNKNOWN && bigMode != MODE_REBUILD)
gotDbpath = 1;
break;
- case GETOPT_QUERYBYNUMBER:
- if (querySource != QUERY_PACKAGE && querySource != QUERY_RPM)
- argerror(_("one type of query may be performed at a "
- "time"));
- querySource = QUERY_DBOFFSET;
- verifySource = VERIFY_RPM;
- break;
-
case GETOPT_TIMECHECK:
tce = NULL;
timeCheck = strtoul(optArg, &tce, 10);
bigMode = MODE_QUERYTAGS;
}
+ if (queryArgs.sourceCount) {
+ if (querySource != QUERY_PACKAGE || queryArgs.sourceCount > 1)
+ argerror(_("one type of query/verify may be performed at a "
+ "time"));
+ querySource = queryArgs.source;
+ }
+
if (buildRootOverride && bigMode != MODE_BUILD &&
bigMode != MODE_REBUILD && bigMode != MODE_TARBUILD) {
argerror("--buildroot may only be used during package builds");
bigMode != MODE_RECOMPILE && bigMode != MODE_TARBUILD)
argerror(_("--timecheck may only be used during package builds"));
- if (bigMode != MODE_QUERY && queryFor)
+ if (bigMode != MODE_QUERY && queryArgs.flags)
argerror(_("unexpected query specifiers"));
- if (bigMode != MODE_QUERY && queryFormat)
+ if (bigMode != MODE_QUERY && queryArgs.queryFormat)
argerror(_("unexpected query specifiers"));
if (bigMode != MODE_QUERY && bigMode != MODE_VERIFY &&
if (oldPackage && !(installFlags & RPMINSTALL_UPGRADE))
argerror(_("--oldpackage may only be used during upgrades"));
- if (bigMode != MODE_QUERY && dump)
- argerror(_("--dump may only be used during queries"));
-
- if (bigMode == MODE_QUERY && dump && !(queryFor & QUERY_FOR_LIST))
- argerror(_("--dump of queries must be used with -l, -c, or -d"));
-
if ((ftpProxy || ftpPort) && !(bigMode == MODE_INSTALL ||
((bigMode == MODE_QUERY && querySource == QUERY_RPM)) ||
((bigMode == MODE_VERIFY && querySource == VERIFY_RPM))))
if (argc != 2)
argerror(_("unexpected arguments to --querytags "));
- queryPrintTags();
+ rpmDisplayQueryTags(stdout);
break;
case MODE_INITDB:
break;
case MODE_QUERY:
- if (dump) queryFor |= QUERY_FOR_DUMPFILES;
-
if (querySource == QUERY_ALL) {
if (poptPeekArg(optCon))
argerror(_("extra arguments given for query of all packages"));
- ec = doQuery(rootdir, QUERY_ALL, queryFor, NULL, queryFormat);
+ ec = rpmQuery(rootdir, QUERY_ALL, queryArgs.flags, NULL,
+ queryArgs.queryFormat);
} else {
if (!poptPeekArg(optCon))
argerror(_("no arguments given for query"));
while ((pkg = poptGetArg(optCon)))
- ec = doQuery(rootdir, querySource, queryFor, pkg, queryFormat);
+ ec = rpmQuery(rootdir, querySource, queryArgs.flags, pkg,
+ queryArgs.queryFormat);
}
break;
}
/* keeps memory leak checkers quiet */
- if (queryFormat) free(queryFormat);
+ if (queryArgs.queryFormat) free(queryArgs.queryFormat);
return ec;
}