+
+#if __DJGPP__ == 2 && __DJGPP_MINOR__ < 4
+ssize_t
+readlink (const char *name, char *dummy1, size_t dummy2)
+{
+ /* `access' is much faster than `stat' on MS-DOS. */
+ if (access (name, F_OK) == 0)
+ errno = EINVAL;
+ return -1;
+}
+#endif
+
+char *
+careadlinkat (int fd, char const *filename,
+ char *buffer, size_t buffer_size,
+ struct allocator const *alloc,
+ ssize_t (*preadlinkat) (int, char const *, char *, size_t))
+{
+ if (!buffer)
+ {
+ /* We don't support the fancy auto-allocation feature. */
+ if (!buffer_size)
+ errno = ENOSYS;
+ else
+ errno = EINVAL;
+ buffer = NULL;
+ }
+ else
+ {
+ ssize_t len = preadlinkat (fd, filename, buffer, buffer_size);
+
+ if (len < 0 || len == buffer_size)
+ buffer = NULL;
+ else
+ buffer[len + 1] = '\0';
+ }
+ return buffer;
+}
+
+ssize_t
+careadlinkatcwd (int fd, char const *filename, char *buffer,
+ size_t buffer_size)
+{
+ (void) fd;
+ return readlink (filename, buffer, buffer_size);
+}
+