diff options
author | Lee Duncan <lduncan@suse.com> | 2022-05-19 11:00:01 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-05-19 11:00:01 -0700 |
commit | 9c4d2ac4567ce4a4fca15ab7c95cdcc11eebbcb4 (patch) | |
tree | 62a6f2a22008f29f1a9c07874c1be7b046abd1f5 | |
parent | 433fad9ddadd62e5edf9597493f32a3b9443cc59 (diff) | |
parent | 10e3bf175bd8b1ad7f9c9900644a674b317e6428 (diff) | |
download | open-iscsi-9c4d2ac4567ce4a4fca15ab7c95cdcc11eebbcb4.tar.gz |
Merge pull request #351 from ericwmackay/boot_context_config
Use config for iscsistart and iscsiadm fw login
-rw-r--r-- | doc/Makefile | 6 | ||||
-rw-r--r-- | doc/iscsistart.8.template (renamed from doc/iscsistart.8) | 4 | ||||
-rw-r--r-- | usr/idbm.c | 65 | ||||
-rw-r--r-- | usr/iscsiadm.c | 8 | ||||
-rw-r--r-- | usr/iscsistart.c | 23 |
5 files changed, 75 insertions, 31 deletions
diff --git a/doc/Makefile b/doc/Makefile index 7267dfc..47e14a9 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -22,11 +22,11 @@ MAN8DIR = $(DESTDIR)$(mandir)/man8 MANPAGES_SOURCES = iscsi_discovery.8 \ iscsi_fw_login.8 \ - iscsi-iname.8 \ - iscsistart.8 + iscsi-iname.8 MANPAGES_TEMPLATES = iscsid.8.template \ iscsiadm.8.template \ - iscsi-gen-initiatorname.8 + iscsi-gen-initiatorname.8 \ + iscsistart.8.template MANPAGES_GENERATED = $(MANPAGES_TEMPLATES:.template=) MANPAGES_DEST = $(addprefix $(MAN8DIR)/,$(MANPAGES_GENERATED)) \ $(addprefix $(MAN8DIR)/,$(MANPAGES_SOURCES)) diff --git a/doc/iscsistart.8 b/doc/iscsistart.8.template index 5aa7dd4..62fae4d 100644 --- a/doc/iscsistart.8 +++ b/doc/iscsistart.8.template @@ -12,6 +12,10 @@ not be run to manage sessions. Its primary use is to start sessions used for iSCSI root boot. .SH OPTIONS .TP +.BI [-c|--config=]\fIconfig\-file\fP +Read configuration from \fIconfig\-file\fR rather than the default +\fI@HOMEDIR@/iscsid.conf\fR file. +.TP .BI [-i|--initiatorname=]\fIname\fP Set InitiatorName to name (Required if not using iBFT or OF) .TP @@ -3055,6 +3055,32 @@ void idbm_terminate(void) free(db); } +static bool idbm_populate_rec(struct node_rec *rec, + char *targetname, int tpgt, char *ip, + int port, struct iface_rec *iface, + int verbose) +{ + if (targetname) + strlcpy(rec->name, targetname, TARGET_NAME_MAXLEN); + rec->tpgt = tpgt; + rec->conn[0].port = port; + if (ip) + strlcpy(rec->conn[0].address, ip, NI_MAXHOST); + memset(&rec->iface, 0, sizeof(struct iface_rec)); + if (iface) { + iface_copy(&rec->iface, iface); + if (strlen(iface->name)) { + if (iface_conf_read(&rec->iface)) { + if (verbose) + log_error("Could not read iface info " + "for %s.", iface->name); + return false; + } + } + } + return true; +} + /** * idbm_create_rec - allocate and setup a node record * @targetname: target name @@ -3081,23 +3107,9 @@ struct node_rec *idbm_create_rec(char *targetname, int tpgt, char *ip, } idbm_node_setup_defaults(rec); - if (targetname) - strlcpy(rec->name, targetname, TARGET_NAME_MAXLEN); - rec->tpgt = tpgt; - rec->conn[0].port = port; - if (ip) - strlcpy(rec->conn[0].address, ip, NI_MAXHOST); - memset(&rec->iface, 0, sizeof(struct iface_rec)); - if (iface) { - iface_copy(&rec->iface, iface); - if (strlen(iface->name)) { - if (iface_conf_read(&rec->iface)) { - if (verbose) - log_error("Could not read iface info " - "for %s.", iface->name); - goto free_rec; - } - } + + if (!idbm_populate_rec(rec, targetname, tpgt, ip, port, iface, verbose)) { + goto free_rec; } return rec; free_rec: @@ -3107,14 +3119,23 @@ free_rec: struct node_rec *idbm_create_rec_from_boot_context(struct boot_context *context) { - struct node_rec *rec; + node_rec_t *rec; - /* tpgt hard coded to 1 ??? */ - rec = idbm_create_rec(context->targetname, 1, - context->target_ipaddr, context->target_port, - NULL, 1); + rec = malloc(sizeof(*rec)); if (!rec) { + log_error("Could not not allocate memory to create node " + "record."); + return NULL; + } + + idbm_node_setup_from_conf(rec); + + /* tpgt hard coded to 1 ??? */ + if (!idbm_populate_rec(rec, context->targetname, 1, + context->target_ipaddr, context->target_port, + NULL, 1)) { log_error("Could not setup rec for fw discovery login."); + free(rec); return NULL; } diff --git a/usr/iscsiadm.c b/usr/iscsiadm.c index 2a86068..11dea31 100644 --- a/usr/iscsiadm.c +++ b/usr/iscsiadm.c @@ -3864,11 +3864,6 @@ main(int argc, char **argv) if (mode < 0) usage(ISCSI_ERR_INVAL); - if (mode == MODE_FW) { - rc = exec_fw_op(NULL, NULL, info_level, do_login, op, wait, ¶ms); - goto out; - } - increase_max_files(); if (idbm_init(get_config_file)) { log_warning("exiting due to idbm configuration error"); @@ -3877,6 +3872,9 @@ main(int argc, char **argv) } switch (mode) { + case MODE_FW: + rc = exec_fw_op(NULL, NULL, info_level, do_login, op, wait, ¶ms); + break; case MODE_HOST: if (sub_mode != -1) { switch (sub_mode) { diff --git a/usr/iscsistart.c b/usr/iscsistart.c index 0fb1f56..546840f 100644 --- a/usr/iscsistart.c +++ b/usr/iscsistart.c @@ -61,11 +61,13 @@ static LIST_HEAD(targets); static LIST_HEAD(user_params); static char program_name[] = "iscsistart"; +static char config_file[TARGET_NAME_MAXLEN]; /* used by initiator */ extern struct iscsi_ipc *ipc; static struct option const long_options[] = { + {"config", required_argument, NULL, 'c'}, {"initiatorname", required_argument, NULL, 'i'}, {"targetname", required_argument, NULL, 't'}, {"tgpt", required_argument, NULL, 'g'}, @@ -94,6 +96,7 @@ static void usage(int status) printf("Usage: %s [OPTION]\n", program_name); printf("\ Open-iSCSI initiator.\n\ + -c, --config=[path] set config file (default " CONFIG_FILE ").\n\ -i, --initiatorname=name set InitiatorName to name (Required)\n\ -t, --targetname=name set TargetName to name (Required)\n\ -g, --tgpt=N set target portal group tag to N (Required)\n\ @@ -270,6 +273,11 @@ static int login_session(struct node_rec *rec) return rc; } +static char *get_config_file(void) +{ + return config_file; +} + static int setup_session(void) { struct boot_context *context; @@ -278,6 +286,13 @@ static int setup_session(void) if (list_empty(&targets)) return login_session(&config_rec); + increase_max_files(); + if (idbm_init(get_config_file)) { + log_warning("exiting due to idbm configuration error"); + rc = ISCSI_ERR_IDBM; + goto out; + } + list_for_each_entry(context, &targets, list) { struct node_rec *rec; @@ -297,6 +312,7 @@ static int setup_session(void) free(rec); } fw_free_targets(&targets); +out: return rc; } @@ -357,6 +373,7 @@ int main(int argc, char *argv[]) int control_fd, mgmt_ipc_fd, err; pid_t pid; + strcpy(config_file, CONFIG_FILE); idbm_node_setup_defaults(&config_rec); config_rec.name[0] = '\0'; config_rec.conn[0].address[0] = '\0'; @@ -373,9 +390,13 @@ int main(int argc, char *argv[]) sysfs_init(); - while ((ch = getopt_long(argc, argv, "P:i:t:g:a:p:d:u:w:U:W:bNfvh", + while ((ch = getopt_long(argc, argv, "c:P:i:t:g:a:p:d:u:w:U:W:bNfvh", long_options, &longindex)) >= 0) { switch (ch) { + case 'c': + strncpy(config_file, optarg, TARGET_NAME_MAXLEN); + config_file[TARGET_NAME_MAXLEN-1] = 0; + break; case 'i': initiatorname = optarg; break; |