diff options
Diffstat (limited to 'src/common/compat.c')
-rw-r--r-- | src/common/compat.c | 49 |
1 files changed, 32 insertions, 17 deletions
diff --git a/src/common/compat.c b/src/common/compat.c index 20df1b71b..6a8368fef 100644 --- a/src/common/compat.c +++ b/src/common/compat.c @@ -695,6 +695,7 @@ get_uname(void) #ifdef MS_WINDOWS OSVERSIONINFOEX info; int i; + unsigned int leftover_mask; const char *plat = NULL; static struct { int major; int minor; const char *version; @@ -710,6 +711,21 @@ get_uname(void) { 3, 51, "Windows NT 3.51" }, { -1, -1, NULL } }; + static struct { + unsigned int mask; const char *str; + } win_mask_table[] = { + { VER_SUITE_BACKOFFICE, " {backoffice}" }, + { VER_SUITE_BLADE, " {\"blade\" (2003, web edition)}" }, + { VER_SUITE_DATACENTER, " {datacenter}" }, + { VER_SUITE_ENTERPRISE, " {enterprise}" }, + { VER_SUITE_EMBEDDEDNT, " {embedded}" }, + { VER_SUITE_PERSONAL, " {personal}" }, + { VER_SUITE_SINGLEUSERTS, " {terminal services, single user}" }, + { VER_SUITE_SMALLBUSINESS, " {small business}" }, + { VER_SUITE_SMALLBUSINESS_RESTRICTED, " {small business, restricted}" }, + { VER_SUITE_TERMINAL, " {terminal services}" }, + { 0, NULL }, + }; info.dwOSVersionInfoSize = sizeof(info); GetVersionEx((LPOSVERSIONINFO)&info); if (info.dwMajorVersion == 4 && info.dwMinorVersion == 0) { @@ -733,12 +749,14 @@ get_uname(void) if (info.dwMajorVersion > 6 || (info.dwMajorVersion==6 && info.dwMinorVersion>0)) tor_snprintf(uname_result, sizeof(uname_result), - "Very recent version of Windows [major=%d,minor=%d]", - (int)info.dwMajorVersion,(int)info.dwMinorVersion); + "Very recent version of Windows [major=%d,minor=%d] %s", + (int)info.dwMajorVersion,(int)info.dwMinorVersion, + info.szCSDVersion); else tor_snprintf(uname_result, sizeof(uname_result), - "Unrecognized version of Windows [major=%d,minor=%d]", - (int)info.dwMajorVersion,(int)info.dwMinorVersion); + "Unrecognized version of Windows [major=%d,minor=%d] %s", + (int)info.dwMajorVersion,(int)info.dwMinorVersion, + infor.szCSDVersion); } if (info.wProductType == VER_NT_DOMAIN_CONTROLLER) { strlcat(uname_result, " [domain controller]", sizeof(uname_result)); @@ -747,20 +765,17 @@ get_uname(void) } else if (info.wProductType == VER_NT_WORKSTATION) { strlcat(uname_result, " [workstation]", sizeof(uname_result)); } - if (info.wSuiteMask & VER_SUITE_DATACENTER) { - strlcat(uname_result, " {datacenter}", sizeof(uname_result)); - } - if (info.wSuiteMask & VER_SUITE_ENTERPRISE) { - strlcat(uname_result, " {enterprise}", sizeof(uname_result)); - } - if (info.wSuiteMask & VER_SUITE_PERSONAL) { - strlcat(uname_result, " {personal}", sizeof(uname_result)); - } - if (info.wSuiteMask & VER_SUITE_EMBEDDEDNT) { - strlcat(uname_result, " {personal}", sizeof(uname_result)); + leftover_mask = info.wSuiteMask; + for (i = 0; win_mask_table[i].mask; ++i) { + if (info.wSuiteMask & win_mask_table[i]) { + strlcat(uname_result, win_mask_table[i].str, sizeof(uname_result)); + leftover_mask &= ~win_mask_table[i].mask; + } } - if (info.wSuiteMask & VER_SUITE_PERSONAL) { - strlcat(uname_result, " {personal}", sizeof(uname_result)); + if (leftover_mask) { + size_t len = strlen(uname_result); + tor_snprintf(uname_result+len, sizeof(uname_result)-len, + " {0x%x}", info.wSuiteMask); } #else strlcpy(uname_result, "Unknown platform", sizeof(uname_result)); |