Main Page | Modules | Data Structures | Directories | File List | Data Fields | Globals | Related Pages

poptQV.c

Go to the documentation of this file.
00001 
00006 #include "system.h"
00007 
00008 #include <rpmcli.h>
00009 #include <rpmbuild.h>
00010 
00011 #include "debug.h"
00012 
00013 /*@unchecked@*/
00014 struct rpmQVKArguments_s rpmQVKArgs;
00015 
00016 /*@unchecked@*/
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 /* ========== Query/Verify/Signature source args */
00032 static void rpmQVSourceArgCallback( /*@unused@*/ poptContext con,
00033                 /*@unused@*/ enum poptCallbackReason reason,
00034                 const struct poptOption * opt, /*@unused@*/ const char * arg, 
00035                 /*@unused@*/ const void * data)
00036         /*@globals rpmQVKArgs @*/
00037         /*@modifies rpmQVKArgs @*/
00038 {
00039     QVA_t qva = &rpmQVKArgs;
00040 
00041     switch (opt->val) {
00042     case 'q':   /* from --query, -q */
00043     case 'Q':   /* from --querytags (handled by poptALL) */
00044     case 'V':   /* from --verify, -V */
00045     case 'A':   /* from --addsign */
00046     case 'I':   /* from --import */
00047     case 'K':   /* from --checksig, -K */
00048     case 'R':   /* from --resign */
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 /* XXX SPECFILE is not verify sources */
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 /*@unchecked@*/
00089 struct poptOption rpmQVSourcePoptTable[] = {
00090 /*@-type@*/ /* FIX: cast? */
00091  { NULL, '\0', POPT_ARG_CALLBACK | POPT_CBFLAG_INC_DATA, 
00092         rpmQVSourceArgCallback, 0, NULL, NULL },
00093 /*@=type@*/
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 /* ========== Query specific popt args */
00130 
00131 static void queryArgCallback(poptContext con,
00132                 /*@unused@*/enum poptCallbackReason reason,
00133                 const struct poptOption * opt, const char * arg, 
00134                 /*@unused@*/ const void * data)
00135         /*@globals rpmQVKArgs @*/
00136         /*@modifies con, rpmQVKArgs @*/
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             /*@-branchstate@*/
00153             if (qf) {
00154                 int len = strlen(qf) + strlen(arg) + 1;
00155                 qf = xrealloc(qf, len);
00156 /*@-boundswrite@*/
00157                 strcat(qf, arg);
00158 /*@=boundswrite@*/
00159             } else {
00160                 qf = xmalloc(strlen(arg) + 1);
00161                 strcpy(qf, arg);
00162             }
00163             /*@=branchstate@*/
00164             qva->qva_queryFormat = qf;
00165         }
00166         break;
00167 
00168     case 'i':
00169         if (qva->qva_mode == 'q') {
00170             /*@-nullassign -readonlytrans@*/
00171             const char * infoCommand[] = { "--info", NULL };
00172             /*@=nullassign =readonlytrans@*/
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 /*@unchecked@*/
00222 struct poptOption rpmQueryPoptTable[] = {
00223 /*@-type@*/ /* FIX: cast? */
00224  { NULL, '\0', POPT_ARG_CALLBACK | POPT_CBFLAG_INC_DATA | POPT_CBFLAG_CONTINUE, 
00225         queryArgCallback, 0, NULL, NULL },
00226 /*@=type@*/
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  /* Duplicate file attr flags from packages into command line options. */
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         /* XXX there's hardly a need for these */
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 /*@-type@*/ /* FIX: cast? */
00269  { NULL, '\0', POPT_ARG_CALLBACK | POPT_CBFLAG_INC_DATA | POPT_CBFLAG_CONTINUE, 
00270         queryArgCallback, 0, NULL, NULL },
00271 /*@=type@*/
00272  { NULL, '\0', POPT_ARG_INCLUDE_TABLE, rpmQVSourcePoptTable, 0,
00273         NULL, NULL },
00274 
00275  /* Duplicate file verify flags from packages into command line options. */
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  /* XXX legacy had a trailing s on --noscript */
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  /* XXX legacy had a trailing s on --noscript */
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 /*@unchecked@*/
00366 struct poptOption rpmSignPoptTable[] = {
00367 /*@-type@*/ /* FIX: cast? */
00368  { NULL, '\0', POPT_ARG_CALLBACK | POPT_CBFLAG_INC_DATA | POPT_CBFLAG_CONTINUE,
00369         rpmQVSourceArgCallback, 0, NULL, NULL },
00370 /*@=type@*/
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 };

Generated on Wed Aug 30 08:46:37 2006 for rpm by  doxygen 1.3.9.1