summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLouis Burda <quent.burda@gmail.com>2023-10-28 16:01:13 +0200
committerLouis Burda <quent.burda@gmail.com>2023-10-28 16:01:13 +0200
commitbf588e2dd965ba97befc374dba9eeaf89413ec24 (patch)
tree0322248acdb930c53b4cf8d8ca94fa999460ab2d
parent38d7efacbdc22e8848d087730fa6d80d960b2d83 (diff)
downloadwd-bf588e2dd965ba97befc374dba9eeaf89413ec24.tar.gz
wd-bf588e2dd965ba97befc374dba9eeaf89413ec24.zip
Handle ./ paths correctly
-rw-r--r--wd.c19
1 files changed, 12 insertions, 7 deletions
diff --git a/wd.c b/wd.c
index 3fb2b46..3fbcc6f 100644
--- 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);