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

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

?? tag.c

?? busybox最新版本. 嵌入式編程必不可少之工具.
?? C
字號:
/* vi: set sw=4 ts=4: *//* * tag.c - allocation/initialization/free routines for tag structs * * Copyright (C) 2001 Andreas Dilger * Copyright (C) 2003 Theodore Ts'o * * %Begin-Header% * This file may be redistributed under the terms of the * GNU Lesser General Public License. * %End-Header% */#include <stdlib.h>#include <string.h>#include <stdio.h>#include "blkidP.h"static blkid_tag blkid_new_tag(void){	blkid_tag tag;	if (!(tag = (blkid_tag) calloc(1, sizeof(struct blkid_struct_tag))))		return NULL;	INIT_LIST_HEAD(&tag->bit_tags);	INIT_LIST_HEAD(&tag->bit_names);	return tag;}#ifdef CONFIG_BLKID_DEBUGvoid blkid_debug_dump_tag(blkid_tag tag){	if (!tag) {		printf("    tag: NULL\n");		return;	}	printf("    tag: %s=\"%s\"\n", tag->bit_name, tag->bit_val);}#endifvoid blkid_free_tag(blkid_tag tag){	if (!tag)		return;	DBG(DEBUG_TAG, printf("    freeing tag %s=%s\n", tag->bit_name,		   tag->bit_val ? tag->bit_val : "(NULL)"));	DBG(DEBUG_TAG, blkid_debug_dump_tag(tag));	list_del(&tag->bit_tags);	/* list of tags for this device */	list_del(&tag->bit_names);	/* list of tags with this type */	free(tag->bit_name);	free(tag->bit_val);	free(tag);}/* * Find the desired tag on a device.  If value is NULL, then the * first such tag is returned, otherwise return only exact tag if found. */blkid_tag blkid_find_tag_dev(blkid_dev dev, const char *type){	struct list_head *p;	if (!dev || !type)		return NULL;	list_for_each(p, &dev->bid_tags) {		blkid_tag tmp = list_entry(p, struct blkid_struct_tag,					   bit_tags);		if (!strcmp(tmp->bit_name, type))			return tmp;	}	return NULL;}/* * Find the desired tag type in the cache. * We return the head tag for this tag type. */static blkid_tag blkid_find_head_cache(blkid_cache cache, const char *type){	blkid_tag head = NULL, tmp;	struct list_head *p;	if (!cache || !type)		return NULL;	list_for_each(p, &cache->bic_tags) {		tmp = list_entry(p, struct blkid_struct_tag, bit_tags);		if (!strcmp(tmp->bit_name, type)) {			DBG(DEBUG_TAG,			    printf("    found cache tag head %s\n", type));			head = tmp;			break;		}	}	return head;}/* * Set a tag on an existing device. * * If value is NULL, then delete the tagsfrom the device. */int blkid_set_tag(blkid_dev dev, const char *name,		  const char *value, const int vlength){	blkid_tag	t = 0, head = 0;	char		*val = 0;	if (!dev || !name)		return -BLKID_ERR_PARAM;	if (!(val = blkid_strndup(value, vlength)) && value)		return -BLKID_ERR_MEM;	t = blkid_find_tag_dev(dev, name);	if (!value) {		blkid_free_tag(t);	} else if (t) {		if (!strcmp(t->bit_val, val)) {			/* Same thing, exit */			free(val);			return 0;		}		free(t->bit_val);		t->bit_val = val;	} else {		/* Existing tag not present, add to device */		if (!(t = blkid_new_tag()))			goto errout;		t->bit_name = blkid_strdup(name);		t->bit_val = val;		t->bit_dev = dev;		list_add_tail(&t->bit_tags, &dev->bid_tags);		if (dev->bid_cache) {			head = blkid_find_head_cache(dev->bid_cache,						     t->bit_name);			if (!head) {				head = blkid_new_tag();				if (!head)					goto errout;				DBG(DEBUG_TAG,				    printf("    creating new cache tag head %s\n", name));				head->bit_name = blkid_strdup(name);				if (!head->bit_name)					goto errout;				list_add_tail(&head->bit_tags,					      &dev->bid_cache->bic_tags);			}			list_add_tail(&t->bit_names, &head->bit_names);		}	}	/* Link common tags directly to the device struct */	if (!strcmp(name, "TYPE"))		dev->bid_type = val;	else if (!strcmp(name, "LABEL"))		dev->bid_label = val;	else if (!strcmp(name, "UUID"))		dev->bid_uuid = val;	if (dev->bid_cache)		dev->bid_cache->bic_flags |= BLKID_BIC_FL_CHANGED;	return 0;errout:	blkid_free_tag(t);	if (!t)		free(val);	blkid_free_tag(head);	return -BLKID_ERR_MEM;}/* * Parse a "NAME=value" string.  This is slightly different than * parse_token, because that will end an unquoted value at a space, while * this will assume that an unquoted value is the rest of the token (e.g. * if we are passed an already quoted string from the command-line we don't * have to both quote and escape quote so that the quotes make it to * us). * * Returns 0 on success, and -1 on failure. */int blkid_parse_tag_string(const char *token, char **ret_type, char **ret_val){	char *name, *value, *cp;	DBG(DEBUG_TAG, printf("trying to parse '%s' as a tag\n", token));	if (!token || !(cp = strchr(token, '=')))		return -1;	name = blkid_strdup(token);	if (!name)		return -1;	value = name + (cp - token);	*value++ = '\0';	if (*value == '"' || *value == '\'') {		char c = *value++;		if (!(cp = strrchr(value, c)))			goto errout; /* missing closing quote */		*cp = '\0';	}	value = blkid_strdup(value);	if (!value)		goto errout;	*ret_type = name;	*ret_val = value;	return 0;errout:	free(name);	return -1;}/* * Tag iteration routines for the public libblkid interface. * * These routines do not expose the list.h implementation, which are a * contamination of the namespace, and which force us to reveal far, far * too much of our internal implemenation.  I'm not convinced I want * to keep list.h in the long term, anyway.  It's fine for kernel * programming, but performance is not the #1 priority for this * library, and I really don't like the tradeoff of type-safety for * performance for this application.  [tytso:20030125.2007EST] *//* * This series of functions iterate over all tags in a device */#define TAG_ITERATE_MAGIC	0x01a5284cstruct blkid_struct_tag_iterate {	int			magic;	blkid_dev		dev;	struct list_head	*p;};blkid_tag_iterate blkid_tag_iterate_begin(blkid_dev dev){	blkid_tag_iterate	iter;	iter = xmalloc(sizeof(struct blkid_struct_tag_iterate));	iter->magic = TAG_ITERATE_MAGIC;	iter->dev = dev;	iter->p	= dev->bid_tags.next;	return iter;}/* * Return 0 on success, -1 on error */extern int blkid_tag_next(blkid_tag_iterate iter,			  const char **type, const char **value){	blkid_tag tag;	*type = 0;	*value = 0;	if (!iter || iter->magic != TAG_ITERATE_MAGIC ||	    iter->p == &iter->dev->bid_tags)		return -1;	tag = list_entry(iter->p, struct blkid_struct_tag, bit_tags);	*type = tag->bit_name;	*value = tag->bit_val;	iter->p = iter->p->next;	return 0;}void blkid_tag_iterate_end(blkid_tag_iterate iter){	if (!iter || iter->magic != TAG_ITERATE_MAGIC)		return;	iter->magic = 0;	free(iter);}/* * This function returns a device which matches a particular * type/value pair.  If there is more than one device that matches the * search specification, it returns the one with the highest priority * value.  This allows us to give preference to EVMS or LVM devices. * * XXX there should also be an interface which uses an iterator so we * can get all of the devices which match a type/value search parameter. */extern blkid_dev blkid_find_dev_with_tag(blkid_cache cache,					 const char *type,					 const char *value){	blkid_tag	head;	blkid_dev	dev;	int		pri;	struct list_head *p;	if (!cache || !type || !value)		return NULL;	blkid_read_cache(cache);	DBG(DEBUG_TAG, printf("looking for %s=%s in cache\n", type, value));try_again:	pri = -1;	dev = 0;	head = blkid_find_head_cache(cache, type);	if (head) {		list_for_each(p, &head->bit_names) {			blkid_tag tmp = list_entry(p, struct blkid_struct_tag,						   bit_names);			if (!strcmp(tmp->bit_val, value) &&			    tmp->bit_dev->bid_pri > pri) {				dev = tmp->bit_dev;				pri = dev->bid_pri;			}		}	}	if (dev && !(dev->bid_flags & BLKID_BID_FL_VERIFIED)) {		dev = blkid_verify(cache, dev);		if (dev && (dev->bid_flags & BLKID_BID_FL_VERIFIED))			goto try_again;	}	if (!dev && !(cache->bic_flags & BLKID_BIC_FL_PROBED)) {		if (blkid_probe_all(cache) < 0)			return NULL;		goto try_again;	}	return dev;}#ifdef TEST_PROGRAM#ifdef HAVE_GETOPT_H#include <getopt.h>#elseextern char *optarg;extern int optind;#endifvoid usage(char *prog){	fprintf(stderr, "Usage: %s [-f blkid_file] [-m debug_mask] device "		"[type value]\n",		prog);	fprintf(stderr, "\tList all tags for a device and exit\n", prog);	exit(1);}int main(int argc, char **argv){	blkid_tag_iterate	iter;	blkid_cache 		cache = NULL;	blkid_dev		dev;	int			c, ret, found;	int			flags = BLKID_DEV_FIND;	char			*tmp;	char			*file = NULL;	char			*devname = NULL;	char			*search_type = NULL;	char			*search_value = NULL;	const char		*type, *value;	while ((c = getopt (argc, argv, "m:f:")) != EOF)		switch (c) {		case 'f':			file = optarg;			break;		case 'm':			blkid_debug_mask = strtoul (optarg, &tmp, 0);			if (*tmp) {				fprintf(stderr, "Invalid debug mask: %d\n",					optarg);				exit(1);			}			break;		case '?':			usage(argv[0]);		}	if (argc > optind)		devname = argv[optind++];	if (argc > optind)		search_type = argv[optind++];	if (argc > optind)		search_value = argv[optind++];	if (!devname || (argc != optind))		usage(argv[0]);	if ((ret = blkid_get_cache(&cache, file)) != 0) {		fprintf(stderr, "%s: error creating cache (%d)\n",			argv[0], ret);		exit(1);	}	dev = blkid_get_dev(cache, devname, flags);	if (!dev) {		fprintf(stderr, "%s: cannot find device in blkid cache\n");		exit(1);	}	if (search_type) {		found = blkid_dev_has_tag(dev, search_type, search_value);		printf("Device %s: (%s, %s) %s\n", blkid_dev_devname(dev),		       search_type, search_value ? search_value : "NULL",		       found ? "FOUND" : "NOT FOUND");		return !found;	}	printf("Device %s...\n", blkid_dev_devname(dev));	iter = blkid_tag_iterate_begin(dev);	while (blkid_tag_next(iter, &type, &value) == 0) {		printf("\tTag %s has value %s\n", type, value);	}	blkid_tag_iterate_end(iter);	blkid_put_cache(cache);	return 0;}#endif

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产婷婷色一区二区三区| 欧美日韩国产电影| 国产精品久久久久久久久果冻传媒| 奇米一区二区三区| 国产精品久线在线观看| 88在线观看91蜜桃国自产| 国产成人免费xxxxxxxx| 国产精品免费视频网站| 久久国产精品第一页| 国产精品视频观看| 欧美性色黄大片| 91在线看国产| 欧美三级一区二区| 国产精品一二三四区| 欧美成人官网二区| 国产一区二区三区综合| 久久一留热品黄| 国产精品66部| 国产午夜精品福利| 成人免费毛片aaaaa**| 成人免费毛片a| 五月天中文字幕一区二区| 精品国产一二三| 欧洲视频一区二区| 成人免费视频一区| 亚洲3atv精品一区二区三区| 欧美高清一级片在线观看| 欧美三区在线观看| 成人高清伦理免费影院在线观看| 日韩综合一区二区| 国产99一区视频免费| 精品国产一区二区三区不卡 | 国产99久久久久久免费看农村| 国产欧美一区二区三区在线老狼 | 国产精品99久久久| 国产精品免费网站在线观看| 91老司机福利 在线| 亚洲成av人片一区二区| 日韩欧美视频在线| 成人午夜av电影| 尤物av一区二区| 日韩欧美在线网站| 成人不卡免费av| 亚洲午夜免费福利视频| 日韩欧美一区在线| 福利一区二区在线| 夜夜嗨av一区二区三区中文字幕| 日韩三级中文字幕| 成人免费观看视频| 午夜久久久久久| 国产午夜精品美女毛片视频| 在线观看日韩国产| 久久国产乱子精品免费女| 国产精品理论在线观看| 欧美综合天天夜夜久久| 国产一区欧美日韩| 玉足女爽爽91| 精品av综合导航| 色香色香欲天天天影视综合网| 日精品一区二区| 中文字幕一区二区三区四区不卡 | 亚洲在线视频一区| 精品精品欲导航| 色八戒一区二区三区| 激情综合一区二区三区| 亚洲精品视频在线观看免费| 日韩午夜精品视频| 色综合久久中文综合久久97| 精品亚洲欧美一区| 亚洲综合成人在线| 久久这里只有精品视频网| 欧美在线免费观看视频| 丰满亚洲少妇av| 日韩高清不卡在线| 日韩一区有码在线| www久久精品| 欧美老肥妇做.爰bbww视频| 国产v综合v亚洲欧| 欧美a级一区二区| 亚洲精品国产第一综合99久久| 久久精品在这里| 欧美一区二区私人影院日本| 色综合久久天天| 国产suv精品一区二区三区| 日本aⅴ精品一区二区三区 | 欧美激情一区二区三区不卡 | 一本色道久久加勒比精品| 国产一区二区三区| 午夜精品久久久久久久| 17c精品麻豆一区二区免费| 亚洲精品一区二区三区在线观看 | 亚洲视频在线观看三级| 精品国产免费久久| 欧美欧美午夜aⅴ在线观看| 99热这里都是精品| 国产精品一区二区在线看| 免费在线视频一区| 亚洲成a人v欧美综合天堂| 1024国产精品| 国产精品久久久久婷婷二区次| 久久一区二区视频| 日韩欧美中文字幕公布| 欧美日韩成人在线一区| 色吧成人激情小说| 99re热这里只有精品免费视频 | 精品一区二区综合| 日精品一区二区| 午夜视频一区二区| 亚洲国产精品久久久久秋霞影院| 亚洲欧美日韩精品久久久久| 国产精品卡一卡二| 国产精品视频看| 国产欧美一区二区三区鸳鸯浴 | 欧美成va人片在线观看| 9191国产精品| 在线成人小视频| 欧美精品自拍偷拍| 777色狠狠一区二区三区| 精品一区二区在线播放| 欧美日韩成人在线| 亚洲小说春色综合另类电影| 91偷拍与自偷拍精品| 亚洲色图在线播放| 99免费精品视频| ...xxx性欧美| 91在线观看高清| 亚洲自拍偷拍欧美| 欧美日韩一级二级| 秋霞影院一区二区| 久久只精品国产| 高清在线不卡av| 亚洲欧洲综合另类在线 | 日韩精品一区二区三区视频在线观看| 日韩黄色小视频| 欧美一区二区三区视频免费播放 | 免费久久精品视频| 亚洲私人影院在线观看| 在线观看国产91| 亚洲人成网站在线| 91电影在线观看| 99视频国产精品| 色猫猫国产区一区二在线视频| 成人一区二区视频| 美女视频黄久久| 麻豆成人久久精品二区三区红| 麻豆国产精品视频| 国产在线一区二区综合免费视频| 国产精品一级在线| 成人性生交大片免费看在线播放 | 亚洲二区视频在线| 喷水一区二区三区| 国产福利91精品一区| 国产激情91久久精品导航 | 日韩美女精品在线| 欧美一区中文字幕| 91色porny| 精品一区二区免费| 丝袜亚洲另类欧美| 精品电影一区二区三区| 91女人视频在线观看| 国产成人免费在线观看| 五月天中文字幕一区二区| 国产欧美日韩久久| 欧美一级夜夜爽| 久久青草国产手机看片福利盒子| 国产精品女同一区二区三区| 一区二区三区中文在线观看| 亚洲天堂免费在线观看视频| 亚洲成人av福利| 久草中文综合在线| 91小视频免费观看| 欧美日韩1234| 国产日韩精品一区| 亚洲午夜日本在线观看| 精品一区免费av| 色呦呦一区二区三区| 91精品国产综合久久婷婷香蕉| 国产视频911| 亚洲成人av福利| 国产成人精品免费在线| 欧美在线你懂得| 精品国产sm最大网站免费看| 综合欧美亚洲日本| 免费在线观看日韩欧美| 成人精品在线视频观看| 51午夜精品国产| 中文字幕中文字幕在线一区 | 久久精品免费在线观看| 亚洲美女偷拍久久| 激情欧美一区二区| 色美美综合视频| 久久久久久久网| 夜色激情一区二区| 国产成人a级片| 在线电影欧美成精品| 中文字幕在线观看一区| 久久精品99国产国产精| 欧美少妇一区二区| 国产精品人妖ts系列视频| 蜜臀a∨国产成人精品|