00001
00006 #include "system.h"
00007
00008 #include <rpmcli.h>
00009 #include <rpmbuild.h>
00010
00011 #include "debug.h"
00012
00013
00014 struct rpmQVKArguments_s rpmQVKArgs;
00015
00016
00017 int specedit = 0;
00018
00019 #define POPT_QUERYFORMAT -1000
00020 #define POPT_WHATREQUIRES -1001
00021 #define POPT_WHATPROVIDES -1002
00022 #define POPT_QUERYBYNUMBER -1003
00023 #define POPT_TRIGGEREDBY -1004
00024 #define POPT_DUMP -1005
00025 #define POPT_SPECFILE -1006
00026 #define POPT_QUERYBYPKGID -1007
00027 #define POPT_QUERYBYHDRID -1008
00028 #define POPT_QUERYBYFILEID -1009
00029 #define POPT_QUERYBYTID -1010
00030
00031
00032 static void rpmQVSourceArgCallback( poptContext con,
00033 enum poptCallbackReason reason,
00034 const struct poptOption * opt, const char * arg,
00035 const void * data)
00036
00037
00038 {
00039 QVA_t qva = &rpmQVKArgs;
00040
00041 switch (opt->val) {
00042 case 'q':
00043 case 'Q':
00044 case 'V':
00045 case 'A':
00046 case 'I':
00047 case 'K':
00048 case 'R':
00049 if (qva->qva_mode == '\0' || strchr("qQ ", qva->qva_mode)) {
00050 qva->qva_mode = opt->val;
00051 qva->qva_char = ' ';
00052 }
00053 break;
00054 case 'a': qva->qva_source |= RPMQV_ALL; qva->qva_sourceCount++; break;
00055 case 'f': qva->qva_source |= RPMQV_PATH; qva->qva_sourceCount++; break;
00056 case 'g': qva->qva_source |= RPMQV_GROUP; qva->qva_sourceCount++; break;
00057 case 'p': qva->qva_source |= RPMQV_RPM; qva->qva_sourceCount++; break;
00058 case POPT_WHATPROVIDES: qva->qva_source |= RPMQV_WHATPROVIDES;
00059 qva->qva_sourceCount++; break;
00060 case POPT_WHATREQUIRES: qva->qva_source |= RPMQV_WHATREQUIRES;
00061 qva->qva_sourceCount++; break;
00062 case POPT_TRIGGEREDBY: qva->qva_source |= RPMQV_TRIGGEREDBY;
00063 qva->qva_sourceCount++; break;
00064 case POPT_QUERYBYPKGID: qva->qva_source |= RPMQV_PKGID;
00065 qva->qva_sourceCount++; break;
00066 case POPT_QUERYBYHDRID: qva->qva_source |= RPMQV_HDRID;
00067 qva->qva_sourceCount++; break;
00068 case POPT_QUERYBYFILEID: qva->qva_source |= RPMQV_FILEID;
00069 qva->qva_sourceCount++; break;
00070 case POPT_QUERYBYTID: qva->qva_source |= RPMQV_TID;
00071 qva->qva_sourceCount++; break;
00072
00073
00074 case POPT_SPECFILE:
00075 qva->qva_source |= RPMQV_SPECFILE;
00076 qva->qva_sourceCount++;
00077 break;
00078 case POPT_QUERYBYNUMBER:
00079 qva->qva_source |= RPMQV_DBOFFSET;
00080 qva->qva_sourceCount++;
00081 break;
00082 }
00083 }
00084
00088
00089 struct poptOption rpmQVSourcePoptTable[] = {
00090
00091 { NULL, '\0', POPT_ARG_CALLBACK | POPT_CBFLAG_INC_DATA,
00092 rpmQVSourceArgCallback, 0, NULL, NULL },
00093
00094 { "all", 'a', 0, 0, 'a',
00095 N_("query/verify all packages"), NULL },
00096 { "checksig", 'K', POPT_ARGFLAG_DOC_HIDDEN, NULL, 'K',
00097 N_("rpm checksig mode"), NULL },
00098 { "file", 'f', 0, 0, 'f',
00099 N_("query/verify package(s) owning file"), "FILE" },
00100 { "fileid", '\0', POPT_ARGFLAG_DOC_HIDDEN, 0, POPT_QUERYBYFILEID,
00101 N_("query/verify package(s) with file identifier"), "MD5" },
00102 { "group", 'g', 0, 0, 'g',
00103 N_("query/verify package(s) in group"), "GROUP" },
00104 { "hdrid", '\0', POPT_ARGFLAG_DOC_HIDDEN, 0, POPT_QUERYBYHDRID,
00105 N_("query/verify package(s) with header identifier"), "SHA1" },
00106 { "package", 'p', 0, 0, 'p',
00107 N_("query/verify a package file"), NULL },
00108 { "pkgid", '\0', POPT_ARGFLAG_DOC_HIDDEN, 0, POPT_QUERYBYPKGID,
00109 N_("query/verify package(s) with package identifier"), "MD5" },
00110 { "query", 'q', POPT_ARGFLAG_DOC_HIDDEN, NULL, 'q',
00111 N_("rpm query mode"), NULL },
00112 { "querybynumber", '\0', POPT_ARGFLAG_DOC_HIDDEN, 0, POPT_QUERYBYNUMBER,
00113 N_("query/verify a header instance"), "HDRNUM" },
00114 { "specfile", '\0', 0, 0, POPT_SPECFILE,
00115 N_("query a spec file"), N_("<spec>") },
00116 { "tid", '\0', POPT_ARGFLAG_DOC_HIDDEN, 0, POPT_QUERYBYTID,
00117 N_("query/verify package(s) from install transaction"), "TID" },
00118 { "triggeredby", '\0', POPT_ARGFLAG_DOC_HIDDEN, 0, POPT_TRIGGEREDBY,
00119 N_("query the package(s) triggered by the package"), "PACKAGE" },
00120 { "verify", 'V', POPT_ARGFLAG_DOC_HIDDEN, NULL, 'V',
00121 N_("rpm verify mode"), NULL },
00122 { "whatrequires", '\0', 0, 0, POPT_WHATREQUIRES,
00123 N_("query/verify the package(s) which require a dependency"), "CAPABILITY" },
00124 { "whatprovides", '\0', 0, 0, POPT_WHATPROVIDES,
00125 N_("query/verify the package(s) which provide a dependency"), "CAPABILITY" },
00126 POPT_TABLEEND
00127 };
00128
00129
00130
00131 static void queryArgCallback(poptContext con,
00132 enum poptCallbackReason reason,
00133 const struct poptOption * opt, const char * arg,
00134 const void * data)
00135
00136
00137 {
00138 QVA_t qva = &rpmQVKArgs;
00139
00140 switch (opt->val) {
00141 case 'c': qva->qva_flags |= QUERY_FOR_CONFIG | QUERY_FOR_LIST; break;
00142 case 'd': qva->qva_flags |= QUERY_FOR_DOCS | QUERY_FOR_LIST; break;
00143 case 'l': qva->qva_flags |= QUERY_FOR_LIST; break;
00144 case 's': qva->qva_flags |= QUERY_FOR_STATE | QUERY_FOR_LIST;
00145 break;
00146 case POPT_DUMP: qva->qva_flags |= QUERY_FOR_DUMPFILES | QUERY_FOR_LIST;
00147 break;
00148
00149 case POPT_QUERYFORMAT:
00150 if (arg) {
00151 char * qf = (char *)qva->qva_queryFormat;
00152
00153 if (qf) {
00154 int len = strlen(qf) + strlen(arg) + 1;
00155 qf = xrealloc(qf, len);
00156
00157 strcat(qf, arg);
00158
00159 } else {
00160 qf = xmalloc(strlen(arg) + 1);
00161 strcpy(qf, arg);
00162 }
00163
00164 qva->qva_queryFormat = qf;
00165 }
00166 break;
00167
00168 case 'i':
00169 if (qva->qva_mode == 'q') {
00170
00171 const char * infoCommand[] = { "--info", NULL };
00172
00173 (void) poptStuffArgs(con, infoCommand);
00174 }
00175 break;
00176
00177 case RPMCLI_POPT_NODIGEST:
00178 qva->qva_flags |= VERIFY_DIGEST;
00179 break;
00180
00181 case RPMCLI_POPT_NOSIGNATURE:
00182 qva->qva_flags |= VERIFY_SIGNATURE;
00183 break;
00184
00185 case RPMCLI_POPT_NOHDRCHK:
00186 qva->qva_flags |= VERIFY_HDRCHK;
00187 break;
00188
00189 case RPMCLI_POPT_NODEPS:
00190 qva->qva_flags |= VERIFY_DEPS;
00191 break;
00192
00193 case RPMCLI_POPT_NOMD5:
00194 qva->qva_flags |= VERIFY_MD5;
00195 break;
00196
00197 case RPMCLI_POPT_NOCONTEXTS:
00198 qva->qva_flags |= VERIFY_CONTEXTS;
00199 break;
00200
00201 #ifdef NOTYET
00202 case RPMCLI_POPT_FORCE:
00203 ia->probFilter |=
00204 ( RPMPROB_FILTER_REPLACEPKG
00205 | RPMPROB_FILTER_REPLACEOLDFILES
00206 | RPMPROB_FILTER_REPLACENEWFILES
00207 | RPMPROB_FILTER_OLDPACKAGE );
00208 break;
00209 #endif
00210
00211 case RPMCLI_POPT_NOSCRIPTS:
00212 qva->qva_flags |= VERIFY_SCRIPT;
00213 break;
00214
00215 }
00216 }
00217
00221
00222 struct poptOption rpmQueryPoptTable[] = {
00223
00224 { NULL, '\0', POPT_ARG_CALLBACK | POPT_CBFLAG_INC_DATA | POPT_CBFLAG_CONTINUE,
00225 queryArgCallback, 0, NULL, NULL },
00226
00227 { NULL, '\0', POPT_ARG_INCLUDE_TABLE, rpmQVSourcePoptTable, 0,
00228 NULL, NULL },
00229 { "configfiles", 'c', 0, 0, 'c',
00230 N_("list all configuration files"), NULL },
00231 { "docfiles", 'd', 0, 0, 'd',
00232 N_("list all documentation files"), NULL },
00233 { "dump", '\0', 0, 0, POPT_DUMP,
00234 N_("dump basic file information"), NULL },
00235 { NULL, 'i', POPT_ARGFLAG_DOC_HIDDEN, 0, 'i',
00236 NULL, NULL },
00237 { "list", 'l', 0, 0, 'l',
00238 N_("list files in package"), NULL },
00239
00240
00241 { "noghost", '\0', POPT_BIT_CLR|POPT_ARGFLAG_DOC_HIDDEN,
00242 &rpmQVKArgs.qva_fflags, RPMFILE_GHOST,
00243 N_("skip %%ghost files"), NULL },
00244 #ifdef NOTEVER
00245 { "nolicense", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
00246 &rpmQVKArgs.qva_fflags, RPMFILE_LICENSE,
00247 N_("skip %%license files"), NULL },
00248 { "noreadme", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
00249 &rpmQVKArgs.qva_fflags, RPMFILE_README,
00250 N_("skip %%readme files"), NULL },
00251 #endif
00252
00253 { "qf", '\0', POPT_ARG_STRING | POPT_ARGFLAG_DOC_HIDDEN, 0,
00254 POPT_QUERYFORMAT, NULL, NULL },
00255 { "queryformat", '\0', POPT_ARG_STRING, 0, POPT_QUERYFORMAT,
00256 N_("use the following query format"), "QUERYFORMAT" },
00257 { "specedit", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &specedit, -1,
00258 N_("substitute i18n sections into spec file"), NULL },
00259 { "state", 's', 0, 0, 's',
00260 N_("display the states of the listed files"), NULL },
00261 POPT_TABLEEND
00262 };
00263
00267 struct poptOption rpmVerifyPoptTable[] = {
00268
00269 { NULL, '\0', POPT_ARG_CALLBACK | POPT_CBFLAG_INC_DATA | POPT_CBFLAG_CONTINUE,
00270 queryArgCallback, 0, NULL, NULL },
00271
00272 { NULL, '\0', POPT_ARG_INCLUDE_TABLE, rpmQVSourcePoptTable, 0,
00273 NULL, NULL },
00274
00275
00277 #ifdef DYING
00278 { "nomd5", '\0', POPT_BIT_SET, &rpmQVKArgs.qva_flags, VERIFY_MD5,
00279 N_("don't verify MD5 digest of files"), NULL },
00280 #else
00281 { "nomd5", '\0', 0, NULL, RPMCLI_POPT_NOMD5,
00282 N_("don't verify MD5 digest of files"), NULL },
00283 #endif
00284 { "nosize", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
00285 &rpmQVKArgs.qva_flags, VERIFY_SIZE,
00286 N_("don't verify size of files"), NULL },
00287 { "nolinkto", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
00288 &rpmQVKArgs.qva_flags, VERIFY_LINKTO,
00289 N_("don't verify symlink path of files"), NULL },
00290 { "nouser", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
00291 &rpmQVKArgs.qva_flags, VERIFY_USER,
00292 N_("don't verify owner of files"), NULL },
00293 { "nogroup", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
00294 &rpmQVKArgs.qva_flags, VERIFY_GROUP,
00295 N_("don't verify group of files"), NULL },
00296 { "nomtime", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
00297 &rpmQVKArgs.qva_flags, VERIFY_MTIME,
00298 N_("don't verify modification time of files"), NULL },
00299 { "nomode", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
00300 &rpmQVKArgs.qva_flags, VERIFY_MODE,
00301 N_("don't verify mode of files"), NULL },
00302 { "nordev", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
00303 &rpmQVKArgs.qva_flags, VERIFY_RDEV,
00304 N_("don't verify mode of files"), NULL },
00305
00306 { "nocontexts", '\0', POPT_ARGFLAG_DOC_HIDDEN, NULL, RPMCLI_POPT_NOCONTEXTS,
00307 N_("don't verify file security contexts"), NULL },
00308 { "nofiles", '\0', POPT_BIT_SET, &rpmQVKArgs.qva_flags, VERIFY_FILES,
00309 N_("don't verify files in package"), NULL},
00310 #ifdef DYING
00311 { "nodeps", '\0', POPT_BIT_SET, &rpmQVKArgs.qva_flags, VERIFY_DEPS,
00312 N_("don't verify package dependencies"), NULL },
00313 #else
00314 { "nodeps", '\0', 0, NULL, RPMCLI_POPT_NODEPS,
00315 N_("don't verify package dependencies"), NULL },
00316 #endif
00317
00318 #ifdef DYING
00319 { "noscript", '\0', POPT_BIT_SET,&rpmQVKArgs.qva_flags, VERIFY_SCRIPT,
00320 N_("don't execute verify script(s)"), NULL },
00321
00322 { "noscripts", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
00323 &rpmQVKArgs.qva_flags, VERIFY_SCRIPT,
00324 N_("don't execute verify script(s)"), NULL },
00325 #else
00326 { "noscript", '\0', 0, NULL, RPMCLI_POPT_NOSCRIPTS,
00327 N_("don't execute verify script(s)"), NULL },
00328
00329 { "noscripts", '\0', POPT_ARGFLAG_DOC_HIDDEN, NULL, RPMCLI_POPT_NOSCRIPTS,
00330 N_("don't execute verify script(s)"), NULL },
00331 #endif
00332
00333 #ifdef DYING
00334 { "nodigest", '\0', POPT_BIT_SET, &rpmQVKArgs.qva_flags, VERIFY_DIGEST,
00335 N_("don't verify package digest(s)"), NULL },
00336 { "nohdrchk", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
00337 &rpmQVKArgs.qva_flags, VERIFY_HDRCHK,
00338 N_("don't verify database header(s) when retrieved"), NULL },
00339 { "nosignature", '\0', POPT_BIT_SET,
00340 &rpmQVKArgs.qva_flags, VERIFY_SIGNATURE,
00341 N_("don't verify package signature(s)"), NULL },
00342 #else
00343 { "nodigest", '\0', POPT_ARGFLAG_DOC_HIDDEN, 0, RPMCLI_POPT_NODIGEST,
00344 N_("don't verify package digest(s)"), NULL },
00345 { "nohdrchk", '\0', POPT_ARGFLAG_DOC_HIDDEN, 0, RPMCLI_POPT_NOHDRCHK,
00346 N_("don't verify database header(s) when retrieved"), NULL },
00347 { "nosignature", '\0', POPT_ARGFLAG_DOC_HIDDEN, 0, RPMCLI_POPT_NOSIGNATURE,
00348 N_("don't verify package signature(s)"), NULL },
00349 #endif
00350
00352 { "nogpg", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
00353 &rpmQVKArgs.qva_flags, VERIFY_SIGNATURE,
00354 N_("don't verify GPG V3 DSA signature(s)"), NULL },
00355 { "nopgp", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
00356 &rpmQVKArgs.qva_flags, VERIFY_SIGNATURE,
00357 N_("don't verify PGP V3 RSA/MD5 signature(s)"), NULL },
00358
00359 POPT_TABLEEND
00360 };
00361
00365
00366 struct poptOption rpmSignPoptTable[] = {
00367
00368 { NULL, '\0', POPT_ARG_CALLBACK | POPT_CBFLAG_INC_DATA | POPT_CBFLAG_CONTINUE,
00369 rpmQVSourceArgCallback, 0, NULL, NULL },
00370
00371 { "addsign", '\0', 0, NULL, 'A',
00372 N_("sign package(s) (identical to --resign)"), NULL },
00373 { "checksig", 'K', 0, NULL, 'K',
00374 N_("verify package signature(s)"), NULL },
00375 { "import", '\0', 0, NULL, 'I',
00376 N_("import an armored public key"), NULL },
00377 { "resign", '\0', 0, NULL, 'R',
00378 N_("sign package(s) (identical to --addsign)"), NULL },
00379 { "sign", '\0', POPT_ARGFLAG_DOC_HIDDEN, &rpmQVKArgs.sign, 0,
00380 N_("generate signature"), NULL },
00381
00382 { "nodigest", '\0', POPT_BIT_SET, &rpmQVKArgs.qva_flags, VERIFY_DIGEST,
00383 N_("don't verify package digest(s)"), NULL },
00384 { "nohdrchk", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
00385 &rpmQVKArgs.qva_flags, VERIFY_HDRCHK,
00386 N_("don't verify database header(s) when retrieved"), NULL },
00387 { "nosignature", '\0', POPT_BIT_SET, &rpmQVKArgs.qva_flags, VERIFY_SIGNATURE,
00388 N_("don't verify package signature(s)"), NULL },
00389
00390 POPT_TABLEEND
00391 };