| commit adbb8027be47b3295367019b2f45863ea3d6c727 |
| Author: Siddhesh Poyarekar <siddhesh@redhat.com> |
| Date: Thu Mar 7 12:15:08 2013 +0530 |
| |
| Remove PIPE_BUF Linux-specific code |
| |
| Fixes BZ #12723 |
| |
| The variable pipe buffer size does nothing to the value of PIPE_BUF, |
| since the number of bytes that are atomically written is still |
| PIPE_BUF on Linux. |
| |
| diff --git glibc-2.17-c758a686/posix/Makefile glibc-2.17-c758a686/posix/Makefile |
| index 2cacd21..658c47e 100644 |
| |
| |
| @@ -86,7 +86,8 @@ tests := tstgetopt testfnm runtests runptests \ |
| tst-rfc3484-3 \ |
| tst-getaddrinfo3 tst-fnmatch2 tst-cpucount tst-cpuset \ |
| bug-getopt1 bug-getopt2 bug-getopt3 bug-getopt4 \ |
| - bug-getopt5 tst-getopt_long1 bug-regex34 |
| + bug-getopt5 tst-getopt_long1 bug-regex34 \ |
| + tst-pathconf |
| xtests := bug-ga2 |
| ifeq (yes,$(build-shared)) |
| test-srcs := globtest |
| diff --git glibc-2.17-c758a686/posix/tst-pathconf.c glibc-2.17-c758a686/posix/tst-pathconf.c |
| new file mode 100644 |
| index 0000000..7627a24 |
| |
| |
| @@ -0,0 +1,176 @@ |
| +/* Test that values of pathconf and fpathconf are consistent for a file. |
| + Copyright (C) 2013 Free Software Foundation, Inc. |
| + This file is part of the GNU C Library. |
| + |
| + The GNU C Library is free software; you can redistribute it and/or |
| + modify it under the terms of the GNU Lesser General Public |
| + License as published by the Free Software Foundation; either |
| + version 2.1 of the License, or (at your option) any later version. |
| + |
| + The GNU C Library is distributed in the hope that it will be useful, |
| + but WITHOUT ANY WARRANTY; without even the implied warranty of |
| + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| + Lesser General Public License for more details. |
| + |
| + You should have received a copy of the GNU Lesser General Public |
| + License along with the GNU C Library; if not, see |
| + <http://www.gnu.org/licenses/>. */ |
| + |
| +#include <fcntl.h> |
| +#include <stdio.h> |
| +#include <stdlib.h> |
| +#include <string.h> |
| +#include <unistd.h> |
| + |
| + |
| +static void prepare (void); |
| +#define PREPARE(argc, argv) prepare () |
| + |
| +static int do_test (void); |
| +#define TEST_FUNCTION do_test () |
| + |
| +#include "../test-skeleton.c" |
| + |
| +static int dir_fd; |
| +static char *dirbuf; |
| + |
| +static void |
| +prepare (void) |
| +{ |
| + size_t test_dir_len = strlen (test_dir); |
| + static const char dir_name[] = "/tst-pathconf.XXXXXX"; |
| + |
| + size_t dirbuflen = test_dir_len + sizeof (dir_name); |
| + dirbuf = malloc (dirbuflen); |
| + if (dirbuf == NULL) |
| + { |
| + puts ("Out of memory"); |
| + exit (1); |
| + } |
| + |
| + snprintf (dirbuf, dirbuflen, "%s%s", test_dir, dir_name); |
| + if (mkdtemp (dirbuf) == NULL) |
| + { |
| + printf ("Cannot create temporary directory: %s\n", strerror (errno)); |
| + exit (1); |
| + } |
| + |
| + add_temp_file (dirbuf); |
| + |
| + dir_fd = open (dirbuf, O_RDONLY); |
| + if (dir_fd == -1) |
| + { |
| + printf ("Cannot open directory: %s\n", strerror (errno)); |
| + exit (1); |
| + } |
| +} |
| + |
| + |
| +static int |
| +do_test (void) |
| +{ |
| + int ret = 0; |
| + static const char *fifo_name = "some-fifo"; |
| + |
| + size_t filenamelen = strlen (dirbuf) + strlen (fifo_name) + 2; |
| + char *filename = malloc (filenamelen); |
| + |
| + snprintf (filename, filenamelen, "%s/%s", dirbuf, fifo_name); |
| + |
| + /* Create a fifo in the directory. */ |
| + int e = mkfifo (filename, 0777); |
| + if (e == -1) |
| + { |
| + printf ("fifo creation failed (%s)\n", strerror (errno)); |
| + ret = 1; |
| + goto out_nofifo; |
| + } |
| + |
| + long dir_pathconf = pathconf (dirbuf, _PC_PIPE_BUF); |
| + |
| + if (dir_pathconf < 0) |
| + { |
| + printf ("pathconf on directory failed: %s\n", strerror (errno)); |
| + ret = 1; |
| + goto out_nofifo; |
| + } |
| + |
| + long fifo_pathconf = pathconf (filename, _PC_PIPE_BUF); |
| + |
| + if (fifo_pathconf < 0) |
| + { |
| + printf ("pathconf on file failed: %s\n", strerror (errno)); |
| + ret = 1; |
| + goto out_nofifo; |
| + } |
| + |
| + int fifo = open (filename, O_RDONLY | O_NONBLOCK); |
| + |
| + if (fifo < 0) |
| + { |
| + printf ("fifo open failed (%s)\n", strerror (errno)); |
| + ret = 1; |
| + goto out_nofifo; |
| + } |
| + |
| + long dir_fpathconf = fpathconf (dir_fd, _PC_PIPE_BUF); |
| + |
| + if (dir_fpathconf < 0) |
| + { |
| + printf ("fpathconf on directory failed: %s\n", strerror (errno)); |
| + ret = 1; |
| + goto out; |
| + } |
| + |
| + long fifo_fpathconf = fpathconf (fifo, _PC_PIPE_BUF); |
| + |
| + if (fifo_fpathconf < 0) |
| + { |
| + printf ("fpathconf on file failed: %s\n", strerror (errno)); |
| + ret = 1; |
| + goto out; |
| + } |
| + |
| + if (fifo_pathconf != fifo_fpathconf) |
| + { |
| + printf ("fifo pathconf (%ld) != fifo fpathconf (%ld)\n", fifo_pathconf, |
| + fifo_fpathconf); |
| + ret = 1; |
| + goto out; |
| + } |
| + |
| + if (dir_pathconf != fifo_pathconf) |
| + { |
| + printf ("directory pathconf (%ld) != fifo pathconf (%ld)\n", |
| + dir_pathconf, fifo_pathconf); |
| + ret = 1; |
| + goto out; |
| + } |
| + |
| + if (dir_fpathconf != fifo_fpathconf) |
| + { |
| + printf ("directory fpathconf (%ld) != fifo fpathconf (%ld)\n", |
| + dir_fpathconf, fifo_fpathconf); |
| + ret = 1; |
| + goto out; |
| + } |
| + |
| +out: |
| + close (fifo); |
| +out_nofifo: |
| + close (dir_fd); |
| + |
| + if (unlink (filename) != 0) |
| + { |
| + printf ("Could not remove fifo (%s)\n", strerror (errno)); |
| + ret = 1; |
| + } |
| + |
| + if (rmdir (dirbuf) != 0) |
| + { |
| + printf ("Could not remove directory (%s)\n", strerror (errno)); |
| + ret = 1; |
| + } |
| + |
| + return ret; |
| +} |
| diff --git glibc-2.17-c758a686/sysdeps/unix/sysv/linux/fpathconf.c glibc-2.17-c758a686/sysdeps/unix/sysv/linux/fpathconf.c |
| index c971644..e8c4dc9 100644 |
| |
| |
| @@ -33,7 +33,6 @@ __fpathconf (fd, name) |
| int name; |
| { |
| struct statfs fsbuf; |
| - int r; |
| |
| switch (name) |
| { |
| @@ -49,12 +48,6 @@ __fpathconf (fd, name) |
| case _PC_CHOWN_RESTRICTED: |
| return __statfs_chown_restricted (__fstatfs (fd, &fsbuf), &fsbuf); |
| |
| - case _PC_PIPE_BUF: |
| - r = __fcntl (fd, F_GETPIPE_SZ); |
| - if (r > 0) |
| - return r; |
| - /* FALLTHROUGH */ |
| - |
| default: |
| return posix_fpathconf (fd, name); |
| } |
| diff --git glibc-2.17-c758a686/sysdeps/unix/sysv/linux/pathconf.c glibc-2.17-c758a686/sysdeps/unix/sysv/linux/pathconf.c |
| index edc691e..de91a45 100644 |
| |
| |
| @@ -39,8 +39,6 @@ long int |
| __pathconf (const char *file, int name) |
| { |
| struct statfs fsbuf; |
| - int fd; |
| - int flags; |
| |
| switch (name) |
| { |
| @@ -56,21 +54,6 @@ __pathconf (const char *file, int name) |
| case _PC_CHOWN_RESTRICTED: |
| return __statfs_chown_restricted (__statfs (file, &fsbuf), &fsbuf); |
| |
| - case _PC_PIPE_BUF: |
| - flags = O_RDONLY|O_NONBLOCK|O_NOCTTY; |
| -#ifdef O_CLOEXEC |
| - flags |= O_CLOEXEC; |
| -#endif |
| - fd = open_not_cancel_2 (file, flags); |
| - if (fd >= 0) |
| - { |
| - long int r = __fcntl (fd, F_GETPIPE_SZ); |
| - close_not_cancel_no_status (fd); |
| - if (r > 0) |
| - return r; |
| - } |
| - /* FALLTHROUGH */ |
| - |
| default: |
| return posix_pathconf (file, name); |
| } |