1/*
2 *  kextlibs_main.h
3 *  kext_tools
4 *
5 *  Created by Nik Gervae on 5/03/08.
6 *  Copyright 2008 Apple Inc. All rights reserved.
7 *
8 */
9#ifndef _KEXTLIBS_MAIN_H
10#define _KEXTLIBS_MAIN_H
11
12#include <CoreFoundation/CoreFoundation.h>
13#include <IOKit/kext/OSKext.h>
14
15#include <getopt.h>
16#include <sysexits.h>
17
18#include <mach-o/arch.h>
19
20#include "kext_tools_util.h"
21
22#pragma mark Basic Types & Constants
23/*******************************************************************************
24* Constants
25*******************************************************************************/
26enum {
27    kKextlibsExitOK          = EX_OK,
28    kKextlibsExitUndefineds  = 1,
29    kKextlibsExitMultiples   = 2,
30
31    // don't actually exit with this, it's just a sentinel value
32    kKextlibsExitHelp        = 33
33};
34
35#pragma mark Command-line Option Definitions
36/*******************************************************************************
37* Command-line options. This data is used by getopt_long_only().
38*
39* Options common to all kext tools are in kext_tools_util.h.
40*******************************************************************************/
41
42#define kOptNameXML               "xml"
43#define kOptNameCompatible        "compatible-versions"
44#define kOptNameAllSymbols        "all-symbols"
45#define kOptNameUndefSymbols      "undef-symbols"
46#define kOptNameOnedefSymbols     "onedef-symbols"
47#define kOptNameMultdefSymbols    "multdef-symbols"
48#define kOptNameNonKPI            "non-kpi"
49#define kOptNameUnsupported       "unsupported"
50#define kOptNameLibraryRefs       "library-references"
51
52#define kOptCompatible           'c'
53#define kOptSystemExtensions     'e'
54#define kOptRepository           'r'
55
56#define kOptChars                "cehr:"
57
58/* Options with no single-letter variant.  */
59// Do not use -1, that's getopt() end-of-args return value
60// and can cause confusion
61#define kLongOptLongindexHack  (-2)
62#define kLongOptXML            (-3)
63#define kLongOptAllSymbols     (-4)
64#define kLongOptUndefSymbols   (-5)
65#define kLongOptOnedefSymbols  (-6)
66#define kLongOptMultdefSymbols (-7)
67#define kLongOptNonKPI         (-8)
68#define kLongOptUnsupported    (-9)
69
70int longopt = 0;
71
72struct option sOptInfo[] = {
73    { kOptNameHelp,             no_argument,        NULL,     kOptHelp },
74    { kOptNameSystemExtensions, no_argument,        NULL,     kOptSystemExtensions },
75    { kOptNameRepository,       required_argument,  NULL,     kOptRepository },
76    { kOptNameCompatible,       no_argument,        NULL,     kOptCompatible },
77    { kOptNameXML,              no_argument,        &longopt, kLongOptXML },
78    { kOptNameAllSymbols,       no_argument,        &longopt, kLongOptAllSymbols },
79    { kOptNameUndefSymbols,     no_argument,        &longopt, kLongOptUndefSymbols },
80    { kOptNameOnedefSymbols,    no_argument,        &longopt, kLongOptOnedefSymbols },
81    { kOptNameMultdefSymbols,   no_argument,        &longopt, kLongOptMultdefSymbols },
82    { kOptNameNonKPI,           no_argument,        &longopt, kLongOptNonKPI },
83    { kOptNameUnsupported,      no_argument,        &longopt, kLongOptUnsupported },
84
85    { kOptNameQuiet,                 no_argument,        NULL,     kOptQuiet },
86    { kOptNameVerbose,               optional_argument,  NULL,     kOptVerbose },
87
88    { NULL, 0, NULL, 0 }  // sentinel to terminate list
89};
90
91#pragma mark Tool Args Structure
92/*******************************************************************************
93* Tool Args Structure
94*******************************************************************************/
95typedef struct {
96    Boolean            flagSysKexts;
97    Boolean            flagXML;
98    Boolean            flagCompatible;
99    Boolean            flagPrintUndefSymbols;
100    Boolean            flagPrintOnedefSymbols;
101    Boolean            flagPrintMultdefSymbols;
102    Boolean            flagNonKPI;
103    Boolean            flagAllowUnsupported;
104    CFMutableArrayRef  repositoryURLs;   // must release
105    char             * kextName;         // do not free; from argv
106    CFURLRef           kextURL;          // must release
107    OSKextRef          theKext;
108} KextlibsArgs;
109
110typedef struct {
111    CFArrayRef       libKexts;
112    CFDictionaryRef  undefSymbols;
113    CFDictionaryRef  onedefSymbols;
114    CFDictionaryRef  multdefSymbols;
115    CFArrayRef       multdefLibs;
116} KextlibsInfo;
117
118#pragma mark Function Prototypes
119/*******************************************************************************
120* Function Prototypes
121*******************************************************************************/
122ExitStatus readArgs(
123    int            argc,
124    char * const * argv,
125    KextlibsArgs * toolArgs);
126ExitStatus addRepository(
127    KextlibsArgs    * toolArgs,
128    const char      * optarg);
129ExitStatus printLibs(
130    KextlibsArgs     * toolArgs,
131    const NXArchInfo * arch,
132    CFArrayRef         libKexts,
133    Boolean            trailingNewlineFlag);
134ExitStatus printProblems(
135    KextlibsArgs     * toolArgs,
136    const NXArchInfo * arch,
137    CFDictionaryRef    undefSymbols,
138    CFDictionaryRef    onedefSymbols,
139    CFDictionaryRef    multdefSymbols,
140    CFArrayRef         multdefLibs,
141    Boolean            printArchFlag,
142    Boolean            trailingNewlineFlag);
143ExitStatus printResults(
144    KextlibsArgs     * toolArgs,
145    const NXArchInfo * arch,
146    Boolean            archSpecific,
147    CFArrayRef         libKexts,
148    CFDictionaryRef    undefSymbols,
149    CFDictionaryRef    onedefSymbols,
150    CFDictionaryRef    multdefSymbols,
151    CFArrayRef         multdefLibs);
152void printUndefSymbol(const void * key, const void * value, void * context);
153void printOnedefSymbol(const void * key, const void * value, void * context);
154void printMultdefSymbol(const void * key, const void * value, void * context);
155
156static void usage(UsageLevel usageLevel);
157
158#endif /* _KEXTLIBS_MAIN_H */
159