@@ -1113,6 +1113,7 @@ pub fn purge_whole_plist(settings: &mut Settings, resources: &mut Resources, std
1113
1113
stdout. flush ( ) . unwrap ( ) ;
1114
1114
}
1115
1115
1116
+ //return true if order is okay
1116
1117
pub fn check_order (
1117
1118
settings : & mut Settings ,
1118
1119
resources : & mut Resources ,
@@ -1130,46 +1131,68 @@ pub fn check_order(
1130
1131
{
1131
1132
return true ;
1132
1133
}
1133
- for res in resources
1134
+ let reses = resources
1134
1135
. config_plist
1135
- . as_dictionary ( )
1136
- . unwrap ( )
1137
- . get ( "Kernel" )
1136
+ . as_dictionary_mut ( )
1138
1137
. unwrap ( )
1139
- . as_dictionary ( )
1138
+ . get_mut ( "Kernel" )
1140
1139
. unwrap ( )
1141
- . get ( "Add" )
1140
+ . as_dictionary_mut ( )
1142
1141
. unwrap ( )
1143
- . as_array ( )
1142
+ . get_mut ( "Add" )
1144
1143
. unwrap ( )
1145
- . iter ( )
1146
- {
1147
- let res_bundle = res
1144
+ . as_array_mut ( )
1145
+ . unwrap ( ) ;
1146
+
1147
+ //build list of kexts from Kernel > Add Section
1148
+ for res in reses {
1149
+ let bundle_path = res
1148
1150
. as_dictionary ( )
1149
1151
. unwrap ( )
1150
1152
. get ( "BundlePath" )
1151
1153
. unwrap ( )
1152
1154
. as_string ( )
1153
1155
. unwrap_or ( "" )
1154
1156
. to_owned ( ) ;
1155
- let res_version = res_version ( settings, resources, & res_bundle) . unwrap_or ( "" . to_owned ( ) ) ;
1156
- // let res_version = res_version(settings, resources, &res_bundle);
1157
1157
let res_enabled = res
1158
1158
. as_dictionary ( )
1159
1159
. unwrap ( )
1160
1160
. get ( "Enabled" )
1161
1161
. unwrap ( )
1162
1162
. as_boolean ( )
1163
1163
. unwrap_or ( false ) ;
1164
- // if res_version.is_some() {
1165
- // kext_list.push((res_bundle, res_version.unwrap(), res_enabled));
1166
- kext_list. push ( ( res_bundle, res_version, res_enabled) ) ;
1167
- // }
1164
+ let mut new_res = ( bundle_path. split ( '/' ) . last ( ) . unwrap_or ( "" ) . to_string ( ) , "Unknown" . to_owned ( ) , res_enabled) ;
1165
+ if kext_list. contains ( & new_res) && res_enabled {
1166
+ write ! (
1167
+ stdout,
1168
+ "\x1b [2KResource {} already enabled!!\r \n " ,
1169
+ new_res. 0
1170
+ )
1171
+ . unwrap ( ) ;
1172
+ if !check_only {
1173
+ write ! ( stdout, "\x1b [2KDisabling duplicate\r \n " ) . unwrap ( ) ;
1174
+ match res {
1175
+ Value :: Boolean ( b) => * b = !* b,
1176
+ Value :: Dictionary ( d) => match d. get_mut ( "Enabled" ) {
1177
+ Some ( Value :: Boolean ( b) ) => * b = !* b,
1178
+ _ => ( ) ,
1179
+ } ,
1180
+ _ => ( ) ,
1181
+ }
1182
+ }
1183
+ new_res. 2 = false ;
1184
+ }
1185
+ kext_list. push ( new_res) ;
1186
+ }
1187
+
1188
+ //add version numbers to list
1189
+ for i in 0 ..kext_list. len ( ) {
1190
+ kext_list[ i] . 1 = res_version ( settings, resources, & kext_list[ i] . 0 ) . unwrap_or ( "" . to_owned ( ) ) ;
1168
1191
}
1169
1192
1170
1193
#[ cfg( debug_assertions) ]
1171
1194
{
1172
- write ! ( stdout, "\x1b [0J{:?}\r \n " , kext_list) . unwrap ( ) ;
1195
+ write ! ( stdout, "\x1b [0J{} { :?}\r \n " , kext_list . len ( ) , kext_list) . unwrap ( ) ;
1173
1196
}
1174
1197
1175
1198
//iterate kext_list and build bundle_list
@@ -1210,6 +1233,8 @@ pub fn check_order(
1210
1233
let mut buns = vec ! [ ] ;
1211
1234
for val in d. iter ( ) {
1212
1235
if !val. 0 . contains ( "com.apple" ) {
1236
+ //add requirement if it is
1237
+ //not from apple
1213
1238
buns. push ( (
1214
1239
val. 0 . to_owned ( ) ,
1215
1240
val. 1 . as_string ( ) . unwrap ( ) . to_owned ( ) ,
@@ -1240,12 +1265,14 @@ pub fn check_order(
1240
1265
1241
1266
#[ cfg( debug_assertions) ]
1242
1267
{
1243
- write ! ( stdout, "\r \n {:?}\r \n " , bundle_list) . unwrap ( ) ;
1268
+ write ! ( stdout, "\r \n {} { :?}\r \n " , bundle_list . len ( ) , bundle_list) . unwrap ( ) ;
1244
1269
}
1245
1270
1271
+ //enable or add requirements
1246
1272
for ( i, bun) in bundle_list. iter ( ) . enumerate ( ) {
1247
1273
if kext_list[ i] . 2 {
1248
1274
if bun. 2 . len ( ) > 0 {
1275
+ //has requirements
1249
1276
for ( j, required) in bun. 2 . iter ( ) . enumerate ( ) {
1250
1277
let mut requirement_exists = false ;
1251
1278
let mut requirement_index = 0 ;
@@ -1257,6 +1284,10 @@ pub fn check_order(
1257
1284
if k > i {
1258
1285
requirement_out_of_order = true ;
1259
1286
}
1287
+ if kext_list[ k] . 2 {
1288
+ break ;
1289
+ //found enabled requirement
1290
+ }
1260
1291
}
1261
1292
}
1262
1293
if requirement_exists {
0 commit comments