From 2b7b10ae1a7589904de13794742f848bfc6ed2e5 Mon Sep 17 00:00:00 2001 From: Rusty Bird Date: Thu, 27 Jun 2024 12:59:18 +0000 Subject: [PATCH 1/2] qfile-agent: rename a variable --- qubes-rpc/qfile-agent.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/qubes-rpc/qfile-agent.c b/qubes-rpc/qfile-agent.c index 95988f10..e759ecfc 100644 --- a/qubes-rpc/qfile-agent.c +++ b/qubes-rpc/qfile-agent.c @@ -19,7 +19,7 @@ enum { PROGRESS_FLAG_DONE }; -void do_notify_progress(long long total, int flag) +void do_notify_progress(long long cur_total, int flag) { const char *du_size_env = getenv("FILECOPY_TOTAL_SIZE"); const char *progress_type_env = getenv("PROGRESS_TYPE"); @@ -30,7 +30,7 @@ void do_notify_progress(long long total, int flag) if (!strcmp(progress_type_env, "console") && du_size_env) { char msg[256]; snprintf(msg, sizeof(msg), "sent %lld/%lld KB\r", - (total + 1023) / 1024, strtoull(du_size_env, NULL, 10)); + (cur_total + 1023) / 1024, strtoull(du_size_env, NULL, 10)); ignore = write(2, msg, strlen(msg)); if (flag == PROGRESS_FLAG_DONE) ignore = write(2, "\n", 1); @@ -40,7 +40,7 @@ void do_notify_progress(long long total, int flag) } if (!strcmp(progress_type_env, "gui") && saved_stdout_env) { char msg[256]; - snprintf(msg, sizeof(msg), "%lld\n", total); + snprintf(msg, sizeof(msg), "%lld\n", cur_total); if (write(strtoul(saved_stdout_env, NULL, 10), msg, strlen(msg)) == -1 && errno == EPIPE) exit(32); @@ -49,18 +49,18 @@ void do_notify_progress(long long total, int flag) void notify_progress(int size, int flag) { - static long long total = 0; + static long long cur_total = 0; static long long prev_total = 0; - total += size; - if (total > prev_total + PROGRESS_NOTIFY_DELTA + cur_total += size; + if (cur_total > prev_total + PROGRESS_NOTIFY_DELTA || (flag != PROGRESS_FLAG_NORMAL)) { // check for possible error from qfile-unpacker; if error occured, // exit() will be called, so don't bother with current state // (notify_progress can be called as callback from copy_file()) if (flag == PROGRESS_FLAG_NORMAL) wait_for_result(); - do_notify_progress(total, flag); - prev_total = total; + do_notify_progress(cur_total, flag); + prev_total = cur_total; } } From ca6e96d31b8b8c7b62266c9724d4b5a21920b4b8 Mon Sep 17 00:00:00 2001 From: Rusty Bird Date: Thu, 27 Jun 2024 12:59:19 +0000 Subject: [PATCH 2/2] qfile-agent: fix CLI progress display unit mismatch qubes-fs-tree-check outputs the total estimated size in bytes, not KB. Fix the display bug by renaming the env variable that's used to pass this number (in the qvm-copy wrapper script) to $FILECOPY_TOTAL_BYTES, and then making qfile-agent convert from bytes to KB display units. $ truncate -s 10K foo $ qvm-copy foo # before: sent 10/10240 KB $ qvm-copy foo # after: sent 10/10 KB --- qubes-rpc/qfile-agent.c | 7 ++++--- qubes-rpc/qvm-copy | 6 +++--- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/qubes-rpc/qfile-agent.c b/qubes-rpc/qfile-agent.c index e759ecfc..c4d789e5 100644 --- a/qubes-rpc/qfile-agent.c +++ b/qubes-rpc/qfile-agent.c @@ -21,16 +21,17 @@ enum { void do_notify_progress(long long cur_total, int flag) { - const char *du_size_env = getenv("FILECOPY_TOTAL_SIZE"); + const char *total_bytes_env = getenv("FILECOPY_TOTAL_BYTES"); const char *progress_type_env = getenv("PROGRESS_TYPE"); const char *saved_stdout_env = getenv("SAVED_FD_1"); int ignore; if (!progress_type_env) return; - if (!strcmp(progress_type_env, "console") && du_size_env) { + if (!strcmp(progress_type_env, "console") && total_bytes_env) { char msg[256]; snprintf(msg, sizeof(msg), "sent %lld/%lld KB\r", - (cur_total + 1023) / 1024, strtoull(du_size_env, NULL, 10)); + (cur_total + 1023) / 1024, + (strtoull(total_bytes_env, NULL, 10) + 1023) / 1024); ignore = write(2, msg, strlen(msg)); if (flag == PROGRESS_FLAG_DONE) ignore = write(2, "\n", 1); diff --git a/qubes-rpc/qvm-copy b/qubes-rpc/qvm-copy index 57987d12..20a0992e 100755 --- a/qubes-rpc/qvm-copy +++ b/qubes-rpc/qvm-copy @@ -21,7 +21,7 @@ set -e -o pipefail -unset PROGRESS_TYPE OPERATION_TYPE TARGET_TYPE MIN_ARGS FILECOPY_TOTAL_SIZE service scriptdir +unset PROGRESS_TYPE OPERATION_TYPE TARGET_TYPE MIN_ARGS FILECOPY_TOTAL_BYTES service scriptdir # Determine the operation to be performed case ${0##*/} in @@ -82,7 +82,7 @@ else VM="@default" fi -if FILECOPY_TOTAL_SIZE=$("$scriptdir/qubes/qubes-fs-tree-check" \ +if FILECOPY_TOTAL_BYTES=$("$scriptdir/qubes/qubes-fs-tree-check" \ --allow-symlinks --allow-directories --machine -- "$@"); then service=qubes.Filecopy else @@ -90,7 +90,7 @@ else if [[ "$status" -ne 2 ]]; then exit "$status"; fi service=qubes.Filecopy+allow-all-names fi -if [[ "$PROGRESS_TYPE" = 'console' ]]; then export FILECOPY_TOTAL_SIZE; fi +if [[ "$PROGRESS_TYPE" = 'console' ]]; then export FILECOPY_TOTAL_BYTES; fi "$scriptdir/qubes/qrexec-client-vm" --filter-escape-chars-stderr -- "$VM" \ "$service" "$scriptdir/qubes/qfile-agent" "$@"