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