- int link_length;
- buffer = (char *) xrealloc (buffer, buf_size);
- link_length = readlink (filename, buffer, buf_size);
- if (link_length < 0)
+ char *buffer = xmalloc (buf_size);
+ ssize_t r = readlink (file, buffer, buf_size);
+ size_t link_length = r;
+
+ /* On AIX 5L v5.3 and HP-UX 11i v2 04/09, readlink returns -1
+ with errno == ERANGE if the buffer is too small. */
+ if (r < 0 && errno != ERANGE)