Magellan Linux

Contents of /trunk/mkinitrd-magellan/busybox/libbb/execable.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 532 - (show annotations) (download)
Sat Sep 1 22:45:15 2007 UTC (16 years, 9 months ago) by niro
File MIME type: text/plain
File size: 1176 byte(s)
-import if magellan mkinitrd; it is a fork of redhats mkinitrd-5.0.8 with all magellan patches and features; deprecates magellan-src/mkinitrd

1 /* vi: set sw=4 ts=4: */
2 /*
3 * Utility routines.
4 *
5 * Copyright (C) 2006 Gabriel Somlo <somlo at cmu.edu>
6 *
7 * Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
8 */
9
10 #include "libbb.h"
11
12 /* check if path points to an executable file;
13 * return 1 if found;
14 * return 0 otherwise;
15 */
16 int execable_file(const char *name)
17 {
18 struct stat s;
19 return (!access(name, X_OK) && !stat(name, &s) && S_ISREG(s.st_mode));
20 }
21
22 /* search $PATH for an executable file;
23 * return allocated string containing full path if found;
24 * return NULL otherwise;
25 */
26 char *find_execable(const char *filename)
27 {
28 char *path, *p, *n;
29
30 p = path = xstrdup(getenv("PATH"));
31 while (p) {
32 n = strchr(p, ':');
33 if (n)
34 *n++ = '\0';
35 if (*p != '\0') { /* it's not a PATH="foo::bar" situation */
36 p = concat_path_file(p, filename);
37 if (execable_file(p)) {
38 free(path);
39 return p;
40 }
41 free(p);
42 }
43 p = n;
44 }
45 free(path);
46 return NULL;
47 }
48
49 /* search $PATH for an executable file;
50 * return 1 if found;
51 * return 0 otherwise;
52 */
53 int exists_execable(const char *filename)
54 {
55 char *ret = find_execable(filename);
56 if (ret) {
57 free(ret);
58 return 1;
59 }
60 return 0;
61 }