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

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

?? isns.c

?? ISCSI target.It can be used to make up a IPSAN system.
?? 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;	scn_flags = htonl(set_scn_flag(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)		length += isns_tlv_set(&tlv, ISNS_ATTR_ENTITY_IDENTIFIER,

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品国产一二三区| 亚洲三级免费观看| 中文一区一区三区高中清不卡| 亚洲激情一二三区| 极品少妇xxxx精品少妇偷拍| 在线观看视频一区| 国产嫩草影院久久久久| 日日骚欧美日韩| 91丨porny丨中文| 日本vs亚洲vs韩国一区三区二区| 欧美人妇做爰xxxⅹ性高电影| 欧美一区二区三区日韩视频| 国产精品日产欧美久久久久| 日本v片在线高清不卡在线观看| 99久久综合精品| 精品sm捆绑视频| 天天av天天翘天天综合网色鬼国产| 成人av电影在线网| 国产色综合一区| 狠狠色丁香久久婷婷综| 欧美日韩一级二级| 亚洲欧美另类综合偷拍| 成人免费毛片app| 国产午夜精品在线观看| 韩国一区二区在线观看| 日韩你懂的在线播放| 欧美视频一区在线观看| 日韩精品综合一本久道在线视频| 国产午夜精品在线观看| 久久精品国产一区二区三区免费看| 99综合电影在线视频| 久久综合久久鬼色中文字| 日韩电影在线一区二区| 在线电影国产精品| 日韩高清在线观看| 欧美一级二级在线观看| 五月天亚洲精品| 在线免费观看日韩欧美| 亚洲美女视频在线| 欧洲在线/亚洲| 亚洲国产成人精品视频| 色欧美日韩亚洲| 国产高清不卡二三区| 欧美一区二区三区视频在线| 日韩精品一级中文字幕精品视频免费观看 | 亚洲成人自拍一区| 欧美视频第二页| 亚洲一卡二卡三卡四卡| 欧美日韩激情一区二区三区| 免费人成精品欧美精品| 欧美成人福利视频| 国产一区二区三区观看| 中文字幕一区视频| 在线观看国产一区二区| 蜜桃精品视频在线| 久久久综合视频| 欧美日韩免费电影| 亚洲欧洲一区二区在线播放| 色婷婷av一区二区三区软件| 午夜精品一区二区三区免费视频 | 国产一区福利在线| 国产精品免费久久久久| 91麻豆国产自产在线观看| 丝袜诱惑亚洲看片| 欧美精品一区二区久久婷婷| 成人av电影免费在线播放| 亚洲国产视频一区二区| 久久影视一区二区| 色婷婷综合久久久久中文一区二区| 日韩综合小视频| 国产精品三级久久久久三级| 欧美精品一卡二卡| 丰满岳乱妇一区二区三区| 亚洲国产欧美在线| 亚洲裸体xxx| 国产真实乱对白精彩久久| 国产日产精品一区| 欧美三级日本三级少妇99| 久久国产精品99精品国产| 亚洲欧洲成人av每日更新| 欧美图区在线视频| 成人美女视频在线看| 日本女人一区二区三区| 亚洲女人小视频在线观看| 欧美成人精品高清在线播放 | 男女男精品网站| 国产精品乱码一区二区三区软件 | 日韩av中文字幕一区二区| 亚洲国产岛国毛片在线| 91精品国产色综合久久不卡电影 | 99视频精品在线| 日韩久久免费av| 色婷婷久久99综合精品jk白丝| 麻豆精品在线看| 午夜视频在线观看一区二区三区| 国产精品视频在线看| 日韩视频在线永久播放| 欧美色欧美亚洲另类二区| 成人高清视频免费观看| 狠狠色丁香久久婷婷综合丁香| 亚洲福利国产精品| 亚洲欧美偷拍卡通变态| 欧美激情综合网| 久久午夜电影网| 精品理论电影在线观看 | 欧美电影免费观看高清完整版在| 欧美主播一区二区三区| 粉嫩13p一区二区三区| 国产福利一区二区三区视频在线| 免费高清在线视频一区·| 亚洲狠狠爱一区二区三区| 亚洲视频 欧洲视频| 亚洲欧洲av在线| 亚洲国产成人av网| 中文字幕一区日韩精品欧美| 国产视频一区二区在线| 国产偷国产偷亚洲高清人白洁| 精品国产亚洲在线| 久久久国产综合精品女国产盗摄| 日韩一区二区三区观看| 666欧美在线视频| 日韩精品一区二区三区swag| 久久先锋影音av鲁色资源网| 久久日一线二线三线suv| 久久精品一区四区| 国产精品超碰97尤物18| 亚洲精品videosex极品| 亚洲国产日日夜夜| 蜜桃久久精品一区二区| 国产精品一区久久久久| 成人激情视频网站| 色婷婷综合五月| 欧美人xxxx| 久久免费看少妇高潮| 国产精品天美传媒| 亚洲黄色免费网站| 蜜臀精品久久久久久蜜臀 | 欧美tickle裸体挠脚心vk| 欧美日韩精品一区二区| 欧美日韩视频在线一区二区| 91.麻豆视频| 精品电影一区二区三区| 国产精品网曝门| 一区二区三区美女| 免费在线欧美视频| 成人午夜在线免费| 欧美无人高清视频在线观看| 91麻豆精品国产无毒不卡在线观看| 欧美本精品男人aⅴ天堂| 亚洲国产成人午夜在线一区| 亚洲资源在线观看| 精品一区二区免费看| 91毛片在线观看| 欧美videos中文字幕| 亚洲男女毛片无遮挡| 免费高清成人在线| 99精品视频中文字幕| 久热成人在线视频| 亚洲国产成人自拍| 亚洲乱码中文字幕综合| 日本欧美肥老太交大片| 丰满亚洲少妇av| 91精品免费在线观看| 久久精品欧美日韩| 午夜一区二区三区视频| 高清在线成人网| 日韩一级大片在线| 亚洲激情六月丁香| 国产乱码精品一区二区三区五月婷 | 久久综合五月天婷婷伊人| 亚洲精品免费在线观看| 国产一区啦啦啦在线观看| 欧美日韩成人一区| 中文字幕综合网| 国产精品综合视频| 欧美一级生活片| 亚洲综合免费观看高清完整版| 韩国av一区二区三区四区| 婷婷丁香久久五月婷婷| 亚洲午夜国产一区99re久久| 久久99蜜桃精品| 欧美在线一二三四区| 国产精品免费av| 国产一区二区在线看| 777午夜精品免费视频| 亚洲黄色av一区| 97se亚洲国产综合自在线不卡 | 国产精品18久久久久久久久久久久| 欧美猛男男办公室激情| 一区二区三区成人在线视频| 9人人澡人人爽人人精品| 欧美国产一区视频在线观看| 国产一区二区成人久久免费影院| 欧美一区二区久久久| 午夜视频在线观看一区| 欧美男人的天堂一二区| 亚洲综合色自拍一区| 欧美在线观看视频一区二区三区 | 久久精品国产网站| 欧美日韩亚洲高清一区二区|