[PATCH 3/3] tests: check -z and -Z options

Paul Chaignon paul.chaignon at gmail.com
Tue Apr 2 19:54:58 UTC 2019


On Mon, Apr 01, 2019 at 11:16:06PM +0200, Paul Chaignon wrote:
> This patch adds two test cases for the -z and -Z options.
> 
> Signed-off-by: Paul Chaignon <paul.chaignon at gmail.com>
> ---
>  stage_output.c              | 74 +++++++++++++++++++++++++++++++++++++
>  tests/.gitignore            |  2 +
>  tests/gen_tests.in          |  2 +
>  tests/open-Z.c              | 59 +++++++++++++++++++++++++++++
>  tests/open-z.c              | 58 +++++++++++++++++++++++++++++
>  tests/pure_executables.list |  2 +
>  6 files changed, 197 insertions(+)
>  create mode 100644 stage_output.c
>  create mode 100644 tests/open-Z.c
>  create mode 100644 tests/open-z.c
> 
> diff --git a/stage_output.c b/stage_output.c
> new file mode 100644
> index 00000000..81b29b31
> --- /dev/null
> +++ b/stage_output.c

I added this file to the wrong commit and patch 2/3 won't build.   I'll
send a v2.  For the v2, I've executed the Travis-CI tests on all three
patches.

> @@ -0,0 +1,74 @@
> +/*
> + * Copyright (c) 2017 Burkhard Kohl <burkhard.kohl at intel.com>
> + * Copyright (c) 2019 Paul Chaignon <paul.chaignon at gmail.com>
> + * All rights reserved.
> + *
> + * SPDX-License-Identifier: LGPL-2.1-or-later
> + */
> +
> +/*
> + *  Output staging is based on the "open_memstream()" function, see:
> + *  http://man7.org/linux/man-pages/man3/open_memstream.3.html
> + *  Requires glibc version 2.7 mininal
> + *
> + *  open_memstream returns a FILE stream that allows writing to a
> + *  dynamically growing buffer, that can be either copied to
> + *  tcp->outf (syscall successful) or dropped (syscall failed)
> + */
> +
> +#include "defs.h"
> +#if HAVE_OPEN_MEMSTREAM
> +
> +FILE *
> +strace_openmemstream(struct tcb *tcp)
> +{
> +	FILE *fp = NULL;
> +
> +	tcp->memfptr = NULL;
> +	fp = open_memstream(&tcp->memfptr, &tcp->memfloc);
> +	if (!fp)
> +		perror_msg_and_die("open_memstream");
> +	/* Call to fflush required to update tcp->memfptr, see open_memstream
> +	 * man page. */
> +	fflush(fp);
> +	tcp->memf = fp;
> +	return fp;
> +}
> +
> +void
> +drop_staged_out(struct tcb *tcp)
> +{
> +	if (!tcp->memf)
> +		return;
> +
> +	if (fclose(tcp->memf))
> +		perror_msg("fclose(tcp->memf)");
> +	if (tcp->memfptr) {
> +		if (debug_flag)
> +			error_msg("syscall output dropped: %s", tcp->memfptr);
> +		free(tcp->memfptr);
> +		tcp->memfptr = NULL;
> +	}
> +
> +	/* reopen tcp->memf for subsequent use */
> +	strace_openmemstream(tcp);
> +}
> +
> +void
> +publish_staged_out(struct tcb *tcp)
> +{
> +	if (!tcp->memf)
> +		return;
> +
> +	if (fclose(tcp->memf))
> +		perror_msg("flose(tcp->memf)");
> +	if (tcp->memfptr) {
> +		fprintf(tcp->outf, "%s", tcp->memfptr);
> +		free(tcp->memfptr);
> +		tcp->memfptr = NULL;
> +	}
> +
> +	/* reopen tcp->memf for subsequent use */
> +	strace_openmemstream(tcp);
> +}
> +#endif
> diff --git a/tests/.gitignore b/tests/.gitignore
> index 5a601641..f837656a 100644
> --- a/tests/.gitignore
> +++ b/tests/.gitignore
> @@ -362,6 +362,8 @@ oldselect-efault
>  oldselect-efault-P
>  oldstat
>  open
> +open-z
> +open-Z
>  openat
>  orphaned_process_group
>  osf_utimes
> diff --git a/tests/gen_tests.in b/tests/gen_tests.in
> index 314608eb..d4ba061e 100644
> --- a/tests/gen_tests.in
> +++ b/tests/gen_tests.in
> @@ -309,6 +309,8 @@ oldselect-efault	-a13 -e trace=select
>  oldselect-efault-P	-a13 -e trace=select -P /dev/full 9>>/dev/full
>  oldstat	-a32 -v -P stat.sample -P /dev/full
>  open	-a30 -P $NAME.sample
> +open-Z	-a30 -e trace=open -P open.sample -Z
> +open-z	-a30 -e trace=open -P open.sample -z
>  openat	-a36 -P $NAME.sample
>  orphaned_process_group	. "${srcdir=.}/PTRACE_SEIZE.sh"; run_strace_match_diff -f -e trace=none -e signal='!chld'
>  osf_utimes	-a21
> diff --git a/tests/open-Z.c b/tests/open-Z.c
> new file mode 100644
> index 00000000..b692502f
> --- /dev/null
> +++ b/tests/open-Z.c
> @@ -0,0 +1,59 @@
> +/*
> + * Copyright (c) 2019 Paul Chaignon <paul.chaignon at gmail.com>
> + * All rights reserved.
> + *
> + * SPDX-License-Identifier: LGPL-2.1-or-later
> + */
> +
> +#include "tests.h"
> +#include <asm/unistd.h>
> +
> +#ifdef __NR_open
> +
> +# include <asm/fcntl.h>
> +# include <stdio.h>
> +# include <unistd.h>
> +
> +int
> +main(void)
> +{
> +	static const char sample[] = "open.sample";
> +	long fd = syscall(__NR_open, sample, O_RDONLY | O_CREAT, 0400);
> +
> +	if (fd == -1)
> +		printf("open(\"%s\", O_RDONLY|O_CREAT, 0400) = %s\n",
> +		       sample, sprintrc(fd));
> +
> +	if (fd != -1) {
> +		close(fd);
> +		if (unlink(sample))
> +			perror_msg_and_fail("unlink");
> +
> +		fd = syscall(__NR_open, sample, O_RDONLY);
> +		if (fd == -1)
> +			printf("open(\"%s\", O_RDONLY) = %s\n", sample,
> +			       sprintrc(fd));
> +
> +		fd = syscall(__NR_open, sample,
> +			     O_WRONLY | O_NONBLOCK | 0x80000000);
> +		if (fd == -1)
> +			printf("open(\"%s\", O_WRONLY|O_NONBLOCK|0x80000000) = %s\n",
> +			       sample, sprintrc(fd));
> +	}
> +
> +# ifdef O_TMPFILE
> +	fd = syscall(__NR_open, sample, O_WRONLY | O_TMPFILE, 0600);
> +	if (fd == -1)
> +		printf("open(\"%s\", O_WRONLY|O_TMPFILE, 0600) = %s\n",
> +		       sample, sprintrc(fd));
> +# endif /* O_TMPFILE */
> +
> +	puts("+++ exited with 0 +++");
> +	return 0;
> +}
> +
> +#else
> +
> +SKIP_MAIN_UNDEFINED("__NR_open")
> +
> +#endif
> diff --git a/tests/open-z.c b/tests/open-z.c
> new file mode 100644
> index 00000000..ab988105
> --- /dev/null
> +++ b/tests/open-z.c
> @@ -0,0 +1,58 @@
> +/*
> + * Copyright (c) 2019 Paul Chaignon <paul.chaignon at gmail.com>
> + * All rights reserved.
> + *
> + * SPDX-License-Identifier: LGPL-2.1-or-later
> + */
> +
> +#include "tests.h"
> +#include <asm/unistd.h>
> +
> +#ifdef __NR_open
> +
> +# include <asm/fcntl.h>
> +# include <stdio.h>
> +# include <unistd.h>
> +
> +int
> +main(void)
> +{
> +	static const char sample[] = "open.sample";
> +	long fd = syscall(__NR_open, sample, O_RDONLY | O_CREAT, 0400);
> +
> +	if (fd != -1) {
> +		printf("open(\"%s\", O_RDONLY|O_CREAT, 0400) = %s\n",
> +		       sample, sprintrc(fd));
> +
> +		close(fd);
> +		if (unlink(sample))
> +			perror_msg_and_fail("unlink");
> +
> +		fd = syscall(__NR_open, sample, O_RDONLY);
> +		if (fd != -1)
> +			printf("open(\"%s\", O_RDONLY) = %s\n", sample,
> +			       sprintrc(fd));
> +
> +		fd = syscall(__NR_open, sample,
> +			     O_WRONLY | O_NONBLOCK | 0x80000000);
> +		if (fd != -1)
> +			printf("open(\"%s\", O_WRONLY|O_NONBLOCK|0x80000000) = %s\n",
> +			       sample, sprintrc(fd));
> +	}
> +
> +# ifdef O_TMPFILE
> +	fd = syscall(__NR_open, sample, O_WRONLY | O_TMPFILE, 0600);
> +	if (fd != -1)
> +		printf("open(\"%s\", O_WRONLY|O_TMPFILE, 0600) = %s\n",
> +		       sample, sprintrc(fd));
> +# endif /* O_TMPFILE */
> +
> +	puts("+++ exited with 0 +++");
> +	return 0;
> +}
> +
> +#else
> +
> +SKIP_MAIN_UNDEFINED("__NR_open")
> +
> +#endif
> diff --git a/tests/pure_executables.list b/tests/pure_executables.list
> index b695a0ec..210ccb57 100755
> --- a/tests/pure_executables.list
> +++ b/tests/pure_executables.list
> @@ -310,6 +310,8 @@ oldselect
>  oldselect-efault
>  oldstat
>  open
> +open-z
> +open-Z
>  openat
>  osf_utimes
>  pause
> -- 
> 2.17.1
> 


More information about the Strace-devel mailing list