| /* |
| * pfind.c - Search for a binary in $PATH. |
| */ |
| |
| #include <stdio.h> |
| #include <unistd.h> |
| #include <stdlib.h> |
| #include <string.h> |
| #include <limits.h> |
| |
| #ifndef PATH_MAX |
| #define PATH_MAX 1024 |
| #endif |
| |
| |
| char * pfind(const char *name) |
| { |
| char *tok; |
| char *sp; |
| char *path; |
| char fullpath[PATH_MAX+1]; |
| |
| /* Sanity check. */ |
| if (name == NULL) { |
| fprintf(stderr, "pfind(): Null argument.\n"); |
| return NULL; |
| } |
| |
| /* For absolute name or name with a path, check if it is an executable. */ |
| if (name[0] == '/' || name[0] == '.') { |
| if (access(name, X_OK | R_OK) == 0) { |
| return strdup(name); |
| } |
| return NULL; |
| } |
| |
| /* Search in the PATH environment. */ |
| path = getenv("PATH" ); |
| |
| if (path == NULL || strlen(path) <= 0) { |
| fprintf(stderr, "Unable to get $PATH.\n"); |
| return NULL; |
| } |
| |
| /* The value return by getenv() is readonly */ |
| path = strdup(path); |
| |
| tok = strtok_r(path, ":", &sp); |
| while (tok != NULL) { |
| snprintf(fullpath, sizeof(fullpath) - 1, "%s/%s", tok, name); |
| |
| if (access(fullpath, X_OK | R_OK) == 0) { |
| free(path); |
| return strdup(fullpath); |
| } |
| |
| tok = strtok_r( NULL, ":", &sp ); |
| } |
| |
| free(path); |
| return NULL; |
| } |
| |
| #ifdef BUILD_WITH_MAIN |
| int main(int argc, char **argv) |
| { |
| int i; |
| char *fullpath; |
| |
| for (i=1; i<argc; i++) { |
| fullpath = pfind(argv[i]); |
| if (fullpath == NULL) |
| printf("Unable to find %s in $PATH.\n", argv[i]); |
| else |
| printf("Found %s @ %s.\n", argv[i], fullpath); |
| } |
| } |
| #endif |