* trivial stubs
*/
-static inline int readlink(const char *path UNUSED, char *buf UNUSED, size_t bufsiz UNUSED)
-{ errno = ENOSYS; return -1; }
static inline int symlink(const char *oldpath UNUSED, const char *newpath UNUSED)
{ errno = ENOSYS; return -1; }
static inline int fchmod(int fildes UNUSED, mode_t mode UNUSED)
int sigaction(int sig, struct sigaction *in, struct sigaction *out);
int link(const char *oldpath, const char *newpath);
int uname(struct utsname *buf);
+int readlink(const char *path, char *buf, size_t bufsiz);
/*
* replacements of existing functions
return 0;
}
+int readlink(const char *path, char *buf, size_t bufsiz)
+{
+ WCHAR wpath[MAX_PATH];
+ char tmpbuf[MAX_PATH];
+ int len;
+ DWORD tag;
+
+ if (xutftowcs_path(wpath, path) < 0)
+ return -1;
+
+ if (read_reparse_point(wpath, TRUE, tmpbuf, &len, &tag) < 0)
+ return -1;
+
+ /*
+ * Adapt to strange readlink() API: Copy up to bufsiz *bytes*, potentially
+ * cutting off a UTF-8 sequence. Insufficient bufsize is *not* a failure
+ * condition. There is no conversion function that produces invalid UTF-8,
+ * so convert to a (hopefully large enough) temporary buffer, then memcpy
+ * the requested number of bytes (including '\0' for robustness).
+ */
+ memcpy(buf, tmpbuf, min(bufsiz, len + 1));
+ return min(bufsiz, len);
+}
+
pid_t waitpid(pid_t pid, int *status, int options)
{
HANDLE h = OpenProcess(SYNCHRONIZE | PROCESS_QUERY_INFORMATION,