diff options
| author | Louis Burda <quent.burda@gmail.com> | 2023-10-28 16:01:13 +0200 |
|---|---|---|
| committer | Louis Burda <quent.burda@gmail.com> | 2023-10-28 16:01:13 +0200 |
| commit | bf588e2dd965ba97befc374dba9eeaf89413ec24 (patch) | |
| tree | 0322248acdb930c53b4cf8d8ca94fa999460ab2d | |
| parent | 38d7efacbdc22e8848d087730fa6d80d960b2d83 (diff) | |
| download | wd-bf588e2dd965ba97befc374dba9eeaf89413ec24.tar.gz wd-bf588e2dd965ba97befc374dba9eeaf89413ec24.zip | |
Handle ./ paths correctly
| -rw-r--r-- | wd.c | 19 |
1 files changed, 12 insertions, 7 deletions
@@ -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); |
