hostnamed: prefer more precise DMI info over ACPI OSPM info

(also: add comments about the used numbers)

Fixes: #3930
This commit is contained in:
Lennart Poettering 2016-08-31 20:23:19 +02:00
parent f07529fe7d
commit 219bfe3872
1 changed files with 57 additions and 62 deletions

View File

@ -148,29 +148,70 @@ static bool valid_deployment(const char *deployment) {
}
static const char* fallback_chassis(void) {
int r;
char *type;
unsigned t;
int v;
int v, r;
v = detect_virtualization();
if (VIRTUALIZATION_IS_VM(v))
return "vm";
if (VIRTUALIZATION_IS_CONTAINER(v))
return "container";
r = read_one_line_file("/sys/firmware/acpi/pm_profile", &type);
r = read_one_line_file("/sys/class/dmi/id/chassis_type", &type);
if (r < 0)
goto try_dmi;
goto try_acpi;
r = safe_atou(type, &t);
free(type);
if (r < 0)
goto try_dmi;
goto try_acpi;
/* We only list the really obvious cases here as the ACPI data
* is not really super reliable.
/* We only list the really obvious cases here. The DMI data is unreliable enough, so let's not do any
additional guesswork on top of that.
See the SMBIOS Specification 3.0 section 7.4.1 for details about the values listed here:
https://www.dmtf.org/sites/default/files/standards/documents/DSP0134_3.0.0.pdf
*/
switch (t) {
case 0x3: /* Desktop */
case 0x4: /* Low Profile Desktop */
case 0x6: /* Mini Tower */
case 0x7: /* Tower */
return "desktop";
case 0x8: /* Portable */
case 0x9: /* Laptop */
case 0xA: /* Notebook */
case 0xE: /* Sub Notebook */
return "laptop";
case 0xB: /* Hand Held */
return "handset";
case 0x11: /* Main Server Chassis */
case 0x1C: /* Blade */
case 0x1D: /* Blade Enclosure */
return "server";
case 0x1E: /* Tablet */
return "tablet";
}
try_acpi:
r = read_one_line_file("/sys/firmware/acpi/pm_profile", &type);
if (r < 0)
return NULL;
r = safe_atou(type, &t);
free(type);
if (r < 0)
return NULL;
/* We only list the really obvious cases here as the ACPI data is not really super reliable.
*
* See the ACPI 5.0 Spec Section 5.2.9.1 for details:
*
@ -179,66 +220,20 @@ static const char* fallback_chassis(void) {
switch(t) {
case 1:
case 3:
case 6:
case 1: /* Desktop */
case 3: /* Workstation */
case 6: /* Appliance PC */
return "desktop";
case 2:
case 2: /* Mobile */
return "laptop";
case 4:
case 5:
case 7:
case 4: /* Enterprise Server */
case 5: /* SOHO Server */
case 7: /* Performance Server */
return "server";
case 8:
return "tablet";
}
try_dmi:
r = read_one_line_file("/sys/class/dmi/id/chassis_type", &type);
if (r < 0)
return NULL;
r = safe_atou(type, &t);
free(type);
if (r < 0)
return NULL;
/* We only list the really obvious cases here. The DMI data is
unreliable enough, so let's not do any additional guesswork
on top of that.
See the SMBIOS Specification 3.0 section 7.4.1 for
details about the values listed here:
https://www.dmtf.org/sites/default/files/standards/documents/DSP0134_3.0.0.pdf
*/
switch (t) {
case 0x3:
case 0x4:
case 0x6:
case 0x7:
return "desktop";
case 0x8:
case 0x9:
case 0xA:
case 0xE:
return "laptop";
case 0xB:
return "handset";
case 0x11:
case 0x1C:
case 0x1D:
return "server";
case 0x1E:
case 8: /* Tablet */
return "tablet";
}