51static int need_reread = TRUE;
 
   52static time_t last_stat_time = 0;
 
   64static int n_caches = 0;
 
  102xdg_dir_time_list_add (
char   *file_name, 
 
  107  for (list = dir_time_list; list; list = list->
next) 
 
  120  list->
next = dir_time_list;
 
  121  dir_time_list = list;
 
  139xdg_mime_init_from_directory (
const char *directory)
 
  144  assert (directory != NULL);
 
  146  file_name = malloc (strlen (directory) + strlen (
"/mime/mime.cache") + 1);
 
  147  strcpy (file_name, directory); strcat (file_name, 
"/mime/mime.cache");
 
  148  if (stat (file_name, &st) == 0)
 
  154      xdg_dir_time_list_add (file_name, st.st_mtime);
 
  166  file_name = malloc (strlen (directory) + strlen (
"/mime/globs2") + 1);
 
  167  strcpy (file_name, directory); strcat (file_name, 
"/mime/globs2");
 
  168  if (stat (file_name, &st) == 0)
 
  171      xdg_dir_time_list_add (file_name, st.st_mtime);
 
  176      file_name = malloc (strlen (directory) + strlen (
"/mime/globs") + 1);
 
  177      strcpy (file_name, directory); strcat (file_name, 
"/mime/globs");
 
  178      if (stat (file_name, &st) == 0)
 
  181          xdg_dir_time_list_add (file_name, st.st_mtime);
 
  189  file_name = malloc (strlen (directory) + strlen (
"/mime/magic") + 1);
 
  190  strcpy (file_name, directory); strcat (file_name, 
"/mime/magic");
 
  191  if (stat (file_name, &st) == 0)
 
  194      xdg_dir_time_list_add (file_name, st.st_mtime);
 
  201  file_name = malloc (strlen (directory) + strlen (
"/mime/aliases") + 1);
 
  202  strcpy (file_name, directory); strcat (file_name, 
"/mime/aliases");
 
  206  file_name = malloc (strlen (directory) + strlen (
"/mime/subclasses") + 1);
 
  207  strcpy (file_name, directory); strcat (file_name, 
"/mime/subclasses");
 
  211  file_name = malloc (strlen (directory) + strlen (
"/mime/icons") + 1);
 
  212  strcpy (file_name, directory); strcat (file_name, 
"/mime/icons");
 
  216  file_name = malloc (strlen (directory) + strlen (
"/mime/generic-icons") + 1);
 
  217  strcpy (file_name, directory); strcat (file_name, 
"/mime/generic-icons");
 
  229  const char *xdg_data_home;
 
  230  const char *xdg_data_dirs;
 
  233  xdg_data_home = getenv (
"XDG_DATA_HOME");
 
  236      if ((func) (xdg_data_home, user_data))
 
  243      home = getenv (
"HOME");
 
  246      char *guessed_xdg_home;
 
  249      guessed_xdg_home = malloc (strlen (home) + strlen (
"/.local/share/") + 1);
 
  250      strcpy (guessed_xdg_home, home);
 
  251      strcat (guessed_xdg_home, 
"/.local/share/");
 
  252      stop_processing = (func) (guessed_xdg_home, user_data);
 
  253      free (guessed_xdg_home);
 
  260  xdg_data_dirs = getenv (
"XDG_DATA_DIRS");
 
  261  if (xdg_data_dirs == NULL)
 
  262    xdg_data_dirs = 
"/usr/local/share/:/usr/share/";
 
  266  while (*ptr != 
'\000')
 
  274      while (*end_ptr != 
':' && *end_ptr != 
'\000')
 
  286    len = end_ptr - ptr + 1;
 
  287      dir = malloc (len + 1);
 
  288      strncpy (dir, ptr, len);
 
  290      stop_processing = (func) (dir, user_data);
 
  307xdg_check_file (
const char *file_path,
 
  313  if (stat (file_path, &st) == 0)
 
  320      for (list = dir_time_list; list; list = list->
next)
 
  324          if (st.st_mtime == list->
mtime)
 
  342xdg_check_dir (
const char *directory,
 
  343           int        *invalid_dir_list)
 
  348  assert (directory != NULL);
 
  351  file_name = malloc (strlen (directory) + strlen (
"/mime/mime.cache") + 1);
 
  352  strcpy (file_name, directory); strcat (file_name, 
"/mime/mime.cache");
 
  353  invalid = xdg_check_file (file_name, &exists);
 
  357      *invalid_dir_list = TRUE;
 
  366  file_name = malloc (strlen (directory) + strlen (
"/mime/globs") + 1);
 
  367  strcpy (file_name, directory); strcat (file_name, 
"/mime/globs");
 
  368  invalid = xdg_check_file (file_name, NULL);
 
  372      *invalid_dir_list = TRUE;
 
  377  file_name = malloc (strlen (directory) + strlen (
"/mime/magic") + 1);
 
  378  strcpy (file_name, directory); strcat (file_name, 
"/mime/magic");
 
  379  invalid = xdg_check_file (file_name, NULL);
 
  383      *invalid_dir_list = TRUE;
 
  396  int invalid_dir_list = FALSE;
 
  398  for (list = dir_time_list; list; list = list->
next)
 
  404  if (invalid_dir_list)
 
  407  for (list = dir_time_list; list; list = list->
next)
 
  421xdg_check_time_and_dirs (
void)
 
  427  gettimeofday (&tv, NULL);
 
  428  current_time = tv.tv_sec;
 
  430  if (current_time >= last_stat_time + 5)
 
  432      retval = xdg_check_dirs ();
 
  433      last_stat_time = current_time;
 
  444  if (xdg_check_time_and_dirs ())
 
  470  const char *mime_type;
 
  474      if (result_prio != NULL)
 
  476      return XDG_MIME_TYPE_EMPTY;
 
 
  494                                 struct stat *statbuf)
 
  496  const char *mime_type;
 
  500  const char *mime_types[5];
 
  506  const char *base_name;
 
  509  if (file_name == NULL)
 
  523    return mime_types[0];
 
  527      if (stat (file_name, &buf) != 0)
 
  528    return XDG_MIME_TYPE_UNKNOWN;
 
  533  if (!S_ISREG (statbuf->st_mode))
 
  534    return XDG_MIME_TYPE_UNKNOWN;
 
  540  data = malloc (max_extent);
 
  542    return XDG_MIME_TYPE_UNKNOWN;
 
  544  file = fopen (file_name, 
"r");
 
  548      return XDG_MIME_TYPE_UNKNOWN;
 
  551  bytes_read = fread (data, 1, max_extent, file);
 
  556      return XDG_MIME_TYPE_UNKNOWN;
 
 
  574  const char *mime_type;
 
  584    return XDG_MIME_TYPE_UNKNOWN;
 
 
  589                    const char  *mime_types[],
 
 
  616      xdg_dir_time_list_free (dir_time_list);
 
  617      dir_time_list = NULL;
 
  649  if (generic_icon_list)
 
  652      generic_icon_list = NULL;
 
  659      for (i = 0; i < n_caches; i++)
 
  666  for (list = callback_list; list; list = list->
next)
 
 
  709  const char *unalias_a, *unalias_b;
 
  714  if (strcmp (unalias_a, unalias_b) == 0)
 
 
  735  sep = strchr (mime_a, 
'/');
 
  737  if (sep && strncmp (mime_a, mime_b, sep - mime_a + 1) == 0)
 
 
  745ends_with (
const char *str,
 
  751  length = strlen (str);
 
  752  suffix_length = strlen (suffix);
 
  753  if (length < suffix_length)
 
  756  if (strcmp (str + length - suffix_length, suffix) == 0)
 
  763xdg_mime_is_super_type (
const char *mime)
 
  765  return ends_with (mime, 
"/*");
 
  773  const char *umime, *ubase;
 
  774  const char **parents;
 
  782  if (strcmp (umime, ubase) == 0)
 
  787  if (xdg_mime_is_super_type (ubase) &&
 
  793  if (strcmp (ubase, 
"text/plain") == 0 && 
 
  794      strncmp (umime, 
"text/", 5) == 0)
 
  797  if (strcmp (ubase, 
"application/octet-stream") == 0 &&
 
  798      strncmp (umime, 
"inode/", 6) != 0)
 
  802  for (; parents && *parents; parents++)
 
 
  823  const char **parents;
 
  835  for (i = 0; parents[i]; i++) ;
 
  837  n = (i + 1) * 
sizeof (
char *);
 
  838  result = (
char **) malloc (n);
 
  839  memcpy (result, parents, n);
 
 
  861  printf (
"*** ALIASES ***\n\n");
 
  863  printf (
"\n*** PARENTS ***\n\n");
 
  865  printf (
"\n*** CACHE ***\n\n");
 
  867  printf (
"\n*** GLOBS ***\n\n");
 
  869  printf (
"\n*** GLOBS REVERSE TREE ***\n\n");
 
 
  882  static int callback_id = 1;
 
  888  list_el->
data = data;
 
  890  list_el->
next = callback_list;
 
  894  callback_list = list_el;
 
  897  return callback_id - 1;
 
 
  905  for (list = callback_list; list; list = list->
next)
 
  915        callback_list = list->
next;
 
 
int _xdg_mime_mime_type_equal(const char *mime_a, const char *mime_b)
 
int xdg_mime_media_type_equal(const char *mime_a, const char *mime_b)
 
const char * xdg_mime_get_icon(const char *mime)
 
void xdg_mime_shutdown(void)
 
const char * xdg_mime_get_mime_type_from_file_name(const char *file_name)
 
int xdg_mime_mime_type_subclass(const char *mime, const char *base)
 
int _xdg_mime_mime_type_subclass(const char *mime, const char *base)
 
int xdg_mime_is_valid_mime_type(const char *mime_type)
 
const char xdg_mime_type_unknown[]
 
const char * _xdg_mime_unalias_mime_type(const char *mime_type)
 
void xdg_mime_remove_callback(int callback_id)
 
const char xdg_mime_type_textplain[]
 
char ** xdg_mime_list_mime_parents(const char *mime)
 
int xdg_mime_get_mime_types_from_file_name(const char *file_name, const char *mime_types[], int n_mime_types)
 
int xdg_mime_register_reload_callback(XdgMimeCallback callback, void *data, XdgMimeDestroy destroy)
 
const char xdg_mime_type_empty[]
 
const char * xdg_mime_get_generic_icon(const char *mime)
 
int xdg_mime_mime_type_equal(const char *mime_a, const char *mime_b)
 
const char * xdg_mime_get_mime_type_for_data(const void *data, size_t len, int *result_prio)
 
int xdg_mime_get_max_buffer_extents(void)
 
int(* XdgDirectoryFunc)(const char *directory, void *user_data)
 
const char * xdg_mime_unalias_mime_type(const char *mime_type)
 
const char ** xdg_mime_get_mime_parents(const char *mime)
 
const char * xdg_mime_get_mime_type_for_file(const char *file_name, struct stat *statbuf)
 
void(* XdgMimeCallback)(void *user_data)
 
void(* XdgMimeDestroy)(void *user_data)
 
void _xdg_mime_alias_list_free(XdgAliasList *list)
 
const char * _xdg_mime_alias_list_lookup(XdgAliasList *list, const char *alias)
 
void _xdg_mime_alias_read_from_file(XdgAliasList *list, const char *file_name)
 
XdgAliasList * _xdg_mime_alias_list_new(void)
 
void _xdg_mime_alias_list_dump(XdgAliasList *list)
 
const char * _xdg_mime_cache_get_icon(const char *mime)
 
int _xdg_mime_cache_get_mime_types_from_file_name(const char *file_name, const char *mime_types[], int n_mime_types)
 
XdgMimeCache * _xdg_mime_cache_new_from_file(const char *file_name)
 
int _xdg_mime_cache_get_max_buffer_extents(void)
 
const char * _xdg_mime_cache_get_mime_type_from_file_name(const char *file_name)
 
void _xdg_mime_cache_glob_dump(void)
 
const char * _xdg_mime_cache_get_mime_type_for_file(const char *file_name, struct stat *statbuf)
 
const char * _xdg_mime_cache_unalias_mime_type(const char *mime)
 
const char * _xdg_mime_cache_get_mime_type_for_data(const void *data, size_t len, int *result_prio)
 
int _xdg_mime_cache_mime_type_subclass(const char *mime, const char *base)
 
const char * _xdg_mime_cache_get_generic_icon(const char *mime)
 
void _xdg_mime_cache_unref(XdgMimeCache *cache)
 
char ** _xdg_mime_cache_list_mime_parents(const char *mime)
 
int _xdg_glob_hash_lookup_file_name(XdgGlobHash *glob_hash, const char *file_name, const char *mime_types[], int n_mime_types)
 
void _xdg_glob_hash_dump(XdgGlobHash *glob_hash)
 
XdgGlobHash * _xdg_glob_hash_new(void)
 
void _xdg_mime_glob_read_from_file(XdgGlobHash *glob_hash, const char *file_name, int version_two)
 
void _xdg_glob_hash_free(XdgGlobHash *glob_hash)
 
void _xdg_mime_icon_read_from_file(XdgIconList *list, const char *file_name)
 
const char * _xdg_mime_icon_list_lookup(XdgIconList *list, const char *mime_type)
 
XdgIconList * _xdg_mime_icon_list_new(void)
 
void _xdg_mime_icon_list_free(XdgIconList *list)
 
const char * _xdg_binary_or_text_fallback(const void *data, size_t len)
 
const char * _xdg_get_base_name(const char *file_name)
 
int _xdg_utf8_validate(const char *source)
 
void _xdg_mime_magic_read_from_file(XdgMimeMagic *mime_magic, const char *file_name)
 
XdgMimeMagic * _xdg_mime_magic_new(void)
 
int _xdg_mime_magic_get_buffer_extents(XdgMimeMagic *mime_magic)
 
void _xdg_mime_magic_free(XdgMimeMagic *mime_magic)
 
const char * _xdg_mime_magic_lookup_data(XdgMimeMagic *mime_magic, const void *data, size_t len, int *result_prio, const char *mime_types[], int n_mime_types)
 
const char ** _xdg_mime_parent_list_lookup(XdgParentList *list, const char *mime)
 
void _xdg_mime_parent_read_from_file(XdgParentList *list, const char *file_name)
 
void _xdg_mime_parent_list_free(XdgParentList *list)
 
XdgParentList * _xdg_mime_parent_list_new(void)
 
void _xdg_mime_parent_list_dump(XdgParentList *list)