1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
|
/* Given a filename, dld_find_executable searches the directories listed in the
environment variable PATH for a file with that filename.
A new copy of the complete path name of that file is returned. This new
string may be disposed by free() later on.
*/
/* This file is part of DLD, a dynamic link/unlink editor for C.
Copyright (C) 1990 by W. Wilson Ho.
The author can be reached electronically by how@cs.ucdavis.edu or
through physical mail at:
W. Wilson Ho
Division of Computer Science
University of California at Davis
Davis, CA 95616
*/
/* This program is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
Free Software Foundation; either version 1, or (at your option) any
later version. */
#include <sys/file.h>
#include <sys/param.h>
#include <strings.h>
#ifdef linux
#include <stdlib.h>
#include <sys/stat.h>
#include <unistd.h> /* for X_OK define */
#endif
#ifndef __STDC__
# define const /**/
#endif
#define DEFAULT_PATH ".:~/bin::/usr/local/bin:/usr/new:/usr/ucb:/usr/bin:/bin:/usr/hosts"
static char *
copy_of (s)
register const char *s;
{
register char *p = (char *) malloc (strlen(s)+1);
if (!p) return 0;
*p = 0;
strcpy (p, s);
return p;
}
/* ABSOLUTE_FILENAME_P (fname): True if fname is an absolute filename */
#ifdef atarist
#define ABSOLUTE_FILENAME_P(fname) ((fname[0] == '/') || \
(fname[0] && (fname[1] == ':')))
#else
#define ABSOLUTE_FILENAME_P(fname) (fname[0] == '/')
#endif /* atarist */
char *
dld_find_executable (file)
const char *file;
{
char *search;
register char *p;
char name[MAXPATHLEN];
if (ABSOLUTE_FILENAME_P(file))
return copy_of (file);
#ifdef linux
if ((file[0] == '.') && (file[1] == '/')) {
getcwd (name, MAXPATHLEN);
strcat (name, file+1);
return copy_of (name);
}
#endif
if (((search = (char *) getenv("DLDPATH")) == 0) &&
((search = (char *) getenv("PATH")) == 0))
search = DEFAULT_PATH;
p = search;
while (*p) {
register char *next;
next = name;
/* copy directory name into [name] */
while (*p && *p != ':') *next++ = *p++;
*next = 0;
if (*p) p++;
if (name[0] == '.' && name[1] == 0)
getwd (name);
strcat (name, "/");
strcat (name, file);
if (access (name, X_OK) == 0) {
#ifdef linux
struct stat stat_temp;
if (stat(name,&stat_temp)) continue;
if (S_IFREG != (S_IFMT & stat_temp.st_mode)) continue;
#endif /* linux */
return copy_of (name);
}
}
return 0;
}
|