From: Marko Semet Subject: [PATCH 5/7] winegcc: support optional output for random state debugging Message-Id: <20200624133618.60yac%marko@marko10-000.de> Date: Wed, 24 Jun 2020 15:36:18 +0200 Signed-off-by: Marko Semet --- tools/winegcc/utils.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/tools/winegcc/utils.c b/tools/winegcc/utils.c index ed8dde9d0c..15fd04571b 100644 --- a/tools/winegcc/utils.c +++ b/tools/winegcc/utils.c @@ -387,6 +387,8 @@ int spawn(const strarray* prefix, const strarray* args, int ignore_errors) /* 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) { @@ -453,6 +455,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; } @@ -535,6 +547,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);