You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
268 lines
7.0 KiB
268 lines
7.0 KiB
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 |
|
--- glibc-2.17-c758a686/posix/Makefile |
|
+++ glibc-2.17-c758a686/posix/Makefile |
|
@@ -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 |
|
--- /dev/null |
|
+++ glibc-2.17-c758a686/posix/tst-pathconf.c |
|
@@ -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 |
|
--- glibc-2.17-c758a686/sysdeps/unix/sysv/linux/fpathconf.c |
|
+++ glibc-2.17-c758a686/sysdeps/unix/sysv/linux/fpathconf.c |
|
@@ -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 |
|
--- glibc-2.17-c758a686/sysdeps/unix/sysv/linux/pathconf.c |
|
+++ glibc-2.17-c758a686/sysdeps/unix/sysv/linux/pathconf.c |
|
@@ -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); |
|
}
|
|
|