From owner-svn-src-stable-10@FreeBSD.ORG Thu Aug 14 12:31:19 2014 Return-Path: Delivered-To: svn-src-stable-10@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id 94576BE6; Thu, 14 Aug 2014 12:31:19 +0000 (UTC) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 7F3062FF6; Thu, 14 Aug 2014 12:31:19 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.9/8.14.9) with ESMTP id s7ECVJpJ069433; Thu, 14 Aug 2014 12:31:19 GMT (envelope-from trasz@FreeBSD.org) Received: (from trasz@localhost) by svn.freebsd.org (8.14.9/8.14.9/Submit) id s7ECVJu7069353; Thu, 14 Aug 2014 12:31:19 GMT (envelope-from trasz@FreeBSD.org) Message-Id: <201408141231.s7ECVJu7069353@svn.freebsd.org> X-Authentication-Warning: svn.freebsd.org: trasz set sender to trasz@FreeBSD.org using -f From: Edward Tomasz Napierala Date: Thu, 14 Aug 2014 12:31:19 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-10@freebsd.org Subject: svn commit: r269968 - stable/10/usr.bin/iscsictl X-SVN-Group: stable-10 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-stable-10@freebsd.org X-Mailman-Version: 2.1.18-1 Precedence: list List-Id: SVN commit messages for only the 10-stable src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 14 Aug 2014 12:31:19 -0000 Author: trasz Date: Thu Aug 14 12:31:18 2014 New Revision: 269968 URL: http://svnweb.freebsd.org/changeset/base/269968 Log: MFC r267614: Add "iscsictl -M", which allows one to change session parameters without removing it and adding back. Sponsored by: The FreeBSD Foundation Modified: stable/10/usr.bin/iscsictl/iscsictl.8 stable/10/usr.bin/iscsictl/iscsictl.c Directory Properties: stable/10/ (props changed) Modified: stable/10/usr.bin/iscsictl/iscsictl.8 ============================================================================== --- stable/10/usr.bin/iscsictl/iscsictl.8 Thu Aug 14 12:16:03 2014 (r269967) +++ stable/10/usr.bin/iscsictl/iscsictl.8 Thu Aug 14 12:31:18 2014 (r269968) @@ -27,7 +27,7 @@ .\" .\" $FreeBSD$ .\" -.Dd April 24, 2014 +.Dd June 18, 2014 .Dt ISCSICTL 8 .Os .Sh NAME @@ -47,6 +47,17 @@ .Fl A .Fl n Ar nickname Op Fl c Ar path .Nm +.Fl M +.Fl i Ar session-id +.Op Fl p Ar portal +.Op Fl t Ar target +.Op Fl u Ar user +.Op Fl s Ar secret +.Nm +.Fl M +.Fl i Ar session-id +.Op Fl n Ar nickname Op Fl c Ar path +.Nm .Fl R .Op Fl p Ar portal .Op Fl t Ar target @@ -68,6 +79,8 @@ The following options are available: .Bl -tag -width ".Fl A" .It Fl A Add session. +.It Fl M +Modify session. .It Fl R Remove session. .It Fl L @@ -84,6 +97,10 @@ Target host name or address used for Sen When used, it will add a temporary discovery session. After discovery is done, sessions will be added for each discovered target, and the temporary discovery session will be removed. +.It Fl i +Session ID, as displayed by +.Nm +.Fl v . .It Fl n The "nickname" of session defined in the configuration file. .It Fl p Modified: stable/10/usr.bin/iscsictl/iscsictl.c ============================================================================== --- stable/10/usr.bin/iscsictl/iscsictl.c Thu Aug 14 12:16:03 2014 (r269967) +++ stable/10/usr.bin/iscsictl/iscsictl.c Thu Aug 14 12:31:18 2014 (r269968) @@ -350,6 +350,82 @@ kernel_add(int iscsi_fd, const struct ta } static int +kernel_modify(int iscsi_fd, unsigned int session_id, const struct target *targ) +{ + struct iscsi_session_modify ism; + int error; + + memset(&ism, 0, sizeof(ism)); + ism.ism_session_id = session_id; + conf_from_target(&ism.ism_conf, targ); + error = ioctl(iscsi_fd, ISCSISMODIFY, &ism); + if (error != 0) + warn("ISCSISMODIFY"); + return (error); +} + +static void +kernel_modify_some(int iscsi_fd, unsigned int session_id, const char *target, + const char *target_addr, const char *user, const char *secret) +{ + struct iscsi_session_state *states = NULL; + struct iscsi_session_state *state; + struct iscsi_session_conf *conf; + struct iscsi_session_list isl; + struct iscsi_session_modify ism; + unsigned int i, nentries = 1; + int error; + + for (;;) { + states = realloc(states, + nentries * sizeof(struct iscsi_session_state)); + if (states == NULL) + err(1, "realloc"); + + memset(&isl, 0, sizeof(isl)); + isl.isl_nentries = nentries; + isl.isl_pstates = states; + + error = ioctl(iscsi_fd, ISCSISLIST, &isl); + if (error != 0 && errno == EMSGSIZE) { + nentries *= 4; + continue; + } + break; + } + if (error != 0) + errx(1, "ISCSISLIST"); + + for (i = 0; i < isl.isl_nentries; i++) { + state = &states[i]; + + if (state->iss_id == session_id) + break; + } + if (i == isl.isl_nentries) + errx(1, "session-id %u not found", session_id); + + conf = &state->iss_conf; + + if (target != NULL) + strlcpy(conf->isc_target, target, sizeof(conf->isc_target)); + if (target_addr != NULL) + strlcpy(conf->isc_target_addr, target_addr, + sizeof(conf->isc_target_addr)); + if (user != NULL) + strlcpy(conf->isc_user, user, sizeof(conf->isc_user)); + if (secret != NULL) + strlcpy(conf->isc_secret, secret, sizeof(conf->isc_secret)); + + memset(&ism, 0, sizeof(ism)); + ism.ism_session_id = session_id; + memcpy(&ism.ism_conf, conf, sizeof(ism.ism_conf)); + error = ioctl(iscsi_fd, ISCSISMODIFY, &ism); + if (error != 0) + warn("ISCSISMODIFY"); +} + +static int kernel_remove(int iscsi_fd, const struct target *targ) { struct iscsi_session_remove isr; @@ -404,7 +480,7 @@ kernel_list(int iscsi_fd, const struct t state = &states[i]; conf = &state->iss_conf; - printf("Session ID: %d\n", state->iss_id); + printf("Session ID: %u\n", state->iss_id); printf("Initiator name: %s\n", conf->isc_initiator); printf("Initiator portal: %s\n", conf->isc_initiator_addr); @@ -482,6 +558,10 @@ usage(void) "[-u user -s secret]\n"); fprintf(stderr, " iscsictl -A -a [-c path]\n"); fprintf(stderr, " iscsictl -A -n nickname [-c path]\n"); + fprintf(stderr, " iscsictl -M -i session-id [-p portal] " + "[-t target] [-u user] [-s secret]\n"); + fprintf(stderr, " iscsictl -M -i session-id -n nickname " + "[-c path]\n"); fprintf(stderr, " iscsictl -R [-p portal] [-t target]\n"); fprintf(stderr, " iscsictl -R -a\n"); fprintf(stderr, " iscsictl -R -n nickname [-c path]\n"); @@ -503,20 +583,25 @@ checked_strdup(const char *s) int main(int argc, char **argv) { - int Aflag = 0, Rflag = 0, Lflag = 0, aflag = 0, vflag = 0; + int Aflag = 0, Mflag = 0, Rflag = 0, Lflag = 0, aflag = 0, vflag = 0; const char *conf_path = DEFAULT_CONFIG_PATH; char *nickname = NULL, *discovery_host = NULL, *host = NULL, *target = NULL, *user = NULL, *secret = NULL; + long long session_id = -1; + char *end; int ch, error, iscsi_fd, retval, saved_errno; int failed = 0; struct conf *conf; struct target *targ; - while ((ch = getopt(argc, argv, "ARLac:d:n:p:t:u:s:v")) != -1) { + while ((ch = getopt(argc, argv, "AMRLac:d:i:n:p:t:u:s:v")) != -1) { switch (ch) { case 'A': Aflag = 1; break; + case 'M': + Mflag = 1; + break; case 'R': Rflag = 1; break; @@ -532,6 +617,16 @@ main(int argc, char **argv) case 'd': discovery_host = optarg; break; + case 'i': + session_id = strtol(optarg, &end, 10); + if ((size_t)(end - optarg) != strlen(optarg)) + errx(1, "trailing characters after session-id"); + if (session_id < 0) + errx(1, "session-id cannot be negative"); + if (session_id > UINT_MAX) + errx(1, "session-id cannot be greater than %u", + UINT_MAX); + break; case 'n': nickname = optarg; break; @@ -559,10 +654,10 @@ main(int argc, char **argv) if (argc != 0) usage(); - if (Aflag + Rflag + Lflag == 0) + if (Aflag + Mflag + Rflag + Lflag == 0) Lflag = 1; - if (Aflag + Rflag + Lflag > 1) - errx(1, "at most one of -A, -R, or -L may be specified"); + if (Aflag + Mflag + Rflag + Lflag > 1) + errx(1, "at most one of -A, -M, -R, or -L may be specified"); /* * Note that we ignore unneccessary/inapplicable "-c" flag; so that @@ -614,9 +709,33 @@ main(int argc, char **argv) if (secret != NULL && user == NULL) errx(1, "-s must always be used with -u"); + if (session_id != -1) + errx(1, "-i cannot be used with -A"); if (vflag != 0) errx(1, "-v cannot be used with -A"); + } else if (Mflag != 0) { + if (session_id == -1) + errx(1, "-M requires -i"); + + if (discovery_host != NULL) + errx(1, "-M and -d are mutually exclusive"); + if (aflag != 0) + errx(1, "-M and -a are mutually exclusive"); + if (nickname != NULL) { + if (host != NULL) + errx(1, "-n and -p and mutually exclusive"); + if (target != NULL) + errx(1, "-n and -t and mutually exclusive"); + if (user != NULL) + errx(1, "-n and -u and mutually exclusive"); + if (secret != NULL) + errx(1, "-n and -s and mutually exclusive"); + } + + if (vflag != 0) + errx(1, "-v cannot be used with -M"); + } else if (Rflag != 0) { if (user != NULL) errx(1, "-R and -u are mutually exclusive"); @@ -646,6 +765,8 @@ main(int argc, char **argv) } else errx(1, "must specify either -a, -n, -t, or -p"); + if (session_id != -1) + errx(1, "-i cannot be used with -R"); if (vflag != 0) errx(1, "-v cannot be used with -R"); @@ -664,6 +785,9 @@ main(int argc, char **argv) errx(1, "-L and -n and mutually exclusive"); if (discovery_host != NULL) errx(1, "-L and -d and mutually exclusive"); + + if (session_id != -1) + errx(1, "-i cannot be used with -L"); } iscsi_fd = open(ISCSI_PATH, O_RDWR); @@ -687,15 +811,20 @@ main(int argc, char **argv) conf = conf_new_from_file(conf_path); targ = target_find(conf, nickname); if (targ == NULL) - errx(1, "target %s not found in the configuration file", - nickname); + errx(1, "target %s not found in %s", + nickname, conf_path); if (Aflag != 0) failed += kernel_add(iscsi_fd, targ); + else if (Mflag != 0) + failed += kernel_modify(iscsi_fd, session_id, targ); else if (Rflag != 0) failed += kernel_remove(iscsi_fd, targ); else failed += kernel_list(iscsi_fd, targ, vflag); + } else if (Mflag != 0) { + kernel_modify_some(iscsi_fd, session_id, target, host, + user, secret); } else { if (Aflag != 0 && target != NULL) { if (valid_iscsi_name(target) == false)