亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? xdgmime.c

?? linux下電話本所依賴的一些圖形庫
?? C
?? 第 1 頁 / 共 2 頁
字號:
/* -*- mode: C; c-file-style: "gnu" -*- *//* xdgmime.c: XDG Mime Spec mime resolver.  Based on version 0.11 of the spec. * * More info can be found at http://www.freedesktop.org/standards/ *  * Copyright (C) 2003,2004  Red Hat, Inc. * Copyright (C) 2003,2004  Jonathan Blandford <jrb@alum.mit.edu> * * Licensed under the Academic Free License version 2.0 * Or under the following terms: *  * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */#ifdef HAVE_CONFIG_H#include <config.h>#endif#include "xdgmime.h"#include "xdgmimeint.h"#include "xdgmimeglob.h"#include "xdgmimemagic.h"#include "xdgmimealias.h"#include "xdgmimeparent.h"#include "xdgmimecache.h"#include <stdio.h>#include <string.h>#include <sys/stat.h>#include <sys/types.h>#include <sys/time.h>#include <unistd.h>#include <assert.h>typedef struct XdgDirTimeList XdgDirTimeList;typedef struct XdgCallbackList XdgCallbackList;static int need_reread = TRUE;static time_t last_stat_time = 0;static XdgGlobHash *global_hash = NULL;static XdgMimeMagic *global_magic = NULL;static XdgAliasList *alias_list = NULL;static XdgParentList *parent_list = NULL;static XdgDirTimeList *dir_time_list = NULL;static XdgCallbackList *callback_list = NULL;XdgMimeCache **caches = NULL;int n_caches = 0;const char *xdg_mime_type_unknown = "application/octet-stream";enum{  XDG_CHECKED_UNCHECKED,  XDG_CHECKED_VALID,  XDG_CHECKED_INVALID};struct XdgDirTimeList{  time_t mtime;  char *directory_name;  int checked;  XdgDirTimeList *next;};struct XdgCallbackList{  XdgCallbackList *next;  XdgCallbackList *prev;  int              callback_id;  XdgMimeCallback  callback;  void            *data;  XdgMimeDestroy   destroy;};/* Function called by xdg_run_command_on_dirs.  If it returns TRUE, further * directories aren't looked at */typedef int (*XdgDirectoryFunc) (const char *directory,				 void       *user_data);static XdgDirTimeList *xdg_dir_time_list_new (void){  XdgDirTimeList *retval;  retval = calloc (1, sizeof (XdgDirTimeList));  retval->checked = XDG_CHECKED_UNCHECKED;  return retval;}static voidxdg_dir_time_list_free (XdgDirTimeList *list){  XdgDirTimeList *next;  while (list)    {      next = list->next;      free (list->directory_name);      free (list);      list = next;    }}static intxdg_mime_init_from_directory (const char *directory){  char *file_name;  struct stat st;  XdgDirTimeList *list;  assert (directory != NULL);  file_name = malloc (strlen (directory) + strlen ("/mime/mime.cache") + 1);  strcpy (file_name, directory); strcat (file_name, "/mime/mime.cache");  if (stat (file_name, &st) == 0)    {      XdgMimeCache *cache = _xdg_mime_cache_new_from_file (file_name);      if (cache != NULL)	{	  list = xdg_dir_time_list_new ();	  list->directory_name = file_name;	  list->mtime = st.st_mtime;	  list->next = dir_time_list;	  dir_time_list = list;	  caches = realloc (caches, sizeof (XdgMimeCache *) * (n_caches + 1));	  caches[n_caches] = cache;	  n_caches++;	  return FALSE;	}    }  free (file_name);  file_name = malloc (strlen (directory) + strlen ("/mime/globs") + 1);  strcpy (file_name, directory); strcat (file_name, "/mime/globs");  if (stat (file_name, &st) == 0)    {      _xdg_mime_glob_read_from_file (global_hash, file_name);      list = xdg_dir_time_list_new ();      list->directory_name = file_name;      list->mtime = st.st_mtime;      list->next = dir_time_list;      dir_time_list = list;    }  else    {      free (file_name);    }  file_name = malloc (strlen (directory) + strlen ("/mime/magic") + 1);  strcpy (file_name, directory); strcat (file_name, "/mime/magic");  if (stat (file_name, &st) == 0)    {      _xdg_mime_magic_read_from_file (global_magic, file_name);      list = xdg_dir_time_list_new ();      list->directory_name = file_name;      list->mtime = st.st_mtime;      list->next = dir_time_list;      dir_time_list = list;    }  else    {      free (file_name);    }  file_name = malloc (strlen (directory) + strlen ("/mime/aliases") + 1);  strcpy (file_name, directory); strcat (file_name, "/mime/aliases");  _xdg_mime_alias_read_from_file (alias_list, file_name);  free (file_name);  file_name = malloc (strlen (directory) + strlen ("/mime/subclasses") + 1);  strcpy (file_name, directory); strcat (file_name, "/mime/subclasses");  _xdg_mime_parent_read_from_file (parent_list, file_name);  free (file_name);  return FALSE; /* Keep processing */}/* Runs a command on all the directories in the search path */static voidxdg_run_command_on_dirs (XdgDirectoryFunc  func,			 void             *user_data){  const char *xdg_data_home;  const char *xdg_data_dirs;  const char *ptr;  xdg_data_home = getenv ("XDG_DATA_HOME");  if (xdg_data_home)    {      if ((func) (xdg_data_home, user_data))	return;    }  else    {      const char *home;      home = getenv ("HOME");      if (home != NULL)	{	  char *guessed_xdg_home;	  int stop_processing;	  guessed_xdg_home = malloc (strlen (home) + strlen ("/.local/share/") + 1);	  strcpy (guessed_xdg_home, home);	  strcat (guessed_xdg_home, "/.local/share/");	  stop_processing = (func) (guessed_xdg_home, user_data);	  free (guessed_xdg_home);	  if (stop_processing)	    return;	}    }  xdg_data_dirs = getenv ("XDG_DATA_DIRS");  if (xdg_data_dirs == NULL)    xdg_data_dirs = "/usr/local/share/:/usr/share/";  ptr = xdg_data_dirs;  while (*ptr != '\000')    {      const char *end_ptr;      char *dir;      int len;      int stop_processing;      end_ptr = ptr;      while (*end_ptr != ':' && *end_ptr != '\000')	end_ptr ++;      if (end_ptr == ptr)	{	  ptr++;	  continue;	}      if (*end_ptr == ':')	len = end_ptr - ptr;      else	len = end_ptr - ptr + 1;      dir = malloc (len + 1);      strncpy (dir, ptr, len);      dir[len] = '\0';      stop_processing = (func) (dir, user_data);      free (dir);      if (stop_processing)	return;      ptr = end_ptr;    }}/* Checks file_path to make sure it has the same mtime as last time it was * checked.  If it has a different mtime, or if the file doesn't exist, it * returns FALSE. * * FIXME: This doesn't protect against permission changes. */static intxdg_check_file (const char *file_path){  struct stat st;  /* If the file exists */  if (stat (file_path, &st) == 0)    {      XdgDirTimeList *list;      for (list = dir_time_list; list; list = list->next)	{	  if (! strcmp (list->directory_name, file_path) &&	      st.st_mtime == list->mtime)	    {	      if (list->checked == XDG_CHECKED_UNCHECKED)		list->checked = XDG_CHECKED_VALID;	      else if (list->checked == XDG_CHECKED_VALID)		list->checked = XDG_CHECKED_INVALID;	      return (list->checked != XDG_CHECKED_VALID);	    }	}      return TRUE;    }  return FALSE;}static intxdg_check_dir (const char *directory,	       int        *invalid_dir_list){  int invalid;  char *file_name;  assert (directory != NULL);  /* Check the globs file */  file_name = malloc (strlen (directory) + strlen ("/mime/globs") + 1);  strcpy (file_name, directory); strcat (file_name, "/mime/globs");  invalid = xdg_check_file (file_name);  free (file_name);  if (invalid)    {      *invalid_dir_list = TRUE;      return TRUE;    }  /* Check the magic file */  file_name = malloc (strlen (directory) + strlen ("/mime/magic") + 1);  strcpy (file_name, directory); strcat (file_name, "/mime/magic");  invalid = xdg_check_file (file_name);  free (file_name);  if (invalid)    {      *invalid_dir_list = TRUE;      return TRUE;    }  /* Check the mime.cache file */  file_name = malloc (strlen (directory) + strlen ("/mime/mime.cache") + 1);  strcpy (file_name, directory); strcat (file_name, "/mime/mime.cache");  invalid = xdg_check_file (file_name);  free (file_name);  if (invalid)    {      *invalid_dir_list = TRUE;      return TRUE;    }  return FALSE; /* Keep processing */}/* Walks through all the mime files stat()ing them to see if they've changed. * Returns TRUE if they have. */static intxdg_check_dirs (void){  XdgDirTimeList *list;  int invalid_dir_list = FALSE;  for (list = dir_time_list; list; list = list->next)    list->checked = XDG_CHECKED_UNCHECKED;  xdg_run_command_on_dirs ((XdgDirectoryFunc) xdg_check_dir,			   &invalid_dir_list);  if (invalid_dir_list)    return TRUE;  for (list = dir_time_list; list; list = list->next)    {      if (list->checked != XDG_CHECKED_VALID)	return TRUE;    }  return FALSE;}/* We want to avoid stat()ing on every single mime call, so we only look for * newer files every 5 seconds.  This will return TRUE if we need to reread the * mime data from disk. */static intxdg_check_time_and_dirs (void){  struct timeval tv;  time_t current_time;  int retval = FALSE;  gettimeofday (&tv, NULL);  current_time = tv.tv_sec;  if (current_time >= last_stat_time + 5)    {      retval = xdg_check_dirs ();      last_stat_time = current_time;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
韩国成人福利片在线播放| 欧美日韩在线播放一区| 日本伦理一区二区| 精品国产伦理网| 亚洲一区二区视频在线观看| 国产精品1区二区.| 欧美二区乱c少妇| 一区二区三区在线影院| 精品午夜久久福利影院| 欧美色综合网站| 中文字幕在线一区免费| 极品少妇一区二区| 91精品综合久久久久久| 亚洲日本韩国一区| 成人午夜视频福利| 久久久久国色av免费看影院| 日本成人在线不卡视频| 欧美色爱综合网| 一区二区三区日本| 99久久精品免费精品国产| 国产午夜精品一区二区三区嫩草| 蜜臀av一区二区| 欧美老女人在线| 一区二区三区影院| 91理论电影在线观看| 国产精品福利一区二区| 东方aⅴ免费观看久久av| 国产亚洲1区2区3区| 国产伦精品一区二区三区免费迷 | 亚洲成在线观看| 91亚洲国产成人精品一区二区三 | 日韩一区二区三区四区| 三级一区在线视频先锋| 9191精品国产综合久久久久久 | 亚洲丝袜美腿综合| 高清av一区二区| 国产欧美一区二区精品性色超碰| 国产一区二区网址| 久久精品视频在线看| 国产精品1区2区| 国产亚洲精品精华液| 丁香六月综合激情| 国产精品久久久久久久久久久免费看 | 激情久久久久久久久久久久久久久久| 91精品久久久久久久久99蜜臂| 午夜精品久久一牛影视| 欧美久久久久久久久久 | 亚洲人吸女人奶水| 一本大道综合伊人精品热热 | 欧美伦理视频网站| 久久91精品国产91久久小草| 久久中文字幕电影| 成人黄色一级视频| 亚洲主播在线播放| 日韩一区二区麻豆国产| 韩国欧美一区二区| 国产精品嫩草影院av蜜臀| 99在线热播精品免费| 亚洲一二三区不卡| 日韩欧美电影一区| 成人aaaa免费全部观看| 一区二区三区毛片| 欧美大胆一级视频| 成人免费高清在线观看| 亚洲一区在线观看免费| 日韩欧美电影在线| 99久久综合国产精品| 日日噜噜夜夜狠狠视频欧美人| xnxx国产精品| 99国产精品久久久久久久久久| 亚洲精品少妇30p| 91麻豆精品久久久久蜜臀| 国产一区二区伦理片| 亚洲激情图片一区| 精品国产露脸精彩对白| 91亚洲精华国产精华精华液| 日韩精品福利网| 日本一区二区三区四区在线视频| 在线视频中文字幕一区二区| 久久99国产精品成人| 亚洲精品福利视频网站| 久久久久久日产精品| 日韩一区和二区| 99r国产精品| 久久99最新地址| 亚洲精品高清视频在线观看| 欧美精品一区在线观看| 欧美亚洲综合另类| 成人国产亚洲欧美成人综合网| 日本欧美一区二区三区| 日韩一区在线免费观看| 久久综合久久综合亚洲| 欧美日韩一区二区不卡| 成人福利视频网站| 黄色资源网久久资源365| 亚洲成人综合在线| 亚洲精品成人在线| 亚洲欧美在线视频观看| 国产欧美精品在线观看| 日韩一级片在线观看| 欧美日韩一区二区在线视频| 色综合 综合色| 国产黄色91视频| 精品一区二区三区久久久| 亚洲chinese男男1069| 亚洲精品va在线观看| 中文字幕在线播放不卡一区| 精品国产精品网麻豆系列| 欧美一区午夜精品| 欧美肥妇bbw| 在线电影国产精品| 欧美日韩黄色影视| 欧美日韩一级片在线观看| 欧美亚洲一区三区| 欧美无人高清视频在线观看| 日本电影欧美片| 91久久精品国产91性色tv| 91麻豆免费观看| 91女人视频在线观看| 99精品一区二区| 91在线小视频| 色视频成人在线观看免| 色偷偷久久一区二区三区| 91麻豆产精品久久久久久| 91黄色在线观看| 欧美日韩国产影片| 欧美一区二区美女| 精品女同一区二区| 国产片一区二区| 亚洲精品视频观看| 亚洲国产成人av网| 麻豆91精品91久久久的内涵| 日本不卡一区二区| 国内欧美视频一区二区| 成人高清av在线| 91精品福利在线| 4438x亚洲最大成人网| 日韩精品资源二区在线| 久久欧美一区二区| 成人欧美一区二区三区在线播放| 亚洲免费观看在线视频| 亚洲香蕉伊在人在线观| 麻豆国产精品一区二区三区| 国产精品一区二区在线观看不卡| 成人高清视频在线| 欧美揉bbbbb揉bbbbb| 精品少妇一区二区三区日产乱码 | 91精品在线观看入口| 精品美女一区二区| 国产精品久久久久久一区二区三区| 亚洲欧美自拍偷拍| 喷水一区二区三区| 成人18视频在线播放| 欧美日韩在线直播| 久久人人爽人人爽| 亚洲va欧美va人人爽| 国产福利一区在线| 欧美日本一道本在线视频| 久久蜜臀精品av| 亚洲一区影音先锋| 国产激情一区二区三区四区| 欧美日韩在线播放| 国产精品免费人成网站| 男人的j进女人的j一区| 99久久精品费精品国产一区二区| 欧美一级片在线看| 日韩伦理av电影| 国产精品伊人色| 欧美一区二区私人影院日本| 亚洲天堂中文字幕| 国内成+人亚洲+欧美+综合在线| 91福利在线观看| 国产精品青草久久| 91久久线看在观草草青青| 日韩精品在线看片z| 亚洲综合免费观看高清完整版| 国产美女精品人人做人人爽| 欧美最猛黑人xxxxx猛交| 国产女同性恋一区二区| 久久91精品久久久久久秒播| 在线不卡免费欧美| 亚洲自拍偷拍图区| 99re6这里只有精品视频在线观看 99re8在线精品视频免费播放 | 国产精品久久久久aaaa| 精东粉嫩av免费一区二区三区| 欧美专区亚洲专区| 中文字幕一区二区视频| 国产精品99久| 久久午夜电影网| 青娱乐精品视频| 欧美婷婷六月丁香综合色| 一色屋精品亚洲香蕉网站| 国产成人在线免费观看| 久久综合色鬼综合色| 美女mm1313爽爽久久久蜜臀| 欧美日韩免费一区二区三区| 亚洲一二三四区| 色综合天天综合在线视频| 国产精品久久久久aaaa樱花| 9色porny自拍视频一区二区|