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

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

?? isns.c

?? Ubuntu公司提供免費的iSCSI Target
?? C
?? 第 1 頁 / 共 2 頁
字號:
/* * iSNS functions * * Copyright (C) 2006 FUJITA Tomonori <tomof@acm.org> * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program 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 * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA */#include <errno.h>#include <netdb.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <netinet/in.h>#include <netinet/tcp.h>#include <sys/socket.h>#include <sys/types.h>#include "iscsid.h"#include "isns_proto.h"#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))#define BUFSIZE (1 << 18)struct isns_io {	char *buf;	int offset;};struct isns_qry_mgmt {	char name[ISCSI_NAME_LEN];	uint16_t transaction;	struct qelem qlist;};struct isns_initiator {	char name[ISCSI_NAME_LEN];	struct qelem ilist;};static LIST_HEAD(qry_list);static uint16_t scn_listen_port;static int use_isns, use_isns_ac, isns_fd, scn_listen_fd, scn_fd;static struct isns_io isns_rx, scn_rx;static char *rxbuf;static uint16_t transaction;static uint32_t current_timeout = 30; /* seconds */static char eid[ISCSI_NAME_LEN];static uint8_t ip[16]; /* IET supoprts only one portal */static struct sockaddr_storage ss;int isns_scn_access(uint32_t tid, int fd, char *name){	struct isns_initiator *ini;	struct target *target = target_find_by_id(tid);	if (!use_isns || !use_isns_ac)		return 0;	if (!target)		return -EPERM;	list_for_each_entry(ini, &target->isns_head, ilist) {		if (!strcmp(ini->name, name))			return 0;	}	return -EPERM;}static int isns_get_ip(int fd){	int err, i;	uint32_t addr;	struct sockaddr_storage lss;	socklen_t slen = sizeof(lss);	err = getsockname(fd, (struct sockaddr *) &lss, &slen);	if (err) {		log_error("getsockname error %s!", gai_strerror(err));		return err;	}	err = getnameinfo((struct sockaddr *) &lss, sizeof(lss),			  eid, sizeof(eid), NULL, 0, 0);	if (err) {		log_error("getaddrinfo error %s!", gai_strerror(err));		return err;	}	switch (lss.ss_family) {	case AF_INET:		addr = (((struct sockaddr_in *) &lss)->sin_addr.s_addr);		ip[10] = ip[11] = 0xff;		ip[15] = 0xff & (addr >> 24);		ip[14] = 0xff & (addr >> 16);		ip[13] = 0xff & (addr >> 8);		ip[12] = 0xff & addr;		break;	case AF_INET6:		for (i = 0; i < ARRAY_SIZE(ip); i++)			ip[i] = ((struct sockaddr_in6 *) &lss)->sin6_addr.s6_addr[i];		break;	}	return 0;}static int isns_connect(void){	int fd, err;	fd = socket(ss.ss_family, SOCK_STREAM, IPPROTO_TCP);	if (fd < 0) {		log_error("unable to create (%s) %d!", strerror(errno),			  ss.ss_family);		return -1;	}	err = connect(fd, (struct sockaddr *) &ss, sizeof(ss));	if (err < 0) {		log_error("unable to connect (%s) %d!", strerror(errno),			  ss.ss_family);		close(fd);		return -1;	}	log_error("%s %d: new connection %d", __FUNCTION__, __LINE__, fd);	if (!strlen(eid)) {		err = isns_get_ip(fd);		if (err) {			close(fd);			return -1;		}	}	isns_fd = fd;	isns_set_fd(fd, scn_listen_fd, scn_fd);	return fd;}static void isns_hdr_init(struct isns_hdr *hdr, uint16_t function,			  uint16_t length, uint16_t flags,			  uint16_t trans, uint16_t sequence){	hdr->version = htons(0x0001);	hdr->function = htons(function);	hdr->length = htons(length);	hdr->flags = htons(flags);	hdr->transaction = htons(trans);	hdr->sequence = htons(sequence);}static int isns_tlv_set(struct isns_tlv **tlv, uint32_t tag, uint32_t length,			void *value){	if (length)		memcpy((*tlv)->value, value, length);	if (length % ISNS_ALIGN)		length += (ISNS_ALIGN - (length % ISNS_ALIGN));	(*tlv)->tag = htonl(tag);	(*tlv)->length = htonl(length);	length += sizeof(struct isns_tlv);	*tlv = (struct isns_tlv *) ((char *) *tlv + length);	return length;}static int isns_scn_deregister(char *name){	int err;	uint16_t flags, length = 0;	char buf[2048];	struct isns_hdr *hdr = (struct isns_hdr *) buf;	struct isns_tlv *tlv;	if (!isns_fd)		if (isns_connect() < 0)			return 0;	memset(buf, 0, sizeof(buf));	tlv = (struct isns_tlv *) hdr->pdu;	length += isns_tlv_set(&tlv, ISNS_ATTR_ISCSI_NAME, strlen(name), name);	length += isns_tlv_set(&tlv, ISNS_ATTR_ISCSI_NAME, strlen(name), name);	flags = ISNS_FLAG_CLIENT | ISNS_FLAG_LAST_PDU | ISNS_FLAG_FIRST_PDU;	isns_hdr_init(hdr, ISNS_FUNC_SCN_DEREG, length, flags,		      ++transaction, 0);	err = write(isns_fd, buf, length + sizeof(struct isns_hdr));	if (err < 0)		log_error("%s %d: %s", __FUNCTION__, __LINE__, strerror(errno));	return 0;}#if __BYTE_ORDER == __LITTLE_ENDIAN#define set_scn_flag(x)						\{								\	x = (x & 0x55555555) << 1 | (x & 0xaaaaaaaa) >> 1;	\	x = (x & 0x33333333) << 2 | (x & 0xcccccccc) >> 2;	\	x = (x & 0x0f0f0f0f) << 4 | (x & 0xf0f0f0f0) >> 4;	\	x = (x & 0x00ff00ff) << 8 | (x & 0xff00ff00) >> 8;	\	x = (x & 0x0000ffff) << 16 | (x & 0xffff0000) >> 16;	\}#else#define set_scn_flag(x) (x)#endifstatic int isns_scn_register(void){	int err;	uint16_t flags, length = 0;	uint32_t scn_flags;	char buf[4096];	struct isns_hdr *hdr = (struct isns_hdr *) buf;	struct isns_tlv *tlv;	struct target *target;	if (list_empty(&targets_list))		return 0;	if (!isns_fd)		if (isns_connect() < 0)			return 0;	memset(buf, 0, sizeof(buf));	tlv = (struct isns_tlv *) hdr->pdu;	target = list_entry(targets_list.q_forw, struct target, tlist);	length += isns_tlv_set(&tlv, ISNS_ATTR_ISCSI_NAME,			       strlen(target->name), target->name);	length += isns_tlv_set(&tlv, ISNS_ATTR_ISCSI_NAME,			       strlen(target->name), target->name);	length += isns_tlv_set(&tlv, 0, 0, 0);	scn_flags = ISNS_SCN_FLAG_INITIATOR | ISNS_SCN_FLAG_OBJECT_REMOVE |		ISNS_SCN_FLAG_OBJECT_ADDED | ISNS_SCN_FLAG_OBJECT_UPDATED;	set_scn_flag(scn_flags);	scn_flags = htonl(scn_flags);	length += isns_tlv_set(&tlv, ISNS_ATTR_ISCSI_SCN_BITMAP,			       sizeof(scn_flags), &scn_flags);	flags = ISNS_FLAG_CLIENT | ISNS_FLAG_LAST_PDU | ISNS_FLAG_FIRST_PDU;	isns_hdr_init(hdr, ISNS_FUNC_SCN_REG, length, flags, ++transaction, 0);	err = write(isns_fd, buf, length + sizeof(struct isns_hdr));	if (err < 0)		log_error("%s %d: %s", __FUNCTION__, __LINE__, strerror(errno));	return 0;}static int isns_attr_query(char *name){	int err;	uint16_t flags, length = 0;	char buf[4096];	struct isns_hdr *hdr = (struct isns_hdr *) buf;	struct isns_tlv *tlv;	struct target *target;	uint32_t node = htonl(ISNS_NODE_INITIATOR);	struct isns_qry_mgmt *mgmt;	if (list_empty(&targets_list))		return 0;	if (!isns_fd)		if (isns_connect() < 0)			return 0;	mgmt = malloc(sizeof(*mgmt));	if (!mgmt)		return 0;	insque(&mgmt->qlist, &qry_list);	memset(buf, 0, sizeof(buf));	tlv = (struct isns_tlv *) hdr->pdu;	if (name)		snprintf(mgmt->name, sizeof(mgmt->name), name);	else {		mgmt->name[0] = '\0';		target = list_entry(targets_list.q_forw, struct target, tlist);		name = target->name;	}	length += isns_tlv_set(&tlv, ISNS_ATTR_ISCSI_NAME, strlen(name), name);	length += isns_tlv_set(&tlv, ISNS_ATTR_ISCSI_NODE_TYPE,			       sizeof(node), &node);	length += isns_tlv_set(&tlv, 0, 0, 0);	length += isns_tlv_set(&tlv, ISNS_ATTR_ISCSI_NAME, 0, 0);	length += isns_tlv_set(&tlv, ISNS_ATTR_ISCSI_NODE_TYPE, 0, 0);	length += isns_tlv_set(&tlv, ISNS_ATTR_PORTAL_IP_ADDRESS, 0, 0);	flags = ISNS_FLAG_CLIENT | ISNS_FLAG_LAST_PDU | ISNS_FLAG_FIRST_PDU;	isns_hdr_init(hdr, ISNS_FUNC_DEV_ATTR_QRY, length, flags,		      ++transaction, 0);	mgmt->transaction = transaction;	err = write(isns_fd, buf, length + sizeof(struct isns_hdr));	if (err < 0)		log_error("%s %d: %s", __FUNCTION__, __LINE__, strerror(errno));	return 0;}static int isns_deregister(void){	int err;	uint16_t flags, length = 0;	char buf[4096];	struct isns_hdr *hdr = (struct isns_hdr *) buf;	struct isns_tlv *tlv;	struct target *target;	if (list_empty(&targets_list))		return 0;	if (!isns_fd)		if (isns_connect() < 0)			return 0;	memset(buf, 0, sizeof(buf));	tlv = (struct isns_tlv *) hdr->pdu;	target = list_entry(targets_list.q_forw, struct target, tlist);	length += isns_tlv_set(&tlv, ISNS_ATTR_ISCSI_NAME,			       strlen(target->name), target->name);	length += isns_tlv_set(&tlv, 0, 0, 0);	length += isns_tlv_set(&tlv, ISNS_ATTR_ENTITY_IDENTIFIER,			       strlen(eid), eid);	flags = ISNS_FLAG_CLIENT | ISNS_FLAG_LAST_PDU | ISNS_FLAG_FIRST_PDU;	isns_hdr_init(hdr, ISNS_FUNC_DEV_DEREG, length, flags,		      ++transaction, 0);	err = write(isns_fd, buf, length + sizeof(struct isns_hdr));	if (err < 0)		log_error("%s %d: %s", __FUNCTION__, __LINE__, strerror(errno));	return 0;}int isns_target_register(char *name){	char buf[4096];	uint16_t flags = 0, length = 0;	struct isns_hdr *hdr = (struct isns_hdr *) buf;	struct isns_tlv *tlv;	uint32_t port = htonl(ISCSI_LISTEN_PORT);	uint32_t node = htonl(ISNS_NODE_TARGET);	uint32_t type = htonl(2);	struct target *target;	int err, initial = list_length_is_one(&targets_list);	if (!use_isns)		return 0;	if (!isns_fd)		if (isns_connect() < 0)			return 0;	memset(buf, 0, sizeof(buf));	tlv = (struct isns_tlv *) hdr->pdu;        target = list_entry(targets_list.q_back, struct target, tlist);        length += isns_tlv_set(&tlv, ISNS_ATTR_ISCSI_NAME,			       strlen(target->name), target->name);	length += isns_tlv_set(&tlv, ISNS_ATTR_ENTITY_IDENTIFIER,			       strlen(eid), eid);	length += isns_tlv_set(&tlv, 0, 0, 0);	length += isns_tlv_set(&tlv, ISNS_ATTR_ENTITY_IDENTIFIER,			       strlen(eid), eid);	if (initial) {		length += isns_tlv_set(&tlv, ISNS_ATTR_ENTITY_PROTOCOL,				       sizeof(type), &type);		length += isns_tlv_set(&tlv, ISNS_ATTR_PORTAL_IP_ADDRESS,				       sizeof(ip), &ip);		length += isns_tlv_set(&tlv, ISNS_ATTR_PORTAL_PORT,				       sizeof(port), &port);		flags = ISNS_FLAG_REPLACE;		if (scn_listen_port) {			uint32_t sport = htonl(scn_listen_port);			length += isns_tlv_set(&tlv, ISNS_ATTR_SCN_PORT,					       sizeof(sport), &sport);		}	}	length += isns_tlv_set(&tlv, ISNS_ATTR_ISCSI_NAME, strlen(name), name);	length += isns_tlv_set(&tlv, ISNS_ATTR_ISCSI_NODE_TYPE,			       sizeof(node), &node);	flags |= ISNS_FLAG_CLIENT | ISNS_FLAG_LAST_PDU | ISNS_FLAG_FIRST_PDU;	isns_hdr_init(hdr, ISNS_FUNC_DEV_ATTR_REG, length, flags,		      ++transaction, 0);	err = write(isns_fd, buf, length + sizeof(struct isns_hdr));	if (err < 0)		log_error("%s %d: %s", __FUNCTION__, __LINE__, strerror(errno));	if (scn_listen_port)		isns_scn_register();	isns_attr_query(name);	return 0;}static void free_all_acl(struct target *target){	struct isns_initiator *ini;	while (!list_empty(&target->isns_head)) {		ini = list_entry(target->isns_head.q_forw, typeof(*ini), ilist);		remque(&ini->ilist);	}}static struct target *target_lookup_by_name(char *name){	uint32_t tid;	tid = target_find_by_name(name);	if (!tid)		return NULL;	return target_find_by_id(tid);}int isns_target_deregister(char *name){	char buf[4096];	uint16_t flags, length = 0;	struct isns_hdr *hdr = (struct isns_hdr *) buf;	struct isns_tlv *tlv;	int err, last = list_empty(&targets_list);	struct target *target;	target = target_lookup_by_name(name);	if (target)		free_all_acl(target);	if (!use_isns)		return 0;	if (!isns_fd)		if (isns_connect() < 0)			return 0;	isns_scn_deregister(name);	memset(buf, 0, sizeof(buf));	tlv = (struct isns_tlv *) hdr->pdu;	length += isns_tlv_set(&tlv, ISNS_ATTR_ISCSI_NAME, strlen(name), name);	length += isns_tlv_set(&tlv, 0, 0, 0);	if (last)

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品理论电影在线观看 | 国产精品久久久久影视| 欧美三级一区二区| 日韩精品一区二| 一区二区三区日韩欧美| 国产一区二区三区久久久| 欧美亚洲综合网| 国产精品欧美久久久久一区二区| 蜜桃视频一区二区三区| 日本精品一级二级| 欧美国产欧美综合| 韩国女主播成人在线观看| 欧美日韩国产影片| 亚洲欧美激情插 | 久久激情综合网| 色先锋资源久久综合| 国产区在线观看成人精品| 日本午夜一区二区| 精品视频在线看| 亚洲一区二区三区四区五区中文| 9久草视频在线视频精品| 久久综合99re88久久爱| 久久国产福利国产秒拍| 日韩三级视频在线观看| 日韩av在线免费观看不卡| 欧美人牲a欧美精品| 亚洲成人av电影在线| 欧美日韩亚洲另类| 亚洲一区二区三区爽爽爽爽爽| 色婷婷精品久久二区二区蜜臀av| 中文字幕一区二区三区在线不卡 | 成人手机电影网| 国产欧美日韩精品a在线观看| 狠狠色综合播放一区二区| 精品噜噜噜噜久久久久久久久试看| 男人的j进女人的j一区| 日韩限制级电影在线观看| 美女性感视频久久| 久久综合九色综合97_久久久| 国产精品亚洲专一区二区三区| 久久久精品tv| av在线免费不卡| 一个色综合网站| 91精品国模一区二区三区| 韩国在线一区二区| 国产精品水嫩水嫩| 91高清在线观看| 日本 国产 欧美色综合| 久久久蜜臀国产一区二区| 99久久久精品免费观看国产蜜| **性色生活片久久毛片| 欧美日韩久久久久久| 理论电影国产精品| 亚洲国产成人自拍| 欧美性xxxxx极品少妇| 日本不卡一区二区三区高清视频| 精品成人佐山爱一区二区| 成人精品一区二区三区四区| 亚洲综合久久av| 久久综合色综合88| 色猫猫国产区一区二在线视频| 免费观看日韩电影| 国产精品不卡一区| 欧美福利视频一区| 成人激情动漫在线观看| 亚洲成av人片在线观看无码| 久久伊人蜜桃av一区二区| 91九色最新地址| 国产乱码精品1区2区3区| 一区二区免费看| 久久在线观看免费| 欧美日韩一区中文字幕| 国产成人免费网站| 亚洲成av人片一区二区梦乃| 国产精品乱码一区二三区小蝌蚪| 制服丝袜激情欧洲亚洲| 99精品视频中文字幕| 青青草97国产精品免费观看无弹窗版| 国产婷婷一区二区| 91精品国产高清一区二区三区蜜臀| 波多野结衣视频一区| 日本美女一区二区三区| 亚洲激情图片qvod| 国产精品欧美一级免费| 337p日本欧洲亚洲大胆精品 | 久久久久国产精品麻豆| 欧美另类变人与禽xxxxx| 成人动漫在线一区| 国产原创一区二区| 青青草精品视频| 丝袜美腿成人在线| 樱花草国产18久久久久| 亚洲国产精品传媒在线观看| 欧美精品一区二区精品网| 欧美精品乱人伦久久久久久| 在线精品视频一区二区三四| 成人教育av在线| 国产经典欧美精品| 国产毛片精品国产一区二区三区| 免费看日韩精品| 秋霞电影一区二区| 青青草视频一区| 日本免费在线视频不卡一不卡二| 午夜不卡在线视频| 午夜电影久久久| 秋霞午夜鲁丝一区二区老狼| 首页国产欧美久久| 日韩福利视频网| 日本v片在线高清不卡在线观看| 性久久久久久久| 亚洲va欧美va天堂v国产综合| 亚洲午夜三级在线| 亚洲一区二区精品久久av| 亚洲国产综合在线| 午夜视频一区二区| 蜜臀av一级做a爰片久久| 日韩精品91亚洲二区在线观看| 午夜激情综合网| 日韩电影一二三区| 麻豆高清免费国产一区| 久久激情五月激情| 国产69精品久久久久毛片| 国产suv精品一区二区883| av在线一区二区三区| 91视频一区二区| 欧美又粗又大又爽| 欧美精品色综合| 精品成人一区二区三区四区| 国产欧美一区二区三区在线看蜜臀 | 久久精品二区亚洲w码| 国产一区二区三区在线观看精品| 国产91丝袜在线播放| 99久久er热在这里只有精品15| 日本丶国产丶欧美色综合| 51午夜精品国产| 欧美激情综合网| 一区二区国产视频| 日韩高清不卡在线| 国产99精品视频| 欧美曰成人黄网| 精品国产一区二区亚洲人成毛片| 国产精品麻豆久久久| 亚洲成人第一页| 国产伦精品一区二区三区视频青涩 | 日韩精品一区二区三区四区 | 亚洲精品在线网站| 国产精品美女久久久久久2018| 亚洲在线成人精品| 久久99久久久欧美国产| 99re这里都是精品| 91精品国产综合久久精品性色| 久久亚洲综合色| 亚洲aⅴ怡春院| 成人午夜视频福利| 91麻豆精品国产| 亚洲同性gay激情无套| 麻豆视频一区二区| 欧美主播一区二区三区| 久久久精品免费免费| 五月综合激情网| 91蜜桃免费观看视频| 精品国产青草久久久久福利| 亚洲综合视频网| 国产99久久精品| 欧美成人精品二区三区99精品| 国产精品狼人久久影院观看方式| 视频在线观看一区| 色噜噜偷拍精品综合在线| 久久久久久久久久久久久夜| 三级欧美韩日大片在线看| 99re这里只有精品6| 久久久久久久久99精品| 男人的j进女人的j一区| 在线日韩av片| 亚洲男人的天堂在线aⅴ视频| 国产综合色精品一区二区三区| 777亚洲妇女| 亚洲国产人成综合网站| av在线播放一区二区三区| 久久精品免视看| 国产一区二区在线免费观看| 欧美丰满少妇xxxxx高潮对白 | 欧美写真视频网站| 亚洲欧美日韩在线播放| 不卡一区二区中文字幕| 国产日韩欧美高清| 国产成人在线色| 国产亚洲精品免费| 国产精品一二三四区| 久久久久久99精品| 国产精品综合一区二区三区| 欧美精品一区二区三区蜜桃视频| 日本不卡视频在线| 日韩一区国产二区欧美三区| 日本欧美久久久久免费播放网| 欧美美女激情18p| 日韩高清在线不卡| 日韩久久久精品| 另类小说色综合网站| 精品噜噜噜噜久久久久久久久试看|