https://git.reactos.org/?p=reactos.git;a=commitdiff;h=8083ef9ad77af68539cbb2...
commit 8083ef9ad77af68539cbb2903d7d9302a7b12d41 Author: Ratin Gao ratin@knsoft.org AuthorDate: Wed Nov 2 03:56:43 2022 +0800 Commit: GitHub noreply@github.com CommitDate: Tue Nov 1 20:56:43 2022 +0100
[IPCONFIG] Localized datetime format (#4777)
IPconfig used a fixed format for time/date display (for DHCP lease), while it should respect local settings. CORE-18396 --- base/applications/network/ipconfig/ipconfig.c | 80 ++++++++++++++++++++++++++- 1 file changed, 78 insertions(+), 2 deletions(-)
diff --git a/base/applications/network/ipconfig/ipconfig.c b/base/applications/network/ipconfig/ipconfig.c index d386f7d1eac..8124d8c85d2 100644 --- a/base/applications/network/ipconfig/ipconfig.c +++ b/base/applications/network/ipconfig/ipconfig.c @@ -16,6 +16,7 @@ #include <stdarg.h> #include <windef.h> #include <winbase.h> +#include <winnls.h> #include <winuser.h> #include <winreg.h> #include <stdio.h> @@ -238,6 +239,70 @@ PTCHAR PrintMacAddr(PBYTE Mac) }
+/* convert time_t to localized string */ +_Ret_opt_z_ PTSTR timeToStr(_In_ time_t TimeStamp) +{ + struct tm* ptm; + SYSTEMTIME SystemTime; + INT DateCchSize, TimeCchSize, TotalCchSize, i; + PTSTR DateTimeString, psz; + + /* Convert Unix time to SYSTEMTIME */ + /* localtime_s may be preferred if available */ + ptm = localtime(&TimeStamp); + if (!ptm) + { + return NULL; + } + SystemTime.wYear = ptm->tm_year + 1900; + SystemTime.wMonth = ptm->tm_mon + 1; + SystemTime.wDay = ptm->tm_mday; + SystemTime.wHour = ptm->tm_hour; + SystemTime.wMinute = ptm->tm_min; + SystemTime.wSecond = ptm->tm_sec; + + /* Get total size in characters required of buffer */ + DateCchSize = GetDateFormat(LOCALE_USER_DEFAULT, DATE_LONGDATE, &SystemTime, NULL, NULL, 0); + if (!DateCchSize) + { + return NULL; + } + TimeCchSize = GetTimeFormat(LOCALE_USER_DEFAULT, 0, &SystemTime, NULL, NULL, 0); + if (!TimeCchSize) + { + return NULL; + } + /* Two terminating null are included, the first one will be replaced by space */ + TotalCchSize = DateCchSize + TimeCchSize; + + /* Allocate buffer and format datetime string */ + DateTimeString = (PTSTR)HeapAlloc(ProcessHeap, 0, TotalCchSize * sizeof(TCHAR)); + if (!DateTimeString) + { + return NULL; + } + + /* Get date string */ + i = GetDateFormat(LOCALE_USER_DEFAULT, DATE_LONGDATE, &SystemTime, NULL, DateTimeString, TotalCchSize); + if (i) + { + /* Append space and move pointer */ + DateTimeString[i - 1] = _T(' '); + psz = DateTimeString + i; + TotalCchSize -= i; + + /* Get time string */ + if (GetTimeFormat(LOCALE_USER_DEFAULT, 0, &SystemTime, NULL, psz, TotalCchSize)) + { + return DateTimeString; + } + } + + HeapFree(ProcessHeap, 0, DateTimeString); + return NULL; +} + + VOID DoFormatMessage(LONG ErrorCode) { LPVOID lpMsgBuf; @@ -686,8 +751,19 @@ VOID ShowInfo(BOOL bAll)
if (pAdapter->DhcpEnabled && _tcscmp(pAdapter->DhcpServer.IpAddress.String, _T("255.255.255.255"))) { - _tprintf(_T("\tLease Obtained. . . . . . . . . . : %s"), _tasctime(localtime(&pAdapter->LeaseObtained))); - _tprintf(_T("\tLease Expires . . . . . . . . . . : %s"), _tasctime(localtime(&pAdapter->LeaseExpires))); + PTSTR DateTimeString; + DateTimeString = timeToStr(pAdapter->LeaseObtained); + _tprintf(_T("\tLease Obtained. . . . . . . . . . : %s\n"), DateTimeString ? DateTimeString : _T("N/A")); + if (DateTimeString) + { + HeapFree(ProcessHeap, 0, DateTimeString); + } + DateTimeString = timeToStr(pAdapter->LeaseExpires); + _tprintf(_T("\tLease Expires . . . . . . . . . . : %s\n"), DateTimeString ? DateTimeString : _T("N/A")); + if (DateTimeString) + { + HeapFree(ProcessHeap, 0, DateTimeString); + } } } _tprintf(_T("\n"));