diff -aurp open-iscsi-2.0-868-test1.orig/doc/iscsiadm.8 open-iscsi-2.0-868-test1/doc/iscsiadm.8 --- open-iscsi-2.0-868-test1.orig/doc/iscsiadm.8 2008-01-11 17:30:38.000000000 -0600 +++ open-iscsi-2.0-868-test1/doc/iscsiadm.8 2008-01-11 17:51:12.000000000 -0600 @@ -12,7 +12,7 @@ iscsiadm \- open-iscsi administration ut \fBiscsiadm\fR -m iface [ -hV ] [ -d debug_level ] [ -P printlevel ] [ -I ifacename ] [ [ -o operation ] [ -n name ] [ -v value ] ] -\fBiscsiadm\fR -m fw +\fBiscsiadm\fR -m fw [-l] \fBiscsiadm\fR -k priority @@ -90,7 +90,7 @@ This command and iscsid's SIGTERM handli .TP \fB\-l\fR, \fB\-\-login\fR -For node mode, login to a specified record. For discovery mode, login to +For node and fw mode, login to a specified record. For discovery mode, login to all discovered targets. .IP This option is only valid for discovery and node modes. diff -aurp open-iscsi-2.0-868-test1.orig/usr/iscsiadm.c open-iscsi-2.0-868-test1/usr/iscsiadm.c --- open-iscsi-2.0-868-test1.orig/usr/iscsiadm.c 2008-01-11 17:30:38.000000000 -0600 +++ open-iscsi-2.0-868-test1/usr/iscsiadm.c 2008-01-11 17:53:29.000000000 -0600 @@ -102,6 +102,7 @@ iscsiadm -m node [ -hV ] [ -d debug_leve [ [ -o operation ] [ -n name ] [ -v value ] ]\n\ iscsiadm -m session [ -hV ] [ -d debug_level ] [ -P printlevel] [ -r sessionid | sysfsdir [ -R | -u | -s ] [ -o operation ] [ -n name ] [ -v value ] ]\n\ iscsiadm -m iface [ -hV ] [ -d debug_level ] [ -P printlevel ] [ -I ifacename ] [ [ -o operation ] [ -n name ] [ -v value ] ]\n\ +iscsiadm -m fw [ -l ]\n\ iscsiadm -k priority\n"); } exit(status == 0 ? 0 : -1); @@ -1538,53 +1539,6 @@ static void print_fw_nodes(struct node_r } } -static int do_fw_discovery(idbm_t *db, discovery_rec_t *drec, int do_login, - int info_level) -{ - struct boot_context context; - struct node_rec *rec; - int ret; - - memset(&context, 0, sizeof(struct boot_context)); - ret = fw_get_entry(&context, NULL); - if (ret) { - log_error("Could not read fw values."); - return ret; - } - /* tpgt hard coded to 1 */ - rec = create_node_record(db, context.targetname, 1, - context.target_ipaddr, context.target_port, - NULL, 1); - if (!rec) { - log_error("Could not setup rec for fw discovery login."); - return ENOMEM; - } - - /* todo - grab mac and set that here */ - iface_init(&rec->iface); - strncpy(rec->iface.iname, context.initiatorname, - sizeof(context.initiatorname)); - strncpy(rec->session.auth.username, context.chap_name, - sizeof(context.chap_name)); - strncpy((char *)rec->session.auth.password, context.chap_password, - sizeof(context.chap_password)); - strncpy(rec->session.auth.username_in, context.chap_name_in, - sizeof(context.chap_name_in)); - strncpy((char *)rec->session.auth.password_in, context.chap_password_in, - sizeof(context.chap_password_in)); - rec->session.auth.password_length = - strlen((char *)context.chap_password); - rec->session.auth.password_in_length = - strlen((char *)context.chap_password_in); - - print_fw_nodes(rec, info_level); - if (do_login) - ret = login_portal(db, NULL, rec); - free(rec); - return ret; -} - - static int isns_dev_attr_query(idbm_t *db, discovery_rec_t *drec, int info_level) { @@ -1887,10 +1841,46 @@ out: return rc; } -static int exec_fw_op(void) +static struct node_rec * +fw_create_rec_by_entry(idbm_t *db, struct boot_context *context) +{ + struct node_rec *rec; + + /* tpgt hard coded to 1 ??? */ + rec = create_node_record(db, context->targetname, 1, + context->target_ipaddr, context->target_port, + NULL, 1); + if (!rec) { + log_error("Could not setup rec for fw discovery login."); + return NULL; + } + + /* todo - grab mac and set that here */ + iface_init(&rec->iface); + strncpy(rec->iface.iname, context->initiatorname, + sizeof(context->initiatorname)); + strncpy(rec->session.auth.username, context->chap_name, + sizeof(context->chap_name)); + strncpy((char *)rec->session.auth.password, context->chap_password, + sizeof(context->chap_password)); + strncpy(rec->session.auth.username_in, context->chap_name_in, + sizeof(context->chap_name_in)); + strncpy((char *)rec->session.auth.password_in, + context->chap_password_in, + sizeof(context->chap_password_in)); + rec->session.auth.password_length = + strlen((char *)context->chap_password); + rec->session.auth.password_in_length = + strlen((char *)context->chap_password_in); + return rec; +} + +static int exec_fw_op(idbm_t *db, discovery_rec_t *drec, int do_login, + int info_level) { struct boot_context context; - int ret; + struct node_rec *rec; + int ret = 0; memset(&context, 0, sizeof(struct boot_context)); ret = fw_get_entry(&context, NULL); @@ -1899,8 +1889,22 @@ static int exec_fw_op(void) return ret; } - fw_print_entry(&context); - return 0; + rec = fw_create_rec_by_entry(db, &context); + if (!rec) + return ENODEV; + + /* if discovery, print nodes that were found. */ + if (drec) + print_fw_nodes(rec, info_level); + + if (do_login) + ret = login_portal(db, NULL, rec); + free(rec); + + /* print the fw node info if called in fw mode with no params */ + if (!do_login && !drec) + fw_print_entry(&context); + return ret; } static int parse_sid(char *session) @@ -2106,14 +2110,14 @@ main(int argc, char **argv) usage(0); if (mode == MODE_FW) { - if ((rc = verify_mode_params(argc, argv, "m", 0))) { + if ((rc = verify_mode_params(argc, argv, "ml", 0))) { log_error("fw mode: option '-%c' is not " "allowed/supported", rc); rc = -1; goto out; } - rc = exec_fw_op(); + rc = exec_fw_op(db, NULL, do_login, info_level); goto out; } @@ -2186,7 +2190,7 @@ main(int argc, char **argv) break; case DISCOVERY_TYPE_FWBOOT: drec.type = DISCOVERY_TYPE_FWBOOT; - if (do_fw_discovery(db, &drec, do_login, info_level)) + if (exec_fw_op(db, &drec, do_login, info_level)) rc = -1; break; default: