kextfind_query.h   [plain text]


/*
 * Copyright (c) 2006 Apple Computer, Inc. All rights reserved.
 *
 * @APPLE_LICENSE_HEADER_START@
 * 
 * This file contains Original Code and/or Modifications of Original Code
 * as defined in and that are subject to the Apple Public Source License
 * Version 2.0 (the 'License'). You may not use this file except in
 * compliance with the License. Please obtain a copy of the License at
 * http://www.opensource.apple.com/apsl/ and read it before using this
 * file.
 * 
 * The Original Code and all software distributed under the License are
 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
 * Please see the License for the specific language governing rights and
 * limitations under the License.
 * 
 * @APPLE_LICENSE_HEADER_END@
 */
#ifndef _KEXTFIND_QUERY_H_
#define _KEXTFIND_QUERY_H_

#include "QEQuery.h"
#include "kextfind_tables.h"

/*******************************************************************************
* PREDICATES
*
* These are the basic atoms of a query expression.
*******************************************************************************/


/*****
 * Info Dictionary predicates.
 */
#define kPredNameProperty                "-property"
#define kPredNamePropertyExists          "-property-exists"
#define kPredNameMatchProperty           "-match-property"
#define kPredNameMatchPropertyExists     "-match-property-exists"

/*****
 * "Flag" predicates.
 *
 * Any predicate that is just "is the kext so?" is considered a boolean flag
 * and handled internally with the same eval callback, triggered by the
 * special kPredNameFlag predicate; the predicate keyword itself is stored
 * in the query element under the key "flag".
 */
#define kPredNameFlag                    "__flag__"

#define kPredNameLoaded                  "-loaded"

#define kPredNameValid                   "-valid"
#define kPredNameAuthentic               "-authentic"
#define kPredNameDependenciesMet         "-dependencies-met"
#define kPredNameLoadable                "-loadable"

#define kPredNameWarnings                "-warnings"

#define kPredNameIsLibrary               "-library"
#define kPredNameHasPlugins              "-has-plugins"
#define kPredNameIsPlugin                "-plugin"
#define kPredNameHasDebugProperties      "-debug"
#define kPredNameIsKernelResource        "-kernel-resource"

#define kPredNameDuplicate               "-duplicate-id"

// Flag Shorthands; I may dump these as they are all just logical
// negations of shorter predicates.
#define kPredNameInvalid                 "-invalid"
#define kPredNameInauthentic             "-inauthentic"
#define kPredNameDependenciesMissing     "-dependencies-missing"
#define kPredNameNonloadable             "-nonloadable"

/*****
 * Version-checking predicates.
 */
#define kPredNameVersion                 "-version"
#define kPredNameCompatibleWithVersion   "-compatible-with-version"

/*****
 * BOM-integrity predicates.
 *
 * Kext integrity is no longer used on SnowLeopard. We read the
 * flags but no kext will ever match them now.
 */
#define kPredNameIntegrity               "-integrity"

/*****
 * Executable-checking predicates.
 */
#define kPredNameArch                    "-arch"
#define kPredNameArchExact               "-arch-exact"
#define kPredNameExecutable              "-executable"
#define kPredNameNoExecutable            "-no-executable"

#define kPredNameDefinesSymbol           "-defines-symbol"
#define kPredNameReferencesSymbol        "-references-symbol"

/*****
 * Property shorthands.
 *
 * The bundle ID shorthands are direct property queries, and work with
 * the -case-insensitive command line option, but the OSBundleRequired
 * shorthands enforce strict case-matching for correct handling.
 */
#define kPredNameBundleID                "-bundle-id"
#define kPredNameBundleName              "-bundle-name"
#define kPredNameRoot                    "-root"
#define kPredNameConsole                 "-console"
#define kPredNameLocalRoot               "-local-root"
#define kPredNameNetworkRoot             "-network-root"
#define kPredNameSafeBoot                "-safe-boot"

/*****
 * Output commands.
 *
 * These all print some info and evaluate to true. 
 *
 * All commands are handled internally with the same eval callback, triggered
 * by the special kPredNameCommand predicate; the command itself is stored
 * in the query element under the key "command".
 */
#define kPredNameCommand                 "__command__"

// Any command that begins with this, except for -print0 and -print-diagnostics,
// can take the -0 option to terminate output with a nul rather than a newline.
#define kPredPrefixPrint                 "-print"

#define kPredNameEcho                    "-echo"
#define kPredNameExec                    "-exec"
#define kPredNamePrint                   "-print"
#define kPredNamePrint0                  "-print0"
#define kPredNamePrintDiagnostics        "-print-diagnostics"
#define kPredNamePrintProperty           "-print-property"
#define kPredNamePrintMatchProperty      "-print-match-property"
#define kPredNamePrintArches             "-print-arches"
#define kPredNamePrintDependencies       "-print-dependencies"
#define kPredNamePrintDependents         "-print-dependents"
#define kPredNamePrintIntegrity          "-print-integrity"
#define kPredNamePrintPlugins            "-print-plugins"
#define kPredNamePrintInfoDictionary     "-print-info-dictionary"
#define kPredNamePrintExecutable         "-print-executable"


#define kExecInfoDictionaryReplace       "{info-dictionary}"
#define kExecExecutableReplace           "{executable}"
#define kExecBundlePathReplace           "{}"
#define kExecTerminator                  ";"

/*****
 * Shorter options for the more common predicates.
 */
#define kPredCharProperty                "-p"
#define kPredCharPropertyExists          "-pe"
#define kPredCharMatchProperty           "-m"
#define kPredCharMatchPropertyExists     "-me"

#define kPredCharValid                   "-v"
#define kPredCharAuthentic               "-a"
#define kPredCharDependenciesMet         "-d"
#define kPredCharLoadable                "-l"

#define kPredCharDuplicate               "-dup"

#define kPredCharInvalid                 "-nv"
#define kPredCharInauthentic             "-na"
#define kPredCharDependenciesMissing     "-nd"
#define kPredCharNonloadable             "-nl"

#define kPredCharWarnings                "-w"

#define kPredCharVersion                 "-V"
#define kPredCharIsLibrary               "-lib"

#define kPredCharArchExact               "-ax"
#define kPredCharExecutable              "-x"
#define kPredCharNoExecutable            "-nx"
#define kPredCharDefinesSymbol           "-dsym"
#define kPredCharReferencesSymbol        "-rsym"

#define kPredCharBundleID                "-b"
#define kPredCharBundleName              "-B"

#define kPredCharRoot                    "-R"
#define kPredCharConsole                 "-C"
#define kPredCharLocalRoot               "-L"
#define kPredCharNetworkRoot             "-N"
#define kPredCharSafeBoot                "-S"

//#define kPredCharPrint0                 "-p0"
#define kPredCharPrintDiagnostics        "-pdiag"
#define kPredCharPrintProperty           "-pp"
#define kPredCharPrintMatchProperty      "-pm"
#define kPredCharPrintArches             "-pa"
//#define kPredCharPrintDependencies     "-print-dependencies"
//#define kPredCharPrintDependents       "-print-dependents"
//#define kPredCharPrintPlugins          "-print-plugins"
#define kPredCharPrintInfoDictionary     "-pid"
#define kPredCharPrintExecutable         "-px"

/*******************************************************************************
* Stuff for query & reporting parse/eval.
*******************************************************************************/

/*****
 * Options to predicates. These do *not* include the hyphen
 * cause they get used with getopt_long_only().
 */
// Do not use -1, that's getopt() end-of-args return value
#define kPredOptNameNoNewline            "no-newline"
#define kPredOptNoNewline                'n'
#define kPredOptNameCaseInsensitive      kOptNameCaseInsensitive
#define kPredOptCaseInsensitive          kOptCaseInsensitive
#define kPredOptNameSubstring            "substring"
#define kPredOptSubstring                's'

/*****
 * These keys get stuffed into a query element dictionary to alter how it's
 * evaluated. (Maybe they should get put into the arguments.)
 */
#define kSearchStyleExact           "exact"
#define kSearchStyleCaseInsensitive "case-insensitive"
#define kSearchStyleSubstring       "substring"
#define kSearchStyleKeyExists       "exists"

/*****
 * XXX: These OSBundleRequired definitions should be done by the kext library.
 */
#define kOSBundleRequired             "OSBundleRequired"
#define kOSBundleRequiredRoot         "Root"
#define kOSBundleRequiredConsole      "Console"
#define kOSBundleRequiredLocalRoot    "Local-Root"
#define kOSBundleRequiredNetworkRoot  "Network-Root"
#define kOSBundleRequiredSafeBoot     "Safe Boot"

/*****
 * Command-line keywords for the five possible integrity states.
 *
 * Kext integrity is no longer used on SnowLeopard. We read the
 * flags but no kext will ever match them now.
 */
#define kIntegrityCorrect             "correct"
#define kIntegrityUnknown             "unknown"
#define kIntegrityNotApple            "not-apple"
#define kIntegrityNoReceipt           "no-receipt"
#define kIntegrityModified            "modified"

#define kIntegrityNotApplicable       "n/a"

#define kKeywordFlag    "flag"
#define kKeywordCommand "command"

#define kWordTrue  "true"
#define kWordYes   "yes"
#define kWord1     "1"
#define kWordFalse "false"
#define kWordNo    "no"
#define kWord0     "0"

/*******************************************************************************
* Query Engine Callbacks
*
* The Query Engine invokes these as it finds keywords from the above list
* in the command line or the query being evaluated.
*******************************************************************************/
Boolean parseArgument(
    CFMutableDictionaryRef element,
    char * const argv[],
    uint32_t * num_used,
    void * user_data,
    QEQueryError * error);

Boolean parseBundleName(
    CFMutableDictionaryRef element,
    int argc,
    char * const argv[],
    uint32_t * num_used,
    void * user_data,
    QEQueryError * error);

Boolean evalBundleName(
    CFDictionaryRef queryElement,
    void * object,
    void * user_data,
    QEQueryError * error);

Boolean parseProperty(
    CFMutableDictionaryRef element,
    int argc,
    char * const argv[],
    uint32_t * num_used,
    void * user_data,
    QEQueryError * error);

Boolean parseShorthand(
    CFMutableDictionaryRef element,
    int argc,
    char * const argv[],
    uint32_t * num_used,
    void * user_data,
    QEQueryError * error);

Boolean evalProperty(
    CFDictionaryRef queryElement,
    void * object,
    void * user_data,
    QEQueryError * error);

Boolean parseMatchProperty(
    CFMutableDictionaryRef element,
    int argc,
    char * const argv[],
    uint32_t * num_used,
    void * user_data,
    QEQueryError * error);

Boolean evalMatchProperty(
    CFDictionaryRef queryElement,
    void * object,
    void * user_data,
    QEQueryError * error);

Boolean parseIntegrity(
    CFMutableDictionaryRef element,
    int argc,
    char * const argv[],
    uint32_t * num_used,
    void * user_data,
    QEQueryError * error);

Boolean evalIntegrity(
    CFDictionaryRef queryElement,
    void * object,
    void * user_data,
    QEQueryError * error);

Boolean parseFlag(
    CFMutableDictionaryRef element,
    int argc,
    char * const argv[],
    uint32_t * num_used,
    void * user_data,
    QEQueryError * error);

Boolean evalFlag(
    CFDictionaryRef queryElement,
    void * object,
    void * user_data,
    QEQueryError * error);

Boolean parseVersion(
    CFMutableDictionaryRef element,
    int argc,
    char * const argv[],
    uint32_t * num_used,
    void * user_data,
    QEQueryError * error);

Boolean evalVersion(
    CFDictionaryRef queryElement,
    void * object,
    void * user_data,
    QEQueryError * error);

Boolean parseCompatibleWithVersion(
    CFMutableDictionaryRef element,
    int argc,
    char * const argv[],
    uint32_t * num_used,
    void * user_data,
    QEQueryError * error);

Boolean evalCompatibleWithVersion(
    CFDictionaryRef queryElement,
    void * object,
    void * user_data,
    QEQueryError * error);

Boolean parseArch(
    CFMutableDictionaryRef element,
    int argc,
    char * const argv[],
    uint32_t * num_used,
    void * user_data,
    QEQueryError * error);

Boolean evalArch(
    CFDictionaryRef queryElement,
    void * object,
    void * user_data,
    QEQueryError * error);

Boolean evalArchExact(
    CFDictionaryRef queryElement,
    void * object,
    void * user_data,
    QEQueryError * error);

Boolean parseCommand(
    CFMutableDictionaryRef element,
    int argc,
    char * const argv[],
    uint32_t * num_used,
    void * user_data,
    QEQueryError * error);

Boolean parseDefinesOrReferencesSymbol(
    CFMutableDictionaryRef element,
    int argc,
    char * const argv[],
    uint32_t * num_used,
    void * user_data,
    QEQueryError * error);

Boolean evalDefinesOrReferencesSymbol(
    CFDictionaryRef queryElement,
    void * object,
    void * user_data,
    QEQueryError * error);

Boolean evalCommand(
    CFDictionaryRef queryElement,
    void * object,
    void * user_data,
    QEQueryError * error);

Boolean parseExec(
    CFMutableDictionaryRef element,
    int argc,
    char * const argv[],
    uint32_t * num_used,
    void * user_data,
    QEQueryError * error);

Boolean evalExec(
    CFDictionaryRef queryElement,
    void * object,
    void * user_data,
    QEQueryError * error);

#endif /* _KEXTFIND_QUERY_H_ */