diff options
Diffstat (limited to 'usr/src/cmd/smbios/smbios.c')
-rw-r--r-- | usr/src/cmd/smbios/smbios.c | 26 |
1 files changed, 23 insertions, 3 deletions
diff --git a/usr/src/cmd/smbios/smbios.c b/usr/src/cmd/smbios/smbios.c index c0adfb6ae4..bd6a009feb 100644 --- a/usr/src/cmd/smbios/smbios.c +++ b/usr/src/cmd/smbios/smbios.c @@ -21,7 +21,7 @@ /* * Copyright 2015 OmniTI Computer Consulting, Inc. All rights reserved. - * Copyright (c) 2017, Joyent, Inc. + * Copyright (c) 2018, Joyent, Inc. * Copyright 2021 Oxide Computer Company * Copyright 2010 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. @@ -431,10 +431,30 @@ print_system(smbios_hdl_t *shp, FILE *fp) return; } + /* + * SMBIOS definition section 3.3.2.1 is clear that the first three + * fields are little-endian, but this utility traditionally got this + * wrong, and followed RFC 4122. We keep this old behavior, but also + * provide a corrected UUID. + */ oprintf(fp, " UUID: "); - for (i = 0; i < s.smbs_uuidlen; i++) { + oprintf(fp, "%02x%02x%02x%02x-%02x%02x-%02x%02x-", + s.smbs_uuid[0], s.smbs_uuid[1], s.smbs_uuid[2], s.smbs_uuid[3], + s.smbs_uuid[4], s.smbs_uuid[5], s.smbs_uuid[6], s.smbs_uuid[7]); + for (i = 8; i < s.smbs_uuidlen; i++) { + oprintf(fp, "%02x", s.smbs_uuid[i]); + if (i == 9) + oprintf(fp, "-"); + } + oprintf(fp, "\n"); + + oprintf(fp, " UUID (Endian-corrected): "); + oprintf(fp, "%08x-%04hx-%04hx-", *((uint_t *)&s.smbs_uuid[0]), + *((ushort_t *)&s.smbs_uuid[4]), + *((ushort_t *)&s.smbs_uuid[6])); + for (i = 8; i < s.smbs_uuidlen; i++) { oprintf(fp, "%02x", s.smbs_uuid[i]); - if (i == 3 || i == 5 || i == 7 || i == 9) + if (i == 9) oprintf(fp, "-"); } oprintf(fp, "\n"); |