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

Function find_in_path

src/cli/cli.c:883–911  ·  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

881/* Search for an executable named `name` in the PATH environment variable.
882 * Returns the full path in `out` (max out_sz) if found, else empty string. */
883static bool find_in_path(const char *name, char *out, size_t out_sz) {
884 char path_copy[CLI_BUF_4K];
885 if (!cbm_safe_getenv("PATH", path_copy, sizeof(path_copy), NULL)) {
886 return false;
887 }
888 char *saveptr;
889 char *dir = strtok_r(path_copy, PATH_DELIM, &saveptr);
890 while (dir) {
891 snprintf(out, out_sz, "%s/%s", dir, name);
892 if (is_executable(out)) {
893 return true;
894 }
895#ifdef _WIN32
896 /* On Windows executables carry an extension (PATHEXT). A CLI like
897 * opencode is often installed as a .cmd / .ps1 / .exe shim (e.g. via
898 * mise or npm), so the bare-name probe above misses it (#221). Try the
899 * common executable extensions before moving to the next PATH entry. */
900 static const char *const win_exts[] = {".exe", ".cmd", ".bat", ".ps1", NULL};
901 for (int i = 0; win_exts[i]; i++) {
902 snprintf(out, out_sz, "%s/%s%s", dir, name, win_exts[i]);
903 if (is_executable(out)) {
904 return true;
905 }
906 }
907#endif
908 dir = strtok_r(NULL, PATH_DELIM, &saveptr);
909 }
910 return false;
911}
912
913const char *cbm_find_cli(const char *name, const char *home_dir) {
914 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