Open-iscs源码分析之---iscsiadm.c
login处理...
main(int argc, char **argv)
{
......
printf("anycom: iscsiadmin.c 2332");
rc = exec_node_op(op, do_login, do_logout, do_show,
do_rescan, do_stats, info_level, rec,
name, value);
......
}
切换到:
static int exec_node_op(int op, int do_login, int do_logout,
int do_show, int do_rescan, int do_stats,
int info_level, struct node_rec *rec,
char *name, char *value)
{
....
//其它所有注册工作都在这儿完成的。
if (login_portals(rec))
rc = -1;
....
}
就是调用这个了....
static int login_portals(struct node_rec *pattern_rec)
{
....
INIT_LIST_HEAD(&rec_list);
ret = for_each_rec(pattern_rec, &rec_list, link_recs);
err = __login_portals(NULL, &nr_found, &rec_list,
login_portal);
....
}
static int __login_portals(void *data, int *nr_found, struct list_head *rec_list, int (* login_fn)(void *, struct list_head *, struct node_rec *)){ struct node_rec *curr_rec, *tmp; struct list_head login_list; int ret = 0, err; *nr_found = 0; INIT_LIST_HEAD(&login_list); list_for_each_entry(curr_rec, rec_list, list) { err = login_fn(data, &login_list, curr_rec);这里的login_fn()就是login_portal if (err > 0 && !ret) ret = err; if (!err) (*nr_found)++; } printf("\nanycom: ---------------------------------------------------------iscsiadmin.c 682\n"); err = iscsid_login_reqs_wait(&login_list);//-========================后面是等回复了。 if (err && !ret) ret = err; printf("\nanycom: iscsiadmin.c 687 over\n");///到这里login就完成了,接着把rec们,都删掉。 list_for_each_entry_safe(curr_rec, tmp, rec_list, list) { list_del(&curr_rec->list); free(curr_rec); } return ret;}
也就是调用的这个
static int login_portal(void *data, struct list_head *list,
struct node_rec *rec)
{
...
===============================转到\usr\util.c了================================
rc = iscsid_req_by_rec_async(MGMT_IPC_SESSION_LOGIN,
rec, &fd);
...
}
===============================转到\usr\util.c================================
int iscsid_req_by_rec_async(iscsiadm_cmd_e cmd, node_rec_t *rec, int *fd)
{
iscsiadm_req_t req;
//转递的参数转变成 iscsiadm_reg_t 类型了
//新开了一个iscsiadm_reg_t
//
memset(&req, 0, sizeof(iscsiadm_req_t));
req.command = cmd;
memcpy(&req.u.session.rec, rec, sizeof(node_rec_t));
return iscsid_request(fd, &req);
}
mgmt_ipc_err_e iscsid_request(int *fd, iscsiadm_req_t *req)
{
err = iscsid_connect(fd);
....
///用write与iscsid通信?socket通信
if ((err = write(*fd, req, sizeof(*req))) != sizeof(*req))
}
static mgmt_ipc_err_e iscsid_connect(int *fd)
{
...
for (nsec = 1; nsec <= MAXSLEEP; nsec <<= 1) {
printf("\nanycom:util.c 146\n");
if (connect(*fd, (struct sockaddr *) &addr, sizeof(addr)) == 0)
/* Connection established */
return MGMT_IPC_OK;
sleep();
. ...
}
}
问题是在哪里建了/dev/sdc?
在iscsid.c中int main(int argc, char *argv[])的内容:
mgmt_ipc_listen(void) 480附近
开的socket。
开设备号在
这个东西,还是相当难看懂的,
注册了一个transport class,google上基本没它的资料,不知道是怎么用的。
DECLARE_TRANSPORT_CLASS()了一下。
TRANSPORT_CLASS_REGISTER()了一下。
从哪里来用它,目前还不清楚。
Open-iscs源码分析之---iscsiadm.c相关推荐
- 【Golang源码分析】Go Web常用程序包gorilla/mux的使用与源码简析
目录[阅读时间:约10分钟] 一.概述 二.对比: gorilla/mux与net/http DefaultServeMux 三.简单使用 四.源码简析 1.NewRouter函数 2.HandleF ...
- SpringBoot-web开发(四): SpringMVC的拓展、接管(源码分析)
[SpringBoot-web系列]前文: SpringBoot-web开发(一): 静态资源的导入(源码分析) SpringBoot-web开发(二): 页面和图标定制(源码分析) SpringBo ...
- SpringBoot-web开发(二): 页面和图标定制(源码分析)
[SpringBoot-web系列]前文: SpringBoot-web开发(一): 静态资源的导入(源码分析) 目录 一.首页 1. 源码分析 2. 访问首页测试 二.动态页面 1. 动态资源目录t ...
- SpringBoot-web开发(一): 静态资源的导入(源码分析)
目录 方式一:通过WebJars 1. 什么是webjars? 2. webjars的使用 3. webjars结构 4. 解析源码 5. 测试访问 方式二:放入静态资源目录 1. 源码分析 2. 测 ...
- Yolov3Yolov4网络结构与源码分析
Yolov3&Yolov4网络结构与源码分析 从2018年Yolov3年提出的两年后,在原作者声名放弃更新Yolo算法后,俄罗斯的Alexey大神扛起了Yolov4的大旗. 文章目录 论文汇总 ...
- ViewGroup的Touch事件分发(源码分析)
Android中Touch事件的分发又分为View和ViewGroup的事件分发,View的touch事件分发相对比较简单,可参考 View的Touch事件分发(一.初步了解) View的Touch事 ...
- View的Touch事件分发(二.源码分析)
Android中Touch事件的分发又分为View和ViewGroup的事件分发,先来看简单的View的touch事件分发. 主要分析View的dispatchTouchEvent()方法和onTou ...
- MyBatis原理分析之四:一次SQL查询的源码分析
上回我们讲到Mybatis加载相关的配置文件进行初始化,这回我们讲一下一次SQL查询怎么进行的. 准备工作 Mybatis完成一次SQL查询需要使用的代码如下: Java代码 String res ...
- [转]slf4j + log4j原理实现及源码分析
slf4j + log4j原理实现及源码分析 转载于:https://www.cnblogs.com/jasonzeng888/p/6051080.html
最新文章
- Nginx——反向代理
- (转载)[MySQL技巧]INSERT INTO… ON DUPLICATE KEY UPDATE
- 用流读取文件中的内容
- r语言将百分数化为小数_C语言入门学习(一)
- 获取客户端浏览器信息
- Oracle listener静态注册和动态注册(zt)
- 微软云 mysql 重启_停止Azure MySQL PaaS数据库
- adb驱动和adb工具官方下载链接
- 利用官方git svn插件迁移svn仓库
- 51c语言编程入门教程,51单片机C语言入门教程
- 【附源码】计算机毕业设计SSM小区宠物管理系统
- 阿辉DirectX 11学习笔记二
- shader篇-阴影
- python公众号文章_Python 抓取微信公众号文章
- wps office 办公软件下载
- 硬件参数 调整 麦克风MIC灵敏度 原理
- 清华大学就光刻机发声,ASML立马加紧向中国出口光刻机
- 2019年新年书单 |不可错过的区块链好书 请查收
- w7怎么把计算机放桌面壁纸,W7电脑系统怎么更改锁屏壁纸
- OCR API身份证查验的原理
热门文章
- strlen,strcpy,strcmp,strcat,strncpy,strncmp,strncat
- 多媒体计算机技术第4版鲁宏伟,多媒体计算机技术[第3版.鲁宏伟等主编]课后习题答案完整版...
- 安装ZoneAlarm防火墙
- 倍福PLC--实现Dword数据类型每位1的计数,即统计类型中“1”的位数
- matlab中用高斯-赛德尔(Gauss-Seidel)迭代法解线性方程组
- C51 学习笔记03 | 8051单片机几大功能组成部件
- 网上书店管理系统mysql代码_网上书店信息管理系统+代码+数据库表
- 如何在LaTex当中给表格命名
- Android_常驻进程(杀不死的进程)
- 杀死一些极难杀死的进程,