aboutsummaryrefslogtreecommitdiff
path: root/src/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/main.c')
-rw-r--r--src/main.c46
1 files changed, 40 insertions, 6 deletions
diff --git a/src/main.c b/src/main.c
index 7b60bbe..71cc6fd 100644
--- a/src/main.c
+++ b/src/main.c
@@ -2,8 +2,13 @@
#include <stdlib.h>
#include <string.h>
#include <errno.h>
+#include "config.h"
#include "cleanpath/cleanpath.h"
+#if !OS_WINDOWS
+#include <unistd.h>
+#endif
+
// Make argument parsing less wordy
#define ARGM(X) strcmp(argv[i], X) == 0
@@ -51,6 +56,25 @@ void show_listing(struct CleanPath *path) {
}
}
+static int show_default_path() {
+ char buf[CLEANPATH_PART_MAX];
+#if OS_WINDOWS
+ // I could not find anything in MSDN about dumping default path information.
+ // The internet agrees "this" is "it" (XP/Vista/8/10):
+ strncpy(buf, "%SystemRoot%\\system32;%SystemRoot%;%SystemRoot%\\System32\\Wbem;", sizeof(buf));
+#elif HAVE_CONFSTR // POSIX
+ size_t cf_status;
+ cf_status = confstr(_CS_PATH, buf, sizeof(buf));
+ if (cf_status < 1) { // 0 and -1 are possible error codes for linux and darwin
+ return 1;
+ }
+#else
+ *buf = '\0';
+#endif
+ puts(buf);
+ return 0;
+}
+
void show_path(struct CleanPath *path) {
char *result;
@@ -71,13 +95,14 @@ static void show_usage() {
char *bname;
bname = strrchr(program, '/');
- printf("usage: %s [-hVelrsv] [pattern ...]\n", bname ? bname + 1 : program);
+ printf("usage: %s [-hVDelrsv] [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(" --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_NOAVAIL "\n");
+ printf(" --regex -r Filter matches with (Extended) Regular Expressions " CLEANPATH_MSG_NO_REGEX "\n");
printf(" --sep [str] -s Use custom path separator (default: ':')\n");
printf(" --env [str] -E Use custom environment variable (default: PATH)\n");
}
@@ -86,27 +111,28 @@ int main(int argc, char *argv[]) {
struct CleanPath *path;
char *sep;
char *sys_var;
- char *result;
- size_t pattern_nelem;
int do_listing;
+ int do_default_path;
int filter_mode;
int args_invalid;
+ size_t pattern_nelem;
char *pattern[CLEANPATH_PART_MAX];
program = argv[0];
- result = NULL;
sys_var = NULL;
sep = CLEANPATH_SEP;
do_listing = 0;
+ do_default_path = 0;
filter_mode = CLEANPATH_FILTER_NONE;
- memset(pattern, 0, sizeof(pattern) / sizeof(char *));
pattern_nelem = 0;
+ memset(pattern, 0, (sizeof(pattern) / sizeof(char *)) * sizeof(char *));
args_invalid = 0;
char *args_valid[] = {
"--help", "-h",
"--version", "-V",
"--list",
+ "--default", "-D",
"--exact", "-e",
"--loose", "-l",
"--regex", "-r",
@@ -135,6 +161,9 @@ int main(int argc, char *argv[]) {
if (ARGM("--list")) {
do_listing = 1;
}
+ if (ARGM("--default") || ARGM("-D")) {
+ do_default_path = 1;
+ }
if (ARGM("--exact") || ARGM("-e")) {
filter_mode = CLEANPATH_FILTER_EXACT;
continue;
@@ -173,6 +202,11 @@ int main(int argc, char *argv[]) {
pattern_nelem++;
}
+ // Show default system path, and exit
+ if (do_default_path) {
+ exit(show_default_path());
+ }
+
// Use default environment variable when not set by --var
if (sys_var == NULL) {
sys_var = getenv_ex(CLEANPATH_VAR);