annotate lib/areadlink-with-size.c @ 15727:144db791c6fa

Ensure EBADF returns for socket functions on mingw. * lib/accept.c (rpl_accept): Fail with error EBADF if the file descriptor is invalid. * lib/bind.c (rpl_bind): Likewise. * lib/connect.c (rpl_connect): Likewise. * lib/getpeername.c (rpl_getpeername): Likewise. * lib/getsockname.c (rpl_getsockname): Likewise. * lib/getsockopt.c (rpl_getsockopt): Likewise. * lib/listen.c (rpl_listen): Likewise. * lib/recv.c (rpl_recv): Likewise. * lib/recvfrom.c (rpl_recvfrom): Likewise. * lib/send.c (rpl_send): Likewise. * lib/sendto.c (rpl_sendto): Likewise. * lib/setsockopt.c (rpl_setsockopt): Likewise. * lib/shutdown.c (rpl_shutdown): Likewise.
author Bruno Haible <bruno@clisp.org>
date Wed, 21 Sep 2011 00:20:59 +0200
parents 97fc9a21a8fb
children 8250f2777afc
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
9169
dfa92826de1e Rename mreadlink_with_size to areadlink_with_size.
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1 /* readlink wrapper to return the link name in malloc'd storage.
dfa92826de1e Rename mreadlink_with_size to areadlink_with_size.
Jim Meyering <jim@meyering.net>
parents:
diff changeset
2 Unlike xreadlink and xreadlink_with_size, don't ever call exit.
dfa92826de1e Rename mreadlink_with_size to areadlink_with_size.
Jim Meyering <jim@meyering.net>
parents:
diff changeset
3
14079
97fc9a21a8fb maint: update almost all copyright ranges to include 2011
Jim Meyering <meyering@redhat.com>
parents: 12559
diff changeset
4 Copyright (C) 2001, 2003-2007, 2009-2011 Free Software Foundation, Inc.
9169
dfa92826de1e Rename mreadlink_with_size to areadlink_with_size.
Jim Meyering <jim@meyering.net>
parents:
diff changeset
5
9309
bbbbbf4cd1c5 Change copyright notice from GPLv2+ to GPLv3+.
Bruno Haible <bruno@clisp.org>
parents: 9169
diff changeset
6 This program is free software: you can redistribute it and/or modify
9169
dfa92826de1e Rename mreadlink_with_size to areadlink_with_size.
Jim Meyering <jim@meyering.net>
parents:
diff changeset
7 it under the terms of the GNU General Public License as published by
9309
bbbbbf4cd1c5 Change copyright notice from GPLv2+ to GPLv3+.
Bruno Haible <bruno@clisp.org>
parents: 9169
diff changeset
8 the Free Software Foundation; either version 3 of the License, or
bbbbbf4cd1c5 Change copyright notice from GPLv2+ to GPLv3+.
Bruno Haible <bruno@clisp.org>
parents: 9169
diff changeset
9 (at your option) any later version.
9169
dfa92826de1e Rename mreadlink_with_size to areadlink_with_size.
Jim Meyering <jim@meyering.net>
parents:
diff changeset
10
dfa92826de1e Rename mreadlink_with_size to areadlink_with_size.
Jim Meyering <jim@meyering.net>
parents:
diff changeset
11 This program is distributed in the hope that it will be useful,
dfa92826de1e Rename mreadlink_with_size to areadlink_with_size.
Jim Meyering <jim@meyering.net>
parents:
diff changeset
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
dfa92826de1e Rename mreadlink_with_size to areadlink_with_size.
Jim Meyering <jim@meyering.net>
parents:
diff changeset
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
dfa92826de1e Rename mreadlink_with_size to areadlink_with_size.
Jim Meyering <jim@meyering.net>
parents:
diff changeset
14 GNU General Public License for more details.
dfa92826de1e Rename mreadlink_with_size to areadlink_with_size.
Jim Meyering <jim@meyering.net>
parents:
diff changeset
15
dfa92826de1e Rename mreadlink_with_size to areadlink_with_size.
Jim Meyering <jim@meyering.net>
parents:
diff changeset
16 You should have received a copy of the GNU General Public License
9309
bbbbbf4cd1c5 Change copyright notice from GPLv2+ to GPLv3+.
Bruno Haible <bruno@clisp.org>
parents: 9169
diff changeset
17 along with this program. If not, see <http://www.gnu.org/licenses/>. */
9169
dfa92826de1e Rename mreadlink_with_size to areadlink_with_size.
Jim Meyering <jim@meyering.net>
parents:
diff changeset
18
dfa92826de1e Rename mreadlink_with_size to areadlink_with_size.
Jim Meyering <jim@meyering.net>
parents:
diff changeset
19 /* Written by Jim Meyering <jim@meyering.net> */
dfa92826de1e Rename mreadlink_with_size to areadlink_with_size.
Jim Meyering <jim@meyering.net>
parents:
diff changeset
20
dfa92826de1e Rename mreadlink_with_size to areadlink_with_size.
Jim Meyering <jim@meyering.net>
parents:
diff changeset
21 #include <config.h>
dfa92826de1e Rename mreadlink_with_size to areadlink_with_size.
Jim Meyering <jim@meyering.net>
parents:
diff changeset
22
dfa92826de1e Rename mreadlink_with_size to areadlink_with_size.
Jim Meyering <jim@meyering.net>
parents:
diff changeset
23 #include "areadlink.h"
dfa92826de1e Rename mreadlink_with_size to areadlink_with_size.
Jim Meyering <jim@meyering.net>
parents:
diff changeset
24
dfa92826de1e Rename mreadlink_with_size to areadlink_with_size.
Jim Meyering <jim@meyering.net>
parents:
diff changeset
25 #include <errno.h>
dfa92826de1e Rename mreadlink_with_size to areadlink_with_size.
Jim Meyering <jim@meyering.net>
parents:
diff changeset
26 #include <limits.h>
12141
1fd105be1362 areadlink: use SIZE_MAX consistently
Eric Blake <ebb9@byu.net>
parents: 9309
diff changeset
27 #include <stdint.h>
9169
dfa92826de1e Rename mreadlink_with_size to areadlink_with_size.
Jim Meyering <jim@meyering.net>
parents:
diff changeset
28 #include <stdlib.h>
dfa92826de1e Rename mreadlink_with_size to areadlink_with_size.
Jim Meyering <jim@meyering.net>
parents:
diff changeset
29 #include <unistd.h>
dfa92826de1e Rename mreadlink_with_size to areadlink_with_size.
Jim Meyering <jim@meyering.net>
parents:
diff changeset
30
dfa92826de1e Rename mreadlink_with_size to areadlink_with_size.
Jim Meyering <jim@meyering.net>
parents:
diff changeset
31 #ifndef SSIZE_MAX
dfa92826de1e Rename mreadlink_with_size to areadlink_with_size.
Jim Meyering <jim@meyering.net>
parents:
diff changeset
32 # define SSIZE_MAX ((ssize_t) (SIZE_MAX / 2))
dfa92826de1e Rename mreadlink_with_size to areadlink_with_size.
Jim Meyering <jim@meyering.net>
parents:
diff changeset
33 #endif
dfa92826de1e Rename mreadlink_with_size to areadlink_with_size.
Jim Meyering <jim@meyering.net>
parents:
diff changeset
34
dfa92826de1e Rename mreadlink_with_size to areadlink_with_size.
Jim Meyering <jim@meyering.net>
parents:
diff changeset
35 /* SYMLINK_MAX is used only for an initial memory-allocation sanity
dfa92826de1e Rename mreadlink_with_size to areadlink_with_size.
Jim Meyering <jim@meyering.net>
parents:
diff changeset
36 check, so it's OK to guess too small on hosts where there is no
dfa92826de1e Rename mreadlink_with_size to areadlink_with_size.
Jim Meyering <jim@meyering.net>
parents:
diff changeset
37 arbitrary limit to symbolic link length. */
dfa92826de1e Rename mreadlink_with_size to areadlink_with_size.
Jim Meyering <jim@meyering.net>
parents:
diff changeset
38 #ifndef SYMLINK_MAX
dfa92826de1e Rename mreadlink_with_size to areadlink_with_size.
Jim Meyering <jim@meyering.net>
parents:
diff changeset
39 # define SYMLINK_MAX 1024
dfa92826de1e Rename mreadlink_with_size to areadlink_with_size.
Jim Meyering <jim@meyering.net>
parents:
diff changeset
40 #endif
dfa92826de1e Rename mreadlink_with_size to areadlink_with_size.
Jim Meyering <jim@meyering.net>
parents:
diff changeset
41
dfa92826de1e Rename mreadlink_with_size to areadlink_with_size.
Jim Meyering <jim@meyering.net>
parents:
diff changeset
42 #define MAXSIZE (SIZE_MAX < SSIZE_MAX ? SIZE_MAX : SSIZE_MAX)
dfa92826de1e Rename mreadlink_with_size to areadlink_with_size.
Jim Meyering <jim@meyering.net>
parents:
diff changeset
43
dfa92826de1e Rename mreadlink_with_size to areadlink_with_size.
Jim Meyering <jim@meyering.net>
parents:
diff changeset
44 /* Call readlink to get the symbolic link value of FILE.
dfa92826de1e Rename mreadlink_with_size to areadlink_with_size.
Jim Meyering <jim@meyering.net>
parents:
diff changeset
45 SIZE is a hint as to how long the link is expected to be;
dfa92826de1e Rename mreadlink_with_size to areadlink_with_size.
Jim Meyering <jim@meyering.net>
parents:
diff changeset
46 typically it is taken from st_size. It need not be correct.
dfa92826de1e Rename mreadlink_with_size to areadlink_with_size.
Jim Meyering <jim@meyering.net>
parents:
diff changeset
47 Return a pointer to that NUL-terminated string in malloc'd storage.
dfa92826de1e Rename mreadlink_with_size to areadlink_with_size.
Jim Meyering <jim@meyering.net>
parents:
diff changeset
48 If readlink fails, malloc fails, or if the link value is longer
dfa92826de1e Rename mreadlink_with_size to areadlink_with_size.
Jim Meyering <jim@meyering.net>
parents:
diff changeset
49 than SSIZE_MAX, return NULL (caller may use errno to diagnose). */
dfa92826de1e Rename mreadlink_with_size to areadlink_with_size.
Jim Meyering <jim@meyering.net>
parents:
diff changeset
50
dfa92826de1e Rename mreadlink_with_size to areadlink_with_size.
Jim Meyering <jim@meyering.net>
parents:
diff changeset
51 char *
dfa92826de1e Rename mreadlink_with_size to areadlink_with_size.
Jim Meyering <jim@meyering.net>
parents:
diff changeset
52 areadlink_with_size (char const *file, size_t size)
dfa92826de1e Rename mreadlink_with_size to areadlink_with_size.
Jim Meyering <jim@meyering.net>
parents:
diff changeset
53 {
dfa92826de1e Rename mreadlink_with_size to areadlink_with_size.
Jim Meyering <jim@meyering.net>
parents:
diff changeset
54 /* Some buggy file systems report garbage in st_size. Defend
dfa92826de1e Rename mreadlink_with_size to areadlink_with_size.
Jim Meyering <jim@meyering.net>
parents:
diff changeset
55 against them by ignoring outlandish st_size values in the initial
dfa92826de1e Rename mreadlink_with_size to areadlink_with_size.
Jim Meyering <jim@meyering.net>
parents:
diff changeset
56 memory allocation. */
dfa92826de1e Rename mreadlink_with_size to areadlink_with_size.
Jim Meyering <jim@meyering.net>
parents:
diff changeset
57 size_t symlink_max = SYMLINK_MAX;
dfa92826de1e Rename mreadlink_with_size to areadlink_with_size.
Jim Meyering <jim@meyering.net>
parents:
diff changeset
58 size_t INITIAL_LIMIT_BOUND = 8 * 1024;
dfa92826de1e Rename mreadlink_with_size to areadlink_with_size.
Jim Meyering <jim@meyering.net>
parents:
diff changeset
59 size_t initial_limit = (symlink_max < INITIAL_LIMIT_BOUND
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12141
diff changeset
60 ? symlink_max + 1
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12141
diff changeset
61 : INITIAL_LIMIT_BOUND);
9169
dfa92826de1e Rename mreadlink_with_size to areadlink_with_size.
Jim Meyering <jim@meyering.net>
parents:
diff changeset
62
dfa92826de1e Rename mreadlink_with_size to areadlink_with_size.
Jim Meyering <jim@meyering.net>
parents:
diff changeset
63 /* The initial buffer size for the link value. */
dfa92826de1e Rename mreadlink_with_size to areadlink_with_size.
Jim Meyering <jim@meyering.net>
parents:
diff changeset
64 size_t buf_size = size < initial_limit ? size + 1 : initial_limit;
dfa92826de1e Rename mreadlink_with_size to areadlink_with_size.
Jim Meyering <jim@meyering.net>
parents:
diff changeset
65
dfa92826de1e Rename mreadlink_with_size to areadlink_with_size.
Jim Meyering <jim@meyering.net>
parents:
diff changeset
66 while (1)
dfa92826de1e Rename mreadlink_with_size to areadlink_with_size.
Jim Meyering <jim@meyering.net>
parents:
diff changeset
67 {
dfa92826de1e Rename mreadlink_with_size to areadlink_with_size.
Jim Meyering <jim@meyering.net>
parents:
diff changeset
68 ssize_t r;
dfa92826de1e Rename mreadlink_with_size to areadlink_with_size.
Jim Meyering <jim@meyering.net>
parents:
diff changeset
69 size_t link_length;
dfa92826de1e Rename mreadlink_with_size to areadlink_with_size.
Jim Meyering <jim@meyering.net>
parents:
diff changeset
70 char *buffer = malloc (buf_size);
dfa92826de1e Rename mreadlink_with_size to areadlink_with_size.
Jim Meyering <jim@meyering.net>
parents:
diff changeset
71
dfa92826de1e Rename mreadlink_with_size to areadlink_with_size.
Jim Meyering <jim@meyering.net>
parents:
diff changeset
72 if (buffer == NULL)
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12141
diff changeset
73 return NULL;
9169
dfa92826de1e Rename mreadlink_with_size to areadlink_with_size.
Jim Meyering <jim@meyering.net>
parents:
diff changeset
74 r = readlink (file, buffer, buf_size);
dfa92826de1e Rename mreadlink_with_size to areadlink_with_size.
Jim Meyering <jim@meyering.net>
parents:
diff changeset
75 link_length = r;
dfa92826de1e Rename mreadlink_with_size to areadlink_with_size.
Jim Meyering <jim@meyering.net>
parents:
diff changeset
76
dfa92826de1e Rename mreadlink_with_size to areadlink_with_size.
Jim Meyering <jim@meyering.net>
parents:
diff changeset
77 /* On AIX 5L v5.3 and HP-UX 11i v2 04/09, readlink returns -1
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12141
diff changeset
78 with errno == ERANGE if the buffer is too small. */
9169
dfa92826de1e Rename mreadlink_with_size to areadlink_with_size.
Jim Meyering <jim@meyering.net>
parents:
diff changeset
79 if (r < 0 && errno != ERANGE)
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12141
diff changeset
80 {
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12141
diff changeset
81 int saved_errno = errno;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12141
diff changeset
82 free (buffer);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12141
diff changeset
83 errno = saved_errno;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12141
diff changeset
84 return NULL;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12141
diff changeset
85 }
9169
dfa92826de1e Rename mreadlink_with_size to areadlink_with_size.
Jim Meyering <jim@meyering.net>
parents:
diff changeset
86
dfa92826de1e Rename mreadlink_with_size to areadlink_with_size.
Jim Meyering <jim@meyering.net>
parents:
diff changeset
87 if (link_length < buf_size)
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12141
diff changeset
88 {
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12141
diff changeset
89 buffer[link_length] = 0;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12141
diff changeset
90 return buffer;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12141
diff changeset
91 }
9169
dfa92826de1e Rename mreadlink_with_size to areadlink_with_size.
Jim Meyering <jim@meyering.net>
parents:
diff changeset
92
dfa92826de1e Rename mreadlink_with_size to areadlink_with_size.
Jim Meyering <jim@meyering.net>
parents:
diff changeset
93 free (buffer);
dfa92826de1e Rename mreadlink_with_size to areadlink_with_size.
Jim Meyering <jim@meyering.net>
parents:
diff changeset
94 if (buf_size <= MAXSIZE / 2)
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12141
diff changeset
95 buf_size *= 2;
9169
dfa92826de1e Rename mreadlink_with_size to areadlink_with_size.
Jim Meyering <jim@meyering.net>
parents:
diff changeset
96 else if (buf_size < MAXSIZE)
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12141
diff changeset
97 buf_size = MAXSIZE;
9169
dfa92826de1e Rename mreadlink_with_size to areadlink_with_size.
Jim Meyering <jim@meyering.net>
parents:
diff changeset
98 else
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12141
diff changeset
99 {
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12141
diff changeset
100 errno = ENOMEM;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12141
diff changeset
101 return NULL;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12141
diff changeset
102 }
9169
dfa92826de1e Rename mreadlink_with_size to areadlink_with_size.
Jim Meyering <jim@meyering.net>
parents:
diff changeset
103 }
dfa92826de1e Rename mreadlink_with_size to areadlink_with_size.
Jim Meyering <jim@meyering.net>
parents:
diff changeset
104 }