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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
f87295656694 allocator: New module.
Paul Eggert <eggert@cs.ucla.edu>
parents: 14539
diff changeset
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 }