iscsic_daemonif.c revision 1.2 1 1.2 christos /* $NetBSD: iscsic_daemonif.c,v 1.2 2011/10/30 18:40:06 christos Exp $ */
2 1.1 agc
3 1.1 agc /*-
4 1.1 agc * Copyright (c) 2005,2006,2011 The NetBSD Foundation, Inc.
5 1.1 agc * All rights reserved.
6 1.1 agc *
7 1.1 agc * This code is derived from software contributed to The NetBSD Foundation
8 1.1 agc * by Wasabi Systems, Inc.
9 1.1 agc *
10 1.1 agc * Redistribution and use in source and binary forms, with or without
11 1.1 agc * modification, are permitted provided that the following conditions
12 1.1 agc * are met:
13 1.1 agc * 1. Redistributions of source code must retain the above copyright
14 1.1 agc * notice, this list of conditions and the following disclaimer.
15 1.1 agc * 2. Redistributions in binary form must reproduce the above copyright
16 1.1 agc * notice, this list of conditions and the following disclaimer in the
17 1.1 agc * documentation and/or other materials provided with the distribution.
18 1.1 agc *
19 1.1 agc * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20 1.1 agc * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21 1.1 agc * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 1.1 agc * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23 1.1 agc * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 1.1 agc * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 1.1 agc * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 1.1 agc * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 1.1 agc * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 1.1 agc * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 1.1 agc * POSSIBILITY OF SUCH DAMAGE.
30 1.1 agc */
31 1.1 agc #include "iscsic_globals.h"
32 1.1 agc
33 1.1 agc /*
34 1.1 agc * do_add_target:
35 1.1 agc * Handle both the add_target and add_send_target commands.
36 1.1 agc *
37 1.1 agc * Parameter:
38 1.1 agc * argc, argv Shifted arguments
39 1.1 agc * kind Which list
40 1.1 agc *
41 1.1 agc * Returns: 0 if OK - else it doesn't return at all.
42 1.1 agc */
43 1.1 agc
44 1.1 agc STATIC int
45 1.1 agc do_add_target(int argc, char **argv, iscsid_list_kind_t kind)
46 1.1 agc {
47 1.1 agc iscsid_add_target_req_t *targ;
48 1.1 agc iscsid_set_target_authentication_req_t auth;
49 1.1 agc iscsid_get_set_target_options_t opt;
50 1.1 agc iscsid_response_t *rsp;
51 1.1 agc iscsid_add_target_rsp_t *res;
52 1.1 agc unsigned i;
53 1.1 agc int opts, auths, tlen;
54 1.1 agc uint32_t tid;
55 1.1 agc
56 1.1 agc tlen = cl_get_target(&targ, argc, argv, kind != SEND_TARGETS_LIST);
57 1.1 agc if (tlen == 0) {
58 1.1 agc arg_missing("Target");
59 1.1 agc }
60 1.1 agc if (kind == SEND_TARGETS_LIST && !targ->num_portals) {
61 1.1 agc arg_missing("Target Address");
62 1.1 agc }
63 1.1 agc opts = cl_get_target_opts(&opt, argc, argv);
64 1.1 agc auths = cl_get_auth_opts(&auth, argc, argv);
65 1.1 agc cl_get_symname(targ->sym_name, argc, argv);
66 1.1 agc check_extra_args(argc, argv);
67 1.1 agc
68 1.1 agc targ->list_kind = kind;
69 1.1 agc
70 1.1 agc send_request(ISCSID_ADD_TARGET, tlen, targ);
71 1.1 agc rsp = get_response(FALSE);
72 1.1 agc
73 1.1 agc if (rsp->status) {
74 1.1 agc status_error(rsp->status);
75 1.1 agc }
76 1.2 christos res = (iscsid_add_target_rsp_t *)(void *)rsp->parameter;
77 1.1 agc tid = res->target_id;
78 1.1 agc
79 1.1 agc if (kind == SEND_TARGETS_LIST) {
80 1.1 agc printf("Added Send Target %d\n", res->target_id);
81 1.1 agc } else {
82 1.1 agc printf("Added Target %d", res->target_id);
83 1.1 agc if (res->num_portals) {
84 1.1 agc printf(", Portal ");
85 1.1 agc for (i = 0; i < res->num_portals; i++)
86 1.1 agc printf("%d ", res->portal_id[i]);
87 1.1 agc }
88 1.1 agc printf("\n");
89 1.1 agc }
90 1.1 agc
91 1.1 agc free_response(rsp);
92 1.1 agc
93 1.1 agc if (opts) {
94 1.1 agc opt.list_kind = kind;
95 1.1 agc opt.target_id.id = tid;
96 1.1 agc send_request(ISCSID_SET_TARGET_OPTIONS, sizeof(opt), &opt);
97 1.1 agc rsp = get_response(FALSE);
98 1.1 agc if (rsp->status) {
99 1.1 agc status_error(rsp->status);
100 1.1 agc }
101 1.1 agc free_response(rsp);
102 1.1 agc }
103 1.1 agc
104 1.1 agc if (auths) {
105 1.1 agc auth.list_kind = kind;
106 1.1 agc auth.target_id.id = tid;
107 1.1 agc send_request(ISCSID_SET_TARGET_AUTHENTICATION, sizeof(auth), &auth);
108 1.1 agc rsp = get_response(FALSE);
109 1.1 agc if (rsp->status) {
110 1.1 agc status_error(rsp->status);
111 1.1 agc }
112 1.1 agc free_response(rsp);
113 1.1 agc }
114 1.1 agc
115 1.1 agc return 0;
116 1.1 agc }
117 1.1 agc
118 1.1 agc
119 1.1 agc /*
120 1.1 agc * do_remove_target:
121 1.1 agc * Handle both the remove_target and remove_send_target commands.
122 1.1 agc *
123 1.1 agc * Parameter:
124 1.1 agc * argc, argv Shifted arguments
125 1.1 agc * kind Which list
126 1.1 agc *
127 1.1 agc * Returns: 0 if OK - else it doesn't return at all.
128 1.1 agc */
129 1.1 agc
130 1.1 agc STATIC int
131 1.1 agc do_remove_target(int argc, char **argv, iscsid_list_kind_t kind)
132 1.1 agc {
133 1.1 agc iscsid_list_id_t req;
134 1.1 agc iscsid_search_list_req_t srch;
135 1.1 agc iscsid_response_t *rsp;
136 1.1 agc
137 1.1 agc if (!cl_get_id('I', &req.id, argc, argv)) {
138 1.1 agc if (!cl_get_string('n', (char *)srch.strval, argc, argv)) {
139 1.1 agc arg_missing("Target ID or Name");
140 1.1 agc }
141 1.1 agc check_extra_args(argc, argv);
142 1.1 agc
143 1.1 agc srch.search_kind = FIND_TARGET_NAME;
144 1.1 agc srch.list_kind = kind;
145 1.1 agc
146 1.1 agc send_request(ISCSID_SEARCH_LIST, sizeof(srch), &srch);
147 1.1 agc rsp = get_response(FALSE);
148 1.1 agc if (rsp->status) {
149 1.1 agc status_error_slist(rsp->status);
150 1.1 agc }
151 1.1 agc GET_SYM_ID(req.id.id, rsp->parameter);
152 1.1 agc free_response(rsp);
153 1.1 agc } else {
154 1.1 agc check_extra_args(argc, argv);
155 1.1 agc }
156 1.1 agc req.list_kind = kind;
157 1.1 agc send_request(ISCSID_REMOVE_TARGET, sizeof(req), &req);
158 1.1 agc rsp = get_response(TRUE);
159 1.1 agc if (rsp->status) {
160 1.1 agc status_error(rsp->status);
161 1.1 agc }
162 1.1 agc free_response(rsp);
163 1.1 agc printf("OK\n");
164 1.1 agc return 0;
165 1.1 agc }
166 1.1 agc
167 1.1 agc
168 1.1 agc /*
169 1.1 agc * do_refresh:
170 1.1 agc * Handle the refresh_targets and refresh_isns commands.
171 1.1 agc *
172 1.1 agc * Parameter:
173 1.1 agc * argc, argv Shifted arguments
174 1.1 agc * kind Which list
175 1.1 agc *
176 1.1 agc * Returns: 0 if OK - else it doesn't return at all.
177 1.1 agc */
178 1.1 agc
179 1.1 agc STATIC int
180 1.1 agc do_refresh(int argc, char **argv, iscsid_list_kind_t kind)
181 1.1 agc {
182 1.1 agc iscsid_sym_id_t id;
183 1.1 agc iscsid_response_t *rsp;
184 1.1 agc iscsid_refresh_req_t req;
185 1.1 agc
186 1.1 agc req.kind = kind;
187 1.1 agc
188 1.1 agc if (cl_get_id('I', &id, argc, argv)) {
189 1.1 agc check_extra_args(argc, argv);
190 1.1 agc
191 1.1 agc if (!id.id) {
192 1.1 agc iscsid_search_list_req_t srch;
193 1.1 agc
194 1.1 agc srch.search_kind = FIND_NAME;
195 1.1 agc srch.list_kind = kind;
196 1.1 agc strlcpy((char *)srch.strval, (char *)id.name,
197 1.1 agc sizeof(srch.strval));
198 1.1 agc
199 1.1 agc send_request(ISCSID_SEARCH_LIST, sizeof(srch), &srch);
200 1.1 agc rsp = get_response(FALSE);
201 1.1 agc if (rsp->status) {
202 1.1 agc status_error_slist(rsp->status);
203 1.1 agc }
204 1.1 agc GET_SYM_ID(req.id[0], rsp->parameter);
205 1.1 agc free_response(rsp);
206 1.1 agc } else {
207 1.1 agc req.id[0] = id.id;
208 1.1 agc }
209 1.1 agc req.num_ids = 1;
210 1.1 agc } else {
211 1.1 agc req.num_ids = 0;
212 1.1 agc check_extra_args(argc, argv);
213 1.1 agc }
214 1.1 agc
215 1.1 agc req.kind = kind;
216 1.1 agc send_request(ISCSID_REFRESH_TARGETS, sizeof(req), &req);
217 1.1 agc
218 1.1 agc rsp = get_response(FALSE);
219 1.1 agc if (rsp->status) {
220 1.1 agc status_error(rsp->status);
221 1.1 agc }
222 1.1 agc printf("OK\n");
223 1.1 agc free_response(rsp);
224 1.1 agc return 0;
225 1.1 agc }
226 1.1 agc
227 1.1 agc
228 1.1 agc /*
229 1.1 agc * add_target:
230 1.1 agc * Handle the add_target command.
231 1.1 agc *
232 1.1 agc * Parameter: argc, argv (shifted)
233 1.1 agc *
234 1.1 agc * Returns: 0 if OK - else it doesn't return at all.
235 1.1 agc */
236 1.1 agc
237 1.1 agc int
238 1.1 agc add_target(int argc, char **argv)
239 1.1 agc {
240 1.1 agc return do_add_target(argc, argv, TARGET_LIST);
241 1.1 agc }
242 1.1 agc
243 1.1 agc
244 1.1 agc /*
245 1.1 agc * remove_target:
246 1.1 agc * Handle the remove_target command.
247 1.1 agc *
248 1.1 agc * Parameter: argc, argv (shifted)
249 1.1 agc *
250 1.1 agc * Returns: 0 if OK - else it doesn't return at all.
251 1.1 agc */
252 1.1 agc
253 1.1 agc int
254 1.1 agc remove_target(int argc, char **argv)
255 1.1 agc {
256 1.1 agc return do_remove_target(argc, argv, TARGET_LIST);
257 1.1 agc }
258 1.1 agc
259 1.1 agc
260 1.1 agc /*
261 1.1 agc * slp_find_targets:
262 1.1 agc * Handle the slp_find_targets command.
263 1.1 agc *
264 1.1 agc * Parameter: argc, argv (shifted)
265 1.1 agc *
266 1.1 agc * Returns: 0 if OK - else it doesn't return at all.
267 1.1 agc *
268 1.1 agc * ToDo: Implement.
269 1.1 agc */
270 1.1 agc
271 1.1 agc int
272 1.2 christos /*ARGSUSED*/
273 1.1 agc slp_find_targets(int argc, char **argv)
274 1.1 agc {
275 1.1 agc printf("Not implemented\n");
276 1.1 agc return 5;
277 1.1 agc }
278 1.1 agc
279 1.1 agc
280 1.1 agc /*
281 1.1 agc * refresh_targets:
282 1.1 agc * Handle the refresh_targets command.
283 1.1 agc *
284 1.1 agc * Parameter: argc, argv (shifted)
285 1.1 agc *
286 1.1 agc * Returns: 0 if OK - else it doesn't return at all.
287 1.1 agc */
288 1.1 agc
289 1.1 agc int
290 1.1 agc refresh_targets(int argc, char **argv)
291 1.1 agc {
292 1.1 agc return do_refresh(argc, argv, SEND_TARGETS_LIST);
293 1.1 agc }
294 1.1 agc
295 1.1 agc
296 1.1 agc /*
297 1.1 agc * add_portal:
298 1.1 agc * Handle the add_portal command.
299 1.1 agc *
300 1.1 agc * Parameter:
301 1.1 agc * argc, argv Shifted arguments
302 1.1 agc *
303 1.1 agc * Returns: 0 if OK - else it doesn't return at all.
304 1.1 agc */
305 1.1 agc
306 1.1 agc int
307 1.1 agc add_portal(int argc, char **argv)
308 1.1 agc {
309 1.1 agc iscsid_add_portal_req_t port;
310 1.1 agc iscsid_response_t *rsp;
311 1.1 agc iscsid_add_portal_rsp_t *res;
312 1.1 agc
313 1.1 agc if (!cl_get_portal(&port, argc, argv)) {
314 1.1 agc arg_missing("Portal Address");
315 1.1 agc }
316 1.1 agc if (!cl_get_id('I', &port.target_id, argc, argv)) {
317 1.1 agc arg_missing("Target ID");
318 1.1 agc }
319 1.1 agc cl_get_symname(port.sym_name, argc, argv);
320 1.1 agc check_extra_args(argc, argv);
321 1.1 agc
322 1.1 agc send_request(ISCSID_ADD_PORTAL, sizeof(port), &port);
323 1.1 agc rsp = get_response(FALSE);
324 1.1 agc
325 1.1 agc if (rsp->status) {
326 1.1 agc status_error(rsp->status);
327 1.1 agc }
328 1.2 christos res = (iscsid_add_portal_rsp_t *)(void *)rsp->parameter;
329 1.1 agc
330 1.1 agc printf("Added Portal %d to Target %d\n",
331 1.1 agc res->portal_id.id, res->target_id.id);
332 1.1 agc free_response(rsp);
333 1.1 agc return 0;
334 1.1 agc }
335 1.1 agc
336 1.1 agc
337 1.1 agc /*
338 1.1 agc * show_target:
339 1.1 agc * Get information about and display a target entry (including its portals).
340 1.1 agc *
341 1.1 agc * Parameter:
342 1.1 agc * target ID
343 1.1 agc * list kind
344 1.1 agc */
345 1.1 agc
346 1.1 agc STATIC void
347 1.1 agc show_target(uint32_t id, iscsid_list_kind_t kind)
348 1.1 agc {
349 1.1 agc iscsid_list_id_t req;
350 1.1 agc iscsid_response_t *trsp, *prsp;
351 1.1 agc iscsid_get_target_rsp_t *targ;
352 1.1 agc iscsid_get_portal_rsp_t *port;
353 1.1 agc unsigned i;
354 1.1 agc
355 1.1 agc /* get target info */
356 1.1 agc req.list_kind = kind;
357 1.1 agc req.id.id = id;
358 1.1 agc req.id.name[0] = '\0';
359 1.1 agc send_request(ISCSID_GET_TARGET_INFO, sizeof(req), &req);
360 1.1 agc
361 1.1 agc trsp = get_response(TRUE);
362 1.1 agc if (trsp->status) {
363 1.1 agc status_error(trsp->status);
364 1.1 agc }
365 1.2 christos targ = (iscsid_get_target_rsp_t *)(void *)trsp->parameter;
366 1.1 agc
367 1.1 agc /* display basic target info */
368 1.1 agc printf("%6d", targ->target_id.id);
369 1.1 agc if (targ->target_id.name[0]) {
370 1.1 agc printf(" [%s]", targ->target_id.name);
371 1.1 agc }
372 1.1 agc printf(": %s", targ->TargetName);
373 1.1 agc if (targ->TargetAlias[0]) {
374 1.1 agc printf(" (%s)", targ->TargetAlias);
375 1.1 agc }
376 1.1 agc printf("\n");
377 1.1 agc
378 1.1 agc /* now get and display info on the target's portals */
379 1.1 agc for (i = 0; i < targ->num_portals; i++) {
380 1.1 agc req.id.id = targ->portal[i];
381 1.1 agc send_request(ISCSID_GET_PORTAL_INFO, sizeof(req), &req);
382 1.1 agc prsp = get_response(FALSE);
383 1.1 agc if (prsp->status) {
384 1.1 agc status_error(prsp->status);
385 1.1 agc }
386 1.2 christos port = (iscsid_get_portal_rsp_t *)(void *)prsp->parameter;
387 1.1 agc
388 1.1 agc printf(" %6d", port->portal_id.id);
389 1.1 agc if (port->portal_id.name[0]) {
390 1.1 agc printf(" [%s]", port->portal_id.name);
391 1.1 agc }
392 1.1 agc printf(": %s:%d", port->portal.address, port->portal.port);
393 1.1 agc if (kind != SEND_TARGETS_LIST) {
394 1.1 agc printf(",%d", port->portal.group_tag);
395 1.1 agc }
396 1.1 agc printf("\n");
397 1.1 agc free_response(prsp);
398 1.1 agc }
399 1.1 agc free_response(trsp);
400 1.1 agc }
401 1.1 agc
402 1.1 agc
403 1.1 agc /*
404 1.1 agc * do_list_targets:
405 1.1 agc * Handle both the list_targets and list_send_targets commands.
406 1.1 agc *
407 1.1 agc * Parameter:
408 1.1 agc * argc, argv Shifted arguments
409 1.1 agc * kind Which list
410 1.1 agc *
411 1.1 agc * Returns: 0 if OK - else it doesn't return at all.
412 1.1 agc */
413 1.1 agc
414 1.1 agc STATIC int
415 1.1 agc do_list_targets(int argc, char **argv, iscsid_list_kind_t kind)
416 1.1 agc {
417 1.1 agc iscsid_get_list_req_t lst;
418 1.1 agc iscsid_response_t *rsp;
419 1.1 agc iscsid_get_list_rsp_t *list;
420 1.1 agc unsigned i;
421 1.1 agc
422 1.1 agc check_extra_args(argc, argv);
423 1.1 agc
424 1.1 agc /* get the list of targets */
425 1.1 agc lst.list_kind = kind;
426 1.1 agc send_request(ISCSID_GET_LIST, sizeof(lst), &lst);
427 1.1 agc rsp = get_response(TRUE);
428 1.1 agc if (rsp->status) {
429 1.1 agc status_error(rsp->status);
430 1.1 agc }
431 1.2 christos list = (iscsid_get_list_rsp_t *)(void *)rsp->parameter;
432 1.1 agc
433 1.1 agc /* display all targets */
434 1.1 agc for (i = 0; i < list->num_entries; i++) {
435 1.1 agc show_target(list->id[i], kind);
436 1.1 agc }
437 1.1 agc free_response(rsp);
438 1.1 agc return 0;
439 1.1 agc }
440 1.1 agc
441 1.1 agc
442 1.1 agc /*
443 1.1 agc * list_targets:
444 1.1 agc * Handle the list_targets command.
445 1.1 agc *
446 1.1 agc * Parameter: argc, argv (shifted)
447 1.1 agc *
448 1.1 agc * Returns: 0 if OK - else it doesn't return at all.
449 1.1 agc */
450 1.1 agc
451 1.1 agc int
452 1.1 agc list_targets(int argc, char **argv)
453 1.1 agc {
454 1.1 agc return do_list_targets(argc, argv, TARGET_LIST);
455 1.1 agc }
456 1.1 agc
457 1.1 agc
458 1.1 agc /*
459 1.1 agc * add_send_target:
460 1.1 agc * Handle the add_target command.
461 1.1 agc *
462 1.1 agc * Parameter: argc, argv (shifted)
463 1.1 agc *
464 1.1 agc * Returns: 0 if OK - else it doesn't return at all.
465 1.1 agc */
466 1.1 agc
467 1.1 agc int
468 1.1 agc add_send_target(int argc, char **argv)
469 1.1 agc {
470 1.1 agc return do_add_target(argc, argv, SEND_TARGETS_LIST);
471 1.1 agc }
472 1.1 agc
473 1.1 agc
474 1.1 agc /*
475 1.1 agc * remove_send_target:
476 1.1 agc * Handle the remove_target command.
477 1.1 agc *
478 1.1 agc * Parameter: argc, argv (shifted)
479 1.1 agc *
480 1.1 agc * Returns: 0 if OK - else it doesn't return at all.
481 1.1 agc */
482 1.1 agc
483 1.1 agc int
484 1.1 agc remove_send_target(int argc, char **argv)
485 1.1 agc {
486 1.1 agc return do_remove_target(argc, argv, SEND_TARGETS_LIST);
487 1.1 agc }
488 1.1 agc
489 1.1 agc
490 1.1 agc /*
491 1.1 agc * list_send_targets:
492 1.1 agc * Handle the list_send_targets command.
493 1.1 agc *
494 1.1 agc * Parameter: argc, argv (shifted)
495 1.1 agc *
496 1.1 agc * Returns: 0 if OK - else it doesn't return at all.
497 1.1 agc */
498 1.1 agc
499 1.1 agc int
500 1.1 agc list_send_targets(int argc, char **argv)
501 1.1 agc {
502 1.1 agc return do_list_targets(argc, argv, SEND_TARGETS_LIST);
503 1.1 agc }
504 1.1 agc
505 1.1 agc
506 1.1 agc /*
507 1.1 agc * add_isns_server:
508 1.1 agc * Handle the add_isns_server command.
509 1.1 agc *
510 1.1 agc * Parameter: argc, argv (shifted)
511 1.1 agc *
512 1.1 agc * Returns: 0 if OK - else it doesn't return at all.
513 1.1 agc */
514 1.1 agc
515 1.1 agc int
516 1.1 agc add_isns_server(int argc, char **argv)
517 1.1 agc {
518 1.1 agc iscsid_add_isns_server_req_t arg;
519 1.1 agc iscsid_add_isns_server_rsp_t *res;
520 1.1 agc iscsid_response_t *rsp;
521 1.1 agc
522 1.1 agc memset(&arg, 0x0, sizeof(arg));
523 1.1 agc if (!(cl_get_isns(&arg, argc, argv))) {
524 1.1 agc arg_missing("Server Address");
525 1.1 agc }
526 1.1 agc check_extra_args(argc, argv);
527 1.1 agc
528 1.1 agc send_request(ISCSID_ADD_ISNS_SERVER, sizeof(arg), &arg);
529 1.1 agc rsp = get_response(FALSE);
530 1.1 agc
531 1.1 agc if (rsp->status) {
532 1.1 agc status_error(rsp->status);
533 1.1 agc }
534 1.2 christos res = (iscsid_add_isns_server_rsp_t *)(void *)rsp->parameter;
535 1.1 agc
536 1.1 agc printf("Added iSNS Server ID %d\n", res->server_id);
537 1.1 agc
538 1.1 agc free_response(rsp);
539 1.1 agc return 0;
540 1.1 agc }
541 1.1 agc
542 1.1 agc
543 1.1 agc /*
544 1.1 agc * remove_isns_server:
545 1.1 agc * Handle the add_isns_server command.
546 1.1 agc *
547 1.1 agc * Parameter: argc, argv (shifted)
548 1.1 agc *
549 1.1 agc * Returns: 0 if OK - else it doesn't return at all.
550 1.1 agc */
551 1.1 agc
552 1.1 agc int
553 1.1 agc remove_isns_server(int argc, char **argv)
554 1.1 agc {
555 1.1 agc iscsid_sym_id_t req;
556 1.1 agc iscsid_search_list_req_t srch;
557 1.1 agc iscsid_response_t *rsp;
558 1.1 agc
559 1.1 agc if (!cl_get_id('I', &req, argc, argv)) {
560 1.1 agc if (!cl_get_string('a', (char *)srch.strval, argc, argv)) {
561 1.1 agc arg_missing("Server Address");
562 1.1 agc }
563 1.1 agc check_extra_args(argc, argv);
564 1.1 agc srch.search_kind = FIND_ADDRESS;
565 1.1 agc srch.list_kind = ISNS_LIST;
566 1.1 agc
567 1.1 agc send_request(ISCSID_SEARCH_LIST, sizeof(srch), &srch);
568 1.1 agc rsp = get_response(FALSE);
569 1.1 agc if (rsp->status) {
570 1.1 agc status_error_slist(rsp->status);
571 1.1 agc }
572 1.1 agc GET_SYM_ID(req.id, rsp->parameter);
573 1.1 agc free_response(rsp);
574 1.1 agc } else {
575 1.1 agc check_extra_args(argc, argv);
576 1.1 agc }
577 1.1 agc send_request(ISCSID_REMOVE_ISNS_SERVER, sizeof(req), &req);
578 1.1 agc rsp = get_response(TRUE);
579 1.1 agc if (rsp->status) {
580 1.1 agc status_error(rsp->status);
581 1.1 agc }
582 1.1 agc free_response(rsp);
583 1.1 agc
584 1.1 agc printf("OK\n");
585 1.1 agc return 0;
586 1.1 agc }
587 1.1 agc
588 1.1 agc
589 1.1 agc /*
590 1.1 agc * find_isns_servers:
591 1.1 agc * Handle the find_isns_servers command.
592 1.1 agc *
593 1.1 agc * Parameter: argc, argv (shifted)
594 1.1 agc *
595 1.1 agc * Returns: 0 if OK - else it doesn't return at all.
596 1.1 agc */
597 1.1 agc
598 1.1 agc int
599 1.2 christos /*ARGSUSED*/
600 1.1 agc find_isns_servers(int argc, char **argv)
601 1.1 agc {
602 1.1 agc printf("Not implemented\n");
603 1.1 agc return 5;
604 1.1 agc }
605 1.1 agc
606 1.1 agc
607 1.1 agc /*
608 1.1 agc * list_isns_servers:
609 1.1 agc * Handle the list_isns_servers command.
610 1.1 agc *
611 1.1 agc * Parameter: argc, argv (shifted)
612 1.1 agc *
613 1.1 agc * Returns: 0 if OK - else it doesn't return at all.
614 1.1 agc */
615 1.1 agc
616 1.1 agc int
617 1.1 agc list_isns_servers(int argc, char **argv)
618 1.1 agc {
619 1.1 agc iscsid_get_list_req_t lst;
620 1.1 agc iscsid_response_t *rsp, *prsp;
621 1.1 agc iscsid_get_list_rsp_t *list;
622 1.1 agc iscsid_get_isns_server_rsp_t *isns;
623 1.1 agc iscsid_sym_id_t req;
624 1.1 agc unsigned i;
625 1.1 agc
626 1.1 agc memset(&req, 0x0, sizeof(req));
627 1.1 agc check_extra_args(argc, argv);
628 1.1 agc
629 1.1 agc /* get the list of servers */
630 1.1 agc lst.list_kind = ISNS_LIST;
631 1.1 agc send_request(ISCSID_GET_LIST, sizeof(lst), &lst);
632 1.1 agc rsp = get_response(TRUE);
633 1.1 agc if (rsp->status) {
634 1.1 agc status_error(rsp->status);
635 1.1 agc }
636 1.2 christos list = (iscsid_get_list_rsp_t *)(void *)rsp->parameter;
637 1.1 agc
638 1.1 agc /* display all servers */
639 1.1 agc for (i = 0; i < list->num_entries; i++) {
640 1.1 agc req.id = list->id[i];
641 1.1 agc send_request(ISCSID_GET_ISNS_SERVER, sizeof(req), &req);
642 1.1 agc prsp = get_response(FALSE);
643 1.1 agc if (prsp->status)
644 1.1 agc status_error(prsp->status);
645 1.1 agc
646 1.2 christos isns = (iscsid_get_isns_server_rsp_t *)(void *)prsp->parameter;
647 1.1 agc printf("%6d: %s\n", list->id[i], isns->address);
648 1.1 agc free_response(prsp);
649 1.1 agc }
650 1.1 agc free_response(rsp);
651 1.1 agc return 0;
652 1.1 agc }
653 1.1 agc
654 1.1 agc
655 1.1 agc /*
656 1.1 agc * refresh_isns:
657 1.1 agc * Handle the refresh_isns command.
658 1.1 agc *
659 1.1 agc * Parameter: argc, argv (shifted)
660 1.1 agc *
661 1.1 agc * Returns: 0 if OK - else it doesn't return at all.
662 1.1 agc */
663 1.1 agc
664 1.1 agc int
665 1.1 agc refresh_isns(int argc, char **argv)
666 1.1 agc {
667 1.1 agc return do_refresh(argc, argv, ISNS_LIST);
668 1.1 agc }
669 1.1 agc
670 1.1 agc
671 1.1 agc /*
672 1.1 agc * add_initiator:
673 1.1 agc * Handle the add_initiator command.
674 1.1 agc *
675 1.1 agc * Parameter: argc, argv (shifted)
676 1.1 agc *
677 1.1 agc * Returns: 0 if OK - else it doesn't return at all.
678 1.1 agc */
679 1.1 agc
680 1.1 agc int
681 1.1 agc add_initiator(int argc, char **argv)
682 1.1 agc {
683 1.1 agc iscsid_add_initiator_req_t req;
684 1.1 agc iscsid_add_initiator_rsp_t *res;
685 1.1 agc iscsid_response_t *rsp;
686 1.1 agc
687 1.1 agc memset(&req, 0x0, sizeof(req));
688 1.1 agc if (!cl_get_string('a', (char *)req.address, argc, argv)) {
689 1.1 agc arg_missing("Interface Address");
690 1.1 agc }
691 1.1 agc cl_get_symname(req.name, argc, argv);
692 1.1 agc check_extra_args(argc, argv);
693 1.1 agc
694 1.1 agc send_request(ISCSID_ADD_INITIATOR_PORTAL, sizeof(req), &req);
695 1.1 agc rsp = get_response(FALSE);
696 1.1 agc if (rsp->status) {
697 1.1 agc status_error(rsp->status);
698 1.1 agc }
699 1.2 christos res = (iscsid_add_initiator_rsp_t *)(void *)rsp->parameter;
700 1.1 agc printf("Added Initiator Portal %d\n", res->portal_id);
701 1.1 agc
702 1.1 agc free_response(rsp);
703 1.1 agc return 0;
704 1.1 agc }
705 1.1 agc
706 1.1 agc
707 1.1 agc /*
708 1.1 agc * remove_initiator:
709 1.1 agc * Handle the remove_initiator command.
710 1.1 agc *
711 1.1 agc * Parameter: argc, argv (shifted)
712 1.1 agc *
713 1.1 agc * Returns: 0 if OK - else it doesn't return at all.
714 1.1 agc */
715 1.1 agc
716 1.1 agc int
717 1.1 agc remove_initiator(int argc, char **argv)
718 1.1 agc {
719 1.1 agc iscsid_sym_id_t req;
720 1.1 agc iscsid_response_t *rsp;
721 1.1 agc
722 1.1 agc memset(&req, 0x0, sizeof(req));
723 1.1 agc if (!cl_get_id('I', &req, argc, argv)) {
724 1.1 agc arg_missing("Initiator Portal ID");
725 1.1 agc }
726 1.1 agc check_extra_args(argc, argv);
727 1.1 agc
728 1.1 agc send_request(ISCSID_REMOVE_INITIATOR_PORTAL, sizeof(req), &req);
729 1.1 agc rsp = get_response(FALSE);
730 1.1 agc if (rsp->status) {
731 1.1 agc status_error(rsp->status);
732 1.1 agc }
733 1.1 agc free_response(rsp);
734 1.1 agc
735 1.1 agc printf("OK\n");
736 1.1 agc return 0;
737 1.1 agc }
738 1.1 agc
739 1.1 agc /*
740 1.1 agc * list_initiators:
741 1.1 agc * Handle the list_initiators command.
742 1.1 agc *
743 1.1 agc * Parameter: argc, argv (shifted)
744 1.1 agc *
745 1.1 agc * Returns: 0 if OK - else it doesn't return at all.
746 1.1 agc */
747 1.1 agc
748 1.1 agc int
749 1.1 agc list_initiators(int argc, char **argv)
750 1.1 agc {
751 1.1 agc iscsid_get_list_req_t lst;
752 1.1 agc iscsid_response_t *rsp, *prsp;
753 1.1 agc iscsid_get_list_rsp_t *list;
754 1.1 agc iscsid_get_initiator_rsp_t *init;
755 1.1 agc iscsid_sym_id_t req;
756 1.1 agc unsigned i;
757 1.1 agc
758 1.1 agc memset(&req, 0x0, sizeof(req));
759 1.1 agc check_extra_args(argc, argv);
760 1.1 agc
761 1.1 agc /* get the list of servers */
762 1.1 agc lst.list_kind = INITIATOR_LIST;
763 1.1 agc send_request(ISCSID_GET_LIST, sizeof(lst), &lst);
764 1.1 agc rsp = get_response(TRUE);
765 1.1 agc if (rsp->status) {
766 1.1 agc status_error(rsp->status);
767 1.1 agc }
768 1.2 christos list = (iscsid_get_list_rsp_t *)(void *)rsp->parameter;
769 1.1 agc
770 1.1 agc /* display all servers */
771 1.1 agc for (i = 0; i < list->num_entries; i++) {
772 1.1 agc req.id = list->id[i];
773 1.1 agc send_request(ISCSID_GET_INITIATOR_PORTAL, sizeof(req), &req);
774 1.1 agc prsp = get_response(FALSE);
775 1.1 agc if (prsp->status) {
776 1.1 agc status_error(prsp->status);
777 1.1 agc }
778 1.2 christos init = (iscsid_get_initiator_rsp_t *)(void *)prsp->parameter;
779 1.1 agc printf("%6d", init->portal_id.id);
780 1.1 agc if (init->portal_id.name[0]) {
781 1.1 agc printf("[%s]", init->portal_id.name);
782 1.1 agc }
783 1.1 agc printf(": %s\n", init->address);
784 1.1 agc free_response(prsp);
785 1.1 agc }
786 1.1 agc free_response(rsp);
787 1.1 agc return 0;
788 1.1 agc }
789 1.1 agc
790 1.1 agc
791 1.1 agc /*
792 1.1 agc * login_or_add:
793 1.1 agc * Common routine for login and add_connection. Handles the actual command,
794 1.1 agc * the only pre-initialized component is the session ID in the login request
795 1.1 agc * for add_connection.
796 1.1 agc *
797 1.1 agc * Parameters: the login request, plus argc & argv
798 1.1 agc */
799 1.1 agc
800 1.1 agc STATIC void
801 1.1 agc login_or_add(iscsid_login_req_t * loginp, int argc, char **argv)
802 1.1 agc {
803 1.1 agc iscsid_add_target_req_t *targ = NULL;
804 1.1 agc iscsid_add_target_rsp_t *tgtrsp;
805 1.1 agc iscsid_set_target_authentication_req_t auth;
806 1.1 agc iscsid_get_set_target_options_t opt;
807 1.1 agc iscsid_search_list_req_t srch;
808 1.1 agc iscsid_response_t *rsp;
809 1.1 agc int opts, auths, tlen;
810 1.1 agc
811 1.1 agc /* get the remaining parameters */
812 1.1 agc opts = cl_get_target_opts(&opt, argc, argv);
813 1.1 agc auths = cl_get_auth_opts(&auth, argc, argv);
814 1.1 agc cl_get_symname(loginp->sym_name, argc, argv);
815 1.1 agc cl_get_id ('i', &loginp->initiator_id, argc, argv);
816 1.1 agc
817 1.1 agc /* do we have a portal ID? */
818 1.1 agc if (!cl_get_id('P', &loginp->portal_id, argc, argv)) {
819 1.1 agc /* No portal ID - then we must have a target name */
820 1.1 agc if (!(tlen = cl_get_target(&targ, argc, argv, TRUE))) {
821 1.1 agc if (NO_ID(&loginp->session_id)) {
822 1.1 agc arg_missing("Target");
823 1.1 agc }
824 1.1 agc }
825 1.1 agc
826 1.1 agc check_extra_args(argc, argv);
827 1.1 agc
828 1.1 agc if (targ != NULL) {
829 1.1 agc /* was a complete target with portal specified? */
830 1.1 agc if (targ->num_portals) {
831 1.1 agc /* then add it like in an add_target command */
832 1.1 agc targ->list_kind = TARGET_LIST;
833 1.1 agc send_request(ISCSID_ADD_TARGET, tlen, targ);
834 1.1 agc rsp = get_response(FALSE);
835 1.1 agc if (rsp->status) {
836 1.1 agc status_error(rsp->status);
837 1.1 agc }
838 1.1 agc tgtrsp = (iscsid_add_target_rsp_t *)(void *)(rsp->parameter);
839 1.1 agc (void) memcpy(&loginp->portal_id.id, &tgtrsp->target_id,
840 1.1 agc sizeof(loginp->portal_id.id));
841 1.1 agc } else {
842 1.1 agc /* else find the target by its TargetName */
843 1.1 agc srch.search_kind = FIND_TARGET_NAME;
844 1.1 agc srch.list_kind = TARGET_LIST;
845 1.1 agc strlcpy((char *)srch.strval, (char *)targ->TargetName,
846 1.1 agc sizeof(srch.strval));
847 1.1 agc
848 1.1 agc send_request(ISCSID_SEARCH_LIST, sizeof(srch), &srch);
849 1.1 agc rsp = get_response(FALSE);
850 1.1 agc if (rsp->status) {
851 1.1 agc status_error_slist(rsp->status);
852 1.1 agc }
853 1.1 agc GET_SYM_ID(loginp->portal_id.id, rsp->parameter);
854 1.1 agc }
855 1.1 agc free_response(rsp);
856 1.1 agc }
857 1.1 agc } else
858 1.1 agc check_extra_args(argc, argv);
859 1.1 agc
860 1.1 agc /* Options specified? Then set them */
861 1.1 agc if (opts) {
862 1.1 agc opt.target_id = loginp->portal_id;
863 1.1 agc opt.list_kind = TARGET_LIST;
864 1.1 agc send_request(ISCSID_SET_TARGET_OPTIONS, sizeof(opt), &opt);
865 1.1 agc rsp = get_response(FALSE);
866 1.1 agc if (rsp->status) {
867 1.1 agc status_error(rsp->status);
868 1.1 agc }
869 1.1 agc free_response(rsp);
870 1.1 agc }
871 1.1 agc /* Authentication options specified? Then set them */
872 1.1 agc if (auths) {
873 1.1 agc auth.target_id = loginp->portal_id;
874 1.1 agc auth.list_kind = TARGET_LIST;
875 1.1 agc send_request(ISCSID_SET_TARGET_AUTHENTICATION, sizeof(auth), &auth);
876 1.1 agc rsp = get_response(FALSE);
877 1.1 agc if (rsp->status) {
878 1.1 agc status_error(rsp->status);
879 1.1 agc }
880 1.1 agc free_response(rsp);
881 1.1 agc }
882 1.1 agc }
883 1.1 agc
884 1.1 agc
885 1.1 agc /*
886 1.1 agc * login:
887 1.1 agc * Handle login command.
888 1.1 agc *
889 1.1 agc * Parameter: argc, argv (shifted)
890 1.1 agc *
891 1.1 agc * Returns: 0 if OK - else it doesn't return at all.
892 1.1 agc */
893 1.1 agc
894 1.1 agc int
895 1.1 agc login(int argc, char **argv)
896 1.1 agc {
897 1.1 agc iscsid_login_req_t loginp;
898 1.1 agc iscsid_login_rsp_t *res;
899 1.1 agc iscsid_response_t *rsp;
900 1.1 agc
901 1.1 agc memset(&loginp, 0x0, sizeof(loginp));
902 1.1 agc loginp.login_type = (cl_get_opt('m', argc, argv))
903 1.1 agc ? ISCSI_LOGINTYPE_NOMAP : ISCSI_LOGINTYPE_MAP;
904 1.1 agc
905 1.1 agc login_or_add(&loginp, argc, argv);
906 1.1 agc
907 1.1 agc send_request(ISCSID_LOGIN, sizeof(loginp), &loginp);
908 1.1 agc
909 1.1 agc rsp = get_response(FALSE);
910 1.1 agc if (rsp->status) {
911 1.1 agc status_error(rsp->status);
912 1.1 agc }
913 1.2 christos res = (iscsid_login_rsp_t *)(void *)rsp->parameter;
914 1.1 agc printf("Created Session %d, Connection %d\n",
915 1.1 agc res->session_id.id, res->connection_id.id);
916 1.1 agc
917 1.1 agc free_response(rsp);
918 1.1 agc return 0;
919 1.1 agc }
920 1.1 agc
921 1.1 agc
922 1.1 agc /*
923 1.1 agc * logout:
924 1.1 agc * Handle logout command.
925 1.1 agc *
926 1.1 agc * Parameter: argc, argv (shifted)
927 1.1 agc *
928 1.1 agc * Returns: 0 if OK - else it doesn't return at all.
929 1.1 agc */
930 1.1 agc
931 1.1 agc int
932 1.1 agc logout(int argc, char **argv)
933 1.1 agc {
934 1.1 agc iscsid_sym_id_t req;
935 1.1 agc iscsid_response_t *rsp;
936 1.1 agc
937 1.1 agc if (!cl_get_id('I', &req, argc, argv)) {
938 1.1 agc arg_missing("Session");
939 1.1 agc }
940 1.1 agc check_extra_args(argc, argv);
941 1.1 agc
942 1.1 agc send_request(ISCSID_LOGOUT, sizeof(req), &req);
943 1.1 agc rsp = get_response(FALSE);
944 1.1 agc if (rsp->status) {
945 1.1 agc status_error(rsp->status);
946 1.1 agc }
947 1.1 agc free_response(rsp);
948 1.1 agc
949 1.1 agc printf("OK\n");
950 1.1 agc return 0;
951 1.1 agc }
952 1.1 agc
953 1.1 agc
954 1.1 agc /*
955 1.1 agc * add_connection:
956 1.1 agc * Handle add_connection command.
957 1.1 agc *
958 1.1 agc * Parameter: argc, argv (shifted)
959 1.1 agc *
960 1.1 agc * Returns: 0 if OK - else it doesn't return at all.
961 1.1 agc */
962 1.1 agc
963 1.1 agc int
964 1.1 agc add_connection(int argc, char **argv)
965 1.1 agc {
966 1.1 agc iscsid_login_req_t loginp;
967 1.1 agc iscsid_login_rsp_t *loginrsp;
968 1.1 agc iscsid_response_t *rsp;
969 1.1 agc
970 1.1 agc memset(&loginp, 0x0, sizeof(loginp));
971 1.1 agc loginp.login_type = ISCSI_LOGINTYPE_MAP;
972 1.1 agc cl_get_id('I', &loginp.session_id, argc, argv);
973 1.1 agc
974 1.1 agc login_or_add(&loginp, argc, argv);
975 1.1 agc
976 1.1 agc send_request(ISCSID_ADD_CONNECTION, sizeof(loginp), &loginp);
977 1.1 agc
978 1.1 agc rsp = get_response(FALSE);
979 1.1 agc if (rsp->status) {
980 1.1 agc status_error(rsp->status);
981 1.1 agc }
982 1.1 agc loginrsp = (iscsid_login_rsp_t *)(void *)(rsp->parameter);
983 1.1 agc printf("Added Connection %d\n", loginrsp->connection_id.id);
984 1.1 agc
985 1.1 agc free_response(rsp);
986 1.1 agc return 0;
987 1.1 agc }
988 1.1 agc
989 1.1 agc
990 1.1 agc /*
991 1.1 agc * remove_connection:
992 1.1 agc * Handle remove connection command
993 1.1 agc *
994 1.1 agc * Parameter: argc, argv (shifted)
995 1.1 agc *
996 1.1 agc * Returns: 0 if OK - else it doesn't return at all.
997 1.1 agc */
998 1.1 agc
999 1.1 agc int
1000 1.1 agc remove_connection(int argc, char **argv)
1001 1.1 agc {
1002 1.1 agc iscsid_remove_connection_req_t req;
1003 1.1 agc iscsid_response_t *rsp;
1004 1.1 agc
1005 1.1 agc if (!cl_get_id('I', &req.session_id, argc, argv)) {
1006 1.1 agc arg_missing("Session");
1007 1.1 agc }
1008 1.1 agc if (!cl_get_id('C', &req.connection_id, argc, argv)) {
1009 1.1 agc arg_missing("Connection");
1010 1.1 agc }
1011 1.1 agc check_extra_args(argc, argv);
1012 1.1 agc
1013 1.1 agc send_request(ISCSID_REMOVE_CONNECTION, sizeof(req), &req);
1014 1.1 agc rsp = get_response(FALSE);
1015 1.1 agc if (rsp->status) {
1016 1.1 agc status_error(rsp->status);
1017 1.1 agc }
1018 1.1 agc free_response(rsp);
1019 1.1 agc
1020 1.1 agc printf("OK\n");
1021 1.1 agc return 0;
1022 1.1 agc }
1023 1.1 agc
1024 1.1 agc
1025 1.1 agc /*
1026 1.1 agc * list_sessions:
1027 1.1 agc * Handle list_sessions command.
1028 1.1 agc *
1029 1.1 agc * Parameter: argc, argv (shifted)
1030 1.1 agc *
1031 1.1 agc * Returns: 0 if OK - else it doesn't return at all.
1032 1.1 agc *
1033 1.1 agc * ToDo: initiator portals, connection recurse
1034 1.1 agc */
1035 1.1 agc
1036 1.1 agc int
1037 1.1 agc list_sessions(int argc, char **argv)
1038 1.1 agc {
1039 1.1 agc iscsid_response_t *lrsp, *rsp;
1040 1.1 agc iscsid_get_session_list_rsp_t *list;
1041 1.1 agc iscsid_session_list_entry_t *ent;
1042 1.1 agc iscsid_get_connection_info_req_t creq;
1043 1.1 agc iscsid_get_connection_info_rsp_t *info;
1044 1.1 agc iscsid_sym_id_t clreq;
1045 1.1 agc iscsid_get_connection_list_rsp_t *clinfo;
1046 1.1 agc iscsid_connection_list_entry_t *clent;
1047 1.1 agc unsigned i;
1048 1.1 agc unsigned j;
1049 1.1 agc int lconn;
1050 1.1 agc
1051 1.1 agc memset(&creq, 0x0, sizeof(creq));
1052 1.1 agc memset(&clreq, 0x0, sizeof(clreq));
1053 1.1 agc lconn = cl_get_opt('c', argc, argv);
1054 1.1 agc
1055 1.1 agc check_extra_args(argc, argv);
1056 1.1 agc
1057 1.1 agc send_request(ISCSID_GET_SESSION_LIST, 0, NULL);
1058 1.1 agc lrsp = get_response(TRUE);
1059 1.1 agc if (lrsp->status) {
1060 1.1 agc status_error(lrsp->status);
1061 1.1 agc }
1062 1.2 christos list = (iscsid_get_session_list_rsp_t *)(void *)lrsp->parameter;
1063 1.1 agc
1064 1.1 agc for (i = 0, ent = list->session; i < list->num_entries; i++, ent++) {
1065 1.1 agc creq.session_id.id = ent->session_id.id;
1066 1.1 agc send_request(ISCSID_GET_CONNECTION_INFO, sizeof(creq), &creq);
1067 1.1 agc rsp = get_response(FALSE);
1068 1.1 agc if (rsp->status) {
1069 1.1 agc status_error(rsp->status);
1070 1.1 agc }
1071 1.2 christos info = (iscsid_get_connection_info_rsp_t *)(void *)rsp->parameter;
1072 1.1 agc
1073 1.1 agc printf("Session %d", info->session_id.id);
1074 1.1 agc if (info->session_id.name[0]) {
1075 1.1 agc printf("[%s]", info->session_id.name);
1076 1.1 agc }
1077 1.1 agc printf(": Target %s", info->TargetName);
1078 1.1 agc if (info->target_portal_id.name[0]) {
1079 1.1 agc printf(" [%s]", info->target_portal_id.name);
1080 1.1 agc }
1081 1.1 agc printf("\n");
1082 1.1 agc
1083 1.1 agc if (lconn) {
1084 1.1 agc clreq.id = info->session_id.id;
1085 1.1 agc send_request(ISCSID_GET_CONNECTION_LIST, sizeof(clreq), &clreq);
1086 1.1 agc rsp = get_response(FALSE);
1087 1.1 agc if (rsp->status) {
1088 1.1 agc status_error(rsp->status);
1089 1.1 agc }
1090 1.2 christos clinfo = (iscsid_get_connection_list_rsp_t *)(void *)rsp->parameter;
1091 1.1 agc
1092 1.1 agc for (j = 0, clent = clinfo->connection;
1093 1.1 agc j < clinfo->num_connections; j++, clent++) {
1094 1.1 agc printf(" Connection %d", clent->connection_id.id);
1095 1.1 agc if (clent->connection_id.name[0]) {
1096 1.1 agc printf("[%s]", clent->connection_id.name);
1097 1.1 agc }
1098 1.1 agc printf(" Address %s:%d,%d\n", clent->target_portal.address,
1099 1.1 agc clent->target_portal.port,
1100 1.1 agc clent->target_portal.group_tag);
1101 1.1 agc }
1102 1.1 agc }
1103 1.1 agc }
1104 1.1 agc
1105 1.1 agc return 0;
1106 1.1 agc }
1107 1.1 agc
1108 1.1 agc
1109 1.1 agc /*
1110 1.1 agc * set_node_name:
1111 1.1 agc * Handle the set_node_name command.
1112 1.1 agc *
1113 1.1 agc * Parameter: argc, argv (shifted)
1114 1.1 agc *
1115 1.1 agc * Returns: 0 if OK - else it doesn't return at all.
1116 1.1 agc */
1117 1.1 agc
1118 1.1 agc int
1119 1.1 agc set_node_name(int argc, char **argv)
1120 1.1 agc {
1121 1.1 agc iscsid_set_node_name_req_t req;
1122 1.1 agc iscsid_response_t *rsp;
1123 1.1 agc uint64_t isid;
1124 1.1 agc
1125 1.1 agc memset(&req, 0x0, sizeof(req));
1126 1.1 agc if (!cl_get_string('n', (char *)req.InitiatorName, argc, argv)) {
1127 1.1 agc arg_missing("Initiator Name");
1128 1.1 agc }
1129 1.1 agc cl_get_string('A', (char *)req.InitiatorAlias, argc, argv);
1130 1.1 agc isid = cl_get_longlong('i', argc, argv);
1131 1.1 agc hton6(req.ISID, isid);
1132 1.1 agc
1133 1.1 agc check_extra_args(argc, argv);
1134 1.1 agc
1135 1.1 agc send_request(ISCSID_SET_NODE_NAME, sizeof(req), &req);
1136 1.1 agc
1137 1.1 agc rsp = get_response(FALSE);
1138 1.1 agc if (rsp->status) {
1139 1.1 agc status_error(rsp->status);
1140 1.1 agc }
1141 1.1 agc free_response(rsp);
1142 1.1 agc
1143 1.1 agc printf("OK\n");
1144 1.1 agc return 0;
1145 1.1 agc }
1146 1.1 agc
1147 1.1 agc /*
1148 1.1 agc * get_version:
1149 1.1 agc * Handle the version command.
1150 1.1 agc *
1151 1.1 agc * Parameter: argc, argv (shifted)
1152 1.1 agc *
1153 1.1 agc * Returns: 0 if OK - else it doesn't return at all.
1154 1.1 agc */
1155 1.1 agc
1156 1.1 agc int
1157 1.2 christos /*ARGSUSED*/
1158 1.1 agc get_version(int argc, char **argv)
1159 1.1 agc {
1160 1.1 agc iscsid_response_t *rsp;
1161 1.1 agc iscsid_get_version_rsp_t *ver;
1162 1.1 agc
1163 1.1 agc send_request(ISCSID_GET_VERSION, 0, NULL);
1164 1.1 agc rsp = get_response(FALSE);
1165 1.1 agc if (rsp->status) {
1166 1.1 agc status_error(rsp->status);
1167 1.1 agc }
1168 1.2 christos ver = (iscsid_get_version_rsp_t *)(void *)rsp->parameter;
1169 1.1 agc printf("%s\n%s\n%s\n", VERSION_STRING, ver->version_string,
1170 1.1 agc ver->driver_version_string);
1171 1.1 agc
1172 1.1 agc return 0;
1173 1.1 agc }
1174 1.1 agc
1175 1.1 agc
1176 1.1 agc #ifdef ISCSI_DEBUG
1177 1.1 agc /*
1178 1.1 agc * kill_daemon:
1179 1.1 agc * Handle kill_daemon command.
1180 1.1 agc *
1181 1.1 agc * Parameter: argc, argv (shifted)
1182 1.1 agc *
1183 1.1 agc * Returns: Always 0.
1184 1.1 agc */
1185 1.1 agc
1186 1.1 agc int
1187 1.1 agc kill_daemon(int argc, char **argv)
1188 1.1 agc {
1189 1.1 agc check_extra_args(argc, argv);
1190 1.1 agc
1191 1.1 agc send_request(ISCSID_DAEMON_TERMINATE, 0, NULL);
1192 1.1 agc return 0;
1193 1.1 agc }
1194 1.1 agc #endif
1195