iscsic_daemonif.c revision 1.1 1 1.1 agc /* $NetBSD: iscsic_daemonif.c,v 1.1 2011/10/23 21:11:23 agc 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.1 agc res = (iscsid_add_target_rsp_t *) 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.1 agc slp_find_targets(int argc, char **argv)
273 1.1 agc {
274 1.1 agc printf("Not implemented\n");
275 1.1 agc return 5;
276 1.1 agc }
277 1.1 agc
278 1.1 agc
279 1.1 agc /*
280 1.1 agc * refresh_targets:
281 1.1 agc * Handle the refresh_targets command.
282 1.1 agc *
283 1.1 agc * Parameter: argc, argv (shifted)
284 1.1 agc *
285 1.1 agc * Returns: 0 if OK - else it doesn't return at all.
286 1.1 agc */
287 1.1 agc
288 1.1 agc int
289 1.1 agc refresh_targets(int argc, char **argv)
290 1.1 agc {
291 1.1 agc return do_refresh(argc, argv, SEND_TARGETS_LIST);
292 1.1 agc }
293 1.1 agc
294 1.1 agc
295 1.1 agc /*
296 1.1 agc * add_portal:
297 1.1 agc * Handle the add_portal command.
298 1.1 agc *
299 1.1 agc * Parameter:
300 1.1 agc * argc, argv Shifted arguments
301 1.1 agc *
302 1.1 agc * Returns: 0 if OK - else it doesn't return at all.
303 1.1 agc */
304 1.1 agc
305 1.1 agc int
306 1.1 agc add_portal(int argc, char **argv)
307 1.1 agc {
308 1.1 agc iscsid_add_portal_req_t port;
309 1.1 agc iscsid_response_t *rsp;
310 1.1 agc iscsid_add_portal_rsp_t *res;
311 1.1 agc
312 1.1 agc if (!cl_get_portal(&port, argc, argv)) {
313 1.1 agc arg_missing("Portal Address");
314 1.1 agc }
315 1.1 agc if (!cl_get_id('I', &port.target_id, argc, argv)) {
316 1.1 agc arg_missing("Target ID");
317 1.1 agc }
318 1.1 agc cl_get_symname(port.sym_name, argc, argv);
319 1.1 agc check_extra_args(argc, argv);
320 1.1 agc
321 1.1 agc send_request(ISCSID_ADD_PORTAL, sizeof(port), &port);
322 1.1 agc rsp = get_response(FALSE);
323 1.1 agc
324 1.1 agc if (rsp->status) {
325 1.1 agc status_error(rsp->status);
326 1.1 agc }
327 1.1 agc res = (iscsid_add_portal_rsp_t *) rsp->parameter;
328 1.1 agc
329 1.1 agc printf("Added Portal %d to Target %d\n",
330 1.1 agc res->portal_id.id, res->target_id.id);
331 1.1 agc free_response(rsp);
332 1.1 agc return 0;
333 1.1 agc }
334 1.1 agc
335 1.1 agc
336 1.1 agc /*
337 1.1 agc * show_target:
338 1.1 agc * Get information about and display a target entry (including its portals).
339 1.1 agc *
340 1.1 agc * Parameter:
341 1.1 agc * target ID
342 1.1 agc * list kind
343 1.1 agc */
344 1.1 agc
345 1.1 agc STATIC void
346 1.1 agc show_target(uint32_t id, iscsid_list_kind_t kind)
347 1.1 agc {
348 1.1 agc iscsid_list_id_t req;
349 1.1 agc iscsid_response_t *trsp, *prsp;
350 1.1 agc iscsid_get_target_rsp_t *targ;
351 1.1 agc iscsid_get_portal_rsp_t *port;
352 1.1 agc unsigned i;
353 1.1 agc
354 1.1 agc /* get target info */
355 1.1 agc req.list_kind = kind;
356 1.1 agc req.id.id = id;
357 1.1 agc req.id.name[0] = '\0';
358 1.1 agc send_request(ISCSID_GET_TARGET_INFO, sizeof(req), &req);
359 1.1 agc
360 1.1 agc trsp = get_response(TRUE);
361 1.1 agc if (trsp->status) {
362 1.1 agc status_error(trsp->status);
363 1.1 agc }
364 1.1 agc targ = (iscsid_get_target_rsp_t *) trsp->parameter;
365 1.1 agc
366 1.1 agc /* display basic target info */
367 1.1 agc printf("%6d", targ->target_id.id);
368 1.1 agc if (targ->target_id.name[0]) {
369 1.1 agc printf(" [%s]", targ->target_id.name);
370 1.1 agc }
371 1.1 agc printf(": %s", targ->TargetName);
372 1.1 agc if (targ->TargetAlias[0]) {
373 1.1 agc printf(" (%s)", targ->TargetAlias);
374 1.1 agc }
375 1.1 agc printf("\n");
376 1.1 agc
377 1.1 agc /* now get and display info on the target's portals */
378 1.1 agc for (i = 0; i < targ->num_portals; i++) {
379 1.1 agc req.id.id = targ->portal[i];
380 1.1 agc send_request(ISCSID_GET_PORTAL_INFO, sizeof(req), &req);
381 1.1 agc prsp = get_response(FALSE);
382 1.1 agc if (prsp->status) {
383 1.1 agc status_error(prsp->status);
384 1.1 agc }
385 1.1 agc port = (iscsid_get_portal_rsp_t *) prsp->parameter;
386 1.1 agc
387 1.1 agc printf(" %6d", port->portal_id.id);
388 1.1 agc if (port->portal_id.name[0]) {
389 1.1 agc printf(" [%s]", port->portal_id.name);
390 1.1 agc }
391 1.1 agc printf(": %s:%d", port->portal.address, port->portal.port);
392 1.1 agc if (kind != SEND_TARGETS_LIST) {
393 1.1 agc printf(",%d", port->portal.group_tag);
394 1.1 agc }
395 1.1 agc printf("\n");
396 1.1 agc free_response(prsp);
397 1.1 agc }
398 1.1 agc free_response(trsp);
399 1.1 agc }
400 1.1 agc
401 1.1 agc
402 1.1 agc /*
403 1.1 agc * do_list_targets:
404 1.1 agc * Handle both the list_targets and list_send_targets commands.
405 1.1 agc *
406 1.1 agc * Parameter:
407 1.1 agc * argc, argv Shifted arguments
408 1.1 agc * kind Which list
409 1.1 agc *
410 1.1 agc * Returns: 0 if OK - else it doesn't return at all.
411 1.1 agc */
412 1.1 agc
413 1.1 agc STATIC int
414 1.1 agc do_list_targets(int argc, char **argv, iscsid_list_kind_t kind)
415 1.1 agc {
416 1.1 agc iscsid_get_list_req_t lst;
417 1.1 agc iscsid_response_t *rsp;
418 1.1 agc iscsid_get_list_rsp_t *list;
419 1.1 agc unsigned i;
420 1.1 agc
421 1.1 agc check_extra_args(argc, argv);
422 1.1 agc
423 1.1 agc /* get the list of targets */
424 1.1 agc lst.list_kind = kind;
425 1.1 agc send_request(ISCSID_GET_LIST, sizeof(lst), &lst);
426 1.1 agc rsp = get_response(TRUE);
427 1.1 agc if (rsp->status) {
428 1.1 agc status_error(rsp->status);
429 1.1 agc }
430 1.1 agc list = (iscsid_get_list_rsp_t *) rsp->parameter;
431 1.1 agc
432 1.1 agc /* display all targets */
433 1.1 agc for (i = 0; i < list->num_entries; i++) {
434 1.1 agc show_target(list->id[i], kind);
435 1.1 agc }
436 1.1 agc free_response(rsp);
437 1.1 agc return 0;
438 1.1 agc }
439 1.1 agc
440 1.1 agc
441 1.1 agc /*
442 1.1 agc * list_targets:
443 1.1 agc * Handle the list_targets command.
444 1.1 agc *
445 1.1 agc * Parameter: argc, argv (shifted)
446 1.1 agc *
447 1.1 agc * Returns: 0 if OK - else it doesn't return at all.
448 1.1 agc */
449 1.1 agc
450 1.1 agc int
451 1.1 agc list_targets(int argc, char **argv)
452 1.1 agc {
453 1.1 agc return do_list_targets(argc, argv, TARGET_LIST);
454 1.1 agc }
455 1.1 agc
456 1.1 agc
457 1.1 agc /*
458 1.1 agc * add_send_target:
459 1.1 agc * Handle the add_target command.
460 1.1 agc *
461 1.1 agc * Parameter: argc, argv (shifted)
462 1.1 agc *
463 1.1 agc * Returns: 0 if OK - else it doesn't return at all.
464 1.1 agc */
465 1.1 agc
466 1.1 agc int
467 1.1 agc add_send_target(int argc, char **argv)
468 1.1 agc {
469 1.1 agc return do_add_target(argc, argv, SEND_TARGETS_LIST);
470 1.1 agc }
471 1.1 agc
472 1.1 agc
473 1.1 agc /*
474 1.1 agc * remove_send_target:
475 1.1 agc * Handle the remove_target command.
476 1.1 agc *
477 1.1 agc * Parameter: argc, argv (shifted)
478 1.1 agc *
479 1.1 agc * Returns: 0 if OK - else it doesn't return at all.
480 1.1 agc */
481 1.1 agc
482 1.1 agc int
483 1.1 agc remove_send_target(int argc, char **argv)
484 1.1 agc {
485 1.1 agc return do_remove_target(argc, argv, SEND_TARGETS_LIST);
486 1.1 agc }
487 1.1 agc
488 1.1 agc
489 1.1 agc /*
490 1.1 agc * list_send_targets:
491 1.1 agc * Handle the list_send_targets command.
492 1.1 agc *
493 1.1 agc * Parameter: argc, argv (shifted)
494 1.1 agc *
495 1.1 agc * Returns: 0 if OK - else it doesn't return at all.
496 1.1 agc */
497 1.1 agc
498 1.1 agc int
499 1.1 agc list_send_targets(int argc, char **argv)
500 1.1 agc {
501 1.1 agc return do_list_targets(argc, argv, SEND_TARGETS_LIST);
502 1.1 agc }
503 1.1 agc
504 1.1 agc
505 1.1 agc /*
506 1.1 agc * add_isns_server:
507 1.1 agc * Handle the add_isns_server command.
508 1.1 agc *
509 1.1 agc * Parameter: argc, argv (shifted)
510 1.1 agc *
511 1.1 agc * Returns: 0 if OK - else it doesn't return at all.
512 1.1 agc */
513 1.1 agc
514 1.1 agc int
515 1.1 agc add_isns_server(int argc, char **argv)
516 1.1 agc {
517 1.1 agc iscsid_add_isns_server_req_t arg;
518 1.1 agc iscsid_add_isns_server_rsp_t *res;
519 1.1 agc iscsid_response_t *rsp;
520 1.1 agc
521 1.1 agc memset(&arg, 0x0, sizeof(arg));
522 1.1 agc if (!(cl_get_isns(&arg, argc, argv))) {
523 1.1 agc arg_missing("Server Address");
524 1.1 agc }
525 1.1 agc check_extra_args(argc, argv);
526 1.1 agc
527 1.1 agc send_request(ISCSID_ADD_ISNS_SERVER, sizeof(arg), &arg);
528 1.1 agc rsp = get_response(FALSE);
529 1.1 agc
530 1.1 agc if (rsp->status) {
531 1.1 agc status_error(rsp->status);
532 1.1 agc }
533 1.1 agc res = (iscsid_add_isns_server_rsp_t *) rsp->parameter;
534 1.1 agc
535 1.1 agc printf("Added iSNS Server ID %d\n", res->server_id);
536 1.1 agc
537 1.1 agc free_response(rsp);
538 1.1 agc return 0;
539 1.1 agc }
540 1.1 agc
541 1.1 agc
542 1.1 agc /*
543 1.1 agc * remove_isns_server:
544 1.1 agc * Handle the add_isns_server command.
545 1.1 agc *
546 1.1 agc * Parameter: argc, argv (shifted)
547 1.1 agc *
548 1.1 agc * Returns: 0 if OK - else it doesn't return at all.
549 1.1 agc */
550 1.1 agc
551 1.1 agc int
552 1.1 agc remove_isns_server(int argc, char **argv)
553 1.1 agc {
554 1.1 agc iscsid_sym_id_t req;
555 1.1 agc iscsid_search_list_req_t srch;
556 1.1 agc iscsid_response_t *rsp;
557 1.1 agc
558 1.1 agc if (!cl_get_id('I', &req, argc, argv)) {
559 1.1 agc if (!cl_get_string('a', (char *)srch.strval, argc, argv)) {
560 1.1 agc arg_missing("Server Address");
561 1.1 agc }
562 1.1 agc check_extra_args(argc, argv);
563 1.1 agc srch.search_kind = FIND_ADDRESS;
564 1.1 agc srch.list_kind = ISNS_LIST;
565 1.1 agc
566 1.1 agc send_request(ISCSID_SEARCH_LIST, sizeof(srch), &srch);
567 1.1 agc rsp = get_response(FALSE);
568 1.1 agc if (rsp->status) {
569 1.1 agc status_error_slist(rsp->status);
570 1.1 agc }
571 1.1 agc GET_SYM_ID(req.id, rsp->parameter);
572 1.1 agc free_response(rsp);
573 1.1 agc } else {
574 1.1 agc check_extra_args(argc, argv);
575 1.1 agc }
576 1.1 agc send_request(ISCSID_REMOVE_ISNS_SERVER, sizeof(req), &req);
577 1.1 agc rsp = get_response(TRUE);
578 1.1 agc if (rsp->status) {
579 1.1 agc status_error(rsp->status);
580 1.1 agc }
581 1.1 agc free_response(rsp);
582 1.1 agc
583 1.1 agc printf("OK\n");
584 1.1 agc return 0;
585 1.1 agc }
586 1.1 agc
587 1.1 agc
588 1.1 agc /*
589 1.1 agc * find_isns_servers:
590 1.1 agc * Handle the find_isns_servers command.
591 1.1 agc *
592 1.1 agc * Parameter: argc, argv (shifted)
593 1.1 agc *
594 1.1 agc * Returns: 0 if OK - else it doesn't return at all.
595 1.1 agc */
596 1.1 agc
597 1.1 agc int
598 1.1 agc find_isns_servers(int argc, char **argv)
599 1.1 agc {
600 1.1 agc printf("Not implemented\n");
601 1.1 agc return 5;
602 1.1 agc }
603 1.1 agc
604 1.1 agc
605 1.1 agc /*
606 1.1 agc * list_isns_servers:
607 1.1 agc * Handle the list_isns_servers command.
608 1.1 agc *
609 1.1 agc * Parameter: argc, argv (shifted)
610 1.1 agc *
611 1.1 agc * Returns: 0 if OK - else it doesn't return at all.
612 1.1 agc */
613 1.1 agc
614 1.1 agc int
615 1.1 agc list_isns_servers(int argc, char **argv)
616 1.1 agc {
617 1.1 agc iscsid_get_list_req_t lst;
618 1.1 agc iscsid_response_t *rsp, *prsp;
619 1.1 agc iscsid_get_list_rsp_t *list;
620 1.1 agc iscsid_get_isns_server_rsp_t *isns;
621 1.1 agc iscsid_sym_id_t req;
622 1.1 agc unsigned i;
623 1.1 agc
624 1.1 agc memset(&req, 0x0, sizeof(req));
625 1.1 agc check_extra_args(argc, argv);
626 1.1 agc
627 1.1 agc /* get the list of servers */
628 1.1 agc lst.list_kind = ISNS_LIST;
629 1.1 agc send_request(ISCSID_GET_LIST, sizeof(lst), &lst);
630 1.1 agc rsp = get_response(TRUE);
631 1.1 agc if (rsp->status) {
632 1.1 agc status_error(rsp->status);
633 1.1 agc }
634 1.1 agc list = (iscsid_get_list_rsp_t *) rsp->parameter;
635 1.1 agc
636 1.1 agc /* display all servers */
637 1.1 agc for (i = 0; i < list->num_entries; i++) {
638 1.1 agc req.id = list->id[i];
639 1.1 agc send_request(ISCSID_GET_ISNS_SERVER, sizeof(req), &req);
640 1.1 agc prsp = get_response(FALSE);
641 1.1 agc if (prsp->status)
642 1.1 agc status_error(prsp->status);
643 1.1 agc
644 1.1 agc isns = (iscsid_get_isns_server_rsp_t *) prsp->parameter;
645 1.1 agc printf("%6d: %s\n", list->id[i], isns->address);
646 1.1 agc free_response(prsp);
647 1.1 agc }
648 1.1 agc free_response(rsp);
649 1.1 agc return 0;
650 1.1 agc }
651 1.1 agc
652 1.1 agc
653 1.1 agc /*
654 1.1 agc * refresh_isns:
655 1.1 agc * Handle the refresh_isns command.
656 1.1 agc *
657 1.1 agc * Parameter: argc, argv (shifted)
658 1.1 agc *
659 1.1 agc * Returns: 0 if OK - else it doesn't return at all.
660 1.1 agc */
661 1.1 agc
662 1.1 agc int
663 1.1 agc refresh_isns(int argc, char **argv)
664 1.1 agc {
665 1.1 agc return do_refresh(argc, argv, ISNS_LIST);
666 1.1 agc }
667 1.1 agc
668 1.1 agc
669 1.1 agc /*
670 1.1 agc * add_initiator:
671 1.1 agc * Handle the add_initiator command.
672 1.1 agc *
673 1.1 agc * Parameter: argc, argv (shifted)
674 1.1 agc *
675 1.1 agc * Returns: 0 if OK - else it doesn't return at all.
676 1.1 agc */
677 1.1 agc
678 1.1 agc int
679 1.1 agc add_initiator(int argc, char **argv)
680 1.1 agc {
681 1.1 agc iscsid_add_initiator_req_t req;
682 1.1 agc iscsid_add_initiator_rsp_t *res;
683 1.1 agc iscsid_response_t *rsp;
684 1.1 agc
685 1.1 agc memset(&req, 0x0, sizeof(req));
686 1.1 agc if (!cl_get_string('a', (char *)req.address, argc, argv)) {
687 1.1 agc arg_missing("Interface Address");
688 1.1 agc }
689 1.1 agc cl_get_symname(req.name, argc, argv);
690 1.1 agc check_extra_args(argc, argv);
691 1.1 agc
692 1.1 agc send_request(ISCSID_ADD_INITIATOR_PORTAL, sizeof(req), &req);
693 1.1 agc rsp = get_response(FALSE);
694 1.1 agc if (rsp->status) {
695 1.1 agc status_error(rsp->status);
696 1.1 agc }
697 1.1 agc res = (iscsid_add_initiator_rsp_t *) rsp->parameter;
698 1.1 agc printf("Added Initiator Portal %d\n", res->portal_id);
699 1.1 agc
700 1.1 agc free_response(rsp);
701 1.1 agc return 0;
702 1.1 agc }
703 1.1 agc
704 1.1 agc
705 1.1 agc /*
706 1.1 agc * remove_initiator:
707 1.1 agc * Handle the remove_initiator command.
708 1.1 agc *
709 1.1 agc * Parameter: argc, argv (shifted)
710 1.1 agc *
711 1.1 agc * Returns: 0 if OK - else it doesn't return at all.
712 1.1 agc */
713 1.1 agc
714 1.1 agc int
715 1.1 agc remove_initiator(int argc, char **argv)
716 1.1 agc {
717 1.1 agc iscsid_sym_id_t req;
718 1.1 agc iscsid_response_t *rsp;
719 1.1 agc
720 1.1 agc memset(&req, 0x0, sizeof(req));
721 1.1 agc if (!cl_get_id('I', &req, argc, argv)) {
722 1.1 agc arg_missing("Initiator Portal ID");
723 1.1 agc }
724 1.1 agc check_extra_args(argc, argv);
725 1.1 agc
726 1.1 agc send_request(ISCSID_REMOVE_INITIATOR_PORTAL, sizeof(req), &req);
727 1.1 agc rsp = get_response(FALSE);
728 1.1 agc if (rsp->status) {
729 1.1 agc status_error(rsp->status);
730 1.1 agc }
731 1.1 agc free_response(rsp);
732 1.1 agc
733 1.1 agc printf("OK\n");
734 1.1 agc return 0;
735 1.1 agc }
736 1.1 agc
737 1.1 agc /*
738 1.1 agc * list_initiators:
739 1.1 agc * Handle the list_initiators command.
740 1.1 agc *
741 1.1 agc * Parameter: argc, argv (shifted)
742 1.1 agc *
743 1.1 agc * Returns: 0 if OK - else it doesn't return at all.
744 1.1 agc */
745 1.1 agc
746 1.1 agc int
747 1.1 agc list_initiators(int argc, char **argv)
748 1.1 agc {
749 1.1 agc iscsid_get_list_req_t lst;
750 1.1 agc iscsid_response_t *rsp, *prsp;
751 1.1 agc iscsid_get_list_rsp_t *list;
752 1.1 agc iscsid_get_initiator_rsp_t *init;
753 1.1 agc iscsid_sym_id_t req;
754 1.1 agc unsigned i;
755 1.1 agc
756 1.1 agc memset(&req, 0x0, sizeof(req));
757 1.1 agc check_extra_args(argc, argv);
758 1.1 agc
759 1.1 agc /* get the list of servers */
760 1.1 agc lst.list_kind = INITIATOR_LIST;
761 1.1 agc send_request(ISCSID_GET_LIST, sizeof(lst), &lst);
762 1.1 agc rsp = get_response(TRUE);
763 1.1 agc if (rsp->status) {
764 1.1 agc status_error(rsp->status);
765 1.1 agc }
766 1.1 agc list = (iscsid_get_list_rsp_t *) rsp->parameter;
767 1.1 agc
768 1.1 agc /* display all servers */
769 1.1 agc for (i = 0; i < list->num_entries; i++) {
770 1.1 agc req.id = list->id[i];
771 1.1 agc send_request(ISCSID_GET_INITIATOR_PORTAL, sizeof(req), &req);
772 1.1 agc prsp = get_response(FALSE);
773 1.1 agc if (prsp->status) {
774 1.1 agc status_error(prsp->status);
775 1.1 agc }
776 1.1 agc init = (iscsid_get_initiator_rsp_t *) prsp->parameter;
777 1.1 agc printf("%6d", init->portal_id.id);
778 1.1 agc if (init->portal_id.name[0]) {
779 1.1 agc printf("[%s]", init->portal_id.name);
780 1.1 agc }
781 1.1 agc printf(": %s\n", init->address);
782 1.1 agc free_response(prsp);
783 1.1 agc }
784 1.1 agc free_response(rsp);
785 1.1 agc return 0;
786 1.1 agc }
787 1.1 agc
788 1.1 agc
789 1.1 agc /*
790 1.1 agc * login_or_add:
791 1.1 agc * Common routine for login and add_connection. Handles the actual command,
792 1.1 agc * the only pre-initialized component is the session ID in the login request
793 1.1 agc * for add_connection.
794 1.1 agc *
795 1.1 agc * Parameters: the login request, plus argc & argv
796 1.1 agc */
797 1.1 agc
798 1.1 agc STATIC void
799 1.1 agc login_or_add(iscsid_login_req_t * loginp, int argc, char **argv)
800 1.1 agc {
801 1.1 agc iscsid_add_target_req_t *targ = NULL;
802 1.1 agc iscsid_add_target_rsp_t *tgtrsp;
803 1.1 agc iscsid_set_target_authentication_req_t auth;
804 1.1 agc iscsid_get_set_target_options_t opt;
805 1.1 agc iscsid_search_list_req_t srch;
806 1.1 agc iscsid_response_t *rsp;
807 1.1 agc int opts, auths, tlen;
808 1.1 agc
809 1.1 agc /* get the remaining parameters */
810 1.1 agc opts = cl_get_target_opts(&opt, argc, argv);
811 1.1 agc auths = cl_get_auth_opts(&auth, argc, argv);
812 1.1 agc cl_get_symname(loginp->sym_name, argc, argv);
813 1.1 agc cl_get_id ('i', &loginp->initiator_id, argc, argv);
814 1.1 agc
815 1.1 agc /* do we have a portal ID? */
816 1.1 agc if (!cl_get_id('P', &loginp->portal_id, argc, argv)) {
817 1.1 agc /* No portal ID - then we must have a target name */
818 1.1 agc if (!(tlen = cl_get_target(&targ, argc, argv, TRUE))) {
819 1.1 agc if (NO_ID(&loginp->session_id)) {
820 1.1 agc arg_missing("Target");
821 1.1 agc }
822 1.1 agc }
823 1.1 agc
824 1.1 agc check_extra_args(argc, argv);
825 1.1 agc
826 1.1 agc if (targ != NULL) {
827 1.1 agc /* was a complete target with portal specified? */
828 1.1 agc if (targ->num_portals) {
829 1.1 agc /* then add it like in an add_target command */
830 1.1 agc targ->list_kind = TARGET_LIST;
831 1.1 agc send_request(ISCSID_ADD_TARGET, tlen, targ);
832 1.1 agc rsp = get_response(FALSE);
833 1.1 agc if (rsp->status) {
834 1.1 agc status_error(rsp->status);
835 1.1 agc }
836 1.1 agc tgtrsp = (iscsid_add_target_rsp_t *)(void *)(rsp->parameter);
837 1.1 agc (void) memcpy(&loginp->portal_id.id, &tgtrsp->target_id,
838 1.1 agc sizeof(loginp->portal_id.id));
839 1.1 agc } else {
840 1.1 agc /* else find the target by its TargetName */
841 1.1 agc srch.search_kind = FIND_TARGET_NAME;
842 1.1 agc srch.list_kind = TARGET_LIST;
843 1.1 agc strlcpy((char *)srch.strval, (char *)targ->TargetName,
844 1.1 agc sizeof(srch.strval));
845 1.1 agc
846 1.1 agc send_request(ISCSID_SEARCH_LIST, sizeof(srch), &srch);
847 1.1 agc rsp = get_response(FALSE);
848 1.1 agc if (rsp->status) {
849 1.1 agc status_error_slist(rsp->status);
850 1.1 agc }
851 1.1 agc GET_SYM_ID(loginp->portal_id.id, rsp->parameter);
852 1.1 agc }
853 1.1 agc free_response(rsp);
854 1.1 agc }
855 1.1 agc } else
856 1.1 agc check_extra_args(argc, argv);
857 1.1 agc
858 1.1 agc /* Options specified? Then set them */
859 1.1 agc if (opts) {
860 1.1 agc opt.target_id = loginp->portal_id;
861 1.1 agc opt.list_kind = TARGET_LIST;
862 1.1 agc send_request(ISCSID_SET_TARGET_OPTIONS, sizeof(opt), &opt);
863 1.1 agc rsp = get_response(FALSE);
864 1.1 agc if (rsp->status) {
865 1.1 agc status_error(rsp->status);
866 1.1 agc }
867 1.1 agc free_response(rsp);
868 1.1 agc }
869 1.1 agc /* Authentication options specified? Then set them */
870 1.1 agc if (auths) {
871 1.1 agc auth.target_id = loginp->portal_id;
872 1.1 agc auth.list_kind = TARGET_LIST;
873 1.1 agc send_request(ISCSID_SET_TARGET_AUTHENTICATION, sizeof(auth), &auth);
874 1.1 agc rsp = get_response(FALSE);
875 1.1 agc if (rsp->status) {
876 1.1 agc status_error(rsp->status);
877 1.1 agc }
878 1.1 agc free_response(rsp);
879 1.1 agc }
880 1.1 agc }
881 1.1 agc
882 1.1 agc
883 1.1 agc /*
884 1.1 agc * login:
885 1.1 agc * Handle login command.
886 1.1 agc *
887 1.1 agc * Parameter: argc, argv (shifted)
888 1.1 agc *
889 1.1 agc * Returns: 0 if OK - else it doesn't return at all.
890 1.1 agc */
891 1.1 agc
892 1.1 agc int
893 1.1 agc login(int argc, char **argv)
894 1.1 agc {
895 1.1 agc iscsid_login_req_t loginp;
896 1.1 agc iscsid_login_rsp_t *res;
897 1.1 agc iscsid_response_t *rsp;
898 1.1 agc
899 1.1 agc memset(&loginp, 0x0, sizeof(loginp));
900 1.1 agc loginp.login_type = (cl_get_opt('m', argc, argv))
901 1.1 agc ? ISCSI_LOGINTYPE_NOMAP : ISCSI_LOGINTYPE_MAP;
902 1.1 agc
903 1.1 agc login_or_add(&loginp, argc, argv);
904 1.1 agc
905 1.1 agc send_request(ISCSID_LOGIN, sizeof(loginp), &loginp);
906 1.1 agc
907 1.1 agc rsp = get_response(FALSE);
908 1.1 agc if (rsp->status) {
909 1.1 agc status_error(rsp->status);
910 1.1 agc }
911 1.1 agc res = (iscsid_login_rsp_t *) rsp->parameter;
912 1.1 agc printf("Created Session %d, Connection %d\n",
913 1.1 agc res->session_id.id, res->connection_id.id);
914 1.1 agc
915 1.1 agc free_response(rsp);
916 1.1 agc return 0;
917 1.1 agc }
918 1.1 agc
919 1.1 agc
920 1.1 agc /*
921 1.1 agc * logout:
922 1.1 agc * Handle logout command.
923 1.1 agc *
924 1.1 agc * Parameter: argc, argv (shifted)
925 1.1 agc *
926 1.1 agc * Returns: 0 if OK - else it doesn't return at all.
927 1.1 agc */
928 1.1 agc
929 1.1 agc int
930 1.1 agc logout(int argc, char **argv)
931 1.1 agc {
932 1.1 agc iscsid_sym_id_t req;
933 1.1 agc iscsid_response_t *rsp;
934 1.1 agc
935 1.1 agc if (!cl_get_id('I', &req, argc, argv)) {
936 1.1 agc arg_missing("Session");
937 1.1 agc }
938 1.1 agc check_extra_args(argc, argv);
939 1.1 agc
940 1.1 agc send_request(ISCSID_LOGOUT, sizeof(req), &req);
941 1.1 agc rsp = get_response(FALSE);
942 1.1 agc if (rsp->status) {
943 1.1 agc status_error(rsp->status);
944 1.1 agc }
945 1.1 agc free_response(rsp);
946 1.1 agc
947 1.1 agc printf("OK\n");
948 1.1 agc return 0;
949 1.1 agc }
950 1.1 agc
951 1.1 agc
952 1.1 agc /*
953 1.1 agc * add_connection:
954 1.1 agc * Handle add_connection command.
955 1.1 agc *
956 1.1 agc * Parameter: argc, argv (shifted)
957 1.1 agc *
958 1.1 agc * Returns: 0 if OK - else it doesn't return at all.
959 1.1 agc */
960 1.1 agc
961 1.1 agc int
962 1.1 agc add_connection(int argc, char **argv)
963 1.1 agc {
964 1.1 agc iscsid_login_req_t loginp;
965 1.1 agc iscsid_login_rsp_t *loginrsp;
966 1.1 agc iscsid_response_t *rsp;
967 1.1 agc
968 1.1 agc memset(&loginp, 0x0, sizeof(loginp));
969 1.1 agc loginp.login_type = ISCSI_LOGINTYPE_MAP;
970 1.1 agc cl_get_id('I', &loginp.session_id, argc, argv);
971 1.1 agc
972 1.1 agc login_or_add(&loginp, argc, argv);
973 1.1 agc
974 1.1 agc send_request(ISCSID_ADD_CONNECTION, sizeof(loginp), &loginp);
975 1.1 agc
976 1.1 agc rsp = get_response(FALSE);
977 1.1 agc if (rsp->status) {
978 1.1 agc status_error(rsp->status);
979 1.1 agc }
980 1.1 agc loginrsp = (iscsid_login_rsp_t *)(void *)(rsp->parameter);
981 1.1 agc printf("Added Connection %d\n", loginrsp->connection_id.id);
982 1.1 agc
983 1.1 agc free_response(rsp);
984 1.1 agc return 0;
985 1.1 agc }
986 1.1 agc
987 1.1 agc
988 1.1 agc /*
989 1.1 agc * remove_connection:
990 1.1 agc * Handle remove connection command
991 1.1 agc *
992 1.1 agc * Parameter: argc, argv (shifted)
993 1.1 agc *
994 1.1 agc * Returns: 0 if OK - else it doesn't return at all.
995 1.1 agc */
996 1.1 agc
997 1.1 agc int
998 1.1 agc remove_connection(int argc, char **argv)
999 1.1 agc {
1000 1.1 agc iscsid_remove_connection_req_t req;
1001 1.1 agc iscsid_response_t *rsp;
1002 1.1 agc
1003 1.1 agc if (!cl_get_id('I', &req.session_id, argc, argv)) {
1004 1.1 agc arg_missing("Session");
1005 1.1 agc }
1006 1.1 agc if (!cl_get_id('C', &req.connection_id, argc, argv)) {
1007 1.1 agc arg_missing("Connection");
1008 1.1 agc }
1009 1.1 agc check_extra_args(argc, argv);
1010 1.1 agc
1011 1.1 agc send_request(ISCSID_REMOVE_CONNECTION, sizeof(req), &req);
1012 1.1 agc rsp = get_response(FALSE);
1013 1.1 agc if (rsp->status) {
1014 1.1 agc status_error(rsp->status);
1015 1.1 agc }
1016 1.1 agc free_response(rsp);
1017 1.1 agc
1018 1.1 agc printf("OK\n");
1019 1.1 agc return 0;
1020 1.1 agc }
1021 1.1 agc
1022 1.1 agc
1023 1.1 agc /*
1024 1.1 agc * list_sessions:
1025 1.1 agc * Handle list_sessions command.
1026 1.1 agc *
1027 1.1 agc * Parameter: argc, argv (shifted)
1028 1.1 agc *
1029 1.1 agc * Returns: 0 if OK - else it doesn't return at all.
1030 1.1 agc *
1031 1.1 agc * ToDo: initiator portals, connection recurse
1032 1.1 agc */
1033 1.1 agc
1034 1.1 agc int
1035 1.1 agc list_sessions(int argc, char **argv)
1036 1.1 agc {
1037 1.1 agc iscsid_response_t *lrsp, *rsp;
1038 1.1 agc iscsid_get_session_list_rsp_t *list;
1039 1.1 agc iscsid_session_list_entry_t *ent;
1040 1.1 agc iscsid_get_connection_info_req_t creq;
1041 1.1 agc iscsid_get_connection_info_rsp_t *info;
1042 1.1 agc iscsid_sym_id_t clreq;
1043 1.1 agc iscsid_get_connection_list_rsp_t *clinfo;
1044 1.1 agc iscsid_connection_list_entry_t *clent;
1045 1.1 agc unsigned i;
1046 1.1 agc unsigned j;
1047 1.1 agc int lconn;
1048 1.1 agc
1049 1.1 agc memset(&creq, 0x0, sizeof(creq));
1050 1.1 agc memset(&clreq, 0x0, sizeof(clreq));
1051 1.1 agc lconn = cl_get_opt('c', argc, argv);
1052 1.1 agc
1053 1.1 agc check_extra_args(argc, argv);
1054 1.1 agc
1055 1.1 agc send_request(ISCSID_GET_SESSION_LIST, 0, NULL);
1056 1.1 agc lrsp = get_response(TRUE);
1057 1.1 agc if (lrsp->status) {
1058 1.1 agc status_error(lrsp->status);
1059 1.1 agc }
1060 1.1 agc list = (iscsid_get_session_list_rsp_t *) lrsp->parameter;
1061 1.1 agc
1062 1.1 agc for (i = 0, ent = list->session; i < list->num_entries; i++, ent++) {
1063 1.1 agc creq.session_id.id = ent->session_id.id;
1064 1.1 agc send_request(ISCSID_GET_CONNECTION_INFO, sizeof(creq), &creq);
1065 1.1 agc rsp = get_response(FALSE);
1066 1.1 agc if (rsp->status) {
1067 1.1 agc status_error(rsp->status);
1068 1.1 agc }
1069 1.1 agc info = (iscsid_get_connection_info_rsp_t *) rsp->parameter;
1070 1.1 agc
1071 1.1 agc printf("Session %d", info->session_id.id);
1072 1.1 agc if (info->session_id.name[0]) {
1073 1.1 agc printf("[%s]", info->session_id.name);
1074 1.1 agc }
1075 1.1 agc printf(": Target %s", info->TargetName);
1076 1.1 agc if (info->target_portal_id.name[0]) {
1077 1.1 agc printf(" [%s]", info->target_portal_id.name);
1078 1.1 agc }
1079 1.1 agc printf("\n");
1080 1.1 agc
1081 1.1 agc if (lconn) {
1082 1.1 agc clreq.id = info->session_id.id;
1083 1.1 agc send_request(ISCSID_GET_CONNECTION_LIST, sizeof(clreq), &clreq);
1084 1.1 agc rsp = get_response(FALSE);
1085 1.1 agc if (rsp->status) {
1086 1.1 agc status_error(rsp->status);
1087 1.1 agc }
1088 1.1 agc clinfo = (iscsid_get_connection_list_rsp_t *) rsp->parameter;
1089 1.1 agc
1090 1.1 agc for (j = 0, clent = clinfo->connection;
1091 1.1 agc j < clinfo->num_connections; j++, clent++) {
1092 1.1 agc printf(" Connection %d", clent->connection_id.id);
1093 1.1 agc if (clent->connection_id.name[0]) {
1094 1.1 agc printf("[%s]", clent->connection_id.name);
1095 1.1 agc }
1096 1.1 agc printf(" Address %s:%d,%d\n", clent->target_portal.address,
1097 1.1 agc clent->target_portal.port,
1098 1.1 agc clent->target_portal.group_tag);
1099 1.1 agc }
1100 1.1 agc }
1101 1.1 agc }
1102 1.1 agc
1103 1.1 agc return 0;
1104 1.1 agc }
1105 1.1 agc
1106 1.1 agc
1107 1.1 agc /*
1108 1.1 agc * set_node_name:
1109 1.1 agc * Handle the set_node_name command.
1110 1.1 agc *
1111 1.1 agc * Parameter: argc, argv (shifted)
1112 1.1 agc *
1113 1.1 agc * Returns: 0 if OK - else it doesn't return at all.
1114 1.1 agc */
1115 1.1 agc
1116 1.1 agc int
1117 1.1 agc set_node_name(int argc, char **argv)
1118 1.1 agc {
1119 1.1 agc iscsid_set_node_name_req_t req;
1120 1.1 agc iscsid_response_t *rsp;
1121 1.1 agc uint64_t isid;
1122 1.1 agc
1123 1.1 agc memset(&req, 0x0, sizeof(req));
1124 1.1 agc if (!cl_get_string('n', (char *)req.InitiatorName, argc, argv)) {
1125 1.1 agc arg_missing("Initiator Name");
1126 1.1 agc }
1127 1.1 agc cl_get_string('A', (char *)req.InitiatorAlias, argc, argv);
1128 1.1 agc isid = cl_get_longlong('i', argc, argv);
1129 1.1 agc hton6(req.ISID, isid);
1130 1.1 agc
1131 1.1 agc check_extra_args(argc, argv);
1132 1.1 agc
1133 1.1 agc send_request(ISCSID_SET_NODE_NAME, sizeof(req), &req);
1134 1.1 agc
1135 1.1 agc rsp = get_response(FALSE);
1136 1.1 agc if (rsp->status) {
1137 1.1 agc status_error(rsp->status);
1138 1.1 agc }
1139 1.1 agc free_response(rsp);
1140 1.1 agc
1141 1.1 agc printf("OK\n");
1142 1.1 agc return 0;
1143 1.1 agc }
1144 1.1 agc
1145 1.1 agc /*
1146 1.1 agc * get_version:
1147 1.1 agc * Handle the version command.
1148 1.1 agc *
1149 1.1 agc * Parameter: argc, argv (shifted)
1150 1.1 agc *
1151 1.1 agc * Returns: 0 if OK - else it doesn't return at all.
1152 1.1 agc */
1153 1.1 agc
1154 1.1 agc int
1155 1.1 agc get_version(int argc, char **argv)
1156 1.1 agc {
1157 1.1 agc iscsid_response_t *rsp;
1158 1.1 agc iscsid_get_version_rsp_t *ver;
1159 1.1 agc
1160 1.1 agc send_request(ISCSID_GET_VERSION, 0, NULL);
1161 1.1 agc rsp = get_response(FALSE);
1162 1.1 agc if (rsp->status) {
1163 1.1 agc status_error(rsp->status);
1164 1.1 agc }
1165 1.1 agc ver = (iscsid_get_version_rsp_t *)rsp->parameter;
1166 1.1 agc printf("%s\n%s\n%s\n", VERSION_STRING, ver->version_string,
1167 1.1 agc ver->driver_version_string);
1168 1.1 agc
1169 1.1 agc return 0;
1170 1.1 agc }
1171 1.1 agc
1172 1.1 agc
1173 1.1 agc #ifdef ISCSI_DEBUG
1174 1.1 agc /*
1175 1.1 agc * kill_daemon:
1176 1.1 agc * Handle kill_daemon command.
1177 1.1 agc *
1178 1.1 agc * Parameter: argc, argv (shifted)
1179 1.1 agc *
1180 1.1 agc * Returns: Always 0.
1181 1.1 agc */
1182 1.1 agc
1183 1.1 agc int
1184 1.1 agc kill_daemon(int argc, char **argv)
1185 1.1 agc {
1186 1.1 agc check_extra_args(argc, argv);
1187 1.1 agc
1188 1.1 agc send_request(ISCSID_DAEMON_TERMINATE, 0, NULL);
1189 1.1 agc return 0;
1190 1.1 agc }
1191 1.1 agc #endif
1192