History

fftools: Remove MAX_PATH limit and switch to UTF-8 versions of fopen() and getenv()

Nil Admirari committed 4 years ago

Commit 13350e81 parent dfa062e2 files · +47 −15Browse files

Unified · Split

2 files
  1. fftools/cmdutils.c +40 −13
  2. fftools/ffmpeg_opt.c +7 −2
fftools/cmdutils.c+40−13
@@ -39,6 +39,7 @@ · 38 unmodified lines
39#include "libavutil/avstring.h"39#include "libavutil/avstring.h"
40#include "libavutil/channel_layout.h"40#include "libavutil/channel_layout.h"
41#include "libavutil/display.h"41#include "libavutil/display.h"
42#include "libavutil/getenv_utf8.h"
42#include "libavutil/mathematics.h"43#include "libavutil/mathematics.h"
43#include "libavutil/imgutils.h"44#include "libavutil/imgutils.h"
44#include "libavutil/libm.h"45#include "libavutil/libm.h"
@@ -47,9 +48,11 @@ · 2 unmodified lines
47#include "libavutil/dict.h"48#include "libavutil/dict.h"
48#include "libavutil/opt.h"49#include "libavutil/opt.h"
49#include "cmdutils.h"50#include "cmdutils.h"
51#include "fopen_utf8.h"
50#include "opt_common.h"52#include "opt_common.h"
51#ifdef _WIN3253#ifdef _WIN32
52#include <windows.h>54#include <windows.h>
55#include "compat/w32dlfcn.h"
53#endif56#endif
54 57
55AVDictionary *sws_dict;58AVDictionary *sws_dict;
@@ -465,7 +468,7 @@ static void check_options(const OptionDef *po) · 409 unmodified lines
465void parse_loglevel(int argc, char **argv, const OptionDef *options)468void parse_loglevel(int argc, char **argv, const OptionDef *options)
466{469{
467 int idx = locate_option(argc, argv, options, "loglevel");470 int idx = locate_option(argc, argv, options, "loglevel");
468 const char *env;471 char *env;
469 472
470 check_options(options);473 check_options(options);
471 474
@@ -474,7 +477,8 @@ void parse_loglevel(int argc, char **argv, const OptionDef *options) · 2 unmodified lines
474 if (idx && argv[idx + 1])477 if (idx && argv[idx + 1])
475 opt_loglevel(NULL, "loglevel", argv[idx + 1]);478 opt_loglevel(NULL, "loglevel", argv[idx + 1]);
476 idx = locate_option(argc, argv, options, "report");479 idx = locate_option(argc, argv, options, "report");
477 if ((env = getenv("FFREPORT")) || idx) {480 env = getenv_utf8("FFREPORT");
481 if (env || idx) {
478 FILE *report_file = NULL;482 FILE *report_file = NULL;
479 init_report(env, &report_file);483 init_report(env, &report_file);
480 if (report_file) {484 if (report_file) {
@@ -487,6 +491,7 @@ void parse_loglevel(int argc, char **argv, const OptionDef *options) · 6 unmodified lines
487 fflush(report_file);491 fflush(report_file);
488 }492 }
489 }493 }
494 freeenv_utf8(env);
490 idx = locate_option(argc, argv, options, "hide_banner");495 idx = locate_option(argc, argv, options, "hide_banner");
491 if (idx)496 if (idx)
492 hide_banner = 1;497 hide_banner = 1;
@@ -812,28 +817,45 @@ FILE *get_preset_file(char *filename, size_t filename_size, · 319 unmodified lines
812{817{
813 FILE *f = NULL;818 FILE *f = NULL;
814 int i;819 int i;
815 const char *base[3] = { getenv("FFMPEG_DATADIR"),820#if HAVE_GETMODULEHANDLE && defined(_WIN32)
816 getenv("HOME"),821 char *datadir = NULL;
822#endif
823 char *env_home = getenv_utf8("HOME");
824 char *env_ffmpeg_datadir = getenv_utf8("FFMPEG_DATADIR");
825 const char *base[3] = { env_home,
826 env_ffmpeg_datadir,
817 FFMPEG_DATADIR, };827 FFMPEG_DATADIR, };
818 828
819 if (is_path) {829 if (is_path) {
820 av_strlcpy(filename, preset_name, filename_size);830 av_strlcpy(filename, preset_name, filename_size);
821 f = fopen(filename, "r");831 f = fopen_utf8(filename, "r");
822 } else {832 } else {
823#if HAVE_GETMODULEHANDLE && defined(_WIN32)833#if HAVE_GETMODULEHANDLE && defined(_WIN32)
824 char datadir[MAX_PATH], *ls;834 wchar_t *datadir_w = get_module_filename(NULL);
825 base[2] = NULL;835 base[2] = NULL;
826 836
827 if (GetModuleFileNameA(GetModuleHandleA(NULL), datadir, sizeof(datadir) - 1))837 if (wchartoutf8(datadir_w, &datadir))
838 datadir = NULL;
839 av_free(datadir_w);
840
841 if (datadir)
828 {842 {
829 for (ls = datadir; ls < datadir + strlen(datadir); ls++)843 char *ls;
844 for (ls = datadir; *ls; ls++)
830 if (*ls == '\\') *ls = '/';845 if (*ls == '\\') *ls = '/';
831 846
832 if (ls = strrchr(datadir, '/'))847 if (ls = strrchr(datadir, '/'))
833 {848 {
834 *ls = 0;849 ptrdiff_t datadir_len = ls - datadir;
835 strncat(datadir, "/ffpresets", sizeof(datadir) - 1 - strlen(datadir));850 size_t desired_size = datadir_len + strlen("/ffpresets") + 1;
836 base[2] = datadir;851 char *new_datadir = av_realloc_array(
852 datadir, desired_size, sizeof *datadir);
853 if (new_datadir) {
854 datadir = new_datadir;
855 datadir[datadir_len] = 0;
856 strncat(datadir, "/ffpresets", desired_size - 1 - datadir_len);
857 base[2] = datadir;
858 }
837 }859 }
838 }860 }
839#endif861#endif
@@ -842,17 +864,22 @@ FILE *get_preset_file(char *filename, size_t filename_size, · 2 unmodified lines
842 continue;864 continue;
843 snprintf(filename, filename_size, "%s%s/%s.ffpreset", base[i],865 snprintf(filename, filename_size, "%s%s/%s.ffpreset", base[i],
844 i != 1 ? "" : "/.ffmpeg", preset_name);866 i != 1 ? "" : "/.ffmpeg", preset_name);
845 f = fopen(filename, "r");867 f = fopen_utf8(filename, "r");
846 if (!f && codec_name) {868 if (!f && codec_name) {
847 snprintf(filename, filename_size,869 snprintf(filename, filename_size,
848 "%s%s/%s-%s.ffpreset",870 "%s%s/%s-%s.ffpreset",
849 base[i], i != 1 ? "" : "/.ffmpeg", codec_name,871 base[i], i != 1 ? "" : "/.ffmpeg", codec_name,
850 preset_name);872 preset_name);
851 f = fopen(filename, "r");873 f = fopen_utf8(filename, "r");
852 }874 }
853 }875 }
854 }876 }
855 877
878#if HAVE_GETMODULEHANDLE && defined(_WIN32)
879 av_free(datadir);
880#endif
881 freeenv_utf8(env_ffmpeg_datadir);
882 freeenv_utf8(env_home);
856 return f;883 return f;
857}884}
858 885
fftools/ffmpeg_opt.c+7−2
@@ -44,6 +44,7 @@ · 43 unmodified lines
44#include "libavutil/avutil.h"44#include "libavutil/avutil.h"
45#include "libavutil/bprint.h"45#include "libavutil/bprint.h"
46#include "libavutil/channel_layout.h"46#include "libavutil/channel_layout.h"
47#include "libavutil/getenv_utf8.h"
47#include "libavutil/intreadwrite.h"48#include "libavutil/intreadwrite.h"
48#include "libavutil/fifo.h"49#include "libavutil/fifo.h"
49#include "libavutil/mathematics.h"50#include "libavutil/mathematics.h"
@@ -1402,8 +1403,10 @@ static int get_preset_file_2(const char *preset_name, const char *codec_name, AV · 1352 unmodified lines
1402{1403{
1403 int i, ret = -1;1404 int i, ret = -1;
1404 char filename[1000];1405 char filename[1000];
1405 const char *base[3] = { getenv("AVCONV_DATADIR"),1406 char *env_avconv_datadir = getenv_utf8("AVCONV_DATADIR");
1406 getenv("HOME"),1407 char *env_home = getenv_utf8("HOME");
1408 const char *base[3] = { env_avconv_datadir,
1409 env_home,
1407 AVCONV_DATADIR,1410 AVCONV_DATADIR,
1408 };1411 };
1409 1412
@@ -1421,6 +1424,8 @@ static int get_preset_file_2(const char *preset_name, const char *codec_name, AV · 11 unmodified lines
1421 ret = avio_open2(s, filename, AVIO_FLAG_READ, &int_cb, NULL);1424 ret = avio_open2(s, filename, AVIO_FLAG_READ, &int_cb, NULL);
1422 }1425 }
1423 }1426 }
1427 freeenv_utf8(env_home);
1428 freeenv_utf8(env_avconv_datadir);
1424 return ret;1429 return ret;
1425}1430}
1426 1431

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t