Split popt glue into lib/popt{BT,QV}.c.
[platform/upstream/rpm.git] / lib / poptQV.c
1 #include "system.h"
2
3 #include "rpmbuild.h"
4 #include <rpmurl.h>
5
6 struct rpmQVArguments rpmQVArgs;
7 int specedit = 0;
8
9 /* ======================================================================== */
10 #define POPT_QUERYFORMAT        1000
11 #define POPT_WHATREQUIRES       1001
12 #define POPT_WHATPROVIDES       1002
13 #define POPT_QUERYBYNUMBER      1003
14 #define POPT_TRIGGEREDBY        1004
15 #define POPT_DUMP               1005
16 #define POPT_SPECFILE           1006
17
18 /* ========== Query/Verify source popt args */
19 static void rpmQVSourceArgCallback( /*@unused@*/ poptContext con,
20         /*@unused@*/ enum poptCallbackReason reason,
21         const struct poptOption * opt, /*@unused@*/ const char * arg, 
22         const void * data)
23 {
24     QVA_t *qva = (QVA_t *) data;
25
26     switch (opt->val) {
27     case 'q':
28     case 'Q':
29     case 'V':
30         if (qva->qva_mode == ' ') {
31             qva->qva_mode = opt->val;
32             qva->qva_char = ' ';
33         }
34         break;
35     case 'a': qva->qva_source |= RPMQV_ALL; qva->qva_sourceCount++; break;
36     case 'f': qva->qva_source |= RPMQV_PATH; qva->qva_sourceCount++; break;
37     case 'g': qva->qva_source |= RPMQV_GROUP; qva->qva_sourceCount++; break;
38     case 'p': qva->qva_source |= RPMQV_RPM; qva->qva_sourceCount++; break;
39     case POPT_WHATPROVIDES: qva->qva_source |= RPMQV_WHATPROVIDES; 
40                               qva->qva_sourceCount++; break;
41     case POPT_WHATREQUIRES: qva->qva_source |= RPMQV_WHATREQUIRES; 
42                               qva->qva_sourceCount++; break;
43     case POPT_TRIGGEREDBY: qva->qva_source |= RPMQV_TRIGGEREDBY;
44                               qva->qva_sourceCount++; break;
45
46 /* XXX SPECFILE is not verify sources */
47     case POPT_SPECFILE:
48         qva->qva_source |= RPMQV_SPECFILE;
49         qva->qva_sourceCount++;
50         break;
51     case POPT_QUERYBYNUMBER:
52         qva->qva_source |= RPMQV_DBOFFSET; 
53         qva->qva_sourceCount++;
54         break;
55     }
56 }
57
58 struct poptOption rpmQVSourcePoptTable[] = {
59         { NULL, '\0', POPT_ARG_CALLBACK | POPT_CBFLAG_INC_DATA, 
60                 rpmQVSourceArgCallback, 0, NULL, NULL },
61         { "file", 'f', 0, 0, 'f',
62                 N_("query package owning file"), "FILE" },
63         { "group", 'g', 0, 0, 'g',
64                 N_("query packages in group"), "GROUP" },
65         { "package", 'p', 0, 0, 'p',
66                 N_("query a package file"), NULL },
67         { "query", 'q', 0, NULL, 'q',
68                 N_("rpm query mode"), NULL },
69         { "querybynumber", '\0', POPT_ARGFLAG_DOC_HIDDEN, 0, 
70                 POPT_QUERYBYNUMBER, NULL, NULL },
71         { "querytags", '\0', 0, 0, 'Q',
72                 N_("display known query tags"), NULL },
73         { "specfile", '\0', 0, 0, POPT_SPECFILE,
74                 N_("query a spec file"), NULL },
75         { "triggeredby", '\0', 0, 0, POPT_TRIGGEREDBY, 
76                 N_("query the pacakges triggered by the package"), "PACKAGE" },
77         { "verify", 'V', 0, NULL, 'V',
78                 N_("rpm verify mode"), NULL },
79         { NULL, 'y',  POPT_ARGFLAG_DOC_HIDDEN, NULL, 'V',
80                 N_("rpm verify mode (legacy)"), NULL },
81         { "whatrequires", '\0', 0, 0, POPT_WHATREQUIRES, 
82                 N_("query the packages which require a capability"), "CAPABILITY" },
83         { "whatprovides", '\0', 0, 0, POPT_WHATPROVIDES, 
84                 N_("query the packages which provide a capability"), "CAPABILITY" },
85         { 0, 0, 0, 0, 0,        NULL, NULL }
86 };
87
88 /* ========== Query specific popt args */
89
90 static void queryArgCallback(/*@unused@*/poptContext con, /*@unused@*/enum poptCallbackReason reason,
91                              const struct poptOption * opt, const char * arg, 
92                              const void * data)
93 {
94     QVA_t *qva = (QVA_t *) data;
95
96     switch (opt->val) {
97     case 'c': qva->qva_flags |= QUERY_FOR_CONFIG | QUERY_FOR_LIST; break;
98     case 'd': qva->qva_flags |= QUERY_FOR_DOCS | QUERY_FOR_LIST; break;
99     case 'l': qva->qva_flags |= QUERY_FOR_LIST; break;
100     case 's': qva->qva_flags |= QUERY_FOR_STATE | QUERY_FOR_LIST;
101         break;
102     case POPT_DUMP: qva->qva_flags |= QUERY_FOR_DUMPFILES | QUERY_FOR_LIST; break;
103     case 'v': rpmIncreaseVerbosity();    break;
104
105     case POPT_QUERYFORMAT:
106       { char *qf = (char *)qva->qva_queryFormat;
107         if (qf) {
108             int len = strlen(qf) + strlen(arg) + 1;
109             qf = xrealloc(qf, len);
110             strcat(qf, arg);
111         } else {
112             qf = xmalloc(strlen(arg) + 1);
113             strcpy(qf, arg);
114         }
115         qva->qva_queryFormat = qf;
116       } break;
117     }
118 }
119
120 struct poptOption rpmQueryPoptTable[] = {
121         { NULL, '\0', POPT_ARG_CALLBACK | POPT_CBFLAG_INC_DATA, 
122                 queryArgCallback, 0, NULL, NULL },
123         { "configfiles", 'c', 0, 0, 'c',
124                 N_("list all configuration files"), NULL },
125         { "docfiles", 'd', 0, 0, 'd',
126                 N_("list all documentation files"), NULL },
127         { "dump", '\0', 0, 0, POPT_DUMP,
128                 N_("dump basic file information"), NULL },
129         { "list", 'l', 0, 0, 'l',
130                 N_("list files in package"), NULL },
131         { "qf", '\0', POPT_ARG_STRING | POPT_ARGFLAG_DOC_HIDDEN, 0, 
132                 POPT_QUERYFORMAT, NULL, NULL },
133         { "queryformat", '\0', POPT_ARG_STRING, 0, POPT_QUERYFORMAT,
134                 N_("use the following query format"), "QUERYFORMAT" },
135         { "specedit", '\0', POPT_ARG_VAL, &specedit, -1,
136                 N_("substitute i18n sections into spec file"), NULL },
137         { "state", 's', 0, 0, 's',
138                 N_("display the states of the listed files"), NULL },
139         { "verbose", 'v', 0, 0, 'v',
140                 N_("display a verbose file listing"), NULL },
141         { 0, 0, 0, 0, 0,        NULL, NULL }
142 };
143
144 /* ======================================================================== */