1/*
2 * Copyright (c) 2006 Apple Computer, Inc. All rights reserved.
3 *
4 * @APPLE_LICENSE_HEADER_START@
5 *
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. Please obtain a copy of the License at
10 * http://www.opensource.apple.com/apsl/ and read it before using this
11 * file.
12 *
13 * The Original Code and all software distributed under the License are
14 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
15 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
16 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
18 * Please see the License for the specific language governing rights and
19 * limitations under the License.
20 *
21 * @APPLE_LICENSE_HEADER_END@
22 */
23#ifndef _KEXTFIND_QUERY_H_
24#define _KEXTFIND_QUERY_H_
25
26#include "QEQuery.h"
27#include "kextfind_tables.h"
28
29/*******************************************************************************
30* PREDICATES
31*
32* These are the basic atoms of a query expression.
33*******************************************************************************/
34
35
36/*****
37 * Info Dictionary predicates.
38 */
39#define kPredNameProperty                "-property"
40#define kPredNamePropertyExists          "-property-exists"
41#define kPredNameMatchProperty           "-match-property"
42#define kPredNameMatchPropertyExists     "-match-property-exists"
43
44/*****
45 * "Flag" predicates.
46 *
47 * Any predicate that is just "is the kext so?" is considered a boolean flag
48 * and handled internally with the same eval callback, triggered by the
49 * special kPredNameFlag predicate; the predicate keyword itself is stored
50 * in the query element under the key "flag".
51 */
52#define kPredNameFlag                    "__flag__"
53
54#define kPredNameLoaded                  "-loaded"
55
56#define kPredNameValid                   "-valid"
57#define kPredNameAuthentic               "-authentic"
58#define kPredNameDependenciesMet         "-dependencies-met"
59#define kPredNameLoadable                "-loadable"
60
61#define kPredNameWarnings                "-warnings"
62
63#define kPredNameIsLibrary               "-library"
64#define kPredNameHasPlugins              "-has-plugins"
65#define kPredNameIsPlugin                "-plugin"
66#define kPredNameHasDebugProperties      "-debug"
67#define kPredNameIsKernelResource        "-kernel-resource"
68
69#define kPredNameDuplicate               "-duplicate-id"
70
71// Flag Shorthands; I may dump these as they are all just logical
72// negations of shorter predicates.
73#define kPredNameInvalid                 "-invalid"
74#define kPredNameInauthentic             "-inauthentic"
75#define kPredNameDependenciesMissing     "-dependencies-missing"
76#define kPredNameNonloadable             "-nonloadable"
77
78/*****
79 * Version-checking predicates.
80 */
81#define kPredNameVersion                 "-version"
82#define kPredNameCompatibleWithVersion   "-compatible-with-version"
83
84/*****
85 * BOM-integrity predicates.
86 *
87 * Kext integrity is no longer used on SnowLeopard. We read the
88 * flags but no kext will ever match them now.
89 */
90#define kPredNameIntegrity               "-integrity"
91
92/*****
93 * Executable-checking predicates.
94 */
95#define kPredNameArch                    "-arch"
96#define kPredNameArchExact               "-arch-exact"
97#define kPredNameExecutable              "-executable"
98#define kPredNameNoExecutable            "-no-executable"
99
100#define kPredNameDefinesSymbol           "-defines-symbol"
101#define kPredNameReferencesSymbol        "-references-symbol"
102
103/*****
104 * Property shorthands.
105 *
106 * The bundle ID shorthands are direct property queries, and work with
107 * the -case-insensitive command line option, but the OSBundleRequired
108 * shorthands enforce strict case-matching for correct handling.
109 */
110#define kPredNameBundleID                "-bundle-id"
111#define kPredNameBundleName              "-bundle-name"
112#define kPredNameRoot                    "-root"
113#define kPredNameConsole                 "-console"
114#define kPredNameLocalRoot               "-local-root"
115#define kPredNameNetworkRoot             "-network-root"
116#define kPredNameSafeBoot                "-safe-boot"
117
118/*****
119 * Output commands.
120 *
121 * These all print some info and evaluate to true.
122 *
123 * All commands are handled internally with the same eval callback, triggered
124 * by the special kPredNameCommand predicate; the command itself is stored
125 * in the query element under the key "command".
126 */
127#define kPredNameCommand                 "__command__"
128
129// Any command that begins with this, except for -print0 and -print-diagnostics,
130// can take the -0 option to terminate output with a nul rather than a newline.
131#define kPredPrefixPrint                 "-print"
132
133#define kPredNameEcho                    "-echo"
134#define kPredNameExec                    "-exec"
135#define kPredNamePrint                   "-print"
136#define kPredNamePrint0                  "-print0"
137#define kPredNamePrintDiagnostics        "-print-diagnostics"
138#define kPredNamePrintProperty           "-print-property"
139#define kPredNamePrintMatchProperty      "-print-match-property"
140#define kPredNamePrintArches             "-print-arches"
141#define kPredNamePrintDependencies       "-print-dependencies"
142#define kPredNamePrintDependents         "-print-dependents"
143#define kPredNamePrintIntegrity          "-print-integrity"
144#define kPredNamePrintPlugins            "-print-plugins"
145#define kPredNamePrintInfoDictionary     "-print-info-dictionary"
146#define kPredNamePrintExecutable         "-print-executable"
147
148
149#define kExecInfoDictionaryReplace       "{info-dictionary}"
150#define kExecExecutableReplace           "{executable}"
151#define kExecBundlePathReplace           "{}"
152#define kExecTerminator                  ";"
153
154/*****
155 * Shorter options for the more common predicates.
156 */
157#define kPredCharProperty                "-p"
158#define kPredCharPropertyExists          "-pe"
159#define kPredCharMatchProperty           "-m"
160#define kPredCharMatchPropertyExists     "-me"
161
162#define kPredCharValid                   "-v"
163#define kPredCharAuthentic               "-a"
164#define kPredCharDependenciesMet         "-d"
165#define kPredCharLoadable                "-l"
166
167#define kPredCharDuplicate               "-dup"
168
169#define kPredCharInvalid                 "-nv"
170#define kPredCharInauthentic             "-na"
171#define kPredCharDependenciesMissing     "-nd"
172#define kPredCharNonloadable             "-nl"
173
174#define kPredCharWarnings                "-w"
175
176#define kPredCharVersion                 "-V"
177#define kPredCharIsLibrary               "-lib"
178
179#define kPredCharArchExact               "-ax"
180#define kPredCharExecutable              "-x"
181#define kPredCharNoExecutable            "-nx"
182#define kPredCharDefinesSymbol           "-dsym"
183#define kPredCharReferencesSymbol        "-rsym"
184
185#define kPredCharBundleID                "-b"
186#define kPredCharBundleName              "-B"
187
188#define kPredCharRoot                    "-R"
189#define kPredCharConsole                 "-C"
190#define kPredCharLocalRoot               "-L"
191#define kPredCharNetworkRoot             "-N"
192#define kPredCharSafeBoot                "-S"
193
194//#define kPredCharPrint0                 "-p0"
195#define kPredCharPrintDiagnostics        "-pdiag"
196#define kPredCharPrintProperty           "-pp"
197#define kPredCharPrintMatchProperty      "-pm"
198#define kPredCharPrintArches             "-pa"
199//#define kPredCharPrintDependencies     "-print-dependencies"
200//#define kPredCharPrintDependents       "-print-dependents"
201//#define kPredCharPrintPlugins          "-print-plugins"
202#define kPredCharPrintInfoDictionary     "-pid"
203#define kPredCharPrintExecutable         "-px"
204
205/*******************************************************************************
206* Stuff for query & reporting parse/eval.
207*******************************************************************************/
208
209/*****
210 * Options to predicates. These do *not* include the hyphen
211 * cause they get used with getopt_long_only().
212 */
213// Do not use -1, that's getopt() end-of-args return value
214#define kPredOptNameNoNewline            "no-newline"
215#define kPredOptNoNewline                'n'
216#define kPredOptNameCaseInsensitive      kOptNameCaseInsensitive
217#define kPredOptCaseInsensitive          kOptCaseInsensitive
218#define kPredOptNameSubstring            "substring"
219#define kPredOptSubstring                's'
220
221/*****
222 * These keys get stuffed into a query element dictionary to alter how it's
223 * evaluated. (Maybe they should get put into the arguments.)
224 */
225#define kSearchStyleExact           "exact"
226#define kSearchStyleCaseInsensitive "case-insensitive"
227#define kSearchStyleSubstring       "substring"
228#define kSearchStyleKeyExists       "exists"
229
230/*****
231 * XXX: These OSBundleRequired definitions should be done by the kext library.
232 */
233#define kOSBundleRequired             "OSBundleRequired"
234#define kOSBundleRequiredRoot         "Root"
235#define kOSBundleRequiredConsole      "Console"
236#define kOSBundleRequiredLocalRoot    "Local-Root"
237#define kOSBundleRequiredNetworkRoot  "Network-Root"
238#define kOSBundleRequiredSafeBoot     "Safe Boot"
239
240/*****
241 * Command-line keywords for the five possible integrity states.
242 *
243 * Kext integrity is no longer used on SnowLeopard. We read the
244 * flags but no kext will ever match them now.
245 */
246#define kIntegrityCorrect             "correct"
247#define kIntegrityUnknown             "unknown"
248#define kIntegrityNotApple            "not-apple"
249#define kIntegrityNoReceipt           "no-receipt"
250#define kIntegrityModified            "modified"
251
252#define kIntegrityNotApplicable       "n/a"
253
254#define kKeywordFlag    "flag"
255#define kKeywordCommand "command"
256
257#define kWordTrue  "true"
258#define kWordYes   "yes"
259#define kWord1     "1"
260#define kWordFalse "false"
261#define kWordNo    "no"
262#define kWord0     "0"
263
264/*******************************************************************************
265* Query Engine Callbacks
266*
267* The Query Engine invokes these as it finds keywords from the above list
268* in the command line or the query being evaluated.
269*******************************************************************************/
270Boolean parseArgument(
271    CFMutableDictionaryRef element,
272    char * const argv[],
273    uint32_t * num_used,
274    void * user_data,
275    QEQueryError * error);
276
277Boolean parseBundleName(
278    CFMutableDictionaryRef element,
279    int argc,
280    char * const argv[],
281    uint32_t * num_used,
282    void * user_data,
283    QEQueryError * error);
284
285Boolean evalBundleName(
286    CFDictionaryRef queryElement,
287    void * object,
288    void * user_data,
289    QEQueryError * error);
290
291Boolean parseProperty(
292    CFMutableDictionaryRef element,
293    int argc,
294    char * const argv[],
295    uint32_t * num_used,
296    void * user_data,
297    QEQueryError * error);
298
299Boolean parseShorthand(
300    CFMutableDictionaryRef element,
301    int argc,
302    char * const argv[],
303    uint32_t * num_used,
304    void * user_data,
305    QEQueryError * error);
306
307Boolean evalProperty(
308    CFDictionaryRef queryElement,
309    void * object,
310    void * user_data,
311    QEQueryError * error);
312
313Boolean parseMatchProperty(
314    CFMutableDictionaryRef element,
315    int argc,
316    char * const argv[],
317    uint32_t * num_used,
318    void * user_data,
319    QEQueryError * error);
320
321Boolean evalMatchProperty(
322    CFDictionaryRef queryElement,
323    void * object,
324    void * user_data,
325    QEQueryError * error);
326
327Boolean parseIntegrity(
328    CFMutableDictionaryRef element,
329    int argc,
330    char * const argv[],
331    uint32_t * num_used,
332    void * user_data,
333    QEQueryError * error);
334
335Boolean evalIntegrity(
336    CFDictionaryRef queryElement,
337    void * object,
338    void * user_data,
339    QEQueryError * error);
340
341Boolean parseFlag(
342    CFMutableDictionaryRef element,
343    int argc,
344    char * const argv[],
345    uint32_t * num_used,
346    void * user_data,
347    QEQueryError * error);
348
349Boolean evalFlag(
350    CFDictionaryRef queryElement,
351    void * object,
352    void * user_data,
353    QEQueryError * error);
354
355Boolean parseVersion(
356    CFMutableDictionaryRef element,
357    int argc,
358    char * const argv[],
359    uint32_t * num_used,
360    void * user_data,
361    QEQueryError * error);
362
363Boolean evalVersion(
364    CFDictionaryRef queryElement,
365    void * object,
366    void * user_data,
367    QEQueryError * error);
368
369Boolean parseCompatibleWithVersion(
370    CFMutableDictionaryRef element,
371    int argc,
372    char * const argv[],
373    uint32_t * num_used,
374    void * user_data,
375    QEQueryError * error);
376
377Boolean evalCompatibleWithVersion(
378    CFDictionaryRef queryElement,
379    void * object,
380    void * user_data,
381    QEQueryError * error);
382
383Boolean parseArch(
384    CFMutableDictionaryRef element,
385    int argc,
386    char * const argv[],
387    uint32_t * num_used,
388    void * user_data,
389    QEQueryError * error);
390
391Boolean evalArch(
392    CFDictionaryRef queryElement,
393    void * object,
394    void * user_data,
395    QEQueryError * error);
396
397Boolean evalArchExact(
398    CFDictionaryRef queryElement,
399    void * object,
400    void * user_data,
401    QEQueryError * error);
402
403Boolean parseCommand(
404    CFMutableDictionaryRef element,
405    int argc,
406    char * const argv[],
407    uint32_t * num_used,
408    void * user_data,
409    QEQueryError * error);
410
411Boolean parseDefinesOrReferencesSymbol(
412    CFMutableDictionaryRef element,
413    int argc,
414    char * const argv[],
415    uint32_t * num_used,
416    void * user_data,
417    QEQueryError * error);
418
419Boolean evalDefinesOrReferencesSymbol(
420    CFDictionaryRef queryElement,
421    void * object,
422    void * user_data,
423    QEQueryError * error);
424
425Boolean evalCommand(
426    CFDictionaryRef queryElement,
427    void * object,
428    void * user_data,
429    QEQueryError * error);
430
431Boolean parseExec(
432    CFMutableDictionaryRef element,
433    int argc,
434    char * const argv[],
435    uint32_t * num_used,
436    void * user_data,
437    QEQueryError * error);
438
439Boolean evalExec(
440    CFDictionaryRef queryElement,
441    void * object,
442    void * user_data,
443    QEQueryError * error);
444
445#endif /* _KEXTFIND_QUERY_H_ */
446