mirror of https://github.com/djcb/mu.git
expand_path: better handle paths with spaces
I.e., work around surprising behavior of wordexp Fixes #2566.
This commit is contained in:
parent
2c4c3d8d7c
commit
fcd89039eb
|
@ -352,18 +352,21 @@ Mu::play (const std::string& path)
|
||||||
|
|
||||||
|
|
||||||
Result<std::string>
|
Result<std::string>
|
||||||
Mu::expand_path(const std::string& str)
|
expand_path_real(const std::string& str)
|
||||||
{
|
{
|
||||||
#ifndef HAVE_WORDEXP_H
|
#ifndef HAVE_WORDEXP_H
|
||||||
return Ok(std::string{str});
|
return Ok(std::string{str});
|
||||||
#else
|
#else
|
||||||
int res;
|
int res;
|
||||||
wordexp_t result;
|
wordexp_t result{};
|
||||||
memset(&result, 0, sizeof(result));
|
|
||||||
|
|
||||||
res = wordexp(str.c_str(), &result, 0);
|
res = wordexp(str.c_str(), &result, 0);
|
||||||
if (res != 0 || result.we_wordc == 0)
|
if (res != 0)
|
||||||
return Err(Error::Code::File, "cannot expand '%s'; err=%d", str.c_str(), res);
|
return Err(Error::Code::File, "cannot expand {}; err={}", str, res);
|
||||||
|
else if (auto&n = result.we_wordc; n != 1) {
|
||||||
|
wordfree(&result);
|
||||||
|
return Err(Error::Code::File, "expected 1 expansions, but got {} for {}", n, str);
|
||||||
|
}
|
||||||
|
|
||||||
std::string expanded{result.we_wordv[0]};
|
std::string expanded{result.we_wordv[0]};
|
||||||
wordfree(&result);
|
wordfree(&result);
|
||||||
|
@ -374,6 +377,18 @@ Mu::expand_path(const std::string& str)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Result<std::string>
|
||||||
|
Mu::expand_path(const std::string& str)
|
||||||
|
{
|
||||||
|
if (auto&& res{expand_path_real(str)}; res)
|
||||||
|
return res;
|
||||||
|
|
||||||
|
// failed... try quoting.
|
||||||
|
auto qstr{to_string_gchar(g_shell_quote(str.c_str()))};
|
||||||
|
return expand_path_real(qstr);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef BUILD_TESTS
|
#ifdef BUILD_TESTS
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue