From a1244111a790bbc4bf91b078ebcad3f415da79da Mon Sep 17 00:00:00 2001 From: wm4 Date: Fri, 3 Feb 2012 08:05:11 +0100 Subject: windows support: unicode filenames Windows uses a legacy codepage for char* / runtime functions accepting char *. Using UTF-8 as the codepage with setlocale() is explicitly forbidden. Work this around by overriding the MSVCRT functions with wrapper macros, that assume UTF-8 and use "proper" API calls like _wopen etc. to deal with unicode filenames. All code that uses standard functions that take or return filenames must now include osdep/io.h. stat() can't be overridden, because MinGW-w64 itself defines "stat" as a macro. Change code to use use mp_stat() instead. This is not perfectly clean, but still somewhat sane, and much better than littering the rest of the mplayer code with MinGW specific hacks. It's also a bit fragile, but that's actually little different from the previous situation. Also, MinGW is unlikely to ever include a nice way of dealing with this. --- input/input.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) (limited to 'input') diff --git a/input/input.c b/input/input.c index e1c001077a..cde1b5e027 100644 --- a/input/input.c +++ b/input/input.c @@ -31,6 +31,8 @@ #include #include +#include "osdep/io.h" + #include "input.h" #include "mp_fifo.h" #include "keycodes.h" @@ -1776,13 +1778,16 @@ struct input_ctx *mp_input_init(struct input_conf *input_conf) #endif if (input_conf->in_file) { - struct stat st; - int mode = O_RDONLY | O_NONBLOCK; + int mode = O_RDONLY; +#ifndef __MINGW32__ // Use RDWR for FIFOs to ensure they stay open over multiple accesses. - // Note that on Windows stat may fail for named pipes, - // but due to how the API works, using RDONLY should be ok. + // Note that on Windows due to how the API works, using RDONLY should + // be ok. + struct stat st; if (stat(input_conf->in_file, &st) == 0 && S_ISFIFO(st.st_mode)) - mode = O_RDWR | O_NONBLOCK; + mode = O_RDWR; + mode |= O_NONBLOCK; +#endif int in_file_fd = open(input_conf->in_file, mode); if (in_file_fd >= 0) mp_input_add_cmd_fd(ictx, in_file_fd, 1, NULL, close); -- cgit v1.2.3