Args prefix;
for (const auto& word : Util::split_into_strings(prefix_command, " ")) {
- char* path = find_executable(ctx, word.c_str(), MYNAME);
- if (!path) {
+ std::string path = find_executable(ctx, word.c_str(), MYNAME);
+ if (path.empty()) {
fatal("%s: %s", word.c_str(), strerror(errno));
}
- args_add(prefix, path);
- free(path);
+ args_add(prefix, path.c_str());
}
cc_log("Using command-line prefix %s", prefix_command.c_str());
}
free(path);
} else {
- char* path = find_executable(ctx, compiler, MYNAME);
- if (path) {
+ std::string path = find_executable(ctx, compiler, MYNAME);
+ if (!path.empty()) {
auto st = Stat::stat(path, Stat::OnError::log);
hash_compiler(ctx, hash, st, ccbin, false);
- free(path);
}
}
}
base = ctx.config.compiler();
}
- char* compiler = find_executable(ctx, base.c_str(), MYNAME);
- if (!compiler) {
+ std::string compiler = find_executable(ctx, base.c_str(), MYNAME);
+ if (compiler.empty()) {
fatal("Could not find compiler \"%s\" in PATH", base.c_str());
}
- if (str_eq(compiler, argv[0])) {
+ if (compiler == argv[0]) {
fatal("Recursive invocation (the name of the ccache binary must be \"%s\")",
MYNAME);
}
win32getshell(const char* path)
{
char* path_env;
- char* sh = NULL;
+ std::string sh;
const char* ext = get_extension(path);
if (ext && strcasecmp(ext, ".sh") == 0 && (path_env = getenv("PATH"))) {
sh = find_executable_in_path("sh.exe", NULL, path_env);
}
- if (!sh && getenv("CCACHE_DETECT_SHEBANG")) {
+ if (sh.empty() && getenv("CCACHE_DETECT_SHEBANG")) {
// Detect shebang.
FILE* fp = fopen(path, "r");
if (fp) {
}
}
- std::string result = sh ? sh : "";
- free(sh);
- return result;
+ return sh;
}
void
// Find an executable by name in $PATH. Exclude any that are links to
// exclude_name.
-char*
+std::string
find_executable(const Context& ctx, const char* name, const char* exclude_name)
{
if (Util::is_absolute_path(name)) {
- return x_strdup(name);
+ return name;
}
const char* path = ctx.config.path().c_str();
}
if (!path) {
cc_log("No PATH variable");
- return nullptr;
+ return "";
}
return find_executable_in_path(name, exclude_name, path);
}
-char*
+std::string
find_executable_in_path(const char* name,
const char* exclude_name,
const char* path)
return nullptr;
}
- char* path_buf = x_strdup(path);
-
// Search the path looking for the first compiler of the right name that
// isn't us.
- char* saveptr = nullptr;
- for (char* tok = strtok_r(path_buf, PATH_DELIM, &saveptr); tok;
- tok = strtok_r(nullptr, PATH_DELIM, &saveptr)) {
+ for (const std::string& dir : Util::split_into_strings(path, PATH_DELIM)) {
#ifdef _WIN32
char namebuf[MAX_PATH];
- int ret = SearchPath(tok, name, NULL, sizeof(namebuf), namebuf, NULL);
+ int ret =
+ SearchPath(dir.c_str(), name, NULL, sizeof(namebuf), namebuf, NULL);
if (!ret) {
char* exename = format("%s.exe", name);
- ret = SearchPath(tok, exename, NULL, sizeof(namebuf), namebuf, NULL);
+ ret =
+ SearchPath(dir.c_str(), exename, NULL, sizeof(namebuf), namebuf, NULL);
free(exename);
}
(void)exclude_name;
if (ret) {
- free(path_buf);
- return x_strdup(namebuf);
+ return std::string(namebuf);
}
#else
assert(exclude_name);
- char* fname = format("%s/%s", tok, name);
+ std::string fname = fmt::format("{}/{}", dir, name);
auto st1 = Stat::lstat(fname);
auto st2 = Stat::stat(fname);
// Look for a normal executable file.
- if (st1 && st2 && st2.is_regular() && access(fname, X_OK) == 0) {
+ if (st1 && st2 && st2.is_regular() && access(fname.c_str(), X_OK) == 0) {
if (st1.is_symlink()) {
std::string real_path = Util::real_path(fname, true);
if (Util::base_name(real_path) == exclude_name) {
}
// Found it!
- free(path_buf);
return fname;
}
- free(fname);
#endif
}
- free(path_buf);
- return nullptr;
+ return "";
}
void
struct Context;
int execute(const char* const* argv, int fd_out, int fd_err, pid_t* pid);
-char*
+std::string
find_executable(const Context& ctx, const char* name, const char* exclude_name);
-char* find_executable_in_path(const char* name,
- const char* exclude_name,
- const char* path);
+std::string find_executable_in_path(const char* name,
+ const char* exclude_name,
+ const char* path);
void print_command(FILE* fp, const char* const* argv);
char* format_command(const char* const* argv);