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

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

?? read.c

?? busybox最新版本. 嵌入式編程必不可少之工具.
?? C
字號:
/* vi: set sw=4 ts=4: *//* * read.c - read the blkid cache from disk, to avoid scanning all devices * * Copyright (C) 2001, 2003 Theodore Y. Ts'o * Copyright (C) 2001 Andreas Dilger * * %Begin-Header% * This file may be redistributed under the terms of the * GNU Lesser General Public License. * %End-Header% */#include <stdio.h>#include <ctype.h>#include <string.h>#include <time.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <unistd.h>#include <errno.h>#include "blkidP.h"#include "../uuid/uuid.h"#ifdef HAVE_STRTOULL#define __USE_ISOC9X#define STRTOULL strtoull /* defined in stdlib.h if you try hard enough */#else/* FIXME: need to support real strtoull here */#define STRTOULL strtoul#endif#include <stdlib.h>#ifdef TEST_PROGRAM#define blkid_debug_dump_dev(dev)  (debug_dump_dev(dev))static void debug_dump_dev(blkid_dev dev);#endif/* * File format: * *	<device [<NAME="value"> ...]>device_name</device> * *	The following tags are required for each entry: *	<ID="id">	unique (within this file) ID number of this device *	<TIME="time">	(ascii time_t) time this entry was last read from disk *	<TYPE="type">	(detected) type of filesystem/data for this partition * *	The following tags may be present, depending on the device contents *	<LABEL="label">	(user supplied) label (volume name, etc) *	<UUID="uuid">	(generated) universally unique identifier (serial no) */static char *skip_over_blank(char *cp){	while (*cp && isspace(*cp))		cp++;	return cp;}static char *skip_over_word(char *cp){	char ch;	while ((ch = *cp)) {		/* If we see a backslash, skip the next character */		if (ch == '\\') {			cp++;			if (*cp == '\0')				break;			cp++;			continue;		}		if (isspace(ch) || ch == '<' || ch == '>')			break;		cp++;	}	return cp;}static char *strip_line(char *line){	char	*p;	line = skip_over_blank(line);	p = line + strlen(line) - 1;	while (*line) {		if (isspace(*p))			*p-- = '\0';		else			break;	}	return line;}/* * Start parsing a new line from the cache. * * line starts with "<device" return 1 -> continue parsing line * line starts with "<foo", empty, or # return 0 -> skip line * line starts with other, return -BLKID_ERR_CACHE -> error */static int parse_start(char **cp){	char *p;	p = strip_line(*cp);	/* Skip comment or blank lines.  We can't just NUL the first '#' char,	 * in case it is inside quotes, or escaped.	 */	if (*p == '\0' || *p == '#')		return 0;	if (!strncmp(p, "<device", 7)) {		DBG(DEBUG_READ, printf("found device header: %8s\n", p));		p += 7;		*cp = p;		return 1;	}	if (*p == '<')		return 0;	return -BLKID_ERR_CACHE;}/* Consume the remaining XML on the line (cosmetic only) */static int parse_end(char **cp){	*cp = skip_over_blank(*cp);	if (!strncmp(*cp, "</device>", 9)) {		DBG(DEBUG_READ, printf("found device trailer %9s\n", *cp));		*cp += 9;		return 0;	}	return -BLKID_ERR_CACHE;}/* * Allocate a new device struct with device name filled in.  Will handle * finding the device on lines of the form: * <device foo=bar>devname</device> * <device>devname<foo>bar</foo></device> */static int parse_dev(blkid_cache cache, blkid_dev *dev, char **cp){	char *start, *tmp, *end, *name;	int ret;	if ((ret = parse_start(cp)) <= 0)		return ret;	start = tmp = strchr(*cp, '>');	if (!start) {		DBG(DEBUG_READ,		    printf("blkid: short line parsing dev: %s\n", *cp));		return -BLKID_ERR_CACHE;	}	start = skip_over_blank(start + 1);	end = skip_over_word(start);	DBG(DEBUG_READ, printf("device should be %*s\n", end - start, start));	if (**cp == '>')		*cp = end;	else		(*cp)++;	*tmp = '\0';	if (!(tmp = strrchr(end, '<')) || parse_end(&tmp) < 0) {		DBG(DEBUG_READ,		    printf("blkid: missing </device> ending: %s\n", end));	} else if (tmp)		*tmp = '\0';	if (end - start <= 1) {		DBG(DEBUG_READ, printf("blkid: empty device name: %s\n", *cp));		return -BLKID_ERR_CACHE;	}	name = blkid_strndup(start, end-start);	if (name == NULL)		return -BLKID_ERR_MEM;	DBG(DEBUG_READ, printf("found dev %s\n", name));	if (!(*dev = blkid_get_dev(cache, name, BLKID_DEV_CREATE)))		return -BLKID_ERR_MEM;	free(name);	return 1;}/* * Extract a tag of the form NAME="value" from the line. */static int parse_token(char **name, char **value, char **cp){	char *end;	if (!name || !value || !cp)		return -BLKID_ERR_PARAM;	if (!(*value = strchr(*cp, '=')))		return 0;	**value = '\0';	*name = strip_line(*cp);	*value = skip_over_blank(*value + 1);	if (**value == '"') {		end = strchr(*value + 1, '"');		if (!end) {			DBG(DEBUG_READ,			    printf("unbalanced quotes at: %s\n", *value));			*cp = *value;			return -BLKID_ERR_CACHE;		}		(*value)++;		*end = '\0';		end++;	} else {		end = skip_over_word(*value);		if (*end) {			*end = '\0';			end++;		}	}	*cp = end;	return 1;}/* * Extract a tag of the form <NAME>value</NAME> from the line. *//*static int parse_xml(char **name, char **value, char **cp){	char *end;	if (!name || !value || !cp)		return -BLKID_ERR_PARAM;	*name = strip_line(*cp);	if ((*name)[0] != '<' || (*name)[1] == '/')		return 0;	FIXME: finish this.}*//* * Extract a tag from the line. * * Return 1 if a valid tag was found. * Return 0 if no tag found. * Return -ve error code. */static int parse_tag(blkid_cache cache, blkid_dev dev, char **cp){	char *name;	char *value;	int ret;	if (!cache || !dev)		return -BLKID_ERR_PARAM;	if ((ret = parse_token(&name, &value, cp)) <= 0 /* &&	    (ret = parse_xml(&name, &value, cp)) <= 0 */)		return ret;	/* Some tags are stored directly in the device struct */	if (!strcmp(name, "DEVNO"))		dev->bid_devno = STRTOULL(value, 0, 0);	else if (!strcmp(name, "PRI"))		dev->bid_pri = strtol(value, 0, 0);	else if (!strcmp(name, "TIME"))		/* FIXME: need to parse a long long eventually */		dev->bid_time = strtol(value, 0, 0);	else		ret = blkid_set_tag(dev, name, value, strlen(value));	DBG(DEBUG_READ, printf("    tag: %s=\"%s\"\n", name, value));	return ret < 0 ? ret : 1;}/* * Parse a single line of data, and return a newly allocated dev struct. * Add the new device to the cache struct, if one was read. * * Lines are of the form <device [TAG="value" ...]>/dev/foo</device> * * Returns -ve value on error. * Returns 0 otherwise. * If a valid device was read, *dev_p is non-NULL, otherwise it is NULL * (e.g. comment lines, unknown XML content, etc). */static int blkid_parse_line(blkid_cache cache, blkid_dev *dev_p, char *cp){	blkid_dev dev;	int ret;	if (!cache || !dev_p)		return -BLKID_ERR_PARAM;	*dev_p = NULL;	DBG(DEBUG_READ, printf("line: %s\n", cp));	if ((ret = parse_dev(cache, dev_p, &cp)) <= 0)		return ret;	dev = *dev_p;	while ((ret = parse_tag(cache, dev, &cp)) > 0) {		;	}	if (dev->bid_type == NULL) {		DBG(DEBUG_READ,		    printf("blkid: device %s has no TYPE\n",dev->bid_name));		blkid_free_dev(dev);	}	DBG(DEBUG_READ, blkid_debug_dump_dev(dev));	return ret;}/* * Parse the specified filename, and return the data in the supplied or * a newly allocated cache struct.  If the file doesn't exist, return a * new empty cache struct. */void blkid_read_cache(blkid_cache cache){	FILE *file;	char buf[4096];	int fd, lineno = 0;	struct stat st;	if (!cache)		return;	/*	 * If the file doesn't exist, then we just return an empty	 * struct so that the cache can be populated.	 */	if ((fd = open(cache->bic_filename, O_RDONLY)) < 0)		return;	if (fstat(fd, &st) < 0)		goto errout;	if ((st.st_mtime == cache->bic_ftime) ||	    (cache->bic_flags & BLKID_BIC_FL_CHANGED)) {		DBG(DEBUG_CACHE, printf("skipping re-read of %s\n",					cache->bic_filename));		goto errout;	}	DBG(DEBUG_CACHE, printf("reading cache file %s\n",				cache->bic_filename));	file = fdopen(fd, "r");	if (!file)		goto errout;	while (fgets(buf, sizeof(buf), file)) {		blkid_dev dev;		unsigned int end;		lineno++;		if (buf[0] == 0)			continue;		end = strlen(buf) - 1;		/* Continue reading next line if it ends with a backslash */		while (buf[end] == '\\' && end < sizeof(buf) - 2 &&		       fgets(buf + end, sizeof(buf) - end, file)) {			end = strlen(buf) - 1;			lineno++;		}		if (blkid_parse_line(cache, &dev, buf) < 0) {			DBG(DEBUG_READ,			    printf("blkid: bad format on line %d\n", lineno));			continue;		}	}	fclose(file);	/*	 * Initially we do not need to write out the cache file.	 */	cache->bic_flags &= ~BLKID_BIC_FL_CHANGED;	cache->bic_ftime = st.st_mtime;	return;errout:	close(fd);}#ifdef TEST_PROGRAMstatic void debug_dump_dev(blkid_dev dev){	struct list_head *p;	if (!dev) {		printf("  dev: NULL\n");		return;	}	printf("  dev: name = %s\n", dev->bid_name);	printf("  dev: DEVNO=\"0x%0llx\"\n", dev->bid_devno);	printf("  dev: TIME=\"%lu\"\n", dev->bid_time);	printf("  dev: PRI=\"%d\"\n", dev->bid_pri);	printf("  dev: flags = 0x%08X\n", dev->bid_flags);	list_for_each(p, &dev->bid_tags) {		blkid_tag tag = list_entry(p, struct blkid_struct_tag, bit_tags);		if (tag)			printf("    tag: %s=\"%s\"\n", tag->bit_name,			       tag->bit_val);		else			printf("    tag: NULL\n");	}	puts("");}int main(int argc, char**argv){	blkid_cache cache = NULL;	int ret;	blkid_debug_mask = DEBUG_ALL;	if (argc > 2) {		fprintf(stderr, "Usage: %s [filename]\n"			"Test parsing of the cache (filename)\n", argv[0]);		exit(1);	}	if ((ret = blkid_get_cache(&cache, argv[1])) < 0)		fprintf(stderr, "error %d reading cache file %s\n", ret,			argv[1] ? argv[1] : BLKID_CACHE_FILE);	blkid_put_cache(cache);	return ret;}#endif

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
一区二区三区四区亚洲| 亚洲伦在线观看| 91福利国产精品| 捆绑变态av一区二区三区| 国产精品乱人伦一区二区| 91精品国产乱码久久蜜臀| 99久久99久久久精品齐齐| 老司机午夜精品| 亚洲成人一区在线| 中文字幕高清一区| 日韩视频在线一区二区| 色88888久久久久久影院按摩 | 欧美一区二区三区免费| 91亚洲精品一区二区乱码| 国模冰冰炮一区二区| 天堂资源在线中文精品| 成人欧美一区二区三区小说| 日韩女优电影在线观看| 欧美人妇做爰xxxⅹ性高电影| 成人性视频免费网站| 国产尤物一区二区| 蜜芽一区二区三区| 亚洲精品一二三| 国产精品白丝在线| 国产欧美一区二区精品秋霞影院| 日韩欧美二区三区| 91麻豆精品国产无毒不卡在线观看| 91猫先生在线| 99久久精品国产精品久久| 国产精品1区2区| 国产麻豆精品视频| 久久精品国产精品亚洲综合| 日韩高清一级片| 同产精品九九九| 亚洲成人精品一区二区| 亚洲国产欧美在线人成| 亚洲一二三四在线观看| 亚洲欧洲精品成人久久奇米网| 中文字幕精品一区| 欧美国产欧美亚州国产日韩mv天天看完整| 国产亚洲一区二区三区四区 | 国产乱码精品一区二区三区av | 日韩你懂的在线播放| 51精品国自产在线| 日韩欧美一二三| 精品国产一区二区精华| 日韩一级二级三级精品视频| 欧美岛国在线观看| 国产视频一区在线观看| 亚洲视频网在线直播| 亚洲色图一区二区| 亚洲亚洲精品在线观看| 免费观看一级特黄欧美大片| 国产一区不卡在线| 成人一级黄色片| 色偷偷久久人人79超碰人人澡| 在线免费观看日本一区| 欧美日韩电影一区| 久久综合一区二区| 国产精品免费免费| 一区二区在线免费| 免费在线看一区| 国产精品香蕉一区二区三区| 99re这里都是精品| 欧美日韩国产一级二级| 精品99999| 亚洲日本在线天堂| 日韩福利视频网| 国产精品一二三区| 91国偷自产一区二区开放时间 | 色综合夜色一区| 911国产精品| 国产亚洲欧美在线| 亚洲精品中文字幕乱码三区| 免费高清不卡av| 不卡的电影网站| 欧美日韩aaa| 国产网站一区二区三区| 一区二区三区四区乱视频| 日韩1区2区日韩1区2区| 国产精品 欧美精品| 欧美影院一区二区三区| 欧美成人午夜电影| 亚洲蜜桃精久久久久久久| 日本不卡的三区四区五区| 国产成人8x视频一区二区| 欧美体内she精高潮| 久久婷婷国产综合精品青草| 最好看的中文字幕久久| 精品亚洲porn| 色哟哟一区二区在线观看| 欧美va亚洲va香蕉在线| 亚洲黄色av一区| 国产成人免费在线视频| 欧美挠脚心视频网站| 国产亚洲精品福利| 天天操天天色综合| 91日韩一区二区三区| 26uuu欧美日本| 亚洲成a人v欧美综合天堂下载| 成人激情综合网站| 日韩欧美久久久| 亚洲一二三区不卡| 99热在这里有精品免费| 精品人在线二区三区| 亚洲电影在线免费观看| proumb性欧美在线观看| 精品乱人伦小说| 日韩av二区在线播放| 欧美羞羞免费网站| 国产精品激情偷乱一区二区∴| 精品亚洲porn| 欧美一卡在线观看| 天天综合色天天| 欧美三级午夜理伦三级中视频| 一区在线中文字幕| 国产精品一区二区x88av| 日韩免费福利电影在线观看| 亚洲成av人在线观看| 在线一区二区三区做爰视频网站| 国产人成亚洲第一网站在线播放 | 91免费小视频| 中文字幕第一区二区| 国产呦精品一区二区三区网站| 日韩欧美在线影院| 日韩精品欧美精品| 777色狠狠一区二区三区| 夜夜夜精品看看| 91老师国产黑色丝袜在线| 国产精品视频在线看| 成人免费高清视频| 国产精品天美传媒| 国产精品一区不卡| 国产日韩欧美亚洲| 成人少妇影院yyyy| 国产欧美一区二区在线| 国产成人99久久亚洲综合精品| 国产日韩精品视频一区| 成人午夜免费av| 国产精品水嫩水嫩| 91影视在线播放| 一区二区三区四区不卡视频| 色婷婷久久一区二区三区麻豆| 一区二区三区中文字幕在线观看| 在线日韩国产精品| 午夜伦理一区二区| 欧美电影免费观看高清完整版在线观看| 奇米综合一区二区三区精品视频| 日韩欧美一级片| 国产东北露脸精品视频| 国产精品久久久久影院亚瑟| 色88888久久久久久影院按摩 | 成人激情av网| 亚洲色图.com| 欧美日韩精品是欧美日韩精品| 日韩在线一二三区| 欧美tk丨vk视频| 国产91富婆露脸刺激对白| 最新热久久免费视频| 欧美亚一区二区| 老司机免费视频一区二区| 国产人妖乱国产精品人妖| 91麻豆swag| 日韩高清不卡一区二区| 国产校园另类小说区| 91免费观看视频在线| 午夜精品影院在线观看| 日韩免费福利电影在线观看| 风间由美一区二区三区在线观看| 亚洲色图.com| 精品日韩一区二区三区免费视频| 国产成人精品影视| 亚洲国产另类av| 26uuuu精品一区二区| 在线免费观看成人短视频| 蜜臀99久久精品久久久久久软件 | 亚洲一区av在线| 日韩视频一区在线观看| 高清成人免费视频| 亚洲妇女屁股眼交7| 久久精品一区二区三区四区| 欧美在线观看禁18| 国产精品18久久久久久久久| 亚洲一区二区精品3399| 欧美激情综合在线| 欧美理论片在线| 国产999精品久久久久久| 天堂av在线一区| 亚洲三级在线免费| 久久久久久久性| 6080国产精品一区二区| 成人精品电影在线观看| 美女尤物国产一区| 亚洲色图清纯唯美| 久久久99精品免费观看不卡| 欧美视频在线播放| 99riav一区二区三区| 国内外成人在线| 丝袜亚洲另类欧美综合| 亚洲精品成人悠悠色影视|