main/utils: allow checking for command in $PATH

ASTERISK-30037

Change-Id: I4b6f7264c8c737c476c798d2352f3232b263bbdf
This commit is contained in:
Philip Prindeville 2022-07-26 13:38:10 -06:00 committed by George Joseph
parent 55328b1e5c
commit b89130c184
2 changed files with 45 additions and 0 deletions

View File

@ -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 */

View File

@ -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;
}