forked from enlightenment/efl
120 lines
3.0 KiB
C
120 lines
3.0 KiB
C
#include "evas_gl_private.h"
|
|
|
|
static mode_t default_mode = S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH;
|
|
|
|
Eina_Bool
|
|
evas_gl_common_file_cache_is_dir(const char *file)
|
|
{
|
|
struct stat st;
|
|
|
|
if (stat(file, &st) < 0) return EINA_FALSE;
|
|
if (S_ISDIR(st.st_mode)) return EINA_TRUE;
|
|
return EINA_FALSE;
|
|
}
|
|
|
|
Eina_Bool
|
|
evas_gl_common_file_cache_mkdir(const char *dir)
|
|
{
|
|
/* evas gl only call this function when the dir is not exist */
|
|
if (mkdir(dir, default_mode) < 0) return EINA_FALSE;
|
|
return EINA_TRUE;
|
|
}
|
|
|
|
Eina_Bool
|
|
evas_gl_common_file_cache_file_exists(const char *file)
|
|
{
|
|
struct stat st;
|
|
if (!file) return EINA_FALSE;
|
|
if (stat(file, &st) < 0) return EINA_FALSE;
|
|
return EINA_TRUE;
|
|
}
|
|
|
|
Eina_Bool
|
|
evas_gl_common_file_cache_mkpath_if_not_exists(const char *path)
|
|
{
|
|
struct stat st;
|
|
|
|
if (stat(path, &st) < 0)
|
|
return evas_gl_common_file_cache_mkdir(path);
|
|
else if (!S_ISDIR(st.st_mode))
|
|
return EINA_FALSE;
|
|
else
|
|
return EINA_TRUE;
|
|
}
|
|
|
|
Eina_Bool
|
|
evas_gl_common_file_cache_mkpath(const char *path)
|
|
{
|
|
char ss[PATH_MAX];
|
|
unsigned int i;
|
|
|
|
#if defined(HAVE_GETUID) && defined(HAVE_GETEUID)
|
|
if (getuid() != geteuid()) return EINA_FALSE;
|
|
#endif
|
|
if (evas_gl_common_file_cache_is_dir(path)) return EINA_TRUE;
|
|
|
|
for (i = 0; path[i]; ss[i] = path[i], i++)
|
|
{
|
|
if (i == sizeof(ss) - 1) return EINA_FALSE;
|
|
if ((path[i] == '/') && (i > 0))
|
|
{
|
|
ss[i] = 0;
|
|
if (!evas_gl_common_file_cache_mkpath_if_not_exists(ss))
|
|
return EINA_FALSE;
|
|
}
|
|
}
|
|
ss[i] = 0;
|
|
return evas_gl_common_file_cache_mkpath_if_not_exists(ss);
|
|
}
|
|
|
|
int
|
|
evas_gl_common_file_cache_dir_check(char *cache_dir, int num)
|
|
{
|
|
char *home = NULL;
|
|
char *subdir = ".cache/evas_gl_common_caches";
|
|
|
|
#if defined(HAVE_GETUID) && defined(HAVE_GETEUID)
|
|
if (getuid() != geteuid()) return 0;
|
|
#endif
|
|
home = getenv("HOME");
|
|
if ((!home) || (!home[0])) return 0;
|
|
|
|
snprintf(cache_dir, num, "%s/%s", home, subdir);
|
|
return evas_gl_common_file_cache_file_exists(cache_dir);
|
|
}
|
|
|
|
int
|
|
evas_gl_common_file_cache_file_check(const char *cache_dir, const char *cache_name, char *cache_file, int dir_num)
|
|
{
|
|
char before_name[PATH_MAX];
|
|
char after_name[PATH_MAX];
|
|
int new_path_len = 0;
|
|
int i = 0, j = 0;
|
|
|
|
char *vendor = NULL;
|
|
char *driver = NULL;
|
|
char *version = NULL;
|
|
|
|
vendor = (char *)glGetString(GL_VENDOR);
|
|
driver = (char *)glGetString(GL_RENDERER);
|
|
version = (char *)glGetString(GL_VERSION);
|
|
|
|
new_path_len = snprintf(before_name, sizeof(before_name), "%s::%s::%s::%s::%s.eet", vendor, version, driver, MODULE_ARCH, cache_name);
|
|
|
|
/* remove '/' from file name */
|
|
for (i = 0; i < new_path_len; i++)
|
|
{
|
|
if (before_name[i] != '/')
|
|
{
|
|
after_name[j] = before_name[i];
|
|
j++;
|
|
}
|
|
}
|
|
after_name[j] = 0;
|
|
|
|
snprintf(cache_file, dir_num, "%s/%s", cache_dir, after_name);
|
|
|
|
return evas_gl_common_file_cache_file_exists(cache_file);
|
|
}
|
|
|