X-Git-Url: http://git.ieval.ro/?a=blobdiff_plain;f=src%2Fcompat_win32.c;h=d65ea5032bd0b7ffd1c0a7a8b4a8abecc8b55d7f;hb=2642af896e0a9f7b3bca63b02833e69b3bfcd82a;hp=25c13f07f5266b0d59278e4bbd9a2431d4809c8b;hpb=dac71de305ea729c539a007931878e4fd1a26e73;p=fdkaac.git diff --git a/src/compat_win32.c b/src/compat_win32.c index 25c13f0..d65ea50 100644 --- a/src/compat_win32.c +++ b/src/compat_win32.c @@ -15,6 +15,7 @@ #include #include #include +#include #include #include "compat.h" #define WIN32_LEAN_AND_MEAN @@ -66,15 +67,29 @@ FILE *aacenc_fopen(const char *name, const char *mode) fp = (mode[0] == 'r') ? stdin : stdout; _setmode(_fileno(fp), _O_BINARY); } else { + int share = _SH_DENYRW; + if (strchr(mode, 'r') && !strchr(mode, '+')) + share = _SH_DENYWR; codepage_decode_wchar(CP_UTF8, name, &wname); codepage_decode_wchar(CP_UTF8, mode, &wmode); - fp = _wfopen(wname, wmode); + fp = _wfsopen(wname, wmode, share); free(wname); free(wmode); } return fp; } +static char **__aacenc_argv__; + +static +void aacenc_free_mainargs(void) +{ + char **p = __aacenc_argv__; + for (; *p; ++p) + free(*p); + free(__aacenc_argv__); +} + void aacenc_getmainargs(int *argc, char ***argv) { int i; @@ -86,6 +101,8 @@ void aacenc_getmainargs(int *argc, char ***argv) for (i = 0; i < *argc; ++i) codepage_encode_wchar(CP_UTF8, wargv[i], &(*argv)[i]); (*argv)[*argc] = 0; + __aacenc_argv__ = *argv; + atexit(aacenc_free_mainargs); } char *aacenc_to_utf8(const char *s)