diff options
Diffstat (limited to 'src/main.c')
-rw-r--r-- | src/main.c | 46 |
1 files changed, 40 insertions, 6 deletions
@@ -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); |