From: "Mike Crowe" <yocto@mac.mcrowe.com>
To: openembedded-core@lists.openembedded.org
Subject: Re: [OE-core] [pseudo][PATCH v2] fcntl: Add support for fcntl F_GETPIPE_SZ and F_SETPIPE_SZ
Date: Mon, 6 Sep 2021 17:37:14 +0100 [thread overview]
Message-ID: <YTZDuuDXNVI2arzz@mcrowe.com> (raw)
In-Reply-To: <169AD8EBF1055369.13770@lists.openembedded.org>
On Friday 13 August 2021 at 12:05:09 +0100, Mike Crowe via lists.openembedded.org wrote:
> When running the test suite on my Debian 11 box I see many occurrences
> of:
>
> unknown fcntl argument 1032, assuming long argument.
>
> (for example from test-execl.sh.)
>
> It appears that this is F_GETPIPE_SZ and it takes no arguments. Let's
> add it and the corresponding F_SETPIPE_SZ too to avoid the warning
> messages.
>
> F_SETPIPE_SZ accepts an int argument, which strictly speaking isn't the
> same as the long that the wrapper expects. However, this is also true
> for F_DUPFD which seems to be working correctly on all the targets that
> people care about.
>
> We need to define the command constants if the system headers don't
> provide them to ensure that a binary built on an old system works
> without the new commands works correctly only a newer one that tries to
> use them. If the system values differ from the expected ones then such a
> binary would also be incompatible, so fail the build in that case too.
>
> Signed-off-by: Mike Crowe <mac@mcrowe.com>
> ---
> Makefile.in | 1 +
> ports/linux/guts/fcntl.c | 21 +++++++++++++++
> test/test-fcntl.c | 58 ++++++++++++++++++++++++++++++++++++++++
> test/test-fcntl.sh | 5 ++++
> 4 files changed, 85 insertions(+)
> create mode 100644 test/test-fcntl.c
> create mode 100755 test/test-fcntl.sh
>
> diff --git a/Makefile.in b/Makefile.in
> index 10441ef..4ebe5da 100644
> --- a/Makefile.in
> +++ b/Makefile.in
> @@ -79,6 +79,7 @@ test: all | $(BIN) $(LIB) $(LOCALSTATE)
> $(CC) $(CFLAGS) $(CFLAGS_PSEUDO) -o test/test-openat test/test-openat.c
> $(CC) $(CFLAGS) $(CFLAGS_PSEUDO) -o test/test-statx test/test-statx.c
> $(CC) $(CFLAGS) $(CFLAGS_PSEUDO) -o test/test-fstat test/test-fstat.c
> + $(CC) $(CFLAGS) $(CFLAGS_PSEUDO) -o test/test-fcntl test/test-fcntl.c
> @./run_tests.sh -v
>
> install-lib: $(LIBPSEUDO)
> diff --git a/ports/linux/guts/fcntl.c b/ports/linux/guts/fcntl.c
> index 434c7f3..ffb50be 100644
> --- a/ports/linux/guts/fcntl.c
> +++ b/ports/linux/guts/fcntl.c
> @@ -8,6 +8,22 @@
> * wrap_fcntl(int fd, int cmd, ...struct flock *lock) {
> * int rc = -1;
> */
> +#if !defined(F_GETPIPE_SZ)
> +#define F_GETPIPE_SZ (1032)
> +#endif
> +
> +#if F_GETPIPE_SZ != 1032
> +#error System F_GETPIPE_SZ has unexpected value
> +#endif
> +
> +#if !defined(F_SETPIPE_SZ)
> +#define F_SETPIPE_SZ (1031)
> +#endif
> +
> +#if F_SETPIPE_SZ != 1031
> +#error System F_SETPIPE_SZ has unexpected value
> +#endif
> +
> long arg;
> int save_errno;
>
> @@ -31,12 +47,17 @@
> }
> errno = save_errno;
> break;
> + case F_SETPIPE_SZ:
> + /* actually do something */
> + rc = real_fcntl(fd, cmd, arg);
> + break;
> /* no argument: */
> case F_GETFD:
> case F_GETFL:
> case F_GETOWN:
> case F_GETSIG:
> case F_GETLEASE:
> + case F_GETPIPE_SZ:
> rc = real_fcntl(fd, cmd);
> break;
> /* long argument */
> diff --git a/test/test-fcntl.c b/test/test-fcntl.c
> new file mode 100644
> index 0000000..b593d50
> --- /dev/null
> +++ b/test/test-fcntl.c
> @@ -0,0 +1,58 @@
> +/* fcntl-linux.h doesn't define F_GETPIPE_SZ and F_SETPIPE_SZ without
> + * this */
> +#define _GNU_SOURCE
> +
> +#include <sys/types.h>
> +#include <sys/stat.h>
> +#include <fcntl.h>
> +#include <stdio.h>
> +#include <stdlib.h>
> +#include <limits.h>
> +#include <unistd.h>
> +#include <string.h>
> +
> +int test_pipe_sz()
> +{
> +#if defined(F_GETPIPE_SZ) && defined(F_SETPIPE_SZ)
> + int pipefd[2];
> +
> + if (pipe(pipefd) < 0) {
> + perror("pipe");
> + return 1;
> + }
> +
> + const int orig_size = fcntl(pipefd[0], F_GETPIPE_SZ);
> + if (orig_size < 0) {
> + perror("F_GETPIPE_SZ");
> + return 1;
> + }
> +
> + const int new_size = orig_size * 2;
> +
> + if (fcntl(pipefd[0], F_SETPIPE_SZ, new_size) < 0) {
> + perror("F_SETPIPE_SZ");
> + return 1;
> + }
> +
> + const int final_size = fcntl(pipefd[0], F_GETPIPE_SZ);
> + if (final_size < 0) {
> + perror("Second F_GETPIPE_SZ");
> + return 1;
> + }
> +
> + if (final_size < new_size) {
> + fprintf(stderr, "Unexpected final pipe size: %d\n", final_size);
> + return 1;
> + }
> +#else
> + printf("Host too old for F_GETPIPE_SZ and F_SETPIPE_SZ tests\n");
> +#endif
> + return 0;
> +}
> +
> +int main()
> +{
> + int result = 0;
> + result += test_pipe_sz();
> + return result;
> +}
> diff --git a/test/test-fcntl.sh b/test/test-fcntl.sh
> new file mode 100755
> index 0000000..7112620
> --- /dev/null
> +++ b/test/test-fcntl.sh
> @@ -0,0 +1,5 @@
> +#!/bin/bash
> +#
> +# SPDX-License-Identifier: LGPL-2.1-only
> +#
> +./test/test-fcntl
> --
> 2.30.2
>
Ping.
Mike.
next parent reply other threads:[~2021-09-06 16:37 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <169AD8EBF1055369.13770@lists.openembedded.org>
2021-09-06 16:37 ` Mike Crowe [this message]
[not found] ` <16A248F6B42CACC2.5565@lists.openembedded.org>
2021-09-10 16:36 ` [OE-core] [pseudo][PATCH v2] fcntl: Add support for fcntl F_GETPIPE_SZ and F_SETPIPE_SZ Mike Crowe
2021-09-10 16:58 ` Richard Purdie
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=YTZDuuDXNVI2arzz@mcrowe.com \
--to=yocto@mac.mcrowe.com \
--cc=openembedded-core@lists.openembedded.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.