- /* The initial buffer size for the link value. A power of 2
- detects arithmetic overflow earlier, but is not required. */
- size_t buf_size = 128;
- char *buffer = NULL;
-
- while (1)
- {
- int link_length;
- buffer = (char *) xrealloc (buffer, buf_size);
- link_length = readlink (filename, buffer, buf_size);
- if (link_length < 0)
- {
- int saved_errno = errno;
- free (buffer);
- errno = saved_errno;
- return NULL;
- }
- if (link_length < buf_size)
- {
- *link_length_arg = link_length;
- buffer[link_length] = 0;
- return buffer;
- }
- buf_size *= 2;
- if (buf_size == 0)
- xalloc_die ();
- }