commit bf588e2dd965ba97befc374dba9eeaf89413ec24
parent 38d7efacbdc22e8848d087730fa6d80d960b2d83
Author: Louis Burda <quent.burda@gmail.com>
Date: Sat, 28 Oct 2023 16:01:13 +0200
Handle ./ paths correctly
Diffstat:
M | wd.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);