ed2882c437d9b713e8a126846f3429917f06def7
[profile/ivi/ecore.git] / src / lib / ecore_file / ecore_file_path.c
1 #ifdef HAVE_CONFIG_H
2 # include <config.h>
3 #endif
4
5 #include <stdio.h>
6 #include <string.h>
7
8 #include "ecore_file_private.h"
9
10 static Eina_List *__ecore_file_path_bin = NULL;
11
12 static Eina_List *_ecore_file_path_from_env(const char *env);
13
14 void
15 ecore_file_path_init(void)
16 {
17    __ecore_file_path_bin = _ecore_file_path_from_env("PATH");
18 }
19
20 void
21 ecore_file_path_shutdown(void)
22 {
23    char *dir;
24
25    EINA_LIST_FREE(__ecore_file_path_bin, dir)
26      free(dir);
27 }
28
29 Eina_List *
30 _ecore_file_path_from_env(const char *env)
31 {
32    Eina_List *path = NULL;
33    char *env_path, *p, *last;
34
35    env_path = getenv(env);
36    if (!env_path)
37      return path;
38
39    env_path = strdup(env_path);
40    last = env_path;
41    for (p = env_path; *p; p++)
42      {
43         if (*p == ':')
44           *p = '\0';
45
46         if (!*p)
47           {
48              if (!ecore_file_path_dir_exists(last))
49                path = eina_list_append(path, strdup(last));
50              last = p + 1;
51           }
52      }
53    if (p > last)
54      path = eina_list_append(path, strdup(last));
55
56    free(env_path);
57    return path;
58 }
59
60 /**
61  * Check if the given directory is in PATH
62  * @param The name of the directory to search in PATH
63  * @return 1 if the directory exist in PATH, 0 otherwise
64  */
65 EAPI int
66 ecore_file_path_dir_exists(const char *in_dir)
67 {
68    Eina_List *l;
69    char *dir;
70
71    if (!__ecore_file_path_bin) return 0;
72    EINA_LIST_FOREACH(__ecore_file_path_bin, l, dir)
73      {
74         if (strcmp(dir, in_dir))
75           return 1;
76      }
77
78    return 0;
79 }
80
81 /**
82  * Check if the given application is installed
83  * @param  exe The name of the application
84  * @return 1 if the exe is in PATH and is executable
85  * 
86  * This function check if the given name exist in PATH and is executable 
87  */
88 EAPI int
89 ecore_file_app_installed(const char *exe)
90 {
91    Eina_List *l;
92    char *dir;
93    char  buf[PATH_MAX];
94
95    if (!exe) return 0;
96    if (ecore_file_can_exec(exe)) return 1;
97
98    EINA_LIST_FOREACH(__ecore_file_path_bin, l, dir)
99      {
100         snprintf(buf, sizeof(buf), "%s/%s", dir, exe);
101         if (ecore_file_can_exec(buf))
102           return 1;
103      }
104
105    return 0;
106 }
107
108 /**
109  * Get a list of all the applications installed on the system
110  * @return An Eina_List containing all the executable files in the system
111  */
112 EAPI Eina_List *
113 ecore_file_app_list(void)
114 {
115    Eina_List *list = NULL;
116    Eina_List *files;
117    Eina_List *l;
118    char  buf[PATH_MAX], *dir, *exe;
119    
120    EINA_LIST_FOREACH(__ecore_file_path_bin, l, dir)
121      {
122         files = ecore_file_ls(dir);
123         EINA_LIST_FREE(files, exe)
124                {
125                   snprintf(buf, sizeof(buf), "%s/%s", dir, exe);
126                   if ((ecore_file_can_exec(buf)) &&
127                       (!ecore_file_is_dir(buf)))
128                list = eina_list_append(list, strdup(buf));
129              free(exe);
130           }
131      }
132
133    return list;
134 }