[PATCH 38/41] robocopy: print date / time string

Florian Eder others.meder at gmail.com
Mon Sep 6 09:55:15 CDT 2021


Prints the date / time at the start, the end and on any error message

Signed-off-by: Florian Eder <others.meder at gmail.com>
---
 programs/robocopy/main.c      | 43 +++++++++++++++++++++++++++++++----
 programs/robocopy/robocopy.h  |  2 ++
 programs/robocopy/robocopy.rc |  2 ++
 3 files changed, 43 insertions(+), 4 deletions(-)

diff --git a/programs/robocopy/main.c b/programs/robocopy/main.c
index a7c419e37d7..c54d7d9360c 100644
--- a/programs/robocopy/main.c
+++ b/programs/robocopy/main.c
@@ -69,17 +69,44 @@ static void output_message(UINT format_string_id, ...)
     LocalFree(string);
 }
 
+static WCHAR* get_date_time_string(BOOL log_format)
+{
+    SYSTEMTIME current_time;
+    WCHAR *date_time_string, temp_string[128];
+
+    date_time_string = calloc(128, sizeof(WCHAR));
+
+    GetLocalTime(&current_time);
+
+    /* Local time / date format is ignored, to enable scripted extraction of parts of the date / time from the log output */
+    if (log_format)
+        GetDateFormatW(LOCALE_USER_DEFAULT, 0, &current_time, L"yyyy/MM/dd ", temp_string, ARRAY_SIZE(temp_string));
+    else
+        GetDateFormatW(LOCALE_USER_DEFAULT, 0, &current_time, L"ddd MMM dd ", temp_string, ARRAY_SIZE(temp_string));
+
+    wcscpy(date_time_string, temp_string);
+    GetTimeFormatW(LOCALE_USER_DEFAULT, 0, &current_time, L"hh:mm:ss", temp_string, ARRAY_SIZE(temp_string));
+    wcscat(date_time_string, temp_string);
+    if (!log_format)
+    {
+        GetDateFormatW(LOCALE_USER_DEFAULT, 0, &current_time, L" yyyy", temp_string, ARRAY_SIZE(temp_string));
+        wcscat(date_time_string, temp_string);
+    }
+    return date_time_string;
+}
+
 static void output_error(UINT format_string_id, HRESULT error_code, WCHAR* path)
 {
-    WCHAR *error_string, error_code_long[64], error_code_short[64];
+    WCHAR *error_string, error_code_long[64], error_code_short[64], *date_time_string;
 
     FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_ALLOCATE_BUFFER,
                             NULL, error_code, 0, (LPWSTR)&error_string, 0, NULL);
+    date_time_string = get_date_time_string(TRUE);
 
     swprintf(error_code_long, ARRAY_SIZE(error_code_long), L"0x%08x", error_code);
     swprintf(error_code_short, ARRAY_SIZE(error_code_short), L"%u", error_code);
 
-    output_message(format_string_id, L"", error_code_short, error_code_long, path, error_string);
+    output_message(format_string_id, date_time_string, error_code_short, error_code_long, path, error_string);
 
     LocalFree(error_string);
 }
@@ -732,10 +759,13 @@ static WCHAR *get_option_string(void)
 static void print_header(void)
 {
     UINT i;
-    WCHAR *options_string;
+    WCHAR *options_string, *date_time_string;
 
     output_message(STRING_HEADER);
 
+    date_time_string = get_date_time_string(FALSE);
+    if (date_time_string) output_message(STRING_DATE_TIME_START, date_time_string);
+
     if (!options.source) output_message(STRING_SOURCE, L"-");
     else output_message(STRING_SOURCE, strip_path_prefix(options.source));
 
@@ -762,7 +792,7 @@ int __cdecl wmain(int argc, WCHAR *argv[])
 {
     struct robocopy_statistics statistics;
     int exit_code;
-    WCHAR dirs_copied[64], files_copied[64];
+    WCHAR dirs_copied[64], files_copied[64], *date_time_string;
 
     parse_arguments(argc, argv);
 
@@ -791,6 +821,11 @@ int __cdecl wmain(int argc, WCHAR *argv[])
     swprintf(files_copied, ARRAY_SIZE(files_copied), L"%u", statistics.copied_files);
     output_message(STRING_STATISTICS, dirs_copied, files_copied);
 
+    date_time_string = get_date_time_string(FALSE);
+    if (!date_time_string)
+        return ROBOCOPY_ERROR_NO_FILES_COPIED;
+    output_message(STRING_DATE_TIME_END, date_time_string);
+
     exit_code = ROBOCOPY_NO_ERROR_NO_COPY;
     if (statistics.copied_files) exit_code += ROBOCOPY_NO_ERROR_FILES_COPIED;
     if (statistics.extra_files) exit_code += ROBOCOPY_EXTRA_FILES_IN_DESTINATION;
diff --git a/programs/robocopy/robocopy.h b/programs/robocopy/robocopy.h
index 67fbd9eb822..459e5a7f8f7 100644
--- a/programs/robocopy/robocopy.h
+++ b/programs/robocopy/robocopy.h
@@ -71,6 +71,8 @@ struct robocopy_statistics {
 
 /* Resource strings */
 #define STRING_HEADER                         1000
+#define STRING_DATE_TIME_START                1001
+#define STRING_DATE_TIME_END                  1002
 #define STRING_SOURCE                         1003
 #define STRING_DESTINATION                    1004
 #define STRING_FILES                          1005
diff --git a/programs/robocopy/robocopy.rc b/programs/robocopy/robocopy.rc
index 315dce5f947..df66753ca6b 100644
--- a/programs/robocopy/robocopy.rc
+++ b/programs/robocopy/robocopy.rc
@@ -26,6 +26,8 @@ LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT
 STRINGTABLE
 {
     STRING_HEADER, "Robocopy for Wine\n\n"
+    STRING_DATE_TIME_START, "        Started: %1\n\n"
+    STRING_DATE_TIME_END, "\n          Ended: %1\n\n"
     STRING_SOURCE, "         Source: %1\n"
     STRING_DESTINATION, "    Destination: %1\n\n"
     STRING_FILES, "          Files: %1\n"
-- 
2.32.0




More information about the wine-devel mailing list