⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 session.c

📁 iscsi企业级target.很好用
💻 C
字号:
/* * Copyright (C) 2002-2003 Ardis Technolgies <roman@ardistech.com> * * Released under the terms of the GNU GPL v2.0. */#include <ctype.h>#include <dirent.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <sys/stat.h>#include <errno.h>#include "iscsid.h"static struct session *session_alloc(u32 tid){	struct session *session;	struct target *target = target_find_by_id(tid);	if (!target)		return NULL;	if (!(session = malloc(sizeof(*session))))		return NULL;	memset(session, 0, sizeof(*session));	session->target = target;	INIT_LIST_HEAD(&session->slist);	insque(&session->slist, &target->sessions_list);	return session;}struct session *session_find_name(u32 tid, const char *iname, union iscsi_sid sid){	struct session *session;	struct target *target;	if (!(target = target_find_by_id(tid)))		return NULL;	log_debug(1, "session_find_name: %s %#" PRIx64, iname, sid.id64);	list_for_each_entry(session, &target->sessions_list, slist) {		if (!memcmp(sid.id.isid, session->sid.id.isid, 6) &&		    !strcmp(iname, session->initiator))			return session;	}	return NULL;}struct session *session_find_id(u32 tid, u64 sid){	struct session *session;	struct target *target;	if (!(target = target_find_by_id(tid)))		return NULL;	log_debug(1, "session_find_id: %#" PRIx64, sid);	list_for_each_entry(session, &target->sessions_list, slist) {		if (session->sid.id64 == sid)			return session;	}	return NULL;}static int session_test(u32 t_tid, u64 t_sid){	FILE *f;	char buf[8192], *p;	u32 tid;	u64 sid;	int err = -ENOENT, find = 0;	if ((f = fopen(PROC_SESSION, "r")) == NULL) {		fprintf(stderr, "Can't open %s\n", PROC_SESSION);		return -errno;	}	while (fgets(buf, sizeof(buf), f)) {		p = buf;		while (isspace((int) *p))			p++;		if (!strncmp(p, "tid:", 4)) {			if (sscanf(p, "tid:%u", &tid) != 1) {				err = -EIO;				goto out;			}			if (tid == t_tid)				find = 1;			else				find = 0;		} else if (!strncmp(p, "sid:", 4)) {			if (!find)				continue;			if (sscanf(p, "sid:%" SCNu64, &sid) != 1) {				err = -EIO;				goto out;			}			if (sid == t_sid) {				err = 0;				goto out;			}		}	}out:	fclose(f);	return err;}void session_create(struct connection *conn){	struct session *session;	static u16 tsih = 1;	if (!(session = session_alloc(conn->tid)))		return;	session->sid = conn->sid;	session->sid.id.tsih = tsih;	while (1) {		int err = session_test(conn->tid, session->sid.id64);		if (err == -ENOENT)			break;		else if (err < 0)			return;		session->sid.id.tsih++;	}	tsih = session->sid.id.tsih + 1;	conn->session = session;	conn->session->initiator = strdup(conn->initiator);	log_debug(1, "session_create: %#" PRIx64, session->sid.id64);	ki->session_create(conn->tid, session->sid.id64, conn->exp_cmd_sn,			   conn->max_cmd_sn, session->initiator);	ki->param_set(conn->tid, session->sid.id64, key_session, 0, conn->session_param);}void session_remove(struct session *session){	log_debug(1, "session_remove: %#"  PRIx64, session->sid.id64);	if (!session->sid.id.tsih)		ki->session_destroy(session->target->tid, session->sid.id64);	if (session->target) {		remque(&session->slist);/* 		session->target->nr_sessions--; */	}	free(session->initiator);	free(session);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -