/* * pfind.c - Search for a binary in $PATH. */ #include #include #include #include #include #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