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

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

?? btcore.c

?? affix是一個Open Source的藍牙協議棧
?? C
?? 第 1 頁 / 共 3 頁
字號:
	slist_t	*entry, *prev;	for (prev = NULL, entry = *list; entry; prev = entry, entry = entry->next) {		if (entry->data == data) {			if (prev)				prev->next = entry->next;			else				*list = entry->next;			free(entry);			break;		}	}}void s_list_remove_custom(slist_t **list, void *data, slist_sort_func *func){	slist_t	*entry = *list, *prev = NULL, *next = *list;	if (!func)		return;	while (next) {		entry = next;		next = entry->next;						if (func(entry->data, data) == 0) {			if (prev)				prev->next = entry->next;			else				*list = entry->next;			free(entry);		} else			prev = entry;	}}void s_list_destroy(slist_t **list){	slist_t	*entry;		while (*list) {		entry = *list;		*list = entry->next;		if (entry->data)			free(entry->data);		free(entry);	}}int s_list_length(slist_t *list){	slist_t	*entry;	int	count;	for (count = 0, entry = list; entry; entry = entry->next, count++) ;	return count;}void s_list_free(slist_t **list){	slist_t	*entry;	while (*list) {		entry = *list;		*list = entry->next;		free(entry);	}}void *s_list_nth_data(slist_t *list, int i){	slist_t	*entry;	int	count;	for (count = 0, entry = list; entry; entry = entry->next, count++)		if (count == i)			return entry->data;	return NULL;}void s_list_foreach(slist_t *list, slist_func *func, void *param){	slist_t	*entry;	if (!func)		return;	for (entry = list; entry; entry = entry->next)		func(entry->data, param);}slist_t *s_list_find_custom(slist_t *list, void *data, slist_sort_func *func){	slist_t	*entry;	if (!func)		return NULL;	for (entry = list; entry; entry = entry->next)		if (func(entry->data, data) == 0)			return entry;	return NULL;}/* stuff */int affix_wait_for_service_up(int port, int timeout){	struct sockaddr_in	in;	int			fd, err;	time_t			stm, tm;		in.sin_family = AF_INET;	in.sin_port = port;	in.sin_addr.s_addr = inet_addr("127.0.0.1");	fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);	if (fd < 0)		return -1;	stm = time(NULL);	for (;;) {		err = connect(fd, (struct sockaddr *)&in, sizeof(in));		if (!err)			break;		tm = time(NULL);		if (difftime(tm, stm) > timeout) {			close(fd);			return -1;		}		}	close(fd);	return 0;}int affix_system(char *prog, int single){	pid_t	pid;	int	err;	sighandler_t	sh;	if (single) {		pid = affix_pidof(prog, PIDOF_SINGLE | PIDOF_BASENAME, 0);		if (pid)			return 0;	}	/* start server */	sh = signal(SIGCHLD, SIG_DFL);	err = system(prog);	signal(SIGCHLD, sh);	return err ? -1 : 0;}/* device inquiry/known cache */char *xml_element(char **buf, char **attr){	char	*start = *buf, *next;	// find first <	start = strchr(start, '<');	if (start == NULL)		return NULL;	start++;	// find last >	next = strchr(start, '>');	if (next == NULL) {		// broken		return NULL;	}	*next = '\0';	next++;	*buf = next;	// get first later of the element	while (isblank(*start) && *start != '\0')		start++;	next = start+1;	while (!isblank(*next) && *next != '\0')		next++;		*next = '\0';	*attr = next+1;	// check for "/"	next = *buf-1;	while (*next == '\0' || isblank(*next))		next--;	if (*next == '/')		*next = '\0';	return start;}char *xml_attribute(char **buf, char **value){	char *start = *buf, *next;	int flag = 0;	//find attr name	while (isblank(*start) && *start != '\0')		start++;		if (*start == '\0')		return NULL;	next = start+1;		//find end	while (!isblank(*next) && *next != '=' && *next != '\0')		next++;	if (*next == '=')		flag = 1;		*next = '\0';	next++;		if (flag == 0) {		next = strchr(next, '=');		if (next == NULL)			return NULL;		next++;	}		next = strchr(next, '"');	if (next == NULL)		return NULL;	*value = next+1;	next = strchr(next+1, '"');	if (next == NULL)		return NULL;	*next = '\0';	*buf = next+1;		return start;}btdev_struct *btdev_cache_lookup(BD_ADDR *bda){	btdev_struct	*entry;	int		i;		for (i = 0; (entry = s_list_nth_data(devcache.head, i)); i++) {		if (bda_equal(bda, &entry->bda))			return entry;	}	return NULL;}int btdev_cache_del(btdev_struct *entry){	s_list_remove(&devcache.head, entry);	free(entry);	return 0;}btdev_struct *btdev_cache_add(BD_ADDR *bda){	btdev_struct	*entry, *mount;	int		i, num = -1;	for (i = 0; (entry = s_list_nth_data(devcache.head, i)); i++) {		if (bda_equal(bda, &entry->bda)) {			s_list_remove(&devcache.head, entry);			num = i;			break;		}	}	if (!entry) {		/* create new */		entry = malloc(sizeof(btdev_struct));		if (!entry) {			perror("btdev_cache allocation failed\n");			return NULL;		}		memset(entry, 0, sizeof(btdev_struct));		entry->bda = *bda;		entry->state = DEVSTATE_UNKNOWN;	}	/* find linking position */	for (i = 0; (mount = s_list_nth_data(devcache.head, i)); i++) {		if (mount->state == DEVSTATE_RANGE)			continue;		if (mount->state == DEVSTATE_GONE || i == num)			break;	}	s_list_insert(&devcache.head, entry, i);	return entry;}int btdev_cache_init(void){	devcache.file = strdup(affix_cachefile);	if (!devcache.file)		return -1;	devcache.head = NULL;	devcache.count = 0;	devcache.lock = -1;	devcache.stamp = 0;	return 0;}int btdev_cache_load(int locked){	char		buf[256];	FILE		*cfd;	size_t		read;	char		*next = NULL, *elem, *attrs, *attr, *value;	BD_ADDR		bda;	int		found = 0, eof = 0;	struct stat	st;	if (!devcache.file && btdev_cache_init() < 0)		return -1;	if (stat(devcache.file, &st) < 0) {		return -1;	}		if (st.st_mtime == devcache.stamp) {		if (locked && btdev_cache_lock() < 0) {			return -1;		}		return 0;	}		devcache.stamp = st.st_mtime;		if (btdev_cache_lock() < 0) {		return -1;	}	cfd = fopen(devcache.file, "r");	if (!cfd){		fprintf(stderr, "Unable to open cache: %s\n", devcache.file);		btdev_cache_unlock();		return -1;	}	if (devcache.head) {		s_list_destroy(&devcache.head);		devcache.head = NULL;		devcache.count = 0;	}		for (;;) {		int	free;				if (next) {			/* we have some info in the buffer */			free =  next - buf;			memmove(buf, next, sizeof(buf) - free);		} else			free = sizeof(buf);					if (!eof) {			//printf("reading %d butes\n", free);			read = fread(buf + sizeof(buf) - free, 1, free, cfd);			if (!read)				eof = 1;		}		next = (void*)buf;		elem = xml_element(&next, &attrs);		if (!elem)			break;		if (!found)			if (strcmp(elem, "device-listing") == 0) {				found = 1;				continue;			}		if (strcmp(elem, "/device-listing") == 0)			break;		//printf("element: %s\n", elem);		//printf("attr left: %s\n", attrs);		// get attributes		if (strcmp(elem, "device") == 0) {			btdev_struct	*entry;			entry = NULL;			while ((attr = xml_attribute(&attrs, &value))) {				//printf("%s = %s\n", attr, value);				if (!entry) {					if (strcmp(attr, "bda") == 0) {						str2bda(&bda, value);						entry = btdev_cache_add(&bda);					}				} else if (strcmp(attr, "class") == 0) {					sscanf(value, "%x", &entry->cod);				} else if (strcmp(attr, "name") == 0) {					strcpy(entry->name, value);				} else if (strcmp(attr, "key") == 0) {					unsigned int	val;					int		i;					/* convert key to binary format */					for (i = 0; sscanf(value, "%2x", &val) > 0 && i < 16; i++, value += 2) {						entry->link_key[i] = val;					}					if (i)						entry->flags |= BTDEV_KEY;				}			}		}	}	fclose(cfd);	if (!locked)		btdev_cache_unlock();	return 0;}int btdev_cache_reload(void){	return btdev_cache_load(1);}	int btdev_cache_save(void){	btdev_struct	*entry;	FILE		*cfd;	int		i, k;	if (devcache.lock == -1 && btdev_cache_lock() < 0)		return -1;	cfd = fopen(devcache.file, "w");	if (!cfd) {		fprintf(stderr, "Unable to fopen cache file: %s\n", devcache.file);		btdev_cache_unlock();		return -1;	}	fprintf(cfd, "<device-listing>\n");	for (i = 0; (entry = s_list_nth_data(devcache.head, i)); i++) {		fprintf(cfd, "<device bda=\"%s\"", bda2str(&entry->bda));		if (entry->cod)			fprintf(cfd, " class=\"%x\"", entry->cod);		if (entry->name[0] != '\0')			fprintf(cfd, " name=\"%s\"", entry->name);		if (entry->flags & BTDEV_KEY) {			fprintf(cfd, " key=\"");			for (k = 0; k < 16; k++)				fprintf(cfd, "%02x", entry->link_key[k]);			fprintf(cfd, "\"");		}		fprintf(cfd, "/>\n");	}	fprintf(cfd, "</device-listing>\n");	fclose(cfd);	btdev_cache_unlock();	return 0;}void btdev_cache_free(void){	if (devcache.head) {		s_list_destroy(&devcache.head);		devcache.head = NULL;		devcache.count = 0;	}	if (devcache.file) {		free(devcache.file);		devcache.file = NULL;	}}void btdev_cache_purge(void){	if (devcache.head) {		s_list_destroy(&devcache.head);		devcache.head = NULL;		devcache.count = 0;	}	if (!devcache.file)		btdev_cache_init();	btdev_cache_save();}int btdev_cache_lock(void){	devcache.lock = open(devcache.file, O_CREAT, 0644);	if (devcache.lock < 0) {		fprintf(stderr, "Unable to open cache for locking: %s\n", devcache.file);		return devcache.lock;	}	if (flock(devcache.lock, LOCK_EX) < 0) {		fprintf(stderr, "Unable to lock cache\n");		close(devcache.lock);		devcache.lock = -1;		return -1;	}	return 0;}void btdev_cache_unlock(void){	if (devcache.lock < 0)		return;	close(devcache.lock);	devcache.lock = -1;}/* * Inquiry Cache Stuff */void btdev_cache_retire(void){	btdev_struct	*entry;	int		i;		for (i = 0; (entry = s_list_nth_data(devcache.head, i)); i++)		entry->state = DEVSTATE_GONE;}void btdev_cache_print(int state){	btdev_struct	*entry;	char		buf[256], *name;	int		i;	char		ch;	for (i = 0; (entry = s_list_nth_data(devcache.head, i)); i++) {		if (!(entry->state & state))			continue;		parse_cod(buf, entry->cod);		if (entry->name[0] != '\0')			name = entry->name;		else			name = "(none)";		switch (entry->state) {			case DEVSTATE_RANGE:				ch = '+';				break;			case DEVSTATE_GONE:				ch = '-';				break;			case DEVSTATE_UNKNOWN:			default:				ch = ' ';		}		printf("%c%d: Address: %s, Class: 0x%06X, Key: \"%s\"", 				ch, i+1, bda2str(&entry->bda), entry->cod, (entry->flags & BTDEV_KEY)?"yes":"no");		printf(", Name: \"%s\"\n", name);		printf("    %s\n", buf);	}}int btdev_cache_resolve(BD_ADDR *bda, int id){	btdev_struct 	*entry;		if (id < 0)		return -1;	entry = s_list_nth_data(devcache.head, id - 1);	if (!entry)		return -1;	*bda = entry->bda;	return 0;}btdev_struct *__btdev_cache_add(BD_ADDR bda, uint32_t cod, char *name){	btdev_struct *entry;	entry = btdev_cache_add(&bda);	if (!entry)		return NULL;	entry->state = DEVSTATE_RANGE;	entry->cod = cod;	if (name)		strcpy(entry->name, name);	return entry;}int btdev_get_bda(BD_ADDR *bda, char *peer){	int	err;		err = str2bda(bda, peer);	if (!err) {		/* try resolve */		int	id;		id = atoi(peer);		//printf("id: %d\n", id);		if (!id) 			return -1;		if (btdev_cache_load(0) < 0)			return -1;		err = btdev_cache_resolve(bda, id);		if (err)			return -1;	}	return 0;}/* * CLASS Of Device stuff */int parse_cod(char *buf, uint32_t  cod){	int			count = 0, found = 1;	struct affix_tupla	*map;	switch (cod & HCI_COD_MAJOR) {		case HCI_COD_COMPUTER:			for (map = codMinorComputerMnemonic; map->str || (found=0); map++) {				if (map->value == (cod & HCI_COD_MINOR)) {					count += sprintf(buf+count, "Computer (%s)", map->str);					break;				}			}			if (!found)				count += sprintf(buf+count, "Computer (Unclassified)");			break;		case HCI_COD_PHONE:			for (map = codMinorPhoneMnemonic; map->str || (found=0); map++) {				if (map->value == (cod & HCI_COD_MINOR)) {					count += sprintf(buf+count, "Phone (%s)", map->str);					break;				}			}			if (!found)				count += sprintf(buf+count, "Phone (Unclassified)");			break;		case HCI_COD_MAUDIO:			for (map = codMinorAudioMnemonic; map->str || (found=0); map++) {				if (map->value == (cod & HCI_COD_MINOR)) {					count += sprintf(buf+count, "Audio (%s)", map->str);					break;				}			}			if (!found)				count += sprintf(buf+count, "Audio (Unclassified)");			break;		default:			for (map = codMajorClassMnemonic; map->str || (found=0); map++) {				if (map->value == (cod & HCI_COD_MAJOR)) {					count += sprintf(buf+count, "%s (Unclassified)", map->str);					break;				}			}			if (!found)				count += sprintf(buf+count, "Unclassified (Unclassified)");	}	count += sprintf(buf+count, " [");	for (map = codsdp_service_map; map->str; map++) {		if (map->value & cod) {			count += sprintf(buf+count, "%s,", map->str);		}	}	count--;	// remove ,	count += sprintf(buf+count, "]");	return 0;}/* commands */void print_usage(struct command *cmd){	printf("usage: %s %s\n", cmd->name, cmd->arg ? cmd->arg : "");}void print_full_usage(struct command *cmd){	if (cmd->name)		printf("usage: %s %s\n", cmd->name, cmd->arg ? cmd->arg : "");	if (cmd->msg)		printf("description:\n%s", cmd->msg);}int print_command_usage(struct command *cmds, char *command){	struct command	*cmd;	struct command	nullcmd = {NULL, NULL, 0, NULL, NULL};	for (cmd = cmds; memcmp(cmd, &nullcmd, sizeof(nullcmd)) != 0; cmd++) {		if (cmd->name)			if (strcmp(cmd->name, command) == 0) {				print_full_usage(cmd);				return 0;			}	}	printf("invalid command: %s\n", command);	return 	1;}void print_all_usage(struct command *cmds){	struct command	*cmd;	struct command	nullcmd = {NULL, NULL, 0, NULL, NULL};		for (cmd = cmds; memcmp(cmd, &nullcmd, sizeof(nullcmd)) != 0; cmd++) {		if (cmd->name && cmd->arg)			printf("%s %s\n", cmd->name, cmd->arg);		else if (cmd->msg)			printf("%s", cmd->msg);	}}int call_command(struct command *cmds, char *command){	struct command	*cmd;	struct command	nullcmd = {NULL, NULL, 0, NULL, NULL};		for (cmd = cmds; memcmp(cmd, &nullcmd, sizeof(nullcmd)) != 0; cmd++) {		if (cmd->name && strcasecmp(cmd->name, command) == 0) {			return cmd->func(cmd);		}	}	printf("Invalid command: %s\n", command);	return -1;}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
粉嫩在线一区二区三区视频| 精品国产三级a在线观看| 色综合久久天天综合网| 91黄色在线观看| 制服丝袜日韩国产| 久久亚洲精品小早川怜子| 中文字幕第一页久久| 国产精品福利影院| 日韩国产高清影视| 国产精品一区二区在线看| 91在线精品一区二区三区| 欧美日韩不卡一区二区| 国产午夜精品理论片a级大结局| 亚洲青青青在线视频| 日韩电影免费在线观看网站| 丁香啪啪综合成人亚洲小说| 在线视频国内自拍亚洲视频| 中国av一区二区三区| 亚洲精品免费播放| 美女在线观看视频一区二区| 99久久99久久精品免费看蜜桃| 欧美日韩国产首页| 国产精品免费观看视频| 天天综合网天天综合色 | 亚洲激情综合网| 久久国产精品99久久人人澡| 色综合色综合色综合色综合色综合| 日韩三区在线观看| 一区二区视频免费在线观看| 精久久久久久久久久久| 色老头久久综合| 久久久久久久久久久久久久久99 | 欧美午夜精品久久久久久孕妇 | 成人ar影院免费观看视频| 欧美男男青年gay1069videost | av亚洲产国偷v产偷v自拍| 欧美精品少妇一区二区三区 | 色视频成人在线观看免| 久久久www成人免费无遮挡大片| 亚洲国产视频a| hitomi一区二区三区精品| 精品三级在线看| 午夜欧美电影在线观看| 成人三级伦理片| 欧美tickling挠脚心丨vk| 一级精品视频在线观看宜春院| 国产91精品精华液一区二区三区 | 麻豆国产一区二区| 欧美午夜理伦三级在线观看| **性色生活片久久毛片| 国产成人av影院| 欧美va亚洲va香蕉在线| 日韩黄色小视频| 欧洲精品在线观看| 亚洲日本电影在线| 国产91在线观看丝袜| 26uuu久久综合| 蜜臀av性久久久久蜜臀aⅴ流畅| 欧美日韩国产首页在线观看| 亚洲一区二区偷拍精品| 色诱视频网站一区| 亚洲人成网站影音先锋播放| www.欧美.com| 国产精品人成在线观看免费| 国产a级毛片一区| 国产欧美精品一区二区色综合朱莉| 老司机免费视频一区二区三区| 欧美精品久久久久久久多人混战| 亚洲国产美女搞黄色| 欧美日韩电影在线播放| 亚洲福利视频一区二区| 欧美日韩在线精品一区二区三区激情| 亚洲精品网站在线观看| 色综合天天狠狠| 一区二区三区日韩精品| 欧美在线视频不卡| 亚洲123区在线观看| 欧美日韩精品一区二区三区蜜桃 | 欧美在线高清视频| 亚洲一本大道在线| 欧美另类z0zxhd电影| 日韩国产精品大片| 精品88久久久久88久久久| 国产综合色视频| 国产精品私人影院| 91麻豆123| 亚洲成人精品一区二区| 欧美人伦禁忌dvd放荡欲情| 奇米777欧美一区二区| 欧美电视剧免费全集观看| 久久66热re国产| 国产网站一区二区| 91视频91自| 香蕉乱码成人久久天堂爱免费| 欧美一区二区在线播放| 韩国欧美国产一区| 国产精品麻豆欧美日韩ww| 色综合久久综合网97色综合| 天天色综合成人网| 国产亚洲欧美日韩俺去了| 成人精品视频.| 一区二区高清视频在线观看| 欧美高清精品3d| 国产在线精品一区在线观看麻豆| 中文字幕第一区综合| 91国在线观看| 免费观看日韩电影| 国产精品妹子av| 欧美性受极品xxxx喷水| 美女在线观看视频一区二区| 日本一二三四高清不卡| 欧美在线视频不卡| 国产一区美女在线| 一区二区三区精品| 2021国产精品久久精品| 91麻豆高清视频| 蜜臀99久久精品久久久久久软件| 国产三级三级三级精品8ⅰ区| 一本色道a无线码一区v| 另类小说色综合网站| 综合av第一页| 日韩欧美中文字幕一区| 99久久国产综合精品女不卡| 五月婷婷激情综合| 亚洲国产精品av| 欧美日韩国产欧美日美国产精品| 国产精品一区三区| 亚洲一二三四在线| 久久久亚洲高清| 欧美视频你懂的| 国产成人av影院| 奇米精品一区二区三区在线观看| 亚洲欧洲精品天堂一级| 国产精品久久福利| 成人精品在线视频观看| 蜜桃久久精品一区二区| 亚洲欧美激情小说另类| 成人一区二区三区视频在线观看| 亚洲成av人片一区二区三区| 日日摸夜夜添夜夜添国产精品| 99久久精品一区| 精品一区二区三区久久久| 亚洲一区国产视频| 国产精品乱码妇女bbbb| 日韩欧美三级在线| 欧美系列一区二区| 成人白浆超碰人人人人| 久久激情五月激情| 午夜视频在线观看一区二区三区| **欧美大码日韩| 国产三级一区二区| 精品欧美一区二区在线观看 | 一区二区三区四区在线播放| 久久久777精品电影网影网 | 久久精品国产77777蜜臀| 一区二区三区四区激情| 国产精品不卡视频| 久久久99免费| 精品国产一区二区三区久久久蜜月 | 欧美三级日韩三级| av福利精品导航| 国产99久久久国产精品潘金网站| 美女视频黄a大片欧美| 午夜视频一区二区三区| 亚洲欧洲综合另类| 中文字幕 久热精品 视频在线| 欧美变态凌虐bdsm| 欧美一级专区免费大片| 精品视频在线视频| 欧美自拍偷拍一区| 一本大道综合伊人精品热热| 成人性生交大片免费| 国内精品第一页| 国产中文字幕一区| 激情五月播播久久久精品| 日本亚洲最大的色成网站www| 亚洲bt欧美bt精品| 午夜国产精品一区| 日韩激情在线观看| 日本在线播放一区二区三区| 日本亚洲欧美天堂免费| 美日韩一区二区| 韩国一区二区三区| 国产成a人无v码亚洲福利| 国产激情偷乱视频一区二区三区| 国产精品一二三| 国产91精品在线观看| 成人免费视频视频在线观看免费| 国产91精品一区二区| 成人福利视频在线看| 99免费精品在线观看| 91在线云播放| 在线观看一区日韩| 51午夜精品国产| 日韩精品一区二区三区视频播放| 日韩欧美一区二区视频| 精品国产一区二区在线观看| 欧美激情一区二区三区不卡 | 99久久免费视频.com| 91女神在线视频|