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()了一下。
从哪里来用它,目前还不清楚。