dav/xattrtool.c

changeset 687
9922a349a61a
parent 663
888aa263c0f1
child 700
165811ea12ab
--- a/dav/xattrtool.c	Sun Nov 24 12:40:28 2019 +0100
+++ b/dav/xattrtool.c	Mon Dec 02 13:29:36 2019 +0100
@@ -35,6 +35,10 @@
 #include <string.h>
 #include <errno.h>
 
+#ifdef _WIN32
+#include <Windows.h>
+#endif
+
 #include "libxattr.h"
 
 int attrtool_list(int argc, char **argv, int values);
@@ -51,7 +55,47 @@
     fprintf(stderr, "   remove <file> <name>\n");
 }
 
+int xattr_tool_main(int argc, char **argv);
+
+#ifdef _WIN32
+static char* wchar2utf8(const wchar_t *wstr, size_t wlen) {
+    size_t maxlen = wlen * 4;
+    char *ret = malloc(maxlen + 1);
+    int ret_len = WideCharToMultiByte(
+        CP_UTF8,
+        0,
+        wstr,
+        wlen,
+        ret,
+        maxlen,
+        NULL,
+        NULL);
+    ret[ret_len] = 0;
+    return ret;
+}
+
+int wmain(int argc, wchar_t **argv) {
+    char **argv_utf8 = calloc(argc, sizeof(char*));
+    for(int i=0;i<argc;i++) {
+        argv_utf8[i] = wchar2utf8(argv[i], wcslen(argv[i]));
+    }
+    
+    int ret = xattr_tool_main(argc, argv_utf8);
+    
+    for(int i=0;i<argc;i++) {
+        free(argv_utf8[i]);
+    }
+    free(argv_utf8);
+    
+    return ret;
+}
+#else
 int main(int argc, char **argv) {
+    return xattr_tool_main(argc, argv);
+}
+#endif
+
+int xattr_tool_main(int argc, char **argv) {
     if(argc < 3) {
         print_usage(argv[0]);
         return 1;

mercurial