From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:33095) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aiN8A-0005HB-4t for qemu-devel@nongnu.org; Tue, 22 Mar 2016 10:17:59 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1aiN87-0006ln-Gi for qemu-devel@nongnu.org; Tue, 22 Mar 2016 10:17:58 -0400 Received: from mx1.redhat.com ([209.132.183.28]:55323) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aiN87-0006lj-7n for qemu-devel@nongnu.org; Tue, 22 Mar 2016 10:17:55 -0400 From: Paolo Bonzini Date: Tue, 22 Mar 2016 15:17:03 +0100 Message-Id: <1458656229-32043-24-git-send-email-pbonzini@redhat.com> In-Reply-To: <1458656229-32043-1-git-send-email-pbonzini@redhat.com> References: <1458656229-32043-1-git-send-email-pbonzini@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Subject: [Qemu-devel] [PULL 23/29] qemu-log: support simple pid substitution for logs List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: =?UTF-8?q?Alex=20Benn=C3=A9e?= From: Alex Benn=C3=A9e When debugging stuff that occurs over several forks it would be useful not to keep overwriting the one logfile you've set-up. This allows a simple %d to be included once in the logfile parameter which is substituted with getpid(). As the test cases involve checking user output they need g_test_trap_subprocess() support. As a result they are currently skipped on Travis builds due to the older glib involved. Signed-off-by: Alex Benn=C3=A9e Reviewed-by: Leandro Dorileo Reviewed-by: Aurelien Jarno Reviewed-by: Richard Henderson Message-Id: <1458052224-9316-10-git-send-email-alex.bennee@linaro.org> Signed-off-by: Paolo Bonzini --- tests/test-logging.c | 36 +++++++++++++++++++++++++++++++++++- util/log.c | 21 +++++++++++++++++++-- 2 files changed, 54 insertions(+), 3 deletions(-) diff --git a/tests/test-logging.c b/tests/test-logging.c index 193fa92..ac8deed 100644 --- a/tests/test-logging.c +++ b/tests/test-logging.c @@ -89,7 +89,37 @@ static void test_parse_zero_range(void) g_test_trap_assert_stdout(""); g_test_trap_assert_stderr("*Failed to parse range in: 0x1000+0\n"); } -#endif + +/* As the only real failure from a bad log filename path spec is + * reporting to the user we have to use the g_test_trap_subprocess + * mechanism and check no errors reported on stderr. + */ +static void test_parse_path_subprocess(void) +{ + /* All these should work without issue */ + qemu_set_log_filename("/tmp/qemu.log"); + qemu_set_log_filename("/tmp/qemu-%d.log"); + qemu_set_log_filename("/tmp/qemu.log.%d"); +} +static void test_parse_path(void) +{ + g_test_trap_subprocess ("/logging/parse_path/subprocess", 0, 0); + g_test_trap_assert_passed(); + g_test_trap_assert_stdout(""); + g_test_trap_assert_stderr(""); +} +static void test_parse_invalid_path_subprocess(void) +{ + qemu_set_log_filename("/tmp/qemu-%d%d.log"); +} +static void test_parse_invalid_path(void) +{ + g_test_trap_subprocess ("/logging/parse_invalid_path/subprocess", 0,= 0); + g_test_trap_assert_passed(); + g_test_trap_assert_stdout(""); + g_test_trap_assert_stderr("Bad logfile format: /tmp/qemu-%d%d.log\n"= ); +} +#endif /* CONFIG_HAS_GLIB_SUBPROCESS_TESTS */ =20 int main(int argc, char **argv) { @@ -101,6 +131,10 @@ int main(int argc, char **argv) g_test_add_func("/logging/parse_invalid_range", test_parse_invalid_r= ange); g_test_add_func("/logging/parse_zero_range/subprocess", test_parse_z= ero_range_subprocess); g_test_add_func("/logging/parse_zero_range", test_parse_zero_range); + g_test_add_func("/logging/parse_path", test_parse_path); + g_test_add_func("/logging/parse_path/subprocess", test_parse_path_su= bprocess); + g_test_add_func("/logging/parse_invalid_path", test_parse_invalid_pa= th); + g_test_add_func("/logging/parse_invalid_path/subprocess", test_parse= _invalid_path_subprocess); #endif =20 return g_test_run(); diff --git a/util/log.c b/util/log.c index 671b617..b219081e 100644 --- a/util/log.c +++ b/util/log.c @@ -89,11 +89,28 @@ void do_qemu_set_log(int log_flags, bool use_own_buff= ers) qemu_log_close(); } } - +/* + * Allow the user to include %d in their logfile which will be + * substituted with the current PID. This is useful for debugging many + * nested linux-user tasks but will result in lots of logs. + */ void qemu_set_log_filename(const char *filename) { + char *pidstr; g_free(logfilename); - logfilename =3D g_strdup(filename); + + pidstr =3D strstr(filename, "%"); + if (pidstr) { + /* We only accept one %d, no other format strings */ + if (pidstr[1] !=3D 'd' || strchr(pidstr + 2, '%')) { + error_report("Bad logfile format: %s", filename); + logfilename =3D NULL; + } else { + logfilename =3D g_strdup_printf(filename, getpid()); + } + } else { + logfilename =3D g_strdup(filename); + } qemu_log_close(); qemu_set_log(qemu_loglevel); } --=20 2.5.0