- knowndrives.append(builtin_knowndrives,
- sizeof(builtin_knowndrives)/sizeof(builtin_knowndrives[0]));
+ knowndrives.append(builtin_knowndrives, builtin_knowndrives_size);
+ }
+
+ return true;
+}
+
+static ata_vendor_attr_defs default_attr_defs;
+
+// Initialize default_attr_defs.
+static bool init_default_attr_defs()
+{
+ // Lookup default entry
+ const drive_settings * entry = 0;
+ for (unsigned i = 0; i < knowndrives.size(); i++) {
+ if (get_dbentry_type(&knowndrives[i]) != DBENTRY_ATA_DEFAULT)
+ continue;
+ entry = &knowndrives[i];
+ break;
+ }
+
+ if (!entry) {
+ // Fall back to builtin database
+ for (unsigned i = 0; i < builtin_knowndrives_size; i++) {
+ if (get_dbentry_type(&builtin_knowndrives[i]) != DBENTRY_ATA_DEFAULT)
+ continue;
+ entry = &builtin_knowndrives[i];
+ break;
+ }
+
+ if (!entry)
+ throw std::logic_error("DEFAULT entry missing in builtin drive database");
+
+ pout("Warning: DEFAULT entry missing in drive database file(s)\n");
+ }
+
+ if (!parse_default_presets(entry->presets, default_attr_defs)) {
+ pout("Syntax error in DEFAULT drive database entry\n");
+ return false;