Mercurial > hg > octave-shane > gnulib-hg
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 |
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 } |