aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoseph Hunkeler <jhunkeler@gmail.com>2022-02-14 20:04:35 -0500
committerJoseph Hunkeler <jhunkeler@gmail.com>2022-02-14 20:04:35 -0500
commit10a13c64cc5ee3ff16caa77a7b809702cff38595 (patch)
tree2816b6e83dba605d73dbe4602e88744759e2e21a
parent68bb18b1dde2b42913c68501a9d875804b181318 (diff)
downloadcleanpath-10a13c64cc5ee3ff16caa77a7b809702cff38595.tar.gz
Implement --all/-A
* Apply filters to all environment variables
-rw-r--r--README.md15
-rw-r--r--lib/cleanpath.c6
-rw-r--r--src/main.c96
-rw-r--r--tests/CMakeLists.txt3
4 files changed, 98 insertions, 22 deletions
diff --git a/README.md b/README.md
index 838a1bc..4591e22 100644
--- a/README.md
+++ b/README.md
@@ -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);
}
diff --git a/src/main.c b/src/main.c
index f098582..ffab0ac 100644
--- a/src/main.c
+++ b/src/main.c
@@ -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)