1/*
2 *  kextload_main.h
3 *  kext_tools
4 *
5 *  Created by Nik Gervae on 11/08/08.
6 *  Copyright 2008 Apple Inc. All rights reserved.
7 *
8 */
9#ifndef _KEXTLOAD_MAIN_H
10#define _KEXTLOAD_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 <IOKit/kext/OSKext.h>
19
20#include "kext_tools_util.h"
21
22#pragma mark Basic Types & Constants
23/*******************************************************************************
24* Constants
25*******************************************************************************/
26
27enum {
28    kKextloadExitOK          = EX_OK,
29
30    kKextloadExitUnspecified = 10,
31
32    // don't actually exit with this, it's just a sentinel value
33    kKextloadExitHelp        = 33,
34};
35
36#pragma mark Command-line Option Definitions
37/*******************************************************************************
38* Command-line options. This data is used by getopt_long_only().
39*
40* Options common to all kext tools are in kext_tools_util.h.
41*******************************************************************************/
42#define kOptNameDependency              "dependency"
43
44#define kOptNameTests                   "print-diagnostics"
45
46// Obsolete options that might be used for a production load
47#define kOptNameNoCaches                "no-caches"
48#define kOptNameNoLoadedCheck           "no-loaded-check"
49#define kOptNameTests                   "print-diagnostics"
50
51#define kOptNameLongindexHack           "________"
52
53#define kOptDependency            'd'
54#define kOptRepository            'r'
55
56// Obsolete options that might be used for a production load
57#define kOptNoCaches              'c'
58#define kOptNoLoadedCheck         'D'
59#define kOptTests                 't'
60
61/* Options with no single-letter variant.  */
62// Do not use -1, that's getopt() end-of-args return value
63// and can cause confusion
64#define kLongOptLongindexHack    (-2)
65#define kLongOptArch             (-3)
66
67#define kOptChars                "b:cd:Dhqr:tv"
68
69int longopt = 0;
70
71struct option sOptInfo[] = {
72    { kOptNameLongindexHack,         no_argument,        &longopt, kLongOptLongindexHack },
73    { kOptNameHelp,                  no_argument,        NULL,     kOptHelp },
74    { kOptNameBundleIdentifier,      required_argument,  NULL,     kOptBundleIdentifier },
75    { kOptNameDependency,            required_argument,  NULL,     kOptDependency },
76    { kOptNameRepository,            required_argument,  NULL,     kOptRepository },
77
78    { kOptNameQuiet,                 no_argument,        NULL,     kOptQuiet },
79    { kOptNameVerbose,               optional_argument,  NULL,     kOptVerbose },
80    { kOptNameTests,                 no_argument,        NULL,     kOptTests },
81
82    // Obsolete options that might be used for a production load
83    { kOptNameNoCaches,              no_argument,        NULL,     kOptNoCaches },
84    { kOptNameNoLoadedCheck,         no_argument,        NULL,     kOptNoLoadedCheck },
85    { kOptNameTests,                 no_argument,        NULL,     kOptTests },
86
87    { NULL, 0, NULL, 0 }  // sentinel to terminate list
88};
89
90typedef struct {
91    CFMutableArrayRef      kextIDs;          // -b; must release
92    CFMutableArrayRef      dependencyURLs;   // -d; must release
93    CFMutableArrayRef      repositoryURLs;   // -r; must release
94    CFMutableArrayRef      kextURLs;         // kext args; must release
95    CFMutableArrayRef      scanURLs;         // all URLs to scan
96    CFArrayRef             allKexts;         // all opened kexts
97} KextloadArgs;
98
99#pragma mark Function Prototypes
100/*******************************************************************************
101* Function Prototypes
102*******************************************************************************/
103
104ExitStatus readArgs(
105    int argc,
106    char * const * argv,
107    KextloadArgs * toolArgs);
108ExitStatus checkArgs(KextloadArgs * toolArgs);
109
110ExitStatus checkAccess(void);
111
112ExitStatus loadKextsViaKextd(KextloadArgs * toolArgs);
113ExitStatus loadKextsIntoKernel(KextloadArgs * toolArgs);
114
115ExitStatus exitStatusForOSReturn(OSReturn osReturn);
116
117static void usage(UsageLevel usageLevel);
118
119#endif /* _KEXTLOAD_MAIN_H */
120