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

? 歡迎來(lái)到蟲(chóng)蟲(chóng)下載站! | ?? 資源下載 ?? 資源專(zhuān)輯 ?? 關(guān)于我們
? 蟲(chóng)蟲(chóng)下載站

?? plain.c

?? ISCSI target.It can be used to make up a IPSAN system.
?? C
字號(hào):
/* * Plain file-based configuration file code. * * (C) 2005 FUJITA Tomonori <tomof@acm.org> * This code is licenced under the GPL. */#include <ctype.h>#include <dirent.h>#include <errno.h>#include <netdb.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/stat.h>#include <sys/socket.h>#include <netinet/in.h>#include <netinet/tcp.h>#include <netinet/ip.h>#include <arpa/inet.h>#include "iscsid.h"#define BUFSIZE		4096#define CONFIG_FILE	"/etc/ietd.conf"#define ACCT_CONFIG_FILE	CONFIG_FILE/* * Account configuration code */struct user {	struct qelem ulist;	u32 tid;	char *name;	char *password;};/* this is the orignal Ardis code. */static char *target_sep_string(char **pp){	char *p = *pp;	char *q;	for (p = *pp; isspace(*p); p++)		;	for (q = p; *q && !isspace(*q); q++)		;	if (*q)		*q++ = 0;	else		p = NULL;	*pp = q;	return p;}static struct iscsi_key user_keys[] = {	{"IncomingUser",},	{"OutgoingUser",},	{NULL,},};static struct qelem discovery_users_in = LIST_HEAD_INIT(discovery_users_in);static struct qelem discovery_users_out = LIST_HEAD_INIT(discovery_users_out);#define HASH_ORDER	4#define acct_hash(x)	((x) & ((1 << HASH_ORDER) - 1))static struct qelem trgt_acct_in[1 << HASH_ORDER];static struct qelem trgt_acct_out[1 << HASH_ORDER];static struct qelem *account_list_get(u32 tid, int dir){	struct qelem *list = NULL;	if (tid) {		list = (dir == AUTH_DIR_INCOMING) ?			&trgt_acct_in[acct_hash(tid)] : &trgt_acct_out[acct_hash(tid)];	} else		list = (dir == AUTH_DIR_INCOMING) ?			&discovery_users_in : &discovery_users_out;	return list;}static int plain_account_init(char *filename){	FILE *fp;	char buf[BUFSIZE], *p, *q;	u32 tid;	int idx;	if (!(fp = fopen(filename, "r")))		return -EIO;	tid = 0;	while (fgets(buf, sizeof(buf), fp)) {		q = buf;		p = target_sep_string(&q);		if (!p || *p == '#')			continue;		if (!strcasecmp(p, "Target")) {			tid = 0;			if (!(p = target_sep_string(&q)))				continue;			tid = target_find_by_name(p);		} else if (!((idx = param_index_by_name(p, user_keys)) < 0)) {			char *name, *pass;			name = target_sep_string(&q);			pass = target_sep_string(&q);			if (cops->account_add(tid, idx, name, pass) < 0)				fprintf(stderr, "%s %s\n", name, pass);		}	}	fclose(fp);	return 0;}/* Return the first account if the length of name is zero */static struct user *account_lookup_by_name(u32 tid, int dir, char *name){	struct qelem *list = account_list_get(tid, dir);	struct user *user = NULL;	list_for_each_entry(user, list, ulist) {		fprintf(stderr, "%u %s %s\n", user->tid, user->password, user->name);		if (user->tid != tid)			continue;		if (!strlen(name))			return user;		if (!strcmp(user->name, name))			return user;	}	return NULL;}static int plain_account_query(u32 tid, int dir, char *name, char *pass){	struct user *user;	if (!(user = account_lookup_by_name(tid, dir, name)))		return -ENOENT;	if (!strlen(name))		strncpy(name, user->name, ISCSI_NAME_LEN);	strncpy(pass, user->password, ISCSI_NAME_LEN);	return 0;}static void account_destroy(struct user *user){	if (!user)		return;	remque(&user->ulist);	free(user->name);	free(user->password);	free(user);}static int plain_account_del(u32 tid, int dir, char *name){	struct user *user;	if (!name || !(user = account_lookup_by_name(tid, dir, name)))		return -ENOENT;	account_destroy(user);	/* update the file here. */	return 0;}static struct user *account_create(void){	struct user *user;	if (!(user = malloc(sizeof(*user))))		return NULL;	memset(user, 0, sizeof(*user));	INIT_LIST_HEAD(&user->ulist);	return user;}static int plain_account_add(u32 tid, int dir, char *name, char *pass){	int err = -ENOMEM;	struct user *user;	struct qelem *list;	if (!name || !pass)		return -EINVAL;	if (tid) {		/* check here *//* 		return -ENOENT; */	}	if (!(user = account_create()) ||	    !(user->name = strdup(name)) ||	    !(user->password = strdup(pass)))		goto out;	user->tid = tid;	list = account_list_get(tid, dir);	if (dir == AUTH_DIR_OUTGOING && !list_empty(list)) {		struct user *old;		log_warning("Only one outgoing %s account is supported."			    " Replacing the old one.\n",			    tid ? "target" : "discovery");		old = (struct user *) list->q_forw;		account_destroy(old);	}	insque(user, list);	/* update the file here. */	return 0;out:	account_destroy(user);	return err;}/* * Access control code */static int netmask_match_v6(struct sockaddr *sa1, struct sockaddr *sa2, uint32_t mbit){	uint16_t mask, a1[8], a2[8];	int i;	for (i = 0; i < 8; i++) {		a1[i] = ntohs(((struct sockaddr_in6 *) sa1)->sin6_addr.s6_addr16[i]);		a2[i] = ntohs(((struct sockaddr_in6 *) sa2)->sin6_addr.s6_addr16[i]);	}	for (i = 0; i < mbit / 16; i++)		if (a1[i] ^ a2[i])			return 0;	if (mbit % 16) {		mask = ~((1 << (16 - (mbit % 16))) - 1);		if ((mask & a1[mbit / 16]) ^ (mask & a2[mbit / 16]))			return 0;	}	return 1;}static int netmask_match_v4(struct sockaddr *sa1, struct sockaddr *sa2, uint32_t mbit){	uint32_t s1, s2, mask = ~((1 << (32 - mbit)) - 1);	s1 = htonl(((struct sockaddr_in *) sa1)->sin_addr.s_addr);	s2 = htonl(((struct sockaddr_in *) sa2)->sin_addr.s_addr);	if (~mask & s1)		return 0;	if (!((mask & s2) ^ (mask & s1)))		return 1;	return 0;}static int netmask_match(struct sockaddr *sa1, struct sockaddr *sa2, char *buf){	uint32_t mbit;	uint8_t family = sa1->sa_family;	mbit = strtoul(buf, NULL, 0);	if (mbit < 0 ||	    (family == AF_INET && mbit > 31) ||	    (family == AF_INET6 && mbit > 127))		return 0;	if (family == AF_INET)		return netmask_match_v4(sa1, sa2, mbit);	return netmask_match_v6(sa1, sa2, mbit);}static int address_match(struct sockaddr *sa1, struct sockaddr *sa2){	if (sa1->sa_family == AF_INET)		return ((struct sockaddr_in *) sa1)->sin_addr.s_addr ==			((struct sockaddr_in *) sa2)->sin_addr.s_addr;	else {		struct in6_addr *a1, *a2;		a1 = &((struct sockaddr_in6 *) sa1)->sin6_addr;		a2 = &((struct sockaddr_in6 *) sa2)->sin6_addr;		return (a1->s6_addr32[0] == a2->s6_addr32[0] &&			a1->s6_addr32[1] == a2->s6_addr32[1] &&			a1->s6_addr32[2] == a2->s6_addr32[2] &&			a1->s6_addr32[3] == a2->s6_addr32[3]);	}	return 0;}static int __initiator_match(int fd, char *str){	struct sockaddr_storage from;	struct addrinfo hints, *res;	socklen_t len;	char *p, *q;	int err = 0;	len = sizeof(from);	if (getpeername(fd, (struct sockaddr *) &from, &len) < 0)		return 0;	while ((p = strsep(&str, ","))) {		while (isspace(*p))			p++;		if (!strcmp(p, "ALL"))			return 1;		if (*p == '[') {			p++;			if (!(q = strchr(p, ']')))				return 0;			*(q++) = '\0';		} else			q = p;		if ((q = strchr(q, '/')))			*(q++) = '\0';		memset(&hints, 0, sizeof(hints));		hints.ai_socktype = SOCK_STREAM;		hints.ai_flags = AI_NUMERICHOST;		if (getaddrinfo(p, NULL, &hints, &res) < 0)			return 0;		if (q)			err = netmask_match(res->ai_addr,					    (struct sockaddr *) &from, q);		else			err = address_match(res->ai_addr,					    (struct sockaddr *) &from);		freeaddrinfo(res);		if (err)			break;	}	return err;}static int initiator_match(u32 tid, int fd, char *filename){	int err = 0;	FILE *fp;	char buf[BUFSIZE], *p;	if (!(fp = fopen(filename, "r")))		return err;	/*	 * Every time we are called, we read the file. So we don't need to	 * implement 'reload feature'. It's slow, however, it doesn't matter.	 */	while ((p = fgets(buf, sizeof(buf), fp))) {		if (!p || *p == '#')			continue;		p = &buf[strlen(buf) - 1];		if (*p != '\n')			continue;		*p = '\0';		if (!(p = strchr(buf, ' ')))			continue;		*(p++) = '\0';		if (target_find_by_name(buf) != tid && strcmp(buf, "ALL"))			continue;		err = __initiator_match(fd, p);		break;	}	fclose(fp);	return err;}static int plain_initiator_access(u32 tid, int fd){	if (initiator_match(tid, fd, "/etc/initiators.deny") &&	    !initiator_match(tid, fd, "/etc/initiators.allow"))		return -EPERM;	else		return 0;}/* * Main configuration code */static int __plain_target_create(u32 *tid, char *name, int update){	int err;	if (target_find_by_name(name)) {		log_error("duplicated target %s", name);		return -EINVAL;	}	if ((err = target_add(tid, name)) < 0)		return err;	if (update)		; /* Update the config file here. */	return err;}static int plain_target_create(u32 *tid, char *name){	return __plain_target_create(tid, name, 1);}static int plain_target_destroy(u32 tid){	int err;	if ((err = target_del(tid)) < 0)		return err;	/* Update the config file here. */	return err;}static int __plain_lunit_create(u32 tid, u32 lun, char *args, int update){	int err;	if ((err = ki->lunit_create(tid, lun, args)) < 0)		return err;	if (update)		;	return err;}static int plain_lunit_create(u32 tid, u32 lun, char *args){	return __plain_lunit_create(tid, lun, args, 1);}static int plain_lunit_destroy(u32 tid, u32 lun){	return ki->lunit_destroy(tid, lun);}static int __plain_param_set(u32 tid, u64 sid, int type,			   u32 partial, struct iscsi_param *param, int update){	int err;	if ((err = ki->param_set(tid, sid, type, partial, param)) < 0)		return err;	if (update)		;	return err;}static int plain_param_set(u32 tid, u64 sid, int type,			   u32 partial, struct iscsi_param *param){	return __plain_param_set(tid, sid, type, partial, param, 1);}static int iscsi_param_partial_set(u32 tid, u64 sid, int type, int key, u32 val){	struct iscsi_param *param;	struct iscsi_param session_param[session_key_last];	struct iscsi_param target_param[target_key_last];	if (type == key_session)		param = session_param;	else		param = target_param;	param[key].val = val;	return __plain_param_set(tid, sid, type, 1 << key, param, 0);}static int plain_main_init(char *filename){	FILE *config;	char buf[BUFSIZE];	char *p, *q;	int idx;	u32 tid, val;	if (!(config = fopen(filename, "r")))		return -errno;	tid = 0;	while (fgets(buf, BUFSIZE, config)) {		q = buf;		p = target_sep_string(&q);		if (!p || *p == '#')			continue;		if (!strcasecmp(p, "Target")) {			tid = 0;			if (!(p = target_sep_string(&q)))				continue;			if (__plain_target_create(&tid, p, 0))				log_debug(1, "creating target %s", p);		} else if (!strcasecmp(p, "Alias") && tid) {			;		} else if (!strcasecmp(p, "MaxSessions") && tid) {			/* target->max_sessions = strtol(q, &q, 0); */		} else if (!strcasecmp(p, "Lun") && tid) {			u32 lun = strtol(q, &q, 10);			__plain_lunit_create(tid, lun, q, 0);		} else if (!((idx = param_index_by_name(p, target_keys)) < 0) && tid) {			val = strtol(q, &q, 0);			if (param_check_val(target_keys, idx, &val) < 0)				log_warning("%s, %u\n", target_keys[idx].name, val);			iscsi_param_partial_set(tid, 0, key_target, idx, val);		} else if (!((idx = param_index_by_name(p, session_keys)) < 0) && tid) {			char *str = target_sep_string(&q);			if (param_str_to_val(session_keys, idx, str, &val) < 0)				continue;			if (param_check_val(session_keys, idx, &val) < 0)				log_warning("%s, %u\n", session_keys[idx].name, val);			iscsi_param_partial_set(tid, 0, key_session, idx, val);		}	}	fclose(config);	return 0;}static int plain_default_load(char *params){	int i, err;	for (i = 0; i < 1 << HASH_ORDER; i++) {		INIT_LIST_HEAD(&trgt_acct_in[i]);		INIT_LIST_HEAD(&trgt_acct_out[i]);	}	/* First, we must finish the main configuration. */	if ((err = plain_main_init(params ? params : CONFIG_FILE)))		return err;	if ((err = plain_account_init(ACCT_CONFIG_FILE)) < 0)		return err;	/* TODO: error handling */	return err;}static int plain_init(char *params, char **isns, int *isns_ac){	FILE *config;	char buf[BUFSIZE];	char *p, *q;	if (!(config = fopen(params ? : CONFIG_FILE, "r")))		return -errno;	while (fgets(buf, BUFSIZE, config)) {		q = buf;		p = target_sep_string(&q);		if (!p || *p == '#')			continue;		if (!strcasecmp(p, "iSNSServer")) {			*isns = strdup(target_sep_string(&q));		} else if (!strcasecmp(p, "iSNSAccessControl")) {			char *str = target_sep_string(&q);			if (!strcasecmp(str, "Yes"))				*isns_ac = 1;		}	}	fclose(config);	return 0;}struct config_operations plain_ops = {	.init			= plain_init,	.default_load		= plain_default_load,	.target_add		= plain_target_create,	.target_del		= plain_target_destroy,	.lunit_add		= plain_lunit_create,	.lunit_del		= plain_lunit_destroy,	.param_set		= plain_param_set,	.account_add		= plain_account_add,	.account_del		= plain_account_del,	.account_query		= plain_account_query,	.initiator_access	= plain_initiator_access,};

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久综合色之久久综合| 在线亚洲欧美专区二区| 在线观看免费亚洲| 久久人人超碰精品| 丝袜诱惑制服诱惑色一区在线观看| 国产99久久久国产精品潘金| 91精品欧美福利在线观看| 国产精品久久久久影院老司| 激情亚洲综合在线| 欧美日韩极品在线观看一区| 18成人在线观看| 国产高清一区日本| 日韩午夜电影在线观看| 亚洲一区二区三区美女| 99热国产精品| 国产欧美日韩不卡| 精品一区二区影视| 日韩一区二区三| 亚洲国产欧美日韩另类综合| 99这里只有精品| 国产欧美久久久精品影院| 蜜臀av性久久久久av蜜臀妖精| 91久久精品国产91性色tv| 国产欧美一区二区精品性色超碰| 久久国产精品第一页| 欧美日韩免费一区二区三区视频 | 成人网在线播放| 日韩欧美精品在线| 丝瓜av网站精品一区二区| 在线中文字幕不卡| 亚洲美女区一区| 99热这里都是精品| 中文字幕一区二区三区四区不卡 | 亚洲精品乱码久久久久久| 成人一区二区三区中文字幕| 久久丝袜美腿综合| 国产麻豆91精品| 精品国产免费人成电影在线观看四季| 日韩高清一区在线| 欧美精品色一区二区三区| 亚洲一二三四久久| 精品视频在线免费看| 亚洲小说春色综合另类电影| 欧美午夜电影一区| 亚洲一区二区三区四区五区中文| 色综合天天综合网天天狠天天| 亚洲人亚洲人成电影网站色| 99国产精品久| 亚洲精品ww久久久久久p站 | 欧美aaa在线| 欧美一区二区三区影视| 日韩在线观看一区二区| 亚洲综合激情另类小说区| 97se亚洲国产综合在线| 亚洲日本一区二区三区| 欧美亚洲尤物久久| 午夜视黄欧洲亚洲| 91精品国产欧美一区二区| 免费观看一级特黄欧美大片| 精品国产精品网麻豆系列| 国产剧情一区二区| 中文文精品字幕一区二区| www.亚洲国产| 一区二区在线看| 欧美日韩另类国产亚洲欧美一级| 热久久一区二区| 久久人人爽人人爽| 99re这里都是精品| 亚洲一二三区不卡| 欧美大片一区二区| 国产成人免费在线观看不卡| 成人欧美一区二区三区小说 | 麻豆一区二区三| 精品国产一区二区精华| 粉嫩蜜臀av国产精品网站| 亚洲精品乱码久久久久| 欧美二区在线观看| 久久99国内精品| 国产精品久久福利| 欧美人xxxx| 国产一区91精品张津瑜| 亚洲欧美一区二区三区久本道91| 欧美日韩在线三区| 国产乱一区二区| 亚洲精品一卡二卡| 日韩精品影音先锋| 不卡一区二区三区四区| 天天av天天翘天天综合网色鬼国产 | 天堂蜜桃一区二区三区| 精品电影一区二区三区| 色综合夜色一区| 另类中文字幕网| 亚洲欧洲av在线| 日韩一区二区免费在线观看| 粗大黑人巨茎大战欧美成人| 亚洲高清免费视频| 国产亚洲视频系列| 欧美色视频在线| 国产成人亚洲综合a∨婷婷图片| 亚洲精品久久久久久国产精华液| 日韩午夜激情电影| 91一区一区三区| 久久99九九99精品| 亚洲精品高清在线观看| 精品久久人人做人人爽| 色婷婷精品久久二区二区蜜臀av| 狠狠色伊人亚洲综合成人| 亚洲男人的天堂av| 久久这里只有精品6| 91黄视频在线| 国产成人在线电影| 日本亚洲免费观看| 亚洲精品水蜜桃| 久久久久久亚洲综合| 911精品国产一区二区在线| 成人激情图片网| 欧美日韩黄色一区二区| 91影院在线免费观看| 国产伦精一区二区三区| 天堂久久一区二区三区| 亚洲品质自拍视频网站| 久久欧美中文字幕| 欧美一二三四区在线| 日本精品一区二区三区四区的功能| 国产精品一二三区在线| 日韩综合小视频| 一区二区三区欧美| 欧美激情一区二区三区不卡 | 成人免费视频caoporn| 日本少妇一区二区| 亚洲国产视频a| 亚洲欧美偷拍卡通变态| 欧美国产一区二区在线观看| 日韩美女在线视频| 欧美麻豆精品久久久久久| 色婷婷av一区二区三区大白胸| 国产成人精品一区二区三区网站观看| 免费看欧美美女黄的网站| 亚洲国产精品一区二区www | 日韩午夜在线观看| 欧美日本韩国一区| 欧美日韩综合不卡| 欧美这里有精品| 日本韩国一区二区| 97精品超碰一区二区三区| 成人自拍视频在线观看| 国产精品综合二区| 国产一区高清在线| 韩国欧美国产1区| 久久国产精品一区二区| 美女在线观看视频一区二区| 免费在线看一区| 免费看日韩精品| 久久国产婷婷国产香蕉| 美女久久久精品| 理论片日本一区| 美女视频免费一区| 看电视剧不卡顿的网站| 麻豆91免费观看| 精品亚洲免费视频| 国产综合久久久久久久久久久久| 麻豆国产精品777777在线| 久色婷婷小香蕉久久| 精品在线播放免费| 国产一区二区在线影院| 国产成人av在线影院| 成人综合日日夜夜| 91原创在线视频| 欧美怡红院视频| 欧美日韩中文国产| 欧美一区二区精品在线| 日韩欧美国产综合一区 | 91黄色激情网站| 欧美亚洲高清一区| 555www色欧美视频| 日韩欧美一区在线| 久久夜色精品国产欧美乱极品| 久久久久久久久岛国免费| 国产欧美视频一区二区| 国产一区 二区 三区一级| 成人一区二区三区视频在线观看 | 精品一区二区三区香蕉蜜桃| 久久99国产精品久久99果冻传媒| 国内成人精品2018免费看| 懂色av中文字幕一区二区三区| 成人福利视频在线| 在线精品视频一区二区三四| 欧美亚洲一区二区在线| 欧美精品欧美精品系列| 日韩亚洲电影在线| 日本一区二区三区在线不卡| 《视频一区视频二区| 亚洲国产精品视频| 久久99精品网久久| 99久久精品免费看国产免费软件| 91国偷自产一区二区开放时间| 91精品欧美一区二区三区综合在| 精品av久久707| 亚洲精品视频一区| 日本va欧美va精品|