wd

Workdir changer
git clone https://git.sinitax.com/sinitax/wd
Log | Files | Refs | LICENSE | sfeed.txt

commit bf588e2dd965ba97befc374dba9eeaf89413ec24
parent 38d7efacbdc22e8848d087730fa6d80d960b2d83
Author: Louis Burda <quent.burda@gmail.com>
Date:   Sat, 28 Oct 2023 16:01:13 +0200

Handle ./ paths correctly

Diffstat:
Mwd.c | 19++++++++++++-------
1 file changed, 12 insertions(+), 7 deletions(-)

diff --git a/wd.c b/wd.c @@ -8,6 +8,7 @@ #include <stdlib.h> static void +__attribute__((noreturn)) die(const char *fmt, ...) { va_list ap; @@ -26,14 +27,18 @@ die(const char *fmt, ...) exit(1); } -static void -findbin(char *dst, const char *name) +static char * +findbin(char *name) { + static char binpath[PATH_MAX]; char *env, *tok; struct dirent *ent; int len; DIR *d; + if (!strncmp(name, "./", 2)) + return name; + env = getenv("PATH"); if (!env) die("PATH not set"); @@ -48,10 +53,10 @@ findbin(char *dst, const char *name) if (!strcmp(ent->d_name, name)) { closedir(d); free(env); - len = snprintf(dst, PATH_MAX, + len = snprintf(binpath, PATH_MAX, "%s/%s", tok, ent->d_name); if (len > PATH_MAX) abort(); - return; + return binpath; } } closedir(d); @@ -65,16 +70,16 @@ findbin(char *dst, const char *name) int main(int argc, char **argv) { - char binpath[PATH_MAX]; + char *binpath; if (argc < 3) { fprintf(stderr, "Usage: wd DIR CMD..\n"); return 1; } - if (chdir(argv[1])) die("chdir:"); + if (chdir(argv[1])) die("chdir %s:", argv[1]); - findbin(binpath, argv[2]); + binpath = findbin(argv[2]); execv(binpath, argv + 2);