aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJoseph Hunkeler <jhunkeler@gmail.com>2024-11-12 00:59:08 -0500
committerJoseph Hunkeler <jhunkeler@gmail.com>2024-11-12 00:59:08 -0500
commit5a8efc84f7a3c2264926b393aafd5585deaa7195 (patch)
tree7055bde796e3b965368d638c6791ce9e37748449 /src
parent6fe076163eaacac892efd83f9ffe967d2d0e8f52 (diff)
downloadstasis-5a8efc84f7a3c2264926b393aafd5585deaa7195.tar.gz
Add path_manip function
Diffstat (limited to 'src')
-rw-r--r--src/lib/core/utils.c43
1 files changed, 43 insertions, 0 deletions
diff --git a/src/lib/core/utils.c b/src/lib/core/utils.c
index 5f0807c..793b445 100644
--- a/src/lib/core/utils.c
+++ b/src/lib/core/utils.c
@@ -808,3 +808,46 @@ int mkdirs(const char *_path, mode_t mode) {
char *find_version_spec(char *str) {
return strpbrk(str, "@~=<>!");
}
+
+int path_manip(char *path, int mode) {
+ if (isempty(path)) {
+ SYSERROR("%s", "New PATH element cannot be zero-length or NULL");
+ return -1;
+ }
+
+ const char *system_path_old = getenv("PATH");
+ if (!system_path_old) {
+ SYSERROR("%s", "Unable to read PATH");
+ return -1;
+ }
+
+ char *system_path_new = NULL;
+
+ if (mode & PM_APPEND) {
+ asprintf(&system_path_new, "%s:%s", system_path_old, path);
+ } else if (mode & PM_PREPEND) {
+ asprintf(&system_path_new, "%s:%s", path, system_path_old);
+ }
+
+ if (!system_path_new) {
+ SYSERROR("%s", "Unable to allocate memory to update PATH");
+ return -1;
+ }
+
+ if (mode & PM_ONCE) {
+ if (!strstr(system_path_old, path)) {
+ guard_free(system_path_new);
+ return 0;
+ }
+ }
+
+ if (setenv("PATH", system_path_new, 1) < 0) {
+ SYSERROR("Unable to prepend to PATH: %s", path);
+ guard_free(system_path_new);
+ return -1;
+ }
+
+ guard_free(system_path_new);
+ return 0;
+}
+