| /******************************************************************************* |
| * Copyright (c) 2002, 2010 QNX Software Systems and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * QNX Software Systems - initial API and implementation |
| * Wind River Systems, Inc. |
| * Mikhail Sennikovsky - bug 145737 |
| * Everton Rufino Constantino (IBM) - bug 237611 |
| *******************************************************************************/ |
| /* |
| * 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 |
| |
| #define PATH_DEF "PATH=" |
| const int path_def_len = 5; /* strlen(PATH_DEF); */ |
| |
| char * path_val(char * const envp[]) |
| { |
| int i; |
| if (envp == NULL || envp[0] == NULL) |
| return getenv("PATH" ); |
| |
| for(i = 0; envp[i] != NULL; i++){ |
| char* p = envp[i]; |
| if(!strncmp(PATH_DEF, p, path_def_len)){ |
| return p + path_def_len; |
| } |
| } |
| |
| return NULL; |
| } |
| |
| char * pfind(const char *name, char * const envp[]) |
| { |
| 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) == 0) { |
| return strdup(name); |
| } |
| return NULL; |
| } |
| |
| /* Search in the PATH environment. */ |
| path = path_val( envp ); |
| |
| 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) == 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], NULL); |
| if (fullpath == NULL) |
| printf("Unable to find %s in $PATH.\n", argv[i]); |
| else |
| printf("Found %s @ %s.\n", argv[i], fullpath); |
| } |
| } |
| #endif |