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