From: Philip Prindeville Date: Tue, 26 Jul 2022 19:38:10 +0000 (-0600) Subject: main/utils: allow checking for command in $PATH X-Git-Tag: 18.15.0-rc1~10 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=aeb23fe2a7709ffd14503ae1090fc17e7e6aebd4;p=thirdparty%2Fasterisk.git main/utils: allow checking for command in $PATH ASTERISK-30037 Change-Id: I4b6f7264c8c737c476c798d2352f3232b263bbdf --- 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; +} +