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相关推荐

  1. 【Golang源码分析】Go Web常用程序包gorilla/mux的使用与源码简析

    目录[阅读时间:约10分钟] 一.概述 二.对比: gorilla/mux与net/http DefaultServeMux 三.简单使用 四.源码简析 1.NewRouter函数 2.HandleF ...

  2. SpringBoot-web开发(四): SpringMVC的拓展、接管(源码分析)

    [SpringBoot-web系列]前文: SpringBoot-web开发(一): 静态资源的导入(源码分析) SpringBoot-web开发(二): 页面和图标定制(源码分析) SpringBo ...

  3. SpringBoot-web开发(二): 页面和图标定制(源码分析)

    [SpringBoot-web系列]前文: SpringBoot-web开发(一): 静态资源的导入(源码分析) 目录 一.首页 1. 源码分析 2. 访问首页测试 二.动态页面 1. 动态资源目录t ...

  4. SpringBoot-web开发(一): 静态资源的导入(源码分析)

    目录 方式一:通过WebJars 1. 什么是webjars? 2. webjars的使用 3. webjars结构 4. 解析源码 5. 测试访问 方式二:放入静态资源目录 1. 源码分析 2. 测 ...

  5. Yolov3Yolov4网络结构与源码分析

    Yolov3&Yolov4网络结构与源码分析 从2018年Yolov3年提出的两年后,在原作者声名放弃更新Yolo算法后,俄罗斯的Alexey大神扛起了Yolov4的大旗. 文章目录 论文汇总 ...

  6. ViewGroup的Touch事件分发(源码分析)

    Android中Touch事件的分发又分为View和ViewGroup的事件分发,View的touch事件分发相对比较简单,可参考 View的Touch事件分发(一.初步了解) View的Touch事 ...

  7. View的Touch事件分发(二.源码分析)

    Android中Touch事件的分发又分为View和ViewGroup的事件分发,先来看简单的View的touch事件分发. 主要分析View的dispatchTouchEvent()方法和onTou ...

  8. MyBatis原理分析之四:一次SQL查询的源码分析

    上回我们讲到Mybatis加载相关的配置文件进行初始化,这回我们讲一下一次SQL查询怎么进行的. 准备工作 Mybatis完成一次SQL查询需要使用的代码如下: Java代码   String res ...

  9. [转]slf4j + log4j原理实现及源码分析

    slf4j + log4j原理实现及源码分析 转载于:https://www.cnblogs.com/jasonzeng888/p/6051080.html

最新文章

  1. Nginx——反向代理
  2. (转载)[MySQL技巧]INSERT INTO… ON DUPLICATE KEY UPDATE
  3. 用流读取文件中的内容
  4. r语言将百分数化为小数_C语言入门学习(一)
  5. 获取客户端浏览器信息
  6. Oracle listener静态注册和动态注册(zt)
  7. 微软云 mysql 重启_停止Azure MySQL PaaS数据库
  8. adb驱动和adb工具官方下载链接
  9. 利用官方git svn插件迁移svn仓库
  10. 51c语言编程入门教程,51单片机C语言入门教程
  11. 【附源码】计算机毕业设计SSM小区宠物管理系统
  12. 阿辉DirectX 11学习笔记二
  13. shader篇-阴影
  14. python公众号文章_Python 抓取微信公众号文章
  15. wps office 办公软件下载
  16. 硬件参数 调整 麦克风MIC灵敏度 原理
  17. 清华大学就光刻机发声,ASML立马加紧向中国出口光刻机
  18. 2019年新年书单 |不可错过的区块链好书 请查收
  19. w7怎么把计算机放桌面壁纸,W7电脑系统怎么更改锁屏壁纸
  20. OCR API身份证查验的原理

热门文章

  1. strlen,strcpy,strcmp,strcat,strncpy,strncmp,strncat
  2. 多媒体计算机技术第4版鲁宏伟,多媒体计算机技术[第3版.鲁宏伟等主编]课后习题答案完整版...
  3. 安装ZoneAlarm防火墙
  4. 倍福PLC--实现Dword数据类型每位1的计数,即统计类型中“1”的位数
  5. matlab中用高斯-赛德尔(Gauss-Seidel)迭代法解线性方程组
  6. C51 学习笔记03 | 8051单片机几大功能组成部件
  7. 网上书店管理系统mysql代码_网上书店信息管理系统+代码+数据库表
  8. 如何在LaTex当中给表格命名
  9. Android_常驻进程(杀不死的进程)
  10. 杀死一些极难杀死的进程,