diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/lib/core/utils.c | 43 |
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; +} + |