14 #define dln_warning rb_warning
15 #define dln_warning_arg
17 #define dln_warning fprintf
18 #define dln_warning_arg stderr,
30 #if defined(HAVE_ALLOCA_H)
44 #include <sys/types.h>
48 # define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
51 #ifdef HAVE_SYS_PARAM_H
52 # include <sys/param.h>
55 # define MAXPATHLEN 1024
62 #if !defined(_WIN32) && !HAVE_DECL_GETENV
77 if (path) path = envpath =
strdup(path);
82 path =
"/usr/local/bin;/usr/ucb;/usr/bin;/bin;.";
84 path =
"/usr/local/bin:/usr/ucb:/usr/bin:/bin:.";
88 if (envpath)
free(envpath);
96 if (!path) path =
".";
105 register const char *
dp;
106 register const char *ep;
109 size_t i, fnlen, fspace;
111 static const char extension[][5] = {
115 int is_abs = 0, has_path = 0;
118 const char *
p = fname;
120 static const char pathname_too_long[] =
"openpath: pathname too long (ignored)\n\
121 \tDirectory \"%.*s\"%s\n\tFile \"%.*s\"%s\n";
122 #define PATHNAME_TOO_LONG() dln_warning(dln_warning_arg pathname_too_long, \
123 ((bp - fbuf) > 100 ? 100 : (int)(bp - fbuf)), fbuf, \
124 ((bp - fbuf) > 100 ? "..." : ""), \
125 (fnlen > 100 ? 100 : (int)fnlen), fname, \
126 (fnlen > 100 ? "..." : ""))
128 #define RETURN_IF(expr) if (expr) return (char *)fname;
134 "openpath: pathname too long (ignored)\n\tFile \"%.*s\"%s\n",
135 (fnlen > 100 ? 100 : (
int)fnlen), fname,
136 (fnlen > 100 ?
"..." :
""));
141 # define CharNext(p) ((p)+1)
143 # ifdef DOSISH_DRIVE_LETTER
144 if (((p[0] | 0x20) -
'a') < 26 && p[1] ==
':') {
171 for (j = 0;
STRCASECMP(ext, extension[j]); ) {
172 if (++j ==
sizeof(extension) /
sizeof(extension[0])) {
185 if (i + 1 > size)
goto toolong;
186 fspace = size - i - 1;
189 memcpy(fbuf, fname, i + 1);
190 goto needs_extension;
195 if (*p ==
'.' && *++p ==
'.') ++
p;
201 for (dp = path;; dp = ++ep) {
222 if (*dp ==
'~' && (l == 1 ||
265 if (exe_flag && !ext) {
267 for (j = 0; j <
sizeof(extension) /
sizeof(extension[0]); j++) {
268 if (fspace <
strlen(extension[j])) {
272 strlcpy(bp + i, extension[j], fspace);
273 if (
stat(fbuf, &st) == 0)
280 if (
stat(fbuf, &st) == 0) {
281 if (exe_flag == 0)
return fbuf;
#define PATHNAME_TOO_LONG()
size_t strlen(const char *)
RUBY_EXTERN size_t strlcpy(char *, const char *, size_t)
#define STRCASECMP(s1, s2)
#define DLN_FIND_EXTRA_ARG
unsigned char buf[MIME_BUF_SIZE]
#define DLN_FIND_EXTRA_ARG_DECL
RUBY_EXTERN int eaccess(const char *, int)
char * strchr(char *, char)
static char * dln_find_1(const char *fname, const char *path, char *buf, size_t size, int exe_flag DLN_FIND_EXTRA_ARG_DECL)