From 2c4c44ca64faa7703cd407e7ca7941882ab1d6ad Mon Sep 17 00:00:00 2001 From: Philip Prindeville <philipp@redfish-solutions.com> Date: Tue, 26 Jul 2022 13:38:10 -0600 Subject: [PATCH] main/utils: allow checking for command in $PATH ASTERISK-30037 Change-Id: I4b6f7264c8c737c476c798d2352f3232b263bbdf --- include/asterisk/utils.h | 10 ++++++++++ main/utils.c | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+) diff --git a/include/asterisk/utils.h b/include/asterisk/utils.h index 72deaa3952..3c06e834eb 100644 --- a/include/asterisk/utils.h +++ b/include/asterisk/utils.h @@ -1105,4 +1105,14 @@ int ast_thread_user_interface_set(int is_user_interface); */ int ast_thread_is_user_interface(void); +/*! + * \brief Test for the presence of an executable command in $PATH + * + * \param cmd Name of command to locate. + * + * \retval True (non-zero) if command is in $PATH. + * \retval False (zero) command not found. + */ +int ast_check_command_in_path(const char *cmd); + #endif /* _ASTERISK_UTILS_H */ diff --git a/main/utils.c b/main/utils.c index 7d1d6bd7b7..3ab6dc1e70 100644 --- a/main/utils.c +++ b/main/utils.c @@ -3216,3 +3216,38 @@ int ast_thread_is_user_interface(void) return *thread_user_interface; } + +int ast_check_command_in_path(const char *cmd) +{ + char *token, *saveptr, *path = getenv("PATH"); + char filename[PATH_MAX]; + int len; + + if (path == NULL) { + return 0; + } + + path = ast_strdup(path); + if (path == NULL) { + return 0; + } + + token = strtok_r(path, ":", &saveptr); + while (token != NULL) { + len = snprintf(filename, sizeof(filename), "%s/%s", token, cmd); + if (len < 0 || len >= sizeof(filename)) { + ast_log(LOG_WARNING, "Path constructed with '%s' too long; skipping\n", token); + continue; + } + + if (access(filename, X_OK) == 0) { + ast_free(path); + return 1; + } + + token = strtok_r(NULL, ":", &saveptr); + } + ast_free(path); + return 0; +} + -- GitLab