|
Message-Id: <20190723183354.31633-1-ismael@iodev.co.uk> Date: Tue, 23 Jul 2019 20:33:54 +0200 From: Ismael Luceno <ismael@...ev.co.uk> To: musl@...ts.openwall.com Cc: Ismael Luceno <ismael@...ev.co.uk> Subject: [PATCH] glob: implement GLOB_TILDE Signed-off-by: Ismael Luceno <ismael@...ev.co.uk> --- include/glob.h | 1 + src/regex/glob.c | 26 ++++++++++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/include/glob.h b/include/glob.h index 76f6c1c68a23..fc8106b20c5b 100644 --- a/include/glob.h +++ b/include/glob.h @@ -30,6 +30,7 @@ void globfree(glob_t *); #define GLOB_APPEND 0x20 #define GLOB_NOESCAPE 0x40 #define GLOB_PERIOD 0x80 +#define GLOB_TILDE 0x100 #define GLOB_NOSPACE 1 #define GLOB_ABORTED 2 diff --git a/src/regex/glob.c b/src/regex/glob.c index aa1c6a4482ee..77b81f707420 100644 --- a/src/regex/glob.c +++ b/src/regex/glob.c @@ -8,6 +8,8 @@ #include <stdlib.h> #include <errno.h> #include <stddef.h> +#include <unistd.h> +#include "../passwd/pwf.h" struct match { @@ -35,6 +37,30 @@ static int do_glob(char *buf, size_t pos, int type, char *pat, int flags, int (* /* If GLOB_MARK is unused, we don't care about type. */ if (!type && !(flags & GLOB_MARK)) type = DT_REG; + if ((flags & GLOB_TILDE) && *pat == '~') { + struct passwd pw, *res; + char *buf = NULL; + size_t len = 0; + char *name_end = strchr(++pat, '/'); + if (name_end) + *name_end = 0; + uid_t uid = *pat ? 0 : getuid(); + int err = __getpw_a(pat, uid, &pw, &buf, &len, &res); + if (!err && res) { + while (pos < PATH_MAX - 1 && *pw.pw_dir) + buf[pos++] = *pw.pw_dir++; + } + free(buf); + if (err) + return GLOB_NOSPACE; + if (!res) + return 0; + if (name_end) { + pat = name_end; + *pat = '/'; + } + } + /* Special-case the remaining pattern being all slashes, in * which case we can use caller-passed type if it's a dir. */ if (*pat && type!=DT_DIR) type = 0; -- 2.22.0
Powered by blists - more mailing lists
Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.