Mercurial > gnulib
annotate lib/careadlinkat.c @ 17324:b1b7de2c4a71
careadlinkat: stop exporting careadlinkatcwd
Only Emacs used it directly, and Emacs no longer needs it.
* NEWS: Document this simplification.
* lib/areadlink.c (careadlinkatcwd): Move here from careadlinkat.c,
and make it static. Include <stdlib.h>, for abort, and unistd.h,
for readlink.
* lib/careadlinkat.c (careadlinkatcwd): Move to areadlink.c.
Don't include stdlib.h; no longer needed.
* lib/careadlinkat.h (careadlinkatcwd): Remove decl.
* lib/relocwrapper.c: Adjust comment to match new dependencies.
* modules/areadlink (Depends-on): Add readlink.
(Maintainer): Add self.
* modules/careadlinkat (Depends-on): Remove readlink.
author | Paul Eggert <eggert@cs.ucla.edu> |
---|---|
date | Fri, 08 Feb 2013 15:12:36 -0800 |
parents | e542fd46ad6f |
children | 344018b6e5d7 |
rev | line source |
---|---|
14522
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
1 /* Read symbolic links into a buffer without size limitation, relative to fd. |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
2 |
17249
e542fd46ad6f
maint: update all copyright year number ranges
Eric Blake <eblake@redhat.com>
parents:
16201
diff
changeset
|
3 Copyright (C) 2001, 2003-2004, 2007, 2009-2013 Free Software Foundation, |
14522
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
4 Inc. |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
5 |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
6 This program is free software: you can redistribute it and/or modify |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
7 it under the terms of the GNU General Public License as published by |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
8 the Free Software Foundation; either version 3 of the License, or |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
9 (at your option) any later version. |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
10 |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
11 This program is distributed in the hope that it will be useful, |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
12 but WITHOUT ANY WARRANTY; without even the implied warranty of |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
14 GNU General Public License for more details. |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
15 |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
16 You should have received a copy of the GNU General Public License |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
17 along with this program. If not, see <http://www.gnu.org/licenses/>. */ |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
18 |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
19 /* Written by Paul Eggert, Bruno Haible, and Jim Meyering. */ |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
20 |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
21 #include <config.h> |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
22 |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
23 #include "careadlinkat.h" |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
24 |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
25 #include <errno.h> |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
26 #include <limits.h> |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
27 #include <string.h> |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
28 #include <unistd.h> |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
29 |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
30 /* Define this independently so that stdint.h is not a prerequisite. */ |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
31 #ifndef SIZE_MAX |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
32 # define SIZE_MAX ((size_t) -1) |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
33 #endif |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
34 |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
35 #ifndef SSIZE_MAX |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
36 # define SSIZE_MAX ((ssize_t) (SIZE_MAX / 2)) |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
37 #endif |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
38 |
14558
2fecee8e8803
careadlinkat: Use common coding style.
Bruno Haible <bruno@clisp.org>
parents:
14557
diff
changeset
|
39 #include "allocator.h" |
2fecee8e8803
careadlinkat: Use common coding style.
Bruno Haible <bruno@clisp.org>
parents:
14557
diff
changeset
|
40 |
14522
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
41 /* Assuming the current directory is FD, get the symbolic link value |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
42 of FILENAME as a null-terminated string and put it into a buffer. |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
43 If FD is AT_FDCWD, FILENAME is interpreted relative to the current |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
44 working directory, as in openat. |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
45 |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
46 If the link is small enough to fit into BUFFER put it there. |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
47 BUFFER's size is BUFFER_SIZE, and BUFFER can be null |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
48 if BUFFER_SIZE is zero. |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
49 |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
50 If the link is not small, put it into a dynamically allocated |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
51 buffer managed by ALLOC. It is the caller's responsibility to free |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
52 the returned value if it is nonnull and is not BUFFER. A null |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
53 ALLOC stands for the standard allocator. |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
54 |
14557
1d2daac9948e
careadlinkat: Clarify specification.
Bruno Haible <bruno@clisp.org>
parents:
14549
diff
changeset
|
55 The PREADLINKAT function specifies how to read links. It operates |
1d2daac9948e
careadlinkat: Clarify specification.
Bruno Haible <bruno@clisp.org>
parents:
14549
diff
changeset
|
56 like POSIX readlinkat() |
1d2daac9948e
careadlinkat: Clarify specification.
Bruno Haible <bruno@clisp.org>
parents:
14549
diff
changeset
|
57 <http://pubs.opengroup.org/onlinepubs/9699919799/functions/readlink.html> |
1d2daac9948e
careadlinkat: Clarify specification.
Bruno Haible <bruno@clisp.org>
parents:
14549
diff
changeset
|
58 but can assume that its first argument is the same as FD. |
14522
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
59 |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
60 If successful, return the buffer address; otherwise return NULL and |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
61 set errno. */ |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
62 |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
63 char * |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
64 careadlinkat (int fd, char const *filename, |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
65 char *buffer, size_t buffer_size, |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
66 struct allocator const *alloc, |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
67 ssize_t (*preadlinkat) (int, char const *, char *, size_t)) |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
68 { |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
69 char *buf; |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
70 size_t buf_size; |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
71 size_t buf_size_max = |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
72 SSIZE_MAX < SIZE_MAX ? (size_t) SSIZE_MAX + 1 : SIZE_MAX; |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
73 char stack_buf[1024]; |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
74 |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
75 if (! alloc) |
14549 | 76 alloc = &stdlib_allocator; |
14522
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
77 |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
78 if (! buffer_size) |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
79 { |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
80 /* Allocate the initial buffer on the stack. This way, in the |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
81 common case of a symlink of small size, we get away with a |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
82 single small malloc() instead of a big malloc() followed by a |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
83 shrinking realloc(). */ |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
84 buffer = stack_buf; |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
85 buffer_size = sizeof stack_buf; |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
86 } |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
87 |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
88 buf = buffer; |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
89 buf_size = buffer_size; |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
90 |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
91 do |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
92 { |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
93 /* Attempt to read the link into the current buffer. */ |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
94 ssize_t link_length = preadlinkat (fd, filename, buf, buf_size); |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
95 size_t link_size; |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
96 if (link_length < 0) |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
97 { |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
98 /* On AIX 5L v5.3 and HP-UX 11i v2 04/09, readlink returns -1 |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
99 with errno == ERANGE if the buffer is too small. */ |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
100 int readlinkat_errno = errno; |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
101 if (readlinkat_errno != ERANGE) |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
102 { |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
103 if (buf != buffer) |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
104 { |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
105 alloc->free (buf); |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
106 errno = readlinkat_errno; |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
107 } |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
108 return NULL; |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
109 } |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
110 } |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
111 |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
112 link_size = link_length; |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
113 |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
114 if (link_size < buf_size) |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
115 { |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
116 buf[link_size++] = '\0'; |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
117 |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
118 if (buf == stack_buf) |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
119 { |
14537
10946c7debf8
careadlinkat: rename members to avoid problem
Paul Eggert <eggert@cs.ucla.edu>
parents:
14531
diff
changeset
|
120 char *b = (char *) alloc->allocate (link_size); |
14854
f5ea64b67bec
allocator: 'die' routine is now given requested size
Paul Eggert <eggert@cs.ucla.edu>
parents:
14559
diff
changeset
|
121 buf_size = link_size; |
14522
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
122 if (! b) |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
123 break; |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
124 memcpy (b, buf, link_size); |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
125 buf = b; |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
126 } |
14537
10946c7debf8
careadlinkat: rename members to avoid problem
Paul Eggert <eggert@cs.ucla.edu>
parents:
14531
diff
changeset
|
127 else if (link_size < buf_size && buf != buffer && alloc->reallocate) |
14522
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
128 { |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
129 /* Shrink BUF before returning it. */ |
14537
10946c7debf8
careadlinkat: rename members to avoid problem
Paul Eggert <eggert@cs.ucla.edu>
parents:
14531
diff
changeset
|
130 char *b = (char *) alloc->reallocate (buf, link_size); |
14522
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
131 if (b) |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
132 buf = b; |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
133 } |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
134 |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
135 return buf; |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
136 } |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
137 |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
138 if (buf != buffer) |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
139 alloc->free (buf); |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
140 |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
141 if (buf_size <= buf_size_max / 2) |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
142 buf_size *= 2; |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
143 else if (buf_size < buf_size_max) |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
144 buf_size = buf_size_max; |
14854
f5ea64b67bec
allocator: 'die' routine is now given requested size
Paul Eggert <eggert@cs.ucla.edu>
parents:
14559
diff
changeset
|
145 else if (buf_size_max < SIZE_MAX) |
f5ea64b67bec
allocator: 'die' routine is now given requested size
Paul Eggert <eggert@cs.ucla.edu>
parents:
14559
diff
changeset
|
146 { |
f5ea64b67bec
allocator: 'die' routine is now given requested size
Paul Eggert <eggert@cs.ucla.edu>
parents:
14559
diff
changeset
|
147 errno = ENAMETOOLONG; |
f5ea64b67bec
allocator: 'die' routine is now given requested size
Paul Eggert <eggert@cs.ucla.edu>
parents:
14559
diff
changeset
|
148 return NULL; |
f5ea64b67bec
allocator: 'die' routine is now given requested size
Paul Eggert <eggert@cs.ucla.edu>
parents:
14559
diff
changeset
|
149 } |
14522
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
150 else |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
151 break; |
14537
10946c7debf8
careadlinkat: rename members to avoid problem
Paul Eggert <eggert@cs.ucla.edu>
parents:
14531
diff
changeset
|
152 buf = (char *) alloc->allocate (buf_size); |
14522
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
153 } |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
154 while (buf); |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
155 |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
156 if (alloc->die) |
14854
f5ea64b67bec
allocator: 'die' routine is now given requested size
Paul Eggert <eggert@cs.ucla.edu>
parents:
14559
diff
changeset
|
157 alloc->die (buf_size); |
14522
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
158 errno = ENOMEM; |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
159 return NULL; |
39a9dbe4bfe3
areadlink, areadlinkat: rewrite in terms of careadlinkat
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
160 } |