From 265eecb642f0056c455f48dc3be4c4b342158114 Mon Sep 17 00:00:00 2001 From: LRN Date: Tue, 30 Apr 2013 04:38:47 +0000 Subject: [PATCH] Fix test_os_startprocess Previous code wrongly assumed that the message will be read from the pipe completely in one go. It does not happen like that _every_ time. --- src/util/test_os_start_process.c | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/src/util/test_os_start_process.c b/src/util/test_os_start_process.c index 7005c11a4..124b364fb 100644 --- a/src/util/test_os_start_process.c +++ b/src/util/test_os_start_process.c @@ -52,6 +52,14 @@ static struct GNUNET_DISK_PipeHandle *hello_pipe_stdout; static GNUNET_SCHEDULER_TaskIdentifier die_task; +struct read_context +{ + char buf[16]; + int buf_offset; + const struct GNUNET_DISK_FileHandle *stdout_read_handle; +}; + +struct read_context rc; static void end_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) @@ -71,13 +79,10 @@ end_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) static void read_call (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) { - struct GNUNET_DISK_FileHandle *stdout_read_handle = cls; - char buf[16]; - - memset (&buf, 0, sizeof (buf)); int bytes; - bytes = GNUNET_DISK_file_read (stdout_read_handle, &buf, sizeof (buf)); + bytes = GNUNET_DISK_file_read (rc.stdout_read_handle, &rc.buf[rc.buf_offset], \ + sizeof (rc.buf) - rc.buf_offset); GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "bytes is %d\n", bytes); @@ -90,8 +95,10 @@ read_call (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) return; } - ok = strncmp (&buf[0], test_phrase, strlen (test_phrase)); - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "read %s\n", &buf[0]); + ok = strncmp (rc.buf, test_phrase, strlen (test_phrase)); + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "read %s\n", &rc.buf[rc.buf_offset]); + rc.buf_offset += bytes; + if (0 == ok) { GNUNET_SCHEDULER_cancel (die_task); @@ -100,8 +107,8 @@ read_call (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) } GNUNET_SCHEDULER_add_read_file (GNUNET_TIME_UNIT_FOREVER_REL, - stdout_read_handle, &read_call, - stdout_read_handle); + rc.stdout_read_handle, &read_call, + NULL); } @@ -163,9 +170,11 @@ run_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) (GNUNET_TIME_UNIT_MINUTES, 1), &end_task, NULL); + memset (&rc, 0, sizeof (rc)); + rc.stdout_read_handle = stdout_read_handle; GNUNET_SCHEDULER_add_read_file (GNUNET_TIME_UNIT_FOREVER_REL, stdout_read_handle, &read_call, - (void *) stdout_read_handle); + NULL); } -- 2.25.1