diff options
-rw-r--r-- | README.md | 15 | ||||
-rw-r--r-- | lib/cleanpath.c | 6 | ||||
-rw-r--r-- | src/main.c | 96 | ||||
-rw-r--r-- | tests/CMakeLists.txt | 3 |
4 files changed, 98 insertions, 22 deletions
@@ -18,14 +18,15 @@ $ make install # Usage ```shell -usage: cleanpath [-hVelrsE] [pattern ...] +usage: cleanpath [-hVDAelrsEv] [pattern ...] --help -h Displays this help message --version -V Displays the program's version - --default -D Displays default operating system PATH + --default -D Displays default operating system PATH --list Format output as a list + --all -A Apply to all environment variables --exact -e Filter when pattern is an exact match (default) --loose -l Filter when any part of the pattern matches - --regex -r Filter matches with (Extended) Regular Expressions + --regex -r Filter matches with (Extended) Regular Expressions --sep [str] -s Use custom path separator (default: ':') --env [str] -E Use custom environment variable (default: PATH) ``` @@ -74,3 +75,11 @@ a:b/e:f PATH=$(cleanpath -r '^/opt/local/.*' '^/opt/sw/.*') export PATH ``` + +## Using cleanpath to filter your entire runtime environment + +```shell +#!/usr/bin/env bash +# Remove MacPorts and Fink from ALL environment variables +eval $(cleanpath -A -r '^/opt/local/.*' '^/opt/sw/.*') +```
\ No newline at end of file diff --git a/lib/cleanpath.c b/lib/cleanpath.c index 91b399d..138251f 100644 --- a/lib/cleanpath.c +++ b/lib/cleanpath.c @@ -102,18 +102,24 @@ void cleanpath_filter(struct CleanPath *path, unsigned mode, const char *pattern char *cleanpath_read(struct CleanPath *path) { char *result; size_t result_len; + size_t part_count; result = calloc(path->data_len, sizeof(char)); if (result == NULL) { goto cleanpath_read__failure; } + for (part_count = 0; part_count < CLEANPATH_PART_MAX && path->part[part_count] != NULL; part_count++); + for (size_t i = 0; i < CLEANPATH_PART_MAX && path->part[i] != NULL; i++) { // Ignore filtered paths if (*path->part[i] == '\0') { continue; } strcat(result, path->part[i]); + if (part_count > 1 && i == 0) { + continue; + } strcat(result, path->sep); } @@ -1,7 +1,6 @@ #include <stdio.h> #include <stdlib.h> #include <string.h> -#include <errno.h> #include "config.h" #include "cleanpath/cleanpath.h" @@ -15,6 +14,9 @@ // Global program path static char *program; +// Global runtime environment +static char **environ; + int is_valid_arg(char **args, char *s) { int match; @@ -35,8 +37,20 @@ int is_valid_arg(char **args, char *s) { } char *getenv_ex(char *s) { + char *key, *key_end; char *env_var; - env_var = getenv(s); + key = strdup(s); + if (!key) { + return NULL; + } + + key_end = strchr(key, '='); + if (key_end) { + *key_end = '\0'; + } + env_var = getenv(key); + free(key); + if (!env_var || !strlen(env_var)) { return NULL; } @@ -75,6 +89,12 @@ static int show_default_path() { return 0; } +char *get_path(struct CleanPath *path) { + char *result; + result = cleanpath_read(path); + return result; +} + void show_path(struct CleanPath *path) { char *result; @@ -95,11 +115,12 @@ static void show_usage() { char *bname; bname = strrchr(program, '/'); - printf("usage: %s [-hVDelrsv] [pattern ...]\n", bname ? bname + 1 : program); + printf("usage: %s [-hVDAelrsEv] [pattern ...]\n", bname ? bname + 1 : program); printf(" --help -h Displays this help message\n"); printf(" --version -V Displays the program's version\n"); printf(" --default -D Displays default operating system PATH " CLEANPATH_MSG_NO_DEFAULT_PATH "\n"); printf(" --list Format output as a list\n"); + printf(" --all -A Apply to all environment variables\n"); printf(" --exact -e Filter when pattern is an exact match (default)\n"); printf(" --loose -l Filter when any part of the pattern matches\n"); printf(" --regex -r Filter matches with (Extended) Regular Expressions " CLEANPATH_MSG_NO_REGEX "\n"); @@ -107,10 +128,12 @@ static void show_usage() { printf(" --env [str] -E Use custom environment variable (default: PATH)\n"); } -int main(int argc, char *argv[]) { +int main(int argc, char *argv[], char *arge[]) { + environ = arge; struct CleanPath *path; char *sep; char *sys_var; + int do_all_sys_vars; int do_listing; int do_default_path; int filter_mode; @@ -131,6 +154,7 @@ int main(int argc, char *argv[]) { "--version", "-V", "--list", "--default", "-D", + "--all", "-A", "--exact", "-e", "--loose", "-l", "--regex", "-r", @@ -155,6 +179,9 @@ int main(int argc, char *argv[]) { if (ARGM("--list")) { do_listing = 1; } + if (ARGM("--all") || ARGM("-A")) { + do_all_sys_vars = 1; + } if (ARGM("--default") || ARGM("-D")) { do_default_path = 1; } @@ -207,25 +234,56 @@ int main(int argc, char *argv[]) { } // Initialize path data - path = cleanpath_init(sys_var, sep); - if (path == NULL) { - exit(1); - } + if (do_all_sys_vars) { + for (size_t i = 0; environ[i] != NULL; i++) { + char *var = getenv_ex(environ[i]); + path = cleanpath_init(var, sep); + if (path == NULL) { + exit(1); + } - // Remove patterns from sys_var - for (size_t i = 0; i < CLEANPATH_PART_MAX && pattern[i] != NULL; i++) { - cleanpath_filter(path, filter_mode, pattern[i]); - } + char *key = strdup(environ[i]); + char *key_end = strchr(key, '='); + if (key_end) { + *key_end = '\0'; + } + // Remove patterns from sys_var + for (size_t p = 0; p < CLEANPATH_PART_MAX && pattern[p] != NULL; p++) { + cleanpath_filter(path, filter_mode, pattern[p]); + } - // Print filtered result - if (do_listing) { - show_listing(path); + // Print filtered result + if (do_listing) { + show_listing(path); + } else { + char *data = get_path(path); + printf("%s='%s'\n", key, data); + free(data); + } + free(key); + free(path); + } } else { - show_path(path); - } + path = cleanpath_init(sys_var, sep); + if (path == NULL) { + exit(1); + } + + // Remove patterns from sys_var + for (size_t i = 0; i < CLEANPATH_PART_MAX && pattern[i] != NULL; i++) { + cleanpath_filter(path, filter_mode, pattern[i]); + } - // Clean up - cleanpath_free(path); + // Print filtered result + if (do_listing) { + show_listing(path); + } else { + show_path(path); + } + + // Clean up + cleanpath_free(path); + } return 0; } diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 0134945..da31ce8 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -40,6 +40,9 @@ else() add_test(cmd_arg_exact ${exec} ${TEST_SETUP} --exact /usr/bin) add_test(cmd_arg_loose ${exec} ${TEST_SETUP} --loose /usr/bin) add_test(cmd_arg_regex ${exec} ${TEST_SETUP} --regex /usr/bin) + add_test(cmd_arg_all_exact ${exec} ${TEST_SETUP} --all --exact /usr/bin) + add_test(cmd_arg_all_loose ${exec} ${TEST_SETUP} --all --loose /usr/bin) + add_test(cmd_arg_all_regex ${exec} ${TEST_SETUP} --all --regex /usr/bin) endif() add_test(cmd_arg_help ${exec} --help) |