aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
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;
+}
+