From: Marko Semet Subject: [PATCH 6/7] winebuild: support optional output for random state debugging Message-Id: <20200624134601.aLHPh%marko@marko10-000.de> Date: Wed, 24 Jun 2020 15:46:01 +0200 Signed-off-by: Marko Semet --- tools/winebuild/utils.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/tools/winebuild/utils.c b/tools/winebuild/utils.c index e2313aab51..e12e64510f 100644 --- a/tools/winebuild/utils.c +++ b/tools/winebuild/utils.c @@ -1278,6 +1278,8 @@ const char *get_asm_string_section(void) /* xorshift* random generator. Source: https://en.wikipedia.org/wiki/Xorshift#xorshift* */ static uint64_t pseudorandom_state = 1; +static const char* pseudorandom_source = NULL; +static size_t pseudorandom_source_size = 0; static uint64_t pseudorandom_algo(uint64_t* generator_state, uint64_t add_to_state) { @@ -1344,6 +1346,16 @@ int pseudorandom_tempfile(char* file) sleep(5); counter++; } while (counter <= 12); + + /* add deebug info */ + if ((result != -1) && (getenv("SOURCE_RANDOM_DEBUG") != NULL)) + { + debug_filename = strmake("%s.random_debug", file); + debug_file = fopen(debug_filename, "wb"); + fwrite(pseudorandom_source, 1, pseudorandom_source_size, debug_file); + fclose(debug_file); + free(debug_filename); + } return result; } @@ -1426,6 +1438,22 @@ void init_random_generator(int argc, char **argv) pseudorandom_algo(&generator_state, ((unsigned char*) argv_data)[j]); } + /* add debug if required */ + if (getenv("SOURCE_RANDOM_DEBUG") != NULL) + { + /* gen field */ + pseudorandom_source_size = env_size + argv_size + sizeof(generator_state); + buffer_pos = malloc(sizeof(char) * pseudorandom_source_size); + pseudorandom_source = buffer_pos; + + /* copy data into it */ + memcpy(buffer_pos, env_data, env_size); + buffer_pos += env_size; + memcpy(buffer_pos, argv_data, argv_size); + buffer_pos += argv_size; + memcpy(buffer_pos, &generator_state, sizeof(generator_state)); + } + /* set state and free rest */ free(env_data); free(argv_data);