00001
00006 #include "system.h"
00007
00008 #include <rpmcli.h>
00009 #include <rpmbuild.h>
00010
00011 #include "debug.h"
00012
00013 struct rpmQVArguments_s rpmQVArgs;
00014 int specedit = 0;
00015
00016 #define POPT_QUERYFORMAT 1000
00017 #define POPT_WHATREQUIRES 1001
00018 #define POPT_WHATPROVIDES 1002
00019 #define POPT_QUERYBYNUMBER 1003
00020 #define POPT_TRIGGEREDBY 1004
00021 #define POPT_DUMP 1005
00022 #define POPT_SPECFILE 1006
00023
00024
00025 static void rpmQVSourceArgCallback( poptContext con,
00026 enum poptCallbackReason reason,
00027 const struct poptOption * opt, const char * arg,
00028 const void * data)
00029
00030 {
00031 QVA_t qva = &rpmQVArgs;
00032
00033 switch (opt->val) {
00034 case 'q':
00035 case 'Q':
00036 case 'V':
00037 if (qva->qva_mode == ' ') {
00038 qva->qva_mode = opt->val;
00039 qva->qva_char = ' ';
00040 }
00041 break;
00042 case 'a': qva->qva_source |= RPMQV_ALL; qva->qva_sourceCount++; break;
00043 case 'f': qva->qva_source |= RPMQV_PATH; qva->qva_sourceCount++; break;
00044 case 'g': qva->qva_source |= RPMQV_GROUP; qva->qva_sourceCount++; break;
00045 case 'p': qva->qva_source |= RPMQV_RPM; qva->qva_sourceCount++; break;
00046 case POPT_WHATPROVIDES: qva->qva_source |= RPMQV_WHATPROVIDES;
00047 qva->qva_sourceCount++; break;
00048 case POPT_WHATREQUIRES: qva->qva_source |= RPMQV_WHATREQUIRES;
00049 qva->qva_sourceCount++; break;
00050 case POPT_TRIGGEREDBY: qva->qva_source |= RPMQV_TRIGGEREDBY;
00051 qva->qva_sourceCount++; break;
00052
00053
00054 case POPT_SPECFILE:
00055 qva->qva_source |= RPMQV_SPECFILE;
00056 qva->qva_sourceCount++;
00057 break;
00058 case POPT_QUERYBYNUMBER:
00059 qva->qva_source |= RPMQV_DBOFFSET;
00060 qva->qva_sourceCount++;
00061 break;
00062 }
00063 }
00064
00068 struct poptOption rpmQVSourcePoptTable[] = {
00069 { NULL, '\0', POPT_ARG_CALLBACK | POPT_CBFLAG_INC_DATA,
00070 rpmQVSourceArgCallback, 0, NULL, NULL },
00071 { "all", 'a', 0, 0, 'a',
00072 N_("query/verify all packages"), NULL },
00073 { "file", 'f', 0, 0, 'f',
00074 N_("query/verify package(s) owning file"), "FILE" },
00075 { "group", 'g', 0, 0, 'g',
00076 N_("query/verify package(s) in group"), "GROUP" },
00077 { "package", 'p', 0, 0, 'p',
00078 N_("query/verify a package file (i.e. a binary *.rpm file)"), NULL },
00079 { "query", 'q', POPT_ARGFLAG_DOC_HIDDEN, NULL, 'q',
00080 N_("rpm query mode"), NULL },
00081 { "querybynumber", '\0', POPT_ARGFLAG_DOC_HIDDEN, 0,
00082 POPT_QUERYBYNUMBER, NULL, NULL },
00083 { "querytags", '\0', 0, 0, 'Q',
00084 N_("display known query tags"), NULL },
00085 { "specfile", '\0', 0, 0, POPT_SPECFILE,
00086 N_("query a spec file"), N_("<spec>") },
00087 { "triggeredby", '\0', POPT_ARGFLAG_DOC_HIDDEN, 0, POPT_TRIGGEREDBY,
00088 N_("query the package(s) triggered by the package"), "PACKAGE" },
00089 { "verify", 'V', POPT_ARGFLAG_DOC_HIDDEN, NULL, 'V',
00090 N_("rpm verify mode"), NULL },
00091 { NULL, 'y', POPT_ARGFLAG_DOC_HIDDEN, NULL, 'V',
00092 N_("rpm verify mode (legacy)"), NULL },
00093 { "whatrequires", '\0', 0, 0, POPT_WHATREQUIRES,
00094 N_("query/verify the package(s) which require a dependency"), "CAPABILITY" },
00095 { "whatprovides", '\0', 0, 0, POPT_WHATPROVIDES,
00096 N_("query/verify the package(s) which provide a dependency"), "CAPABILITY" },
00097 POPT_TABLEEND
00098 };
00099
00100
00101
00102 static void queryArgCallback(poptContext con,
00103 enum poptCallbackReason reason,
00104 const struct poptOption * opt, const char * arg,
00105 const void * data)
00106
00107 {
00108 QVA_t qva = &rpmQVArgs;
00109
00110 switch (opt->val) {
00111 case 'c': qva->qva_flags |= QUERY_FOR_CONFIG | QUERY_FOR_LIST; break;
00112 case 'd': qva->qva_flags |= QUERY_FOR_DOCS | QUERY_FOR_LIST; break;
00113 case 'l': qva->qva_flags |= QUERY_FOR_LIST; break;
00114 case 's': qva->qva_flags |= QUERY_FOR_STATE | QUERY_FOR_LIST;
00115 break;
00116 case POPT_DUMP: qva->qva_flags |= QUERY_FOR_DUMPFILES | QUERY_FOR_LIST;
00117 break;
00118 case 'v': rpmIncreaseVerbosity(); break;
00119
00120 case POPT_QUERYFORMAT:
00121 if (arg) {
00122 char * qf = (char *)qva->qva_queryFormat;
00123 if (qf) {
00124 int len = strlen(qf) + strlen(arg) + 1;
00125 qf = xrealloc(qf, len);
00126 strcat(qf, arg);
00127 } else {
00128 qf = xmalloc(strlen(arg) + 1);
00129 strcpy(qf, arg);
00130 }
00131 qva->qva_queryFormat = qf;
00132 }
00133 break;
00134 }
00135 }
00136
00140 struct poptOption rpmQueryPoptTable[] = {
00141 { NULL, '\0', POPT_ARG_CALLBACK | POPT_CBFLAG_INC_DATA,
00142 queryArgCallback, 0, NULL, NULL },
00143 { NULL, '\0', POPT_ARG_INCLUDE_TABLE, rpmQVSourcePoptTable, 0,
00144 NULL, NULL },
00145 { "configfiles", 'c', 0, 0, 'c',
00146 N_("list all configuration files"), NULL },
00147 { "docfiles", 'd', 0, 0, 'd',
00148 N_("list all documentation files"), NULL },
00149 { "dump", '\0', 0, 0, POPT_DUMP,
00150 N_("dump basic file information"), NULL },
00151 { "list", 'l', 0, 0, 'l',
00152 N_("list files in package"), NULL },
00153
00154
00155 { "noghost", '\0', POPT_BIT_CLR|POPT_ARGFLAG_DOC_HIDDEN,
00156 &rpmQVArgs.qva_fflags, RPMFILE_GHOST,
00157 N_("skip %%ghost files"), NULL },
00158 #ifdef NOTEVER
00159 { "nolicense", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
00160 &rpmQVArgs.qva_fflags, RPMFILE_LICENSE,
00161 N_("skip %%license files"), NULL },
00162 { "noreadme", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
00163 &rpmQVArgs.qva_fflags, RPMFILE_README,
00164 N_("skip %%readme files"), NULL },
00165 #endif
00166
00167 { "qf", '\0', POPT_ARG_STRING | POPT_ARGFLAG_DOC_HIDDEN, 0,
00168 POPT_QUERYFORMAT, NULL, NULL },
00169 { "queryformat", '\0', POPT_ARG_STRING, 0, POPT_QUERYFORMAT,
00170 N_("use the following query format"), "QUERYFORMAT" },
00171 { "specedit", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &specedit, -1,
00172 N_("substitute i18n sections into spec file"), NULL },
00173 { "state", 's', 0, 0, 's',
00174 N_("display the states of the listed files"), NULL },
00175 { "verbose", 'v', 0, 0, 'v',
00176 N_("display a verbose file listing"), NULL },
00177 POPT_TABLEEND
00178 };
00179
00183 struct poptOption rpmVerifyPoptTable[] = {
00184 #ifdef DYING
00185 { NULL, '\0', POPT_ARG_CALLBACK | POPT_CBFLAG_INC_DATA,
00186 verifyArgCallback, 0, NULL, NULL },
00187 #endif
00188 { NULL, '\0', POPT_ARG_INCLUDE_TABLE, rpmQVSourcePoptTable, 0,
00189 NULL, NULL },
00190
00191
00192 { "nomd5", '\0', POPT_BIT_SET, &rpmQVArgs.qva_flags, VERIFY_MD5,
00193 N_("don't verify MD5 digest of files"), NULL },
00194 { "nosize", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
00195 &rpmQVArgs.qva_flags, VERIFY_SIZE,
00196 N_("don't verify size of files"), NULL },
00197 { "nolinkto", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
00198 &rpmQVArgs.qva_flags, VERIFY_LINKTO,
00199 N_("don't verify symlink path of files"), NULL },
00200 { "nouser", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
00201 &rpmQVArgs.qva_flags, VERIFY_USER,
00202 N_("don't verify owner of files"), NULL },
00203 { "nogroup", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
00204 &rpmQVArgs.qva_flags, VERIFY_GROUP,
00205 N_("don't verify group of files"), NULL },
00206 { "nomtime", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
00207 &rpmQVArgs.qva_flags, VERIFY_MTIME,
00208 N_("don't verify modification time of files"), NULL },
00209 { "nomode", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
00210 &rpmQVArgs.qva_flags, VERIFY_MODE,
00211 N_("don't verify mode of files"), NULL },
00212 { "nordev", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
00213 &rpmQVArgs.qva_flags, VERIFY_RDEV,
00214 N_("don't verify mode of files"), NULL },
00215
00216 { "nofiles", '\0', POPT_BIT_SET, &rpmQVArgs.qva_flags, VERIFY_FILES,
00217 N_("don't verify files in package"), NULL},
00218 { "nodeps", '\0', POPT_BIT_SET, &rpmQVArgs.qva_flags, VERIFY_DEPS,
00219 N_("don't verify package dependencies"), NULL },
00220 { "noscript", '\0', POPT_BIT_SET,&rpmQVArgs.qva_flags, VERIFY_SCRIPT,
00221 N_("don't execute %verifyscript (if any)"), NULL },
00222
00223 { "noscripts", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
00224 &rpmQVArgs.qva_flags, VERIFY_SCRIPT,
00225 N_("don't execute %verifyscript (if any)"), NULL },
00226 { "nodigest", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
00227 &rpmQVArgs.qva_flags, VERIFY_DIGEST,
00228 N_("don't verify header SHA1 digest"), NULL },
00229
00230 POPT_TABLEEND
00231 };