MCPcopy Create free account
hub / github.com/DeusData/codebase-memory-mcp / find_in_path

Function find_in_path

src/cli/cli.c:1081–1109  ·  view source on GitHub ↗

Search for an executable named `name` in the PATH environment variable. * Returns the full path in `out` (max out_sz) if found, else empty string. */

Source from the content-addressed store, hash-verified

1079/* Search for an executable named `name` in the PATH environment variable.
1080 * Returns the full path in `out` (max out_sz) if found, else empty string. */
1081static bool find_in_path(const char *name, char *out, size_t out_sz) {
1082 char path_copy[CLI_BUF_4K];
1083 if (!cbm_safe_getenv("PATH", path_copy, sizeof(path_copy), NULL)) {
1084 return false;
1085 }
1086 char *saveptr;
1087 char *dir = strtok_r(path_copy, PATH_DELIM, &saveptr);
1088 while (dir) {
1089 snprintf(out, out_sz, "%s/%s", dir, name);
1090 if (is_executable(out)) {
1091 return true;
1092 }
1093#ifdef _WIN32
1094 /* On Windows executables carry an extension (PATHEXT). A CLI like
1095 * opencode is often installed as a .cmd / .ps1 / .exe shim (e.g. via
1096 * mise or npm), so the bare-name probe above misses it (#221). Try the
1097 * common executable extensions before moving to the next PATH entry. */
1098 static const char *const win_exts[] = {".exe", ".cmd", ".bat", ".ps1", NULL};
1099 for (int i = 0; win_exts[i]; i++) {
1100 snprintf(out, out_sz, "%s/%s%s", dir, name, win_exts[i]);
1101 if (is_executable(out)) {
1102 return true;
1103 }
1104 }
1105#endif
1106 dir = strtok_r(NULL, PATH_DELIM, &saveptr);
1107 }
1108 return false;
1109}
1110
1111const char *cbm_find_cli(const char *name, const char *home_dir) {
1112 static char buf[CLI_BUF_512];

Callers 2

cbm_find_cliFunction · 0.85
cbm_agent_cli_existsFunction · 0.85

Calls 2

cbm_safe_getenvFunction · 0.85
is_executableFunction · 0.85

Tested by

no test coverage detected