summaryrefslogtreecommitdiff
path: root/ext/standard/link_win32.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/standard/link_win32.c')
-rw-r--r--ext/standard/link_win32.c27
1 files changed, 25 insertions, 2 deletions
diff --git a/ext/standard/link_win32.c b/ext/standard/link_win32.c
index 35ea1cd1ef..898928b2af 100644
--- a/ext/standard/link_win32.c
+++ b/ext/standard/link_win32.c
@@ -196,6 +196,7 @@ PHP_FUNCTION(link)
int ret;
char source_p[MAXPATHLEN];
char dest_p[MAXPATHLEN];
+ wchar_t *dstw, *srcw;
/*First argument to link function is the target and hence should go to frompath
Second argument to link function is the link itself and hence should go to topath */
@@ -224,16 +225,38 @@ PHP_FUNCTION(link)
}
#ifndef ZTS
- ret = CreateHardLinkA(topath, frompath, NULL);
+# define _TO_PATH topath
+# define _FROM_PATH frompath
#else
- ret = CreateHardLinkA(dest_p, source_p, NULL);
+# define _TO_PATH dest_p
+# define _FROM_PATH source_p
#endif
+ dstw = php_win32_ioutil_any_to_w(_TO_PATH);
+ if (!dstw) {
+ php_error_docref(NULL, E_WARNING, "UTF-16 conversion failed (error %d)", GetLastError());
+ RETURN_FALSE;
+ }
+ srcw = php_win32_ioutil_any_to_w(_FROM_PATH);
+ if (!srcw) {
+ free(dstw);
+ php_error_docref(NULL, E_WARNING, "UTF-16 conversion failed (error %d)", GetLastError());
+ RETURN_FALSE;
+ }
+#undef _TO_PATH
+#undef _FROM_PATH
+
+ ret = CreateHardLinkW(dstw, srcw, NULL);
if (ret == 0) {
+ free(dstw);
+ free(srcw);
php_error_docref(NULL, E_WARNING, "%s", strerror(errno));
RETURN_FALSE;
}
+ free(dstw);
+ free(srcw);
+
RETURN_TRUE;
}
/* }}} */