mirror of
https://github.com/mpv-player/mpv
synced 2025-01-03 05:22:23 +00:00
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.
This commit is contained in:
parent
24be34f1e9
commit
a1244111a7
1
Makefile
1
Makefile
@ -403,6 +403,7 @@ SRCS_COMMON = asxparser.c \
|
||||
libmpdemux/yuv4mpeg_ratio.c \
|
||||
libvo/osd.c \
|
||||
osdep/numcores.c \
|
||||
osdep/io.c \
|
||||
osdep/$(GETCH) \
|
||||
osdep/$(TIMER) \
|
||||
stream/open.c \
|
||||
|
@ -31,6 +31,8 @@
|
||||
#include <ctype.h>
|
||||
#include <assert.h>
|
||||
|
||||
#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);
|
||||
|
@ -86,6 +86,8 @@
|
||||
#include <ctype.h>
|
||||
#include <inttypes.h>
|
||||
|
||||
#include "osdep/io.h"
|
||||
|
||||
#include "config.h"
|
||||
#include "mp_msg.h"
|
||||
#include "libvo/fastmemcpy.h"
|
||||
|
@ -23,6 +23,8 @@
|
||||
#include <sys/stat.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "osdep/io.h"
|
||||
|
||||
#include "talloc.h"
|
||||
#include "config.h"
|
||||
#include "mp_msg.h"
|
||||
@ -49,20 +51,19 @@ static void demux_seek_mf(demuxer_t *demuxer,float rel_seek_secs,float audio_del
|
||||
// 1 = successfully read a packet
|
||||
static int demux_mf_fill_buffer(demuxer_t *demuxer, demux_stream_t *ds){
|
||||
mf_t * mf;
|
||||
struct stat fs;
|
||||
FILE * f;
|
||||
|
||||
mf=(mf_t*)demuxer->priv;
|
||||
if ( mf->curr_frame >= mf->nr_of_files ) return 0;
|
||||
|
||||
stat( mf->names[mf->curr_frame],&fs );
|
||||
// printf( "[demux_mf] frame: %d (%s,%d)\n",mf->curr_frame,mf->names[mf->curr_frame],fs.st_size );
|
||||
|
||||
if ( !( f=fopen( mf->names[mf->curr_frame],"rb" ) ) ) return 0;
|
||||
{
|
||||
sh_video_t * sh_video = demuxer->video->sh;
|
||||
demux_packet_t * dp = new_demux_packet( fs.st_size );
|
||||
if ( !fread( dp->buffer,fs.st_size,1,f ) ) return 0;
|
||||
fseek(f, 0, SEEK_END);
|
||||
long file_size = ftell(f);
|
||||
fseek(f, 0, SEEK_SET);
|
||||
demux_packet_t * dp = new_demux_packet( file_size );
|
||||
if ( !fread( dp->buffer,file_size,1,f ) ) return 0;
|
||||
dp->pts=mf->curr_frame / sh_video->fps;
|
||||
dp->pos=mf->curr_frame;
|
||||
dp->flags=0;
|
||||
|
@ -25,7 +25,8 @@
|
||||
#include <errno.h>
|
||||
#include <limits.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
|
||||
#include "osdep/io.h"
|
||||
|
||||
#include "config.h"
|
||||
|
||||
@ -38,6 +39,7 @@
|
||||
|
||||
#include "mp_msg.h"
|
||||
#include "stream/stream.h"
|
||||
#include "path.h"
|
||||
|
||||
#include "mf.h"
|
||||
|
||||
@ -49,7 +51,6 @@ char * mf_type = NULL; //"jpg";
|
||||
mf_t* open_mf(char * filename){
|
||||
#if defined(HAVE_GLOB) || defined(__MINGW32__)
|
||||
glob_t gg;
|
||||
struct stat fs;
|
||||
int i;
|
||||
char * fname;
|
||||
mf_t * mf;
|
||||
@ -63,13 +64,13 @@ mf_t* open_mf(char * filename){
|
||||
FILE *lst_f=fopen(filename + 1,"r");
|
||||
if ( lst_f )
|
||||
{
|
||||
fname=malloc(PATH_MAX);
|
||||
while ( fgets( fname,PATH_MAX,lst_f ) )
|
||||
fname=malloc(MP_PATH_MAX);
|
||||
while ( fgets( fname,MP_PATH_MAX,lst_f ) )
|
||||
{
|
||||
/* remove spaces from end of fname */
|
||||
char *t=fname + strlen( fname ) - 1;
|
||||
while ( t > fname && isspace( *t ) ) *(t--)=0;
|
||||
if ( stat( fname,&fs ) )
|
||||
if ( !mp_path_exists( fname ) )
|
||||
{
|
||||
mp_msg( MSGT_STREAM,MSGL_V,"[mf] file not found: '%s'\n",fname );
|
||||
}
|
||||
@ -94,7 +95,7 @@ mf_t* open_mf(char * filename){
|
||||
|
||||
while ( ( fname=strsep( &filename,"," ) ) )
|
||||
{
|
||||
if ( stat( fname,&fs ) )
|
||||
if ( !mp_path_exists( fname ) )
|
||||
{
|
||||
mp_msg( MSGT_STREAM,MSGL_V,"[mf] file not found: '%s'\n",fname );
|
||||
}
|
||||
@ -130,8 +131,8 @@ mf_t* open_mf(char * filename){
|
||||
|
||||
for( i=0;i < gg.gl_pathc;i++ )
|
||||
{
|
||||
stat( gg.gl_pathv[i],&fs );
|
||||
if( S_ISDIR( fs.st_mode ) ) continue;
|
||||
if (mp_path_isdir(gg.gl_pathv[i]))
|
||||
continue;
|
||||
mf->names[i]=strdup( gg.gl_pathv[i] );
|
||||
// mp_msg( MSGT_STREAM,MSGL_DBG2,"[mf] added file %d.: %s\n",i,mf->names[i] );
|
||||
}
|
||||
@ -144,7 +145,7 @@ mf_t* open_mf(char * filename){
|
||||
while ( error_count < 5 )
|
||||
{
|
||||
sprintf( fname,filename,count++ );
|
||||
if ( stat( fname,&fs ) )
|
||||
if ( !mp_path_exists( fname ) )
|
||||
{
|
||||
error_count++;
|
||||
mp_msg( MSGT_STREAM,MSGL_V,"[mf] file not found: '%s'\n",fname );
|
||||
|
@ -45,6 +45,7 @@
|
||||
#include "video_out.h"
|
||||
#include "video_out_internal.h"
|
||||
#include "mplayer.h" /* for exit_player_bad() */
|
||||
#include "osdep/io.h"
|
||||
|
||||
/* ------------------------------------------------------------------------- */
|
||||
|
||||
@ -107,15 +108,11 @@ static int framenum = 0;
|
||||
static void jpeg_mkdir(const char *buf, int verbose) {
|
||||
struct stat stat_p;
|
||||
|
||||
#ifndef __MINGW32__
|
||||
if ( mkdir(buf, 0755) < 0 ) {
|
||||
#else
|
||||
if ( mkdir(buf) < 0 ) {
|
||||
#endif
|
||||
switch (errno) { /* use switch in case other errors need to be caught
|
||||
and handled in the future */
|
||||
case EEXIST:
|
||||
if ( stat(buf, &stat_p ) < 0 ) {
|
||||
if ( mp_stat(buf, &stat_p ) < 0 ) {
|
||||
mp_msg(MSGT_VO, MSGL_ERR, "%s: %s: %s\n", info.short_name,
|
||||
_("This error has occurred"), strerror(errno) );
|
||||
mp_msg(MSGT_VO, MSGL_ERR, "%s: %s %s\n", info.short_name,
|
||||
|
@ -40,6 +40,7 @@
|
||||
#include "video_out.h"
|
||||
#include "video_out_internal.h"
|
||||
#include "mplayer.h" /* for exit_player_bad() */
|
||||
#include "osdep/io.h"
|
||||
|
||||
/* ------------------------------------------------------------------------- */
|
||||
|
||||
@ -199,16 +200,11 @@ static int preinit(const char *arg)
|
||||
static void pnm_mkdir(char *buf, int verbose) {
|
||||
struct stat stat_p;
|
||||
|
||||
/* Silly MING32 bug workaround */
|
||||
#ifndef __MINGW32__
|
||||
if ( mkdir(buf, 0755) < 0 ) {
|
||||
#else
|
||||
if ( mkdir(buf) < 0 ) {
|
||||
#endif
|
||||
switch (errno) { /* use switch in case other errors need to be caught
|
||||
and handled in the future */
|
||||
case EEXIST:
|
||||
if ( stat(buf, &stat_p ) < 0 ) {
|
||||
if ( mp_stat(buf, &stat_p ) < 0 ) {
|
||||
mp_msg(MSGT_VO, MSGL_ERR, "%s: %s: %s\n", info.short_name,
|
||||
_("This error has occurred"), strerror(errno) );
|
||||
mp_msg(MSGT_VO, MSGL_ERR, "%s: %s %s\n", info.short_name,
|
||||
|
19
mplayer.c
19
mplayer.c
@ -27,6 +27,8 @@
|
||||
#include "config.h"
|
||||
#include "talloc.h"
|
||||
|
||||
#include "osdep/io.h"
|
||||
|
||||
#if defined(__MINGW32__) || defined(__CYGWIN__)
|
||||
#include <windows.h>
|
||||
#endif
|
||||
@ -875,11 +877,7 @@ static void parse_cfgfiles(struct MPContext *mpctx, m_config_t *conf)
|
||||
if ((conffile = get_path("")) == NULL)
|
||||
mp_tmsg(MSGT_CPLAYER, MSGL_WARN, "Cannot find HOME directory.\n");
|
||||
else {
|
||||
#ifdef __MINGW32__
|
||||
mkdir(conffile);
|
||||
#else
|
||||
mkdir(conffile, 0777);
|
||||
#endif
|
||||
free(conffile);
|
||||
if ((conffile = get_path("config")) == NULL)
|
||||
mp_tmsg(MSGT_CPLAYER, MSGL_ERR, "get_path(\"config\") problem\n");
|
||||
@ -968,8 +966,7 @@ static void load_per_output_config(m_config_t *conf, char *cfg, char *out)
|
||||
*/
|
||||
static int try_load_config(m_config_t *conf, const char *file)
|
||||
{
|
||||
struct stat st;
|
||||
if (stat(file, &st))
|
||||
if (!mp_path_exists(file))
|
||||
return 0;
|
||||
mp_tmsg(MSGT_CPLAYER, MSGL_INFO, "Loading config '%s'\n", file);
|
||||
m_config_parse_config_file(conf, file);
|
||||
@ -979,10 +976,10 @@ static int try_load_config(m_config_t *conf, const char *file)
|
||||
static void load_per_file_config(m_config_t *conf, const char * const file)
|
||||
{
|
||||
char *confpath;
|
||||
char cfg[PATH_MAX];
|
||||
char cfg[MP_PATH_MAX];
|
||||
const char *name;
|
||||
|
||||
if (strlen(file) > PATH_MAX - 14) {
|
||||
if (strlen(file) > MP_PATH_MAX - 14) {
|
||||
mp_msg(MSGT_CPLAYER, MSGL_WARN, "Filename is too long, "
|
||||
"can not load file or directory specific config files\n");
|
||||
return;
|
||||
@ -991,7 +988,7 @@ static void load_per_file_config(m_config_t *conf, const char * const file)
|
||||
|
||||
name = mp_basename(cfg);
|
||||
if (use_filedir_conf) {
|
||||
char dircfg[PATH_MAX];
|
||||
char dircfg[MP_PATH_MAX];
|
||||
strcpy(dircfg, cfg);
|
||||
strcpy(dircfg + (name - cfg), "mplayer.conf");
|
||||
try_load_config(conf, dircfg);
|
||||
@ -3974,6 +3971,10 @@ int main(int argc, char *argv[])
|
||||
|| !strcmp(argv[1], "--leak-report")))
|
||||
talloc_enable_leak_report();
|
||||
|
||||
#ifdef __MINGW32__
|
||||
mp_get_converted_argv(&argc, &argv);
|
||||
#endif
|
||||
|
||||
char *mem_ptr;
|
||||
|
||||
// movie info:
|
||||
|
185
osdep/io.c
Normal file
185
osdep/io.c
Normal file
@ -0,0 +1,185 @@
|
||||
/*
|
||||
* unicode/utf-8 I/O helpers and wrappers for Windows
|
||||
*
|
||||
* This file is part of mplayer2.
|
||||
* Contains parts based on libav code (http://libav.org).
|
||||
*
|
||||
* mplayer2 is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* mplayer2 is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with mplayer2. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifdef _WIN32
|
||||
|
||||
#include <windows.h>
|
||||
#include <wchar.h>
|
||||
#include <stdio.h>
|
||||
#include <stddef.h>
|
||||
|
||||
#include "osdep/io.h"
|
||||
#include "talloc.h"
|
||||
|
||||
//copied and modified from libav
|
||||
//http://git.libav.org/?p=libav.git;a=blob;f=libavformat/os_support.c;h=a0fcd6c9ba2be4b0dbcc476f6c53587345cc1152;hb=HEADl30
|
||||
|
||||
wchar_t *mp_from_utf8(void *talloc_ctx, const char *s)
|
||||
{
|
||||
int count = MultiByteToWideChar(CP_UTF8, 0, s, -1, NULL, 0);
|
||||
if (count <= 0)
|
||||
abort();
|
||||
wchar_t *ret = talloc_array(talloc_ctx, wchar_t, count);
|
||||
MultiByteToWideChar(CP_UTF8, 0, s, -1, ret, count);
|
||||
return ret;
|
||||
}
|
||||
|
||||
char *mp_to_utf8(void *talloc_ctx, const wchar_t *s)
|
||||
{
|
||||
int count = WideCharToMultiByte(CP_UTF8, 0, s, -1, NULL, 0, NULL, NULL);
|
||||
if (count <= 0)
|
||||
abort();
|
||||
char *ret = talloc_array(talloc_ctx, char, count);
|
||||
WideCharToMultiByte(CP_UTF8, 0, s, -1, ret, count, NULL, NULL);
|
||||
return ret;
|
||||
}
|
||||
|
||||
#endif // _WIN32
|
||||
|
||||
#ifdef __MINGW32__
|
||||
|
||||
#include <io.h>
|
||||
#include <fcntl.h>
|
||||
|
||||
//http://git.libav.org/?p=libav.git;a=blob;f=cmdutils.c;h=ade3f10ce2fc030e32e375a85fbd06c26d43a433#l161
|
||||
|
||||
static char** win32_argv_utf8;
|
||||
static int win32_argc;
|
||||
|
||||
void mp_get_converted_argv(int *argc, char ***argv)
|
||||
{
|
||||
if (!win32_argv_utf8) {
|
||||
win32_argc = 0;
|
||||
wchar_t **argv_w = CommandLineToArgvW(GetCommandLineW(), &win32_argc);
|
||||
if (win32_argc <= 0 || !argv_w)
|
||||
return;
|
||||
|
||||
win32_argv_utf8 = talloc_zero_array(NULL, char*, win32_argc + 1);
|
||||
|
||||
for (int i = 0; i < win32_argc; i++) {
|
||||
win32_argv_utf8[i] = mp_to_utf8(NULL, argv_w[i]);
|
||||
}
|
||||
|
||||
LocalFree(argv_w);
|
||||
}
|
||||
|
||||
*argc = win32_argc;
|
||||
*argv = win32_argv_utf8;
|
||||
}
|
||||
|
||||
int mp_stat(const char *path, struct stat *buf)
|
||||
{
|
||||
wchar_t *wpath = mp_from_utf8(NULL, path);
|
||||
int res = _wstat64(wpath, buf);
|
||||
talloc_free(wpath);
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
int mp_open(const char *filename, int oflag, ...)
|
||||
{
|
||||
int mode = 0;
|
||||
if (oflag & _O_CREAT) {
|
||||
va_list va;
|
||||
va_start(va, oflag);
|
||||
mode = va_arg(va, int);
|
||||
va_end(va);
|
||||
}
|
||||
wchar_t *wpath = mp_from_utf8(NULL, filename);
|
||||
int res = _wopen(wpath, oflag, mode);
|
||||
talloc_free(wpath);
|
||||
return res;
|
||||
}
|
||||
|
||||
int mp_creat(const char *filename, int mode)
|
||||
{
|
||||
return open(filename, O_CREAT|O_WRONLY|O_TRUNC, mode);
|
||||
}
|
||||
|
||||
FILE *mp_fopen(const char *filename, const char *mode)
|
||||
{
|
||||
wchar_t *wpath = mp_from_utf8(NULL, filename);
|
||||
wchar_t *wmode = mp_from_utf8(wpath, mode);
|
||||
FILE *res = _wfopen(wpath, wmode);
|
||||
talloc_free(wpath);
|
||||
return res;
|
||||
}
|
||||
|
||||
struct mp_dir {
|
||||
DIR crap; // must be first member
|
||||
_WDIR *wdir;
|
||||
union {
|
||||
struct dirent dirent;
|
||||
// dirent has space only for FILENAME_MAX bytes. _wdirent has space for
|
||||
// FILENAME_MAX wchar_t, which might end up bigger as UTF-8 in some
|
||||
// cases. Guarantee we can always hold _wdirent.d_name converted to
|
||||
// UTF-8 (see MP_PATH_MAX).
|
||||
// This works because dirent.d_name is the last member of dirent.
|
||||
char space[MP_PATH_MAX];
|
||||
};
|
||||
};
|
||||
|
||||
DIR* mp_opendir(const char *path)
|
||||
{
|
||||
wchar_t *wpath = mp_from_utf8(NULL, path);
|
||||
_WDIR *wdir = _wopendir(wpath);
|
||||
talloc_free(wpath);
|
||||
if (!wdir)
|
||||
return NULL;
|
||||
struct mp_dir *mpdir = talloc(NULL, struct mp_dir);
|
||||
// DIR is supposed to be opaque, but unfortunately the MinGW headers still
|
||||
// define it. Make sure nobody tries to use it.
|
||||
memset(&mpdir->crap, 0xCD, sizeof(mpdir->crap));
|
||||
mpdir->wdir = wdir;
|
||||
return (DIR*)mpdir;
|
||||
}
|
||||
|
||||
struct dirent* mp_readdir(DIR *dir)
|
||||
{
|
||||
struct mp_dir *mpdir = (struct mp_dir*)dir;
|
||||
struct _wdirent *wdirent = _wreaddir(mpdir->wdir);
|
||||
if (!wdirent)
|
||||
return NULL;
|
||||
size_t buffersize = sizeof(mpdir->space) - offsetof(struct dirent, d_name);
|
||||
WideCharToMultiByte(CP_UTF8, 0, wdirent->d_name, -1, mpdir->dirent.d_name,
|
||||
buffersize, NULL, NULL);
|
||||
mpdir->dirent.d_ino = 0;
|
||||
mpdir->dirent.d_reclen = 0;
|
||||
mpdir->dirent.d_namlen = strlen(mpdir->dirent.d_name);
|
||||
return &mpdir->dirent;
|
||||
}
|
||||
|
||||
int mp_closedir(DIR *dir)
|
||||
{
|
||||
struct mp_dir *mpdir = (struct mp_dir*)dir;
|
||||
int res = _wclosedir(mpdir->wdir);
|
||||
talloc_free(mpdir);
|
||||
return res;
|
||||
}
|
||||
|
||||
int mp_mkdir(const char *path, int mode)
|
||||
{
|
||||
wchar_t *wpath = mp_from_utf8(NULL, path);
|
||||
int res = _wmkdir(wpath);
|
||||
talloc_free(wpath);
|
||||
return res;
|
||||
}
|
||||
|
||||
#endif // __MINGW32__
|
76
osdep/io.h
Normal file
76
osdep/io.h
Normal file
@ -0,0 +1,76 @@
|
||||
/*
|
||||
* unicode/utf-8 I/O helpers and wrappers for Windows
|
||||
*
|
||||
* This file is part of mplayer2.
|
||||
*
|
||||
* mplayer2 is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* mplayer2 is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with mplayer2. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef MPLAYER_OSDEP_IO
|
||||
#define MPLAYER_OSDEP_IO
|
||||
|
||||
#include <limits.h>
|
||||
|
||||
#ifdef _WIN32
|
||||
#include <wchar.h>
|
||||
wchar_t *mp_from_utf8(void *talloc_ctx, const char *s);
|
||||
char *mp_to_utf8(void *talloc_ctx, const wchar_t *s);
|
||||
#endif
|
||||
|
||||
#ifdef __MINGW32__
|
||||
|
||||
#include <stdio.h>
|
||||
#include <dirent.h>
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
|
||||
// Windows' MAX_PATH/PATH_MAX/FILENAME_MAX is fixed to 260, but this limit
|
||||
// applies to unicode paths encoded with wchar_t (2 bytes on Windows). The UTF-8
|
||||
// version could end up bigger in memory. In the worst case each wchar_t is
|
||||
// encoded to 3 bytes in UTF-8, so in the worst case we have:
|
||||
// wcslen(wpath) <= strlen(utf8path) * 3
|
||||
// Thus we need MP_PATH_MAX as the UTF-8/char version of PATH_MAX.
|
||||
#define MP_PATH_MAX (FILENAME_MAX * 3)
|
||||
|
||||
void mp_get_converted_argv(int *argc, char ***argv);
|
||||
|
||||
int mp_stat(const char *path, struct stat *buf);
|
||||
int mp_open(const char *filename, int oflag, ...);
|
||||
int mp_creat(const char *filename, int mode);
|
||||
FILE *mp_fopen(const char *filename, const char *mode);
|
||||
DIR *mp_opendir(const char *path);
|
||||
struct dirent *mp_readdir(DIR *dir);
|
||||
int mp_closedir(DIR *dir);
|
||||
int mp_mkdir(const char *path, int mode);
|
||||
|
||||
// NOTE: Stat is not overridden with mp_stat, because MinGW-w64 defines it as
|
||||
// macro.
|
||||
|
||||
#define open(...) mp_open(__VA_ARGS__)
|
||||
#define creat(...) mp_creat(__VA_ARGS__)
|
||||
#define fopen(...) mp_fopen(__VA_ARGS__)
|
||||
#define opendir(...) mp_opendir(__VA_ARGS__)
|
||||
#define readdir(...) mp_readdir(__VA_ARGS__)
|
||||
#define closedir(...) mp_closedir(__VA_ARGS__)
|
||||
#define mkdir(...) mp_mkdir(__VA_ARGS__)
|
||||
|
||||
#else /* __MINGW32__ */
|
||||
|
||||
#define MP_PATH_MAX PATH_MAX
|
||||
|
||||
#define mp_stat(...) stat(__VA_ARGS__)
|
||||
|
||||
#endif /* __MINGW32__ */
|
||||
|
||||
#endif
|
@ -25,6 +25,8 @@
|
||||
#include <ctype.h>
|
||||
#include <assert.h>
|
||||
|
||||
#include "osdep/io.h"
|
||||
|
||||
#include "parser-cfg.h"
|
||||
#include "mp_msg.h"
|
||||
#include "m_option.h"
|
||||
|
18
path.c
18
path.c
@ -27,14 +27,15 @@
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdbool.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <unistd.h>
|
||||
#include "config.h"
|
||||
#include "mp_msg.h"
|
||||
#include "path.h"
|
||||
|
||||
#ifdef CONFIG_MACOSX_BUNDLE
|
||||
#include <CoreFoundation/CoreFoundation.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <unistd.h>
|
||||
#elif defined(__MINGW32__)
|
||||
#include <windows.h>
|
||||
@ -46,6 +47,7 @@
|
||||
#include "talloc.h"
|
||||
|
||||
#include "osdep/osdep.h"
|
||||
#include "osdep/io.h"
|
||||
|
||||
char *get_path(const char *filename){
|
||||
char *homedir;
|
||||
@ -232,3 +234,15 @@ char *mp_path_join(void *talloc_ctx, struct bstr p1, struct bstr p2)
|
||||
return talloc_asprintf(talloc_ctx, "%.*s%s%.*s", BSTR_P(p1),
|
||||
have_separator ? "" : "/", BSTR_P(p2));
|
||||
}
|
||||
|
||||
bool mp_path_exists(const char *path)
|
||||
{
|
||||
struct stat st;
|
||||
return mp_stat(path, &st) == 0;
|
||||
}
|
||||
|
||||
bool mp_path_isdir(const char *path)
|
||||
{
|
||||
struct stat st;
|
||||
return mp_stat(path, &st) == 0 && S_ISDIR(st.st_mode);
|
||||
}
|
||||
|
4
path.h
4
path.h
@ -21,6 +21,7 @@
|
||||
#ifndef MPLAYER_PATH_H
|
||||
#define MPLAYER_PATH_H
|
||||
|
||||
#include <stdbool.h>
|
||||
#include "bstr.h"
|
||||
|
||||
extern char *codec_path;
|
||||
@ -44,4 +45,7 @@ struct bstr mp_dirname(const char *path);
|
||||
*/
|
||||
char *mp_path_join(void *talloc_ctx, struct bstr p1, struct bstr p2);
|
||||
|
||||
bool mp_path_exists(const char *path);
|
||||
bool mp_path_isdir(const char *path);
|
||||
|
||||
#endif /* MPLAYER_PATH_H */
|
||||
|
11
screenshot.c
11
screenshot.c
@ -21,10 +21,6 @@
|
||||
#include <string.h>
|
||||
#include <inttypes.h>
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include <libswscale/swscale.h>
|
||||
#include <libavcodec/avcodec.h>
|
||||
|
||||
@ -33,6 +29,7 @@
|
||||
#include "screenshot.h"
|
||||
#include "mp_core.h"
|
||||
#include "mp_msg.h"
|
||||
#include "path.h"
|
||||
#include "libmpcodecs/img_format.h"
|
||||
#include "libmpcodecs/mp_image.h"
|
||||
#include "libmpcodecs/dec_video.h"
|
||||
@ -130,11 +127,7 @@ error_exit:
|
||||
|
||||
static int fexists(char *fname)
|
||||
{
|
||||
struct stat dummy;
|
||||
if (stat(fname, &dummy) == 0)
|
||||
return 1;
|
||||
else
|
||||
return 0;
|
||||
return mp_path_exists(fname);
|
||||
}
|
||||
|
||||
static void gen_fname(screenshot_ctx *ctx)
|
||||
|
@ -31,6 +31,8 @@
|
||||
#include <inttypes.h>
|
||||
#include <limits.h>
|
||||
|
||||
#include "osdep/io.h"
|
||||
|
||||
#include "cookies.h"
|
||||
#include "http.h"
|
||||
#include "mp_msg.h"
|
||||
|
@ -36,11 +36,8 @@
|
||||
#include <unistd.h>
|
||||
#include <string.h>
|
||||
#include <limits.h>
|
||||
#include "osdep/io.h"
|
||||
#if defined(__MINGW32__) || defined(__CYGWIN__)
|
||||
#ifdef __MINGW32__
|
||||
#include <path.h>
|
||||
#define mkdir(a,b) mkdir(a)
|
||||
#endif
|
||||
#include <windows.h>
|
||||
#if HAVE_WINSOCK2_H
|
||||
#include <winsock2.h>
|
||||
@ -53,6 +50,7 @@
|
||||
#include <sys/stat.h>
|
||||
|
||||
#include "mp_msg.h"
|
||||
#include "path.h"
|
||||
|
||||
#if defined(__linux__)
|
||||
#include <linux/cdrom.h>
|
||||
@ -472,7 +470,6 @@ static int cddb_read_cache(cddb_data_t *cddb_data)
|
||||
static int cddb_write_cache(cddb_data_t *cddb_data)
|
||||
{
|
||||
// We have the file, save it for cache.
|
||||
struct stat file_stat;
|
||||
char file_name[100];
|
||||
int file_fd, ret;
|
||||
int wrote = 0;
|
||||
@ -481,8 +478,7 @@ static int cddb_write_cache(cddb_data_t *cddb_data)
|
||||
return -1;
|
||||
|
||||
// Check if the CDDB cache dir exist
|
||||
ret = stat(cddb_data->cache_dir, &file_stat);
|
||||
if (ret < 0) {
|
||||
if (!mp_path_exists(cddb_data->cache_dir)) {
|
||||
// Directory not present, create it.
|
||||
ret = mkdir(cddb_data->cache_dir, 0755);
|
||||
#ifdef __MINGW32__
|
||||
|
@ -24,6 +24,8 @@
|
||||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "osdep/io.h"
|
||||
|
||||
#include "mp_msg.h"
|
||||
#include "stream.h"
|
||||
#include "m_option.h"
|
||||
|
@ -4,6 +4,8 @@
|
||||
#include <ctype.h>
|
||||
#include <assert.h>
|
||||
|
||||
#include "osdep/io.h"
|
||||
|
||||
#include "mp_msg.h"
|
||||
#include "options.h"
|
||||
#include "path.h"
|
||||
|
@ -21,9 +21,8 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "osdep/io.h"
|
||||
|
||||
#include "font_load.h"
|
||||
#include "mp_msg.h"
|
||||
@ -72,7 +71,6 @@ unsigned char sor2[1024];
|
||||
font_desc_t *desc;
|
||||
FILE *f = NULL;
|
||||
char *dn;
|
||||
//struct stat fstate;
|
||||
char section[64];
|
||||
int i,j;
|
||||
int chardb=0;
|
||||
@ -93,10 +91,6 @@ if ((dn = malloc(i+1))){
|
||||
|
||||
desc->fpath = dn; // search in the same dir as fonts.desc
|
||||
|
||||
// desc->fpath=get_path("font/");
|
||||
// if (stat(desc->fpath, &fstate)!=0) desc->fpath=DATADIR"/font";
|
||||
|
||||
|
||||
|
||||
|
||||
// set up some defaults, and erase table
|
||||
|
@ -23,6 +23,8 @@
|
||||
#include <dirent.h>
|
||||
#include <libavutil/common.h>
|
||||
|
||||
#include "osdep/io.h"
|
||||
|
||||
#include "talloc.h"
|
||||
|
||||
#include "mp_core.h"
|
||||
|
Loading…
Reference in New Issue
Block a user