2 * Copyright (c) 1998,1999,2000
3 * Traakan, Inc., Los Altos, CA
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
9 * 1. Redistributions of source code must retain the above copyright
10 * notice unmodified, this list of conditions, and the following
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
38 #include "ndmagents.h"
41 #ifndef NDMOS_OPTION_NO_CONTROL_AGENT
45 ndmca_op_query (struct ndm_session *sess)
49 ndmca_opq_robot(sess);
54 ndmca_opq_data (struct ndm_session *sess)
56 struct ndm_job_param * job = &sess->control_acb.job;
59 if (job->data_agent.conn_type == NDMCONN_TYPE_NONE)
62 rc = ndmca_connect_data_agent (sess);
64 ndmconn_destruct (sess->plumb.data);
65 return rc; /* already tattled */
69 ndmalogqr (sess, "Data Agent %s NDMPv%d",
71 sess->plumb.data->protocol_version);
72 ndmca_opq_host_info (sess, sess->plumb.data);
73 ndmca_opq_get_mover_type (sess, sess->plumb.data);
74 ndmca_opq_get_butype_attr (sess, sess->plumb.data);
75 #ifndef NDMOS_OPTION_NO_NDMP3
76 if (sess->plumb.data->protocol_version == NDMP3VER) {
77 ndmca_opq_get_fs_info (sess, sess->plumb.data);
79 #endif /* !NDMOS_OPTION_NO_NDMP3 */
80 #ifndef NDMOS_OPTION_NO_NDMP4
81 if (sess->plumb.data->protocol_version == NDMP4VER) {
82 ndmca_opq_get_fs_info (sess, sess->plumb.data);
84 #endif /* !NDMOS_OPTION_NO_NDMP4 */
90 ndmca_opq_tape (struct ndm_session *sess)
92 struct ndm_job_param * job = &sess->control_acb.job;
95 if (job->tape_agent.conn_type == NDMCONN_TYPE_NONE)
98 rc = ndmca_connect_tape_agent (sess);
100 ndmconn_destruct (sess->plumb.tape);
101 return rc; /* already tattled */
104 ndmalogqr (sess, "");
105 ndmalogqr (sess, "Tape Agent %s NDMPv%d",
106 job->tape_agent.host,
107 sess->plumb.tape->protocol_version);
108 if (sess->plumb.tape != sess->plumb.data) { /* don't be boring */
109 ndmca_opq_host_info (sess, sess->plumb.tape);
110 ndmca_opq_get_mover_type (sess, sess->plumb.tape);
113 #ifndef NDMOS_OPTION_NO_NDMP3
114 if (sess->plumb.tape->protocol_version == NDMP3VER) {
115 ndmca_opq_get_tape_info (sess, sess->plumb.tape);
117 #endif /* !NDMOS_OPTION_NO_NDMP3 */
118 #ifndef NDMOS_OPTION_NO_NDMP4
119 if (sess->plumb.tape->protocol_version == NDMP4VER) {
120 ndmca_opq_get_tape_info (sess, sess->plumb.tape);
122 #endif /* !NDMOS_OPTION_NO_NDMP4 */
128 ndmca_opq_robot (struct ndm_session *sess)
130 struct ndm_job_param * job = &sess->control_acb.job;
133 if (job->robot_agent.conn_type == NDMCONN_TYPE_NONE
137 rc = ndmca_connect_robot_agent (sess);
139 return rc; /* already tattled */
141 ndmalogqr (sess, "");
142 ndmalogqr (sess, "Robot Agent %s NDMPv%d",
143 job->robot_agent.host,
144 sess->plumb.robot->protocol_version);
146 if (sess->plumb.robot != sess->plumb.data
147 && sess->plumb.robot != sess->plumb.tape) {
148 /* don't be boring */
149 ndmca_opq_host_info (sess, sess->plumb.robot);
152 #ifndef NDMOS_OPTION_NO_NDMP3
153 if (sess->plumb.robot->protocol_version == NDMP3VER) {
154 ndmca_opq_get_scsi_info (sess, sess->plumb.robot);
156 #endif /* !NDMOS_OPTION_NO_NDMP3 */
157 #ifndef NDMOS_OPTION_NO_NDMP4
158 if (sess->plumb.robot->protocol_version == NDMP4VER) {
159 ndmca_opq_get_scsi_info (sess, sess->plumb.robot);
161 #endif /* !NDMOS_OPTION_NO_NDMP4 */
163 if (job->have_robot) {
164 if (ndmca_robot_prep_target(sess)) {
165 ndmalogqr (sess, " robot init failed");
169 ndmca_robot_query (sess);
176 ndmca_opq_host_info (struct ndm_session *sess, struct ndmconn *conn)
182 switch (conn->protocol_version) {
184 ndmalogqr (sess, " Host info NDMPv???? %d",
185 conn->protocol_version);
186 ndmalogqr (sess, " INTERNAL ERROR, CHECK BUILD");
189 #ifndef NDMOS_OPTION_NO_NDMP2
191 NDMC_WITH_VOID_REQUEST(ndmp2_config_get_host_info, NDMP2VER)
192 rc = NDMC_CALL(conn);
194 ndmalogqr (sess, "get_host_info failed");
198 ndmalogqr (sess, " Host info");
199 ndmalogqr (sess, " hostname %s", reply->hostname);
200 ndmalogqr (sess, " os_type %s", reply->os_type);
201 ndmalogqr (sess, " os_vers %s", reply->os_vers);
202 ndmalogqr (sess, " hostid %s", reply->hostid);
205 for (i = 0; i < reply->auth_type.auth_type_len; i++) {
206 ndmp2_auth_type atyp;
208 atyp = reply->auth_type.auth_type_val[i];
210 strcat (buf, ndmp2_auth_type_to_str (atyp));
213 ndmalogqr (sess, " auths (%d) %s",
214 reply->auth_type.auth_type_len, buf);
215 ndmalogqr (sess, "");
220 #endif /* !NDMOS_OPTION_NO_NDMP2 */
222 #ifndef NDMOS_OPTION_NO_NDMP3
224 NDMC_WITH_VOID_REQUEST(ndmp3_config_get_host_info, NDMP3VER)
225 rc = NDMC_CALL(conn);
227 ndmalogqr (sess, "get_host_info failed");
231 ndmalogqr (sess, " Host info");
232 ndmalogqr (sess, " hostname %s", reply->hostname);
233 ndmalogqr (sess, " os_type %s", reply->os_type);
234 ndmalogqr (sess, " os_vers %s", reply->os_vers);
235 ndmalogqr (sess, " hostid %s", reply->hostid);
236 ndmalogqr (sess, "");
241 NDMC_WITH_VOID_REQUEST(ndmp3_config_get_server_info, NDMP3VER)
242 rc = NDMC_CALL(conn);
244 ndmalogqr (sess, "get_server_info failed");
248 ndmalogqr (sess, " Server info");
250 ndmalogqr (sess, " vendor %s", reply->vendor_name);
251 ndmalogqr (sess, " product %s", reply->product_name);
252 ndmalogqr (sess, " revision %s", reply->revision_number);
254 for (i = 0; i < reply->auth_type.auth_type_len; i++) {
255 ndmp3_auth_type atyp;
257 atyp = reply->auth_type.auth_type_val[i];
259 strcat (buf, ndmp3_auth_type_to_str (atyp));
261 ndmalogqr (sess, " auths (%d) %s",
262 reply->auth_type.auth_type_len, buf);
263 ndmalogqr (sess, "");
268 #endif /* !NDMOS_OPTION_NO_NDMP3 */
270 #ifndef NDMOS_OPTION_NO_NDMP4
272 NDMC_WITH_VOID_REQUEST(ndmp4_config_get_host_info, NDMP4VER)
273 rc = NDMC_CALL(conn);
275 ndmalogqr (sess, "get_host_info failed");
279 ndmalogqr (sess, " Host info");
280 ndmalogqr (sess, " hostname %s", reply->hostname);
281 ndmalogqr (sess, " os_type %s", reply->os_type);
282 ndmalogqr (sess, " os_vers %s", reply->os_vers);
283 ndmalogqr (sess, " hostid %s", reply->hostid);
284 ndmalogqr (sess, "");
289 NDMC_WITH_VOID_REQUEST(ndmp4_config_get_server_info, NDMP4VER)
290 rc = NDMC_CALL(conn);
292 ndmalogqr (sess, "get_server_info failed");
296 ndmalogqr (sess, " Server info");
298 ndmalogqr (sess, " vendor %s", reply->vendor_name);
299 ndmalogqr (sess, " product %s", reply->product_name);
300 ndmalogqr (sess, " revision %s", reply->revision_number);
302 for (i = 0; i < reply->auth_type.auth_type_len; i++) {
303 ndmp4_auth_type atyp;
305 atyp = reply->auth_type.auth_type_val[i];
307 strcat (buf, ndmp4_auth_type_to_str (atyp));
309 ndmalogqr (sess, " auths (%d) %s",
310 reply->auth_type.auth_type_len, buf);
311 ndmalogqr (sess, "");
316 #endif /* !NDMOS_OPTION_NO_NDMP4 */
323 ndmca_opq_get_mover_type (struct ndm_session *sess, struct ndmconn *conn)
329 switch (conn->protocol_version) {
331 /* already tattled in ndmca_opq_host_info() */
334 #ifndef NDMOS_OPTION_NO_NDMP2
336 NDMC_WITH_VOID_REQUEST(ndmp2_config_get_mover_type, NDMP2VER)
337 rc = NDMC_CALL(conn);
339 ndmalogqr (sess, "get_mover_info failed");
343 ndmalogqr (sess, " Mover types");
346 for (i = 0; i < reply->methods.methods_len; i++) {
347 ndmp2_mover_addr_type val;
349 val = reply->methods.methods_val[i];
351 strcat (buf, ndmp2_mover_addr_type_to_str (val));
353 ndmalogqr (sess, " methods (%d) %s",
354 reply->methods.methods_len,
356 ndmalogqr (sess, "");
361 #endif /* !NDMOS_OPTION_NO_NDMP2 */
363 #ifndef NDMOS_OPTION_NO_NDMP3
365 NDMC_WITH_VOID_REQUEST(ndmp3_config_get_connection_type, NDMP3VER)
366 rc = NDMC_CALL(conn);
368 ndmalogqr (sess, "get_connection_type failed");
372 ndmalogqr (sess, " Connection types");
374 for (i = 0; i < reply->addr_types.addr_types_len; i++) {
377 val = reply->addr_types.addr_types_val[i];
379 strcat (buf, ndmp3_addr_type_to_str (val));
381 ndmalogqr (sess, " addr_types (%d) %s",
382 reply->addr_types.addr_types_len, buf);
383 ndmalogqr (sess, "");
388 #endif /* !NDMOS_OPTION_NO_NDMP3 */
390 #ifndef NDMOS_OPTION_NO_NDMP4
392 NDMC_WITH_VOID_REQUEST(ndmp4_config_get_connection_type, NDMP4VER)
393 rc = NDMC_CALL(conn);
395 ndmalogqr (sess, "get_connection_type failed");
399 ndmalogqr (sess, " Connection types");
401 for (i = 0; i < reply->addr_types.addr_types_len; i++) {
404 val = reply->addr_types.addr_types_val[i];
406 strcat (buf, ndmp4_addr_type_to_str (val));
408 ndmalogqr (sess, " addr_types (%d) %s",
409 reply->addr_types.addr_types_len, buf);
410 ndmalogqr (sess, "");
415 #endif /* !NDMOS_OPTION_NO_NDMP4 */
422 ndmca_opq_get_butype_attr (struct ndm_session *sess, struct ndmconn *conn)
426 switch (conn->protocol_version) {
428 /* already tattled in ndmca_opq_host_info() */
431 #ifndef NDMOS_OPTION_NO_NDMP2
433 NDMC_WITH(ndmp2_config_get_butype_attr, NDMP2VER)
434 request->name = sess->control_acb.job.bu_type;
435 rc = NDMC_CALL(conn);
437 ndmalogqr (sess, " get_butype_attr '%s' failed",
438 sess->control_acb.job.bu_type);
442 ndmalogqr (sess, " Backup type attributes of %s format",
443 sess->control_acb.job.bu_type);
444 ndmalogqr (sess, " backup-filelist %s",
445 (reply->attrs&NDMP2_NO_BACKUP_FILELIST) ? "no":"yes");
446 ndmalogqr (sess, " backup-fhinfo %s",
447 (reply->attrs&NDMP2_NO_BACKUP_FHINFO) ? "no":"yes");
448 ndmalogqr (sess, " recover-filelist %s",
449 (reply->attrs&NDMP2_NO_RECOVER_FILELIST) ? "no":"yes");
450 ndmalogqr (sess, " recover-fhinfo %s",
451 (reply->attrs&NDMP2_NO_RECOVER_FHINFO) ? "no":"yes");
452 ndmalogqr (sess, " recover-inc-only %s",
453 (reply->attrs&NDMP2_NO_RECOVER_INC_ONLY) ? "no":"yes");
458 #endif /* !NDMOS_OPTION_NO_NDMP2 */
460 #ifndef NDMOS_OPTION_NO_NDMP3
462 NDMC_WITH_VOID_REQUEST(ndmp3_config_get_butype_info, NDMP3VER)
465 rc = NDMC_CALL(conn);
467 ndmalogqr (sess, " get_butype_info failed");
471 for (i = 0; i < reply->butype_info.butype_info_len; i++) {
472 ndmp3_butype_info * buti;
474 buti = &reply->butype_info.butype_info_val[i];
475 ndmalogqr (sess, " Backup type info of %s format",
477 ndmalogqr (sess, " attrs 0x%lx",
480 ndmalogqr (sess, " backup-file-history %s",
481 (buti->attrs&NDMP3_BUTYPE_BACKUP_FILE_HISTORY) ? "yes":"no");
482 ndmalogqr (sess, " backup-filelist %s",
483 (buti->attrs&NDMP3_BUTYPE_BACKUP_FILELIST) ? "yes":"no");
484 ndmalogqr (sess, " recover-filelist %s",
485 (buti->attrs&NDMP3_BUTYPE_RECOVER_FILELIST) ? "yes":"no");
486 ndmalogqr (sess, " backup-direct %s",
487 (buti->attrs&NDMP3_BUTYPE_BACKUP_DIRECT) ? "yes":"no");
488 ndmalogqr (sess, " recover-direct %s",
489 (buti->attrs&NDMP3_BUTYPE_RECOVER_DIRECT) ? "yes":"no");
490 ndmalogqr (sess, " backup-incremental %s",
491 (buti->attrs&NDMP3_BUTYPE_BACKUP_INCREMENTAL) ? "yes":"no");
492 ndmalogqr (sess, " recover-incremental %s",
493 (buti->attrs&NDMP3_BUTYPE_RECOVER_INCREMENTAL) ? "yes":"no");
494 ndmalogqr (sess, " backup-utf8 %s",
495 (buti->attrs&NDMP3_BUTYPE_BACKUP_UTF8) ? "yes":"no");
496 ndmalogqr (sess, " recover-utf8 %s",
497 (buti->attrs&NDMP3_BUTYPE_RECOVER_UTF8) ? "yes":"no");
498 ndmalogqr (sess, " recover-file-history %s",
499 (buti->attrs&NDMP3_BUTYPE_RECOVER_FILE_HISTORY) ? "yes":"no");
504 for (j = 0; j < buti->default_env.default_env_len; j++) {
505 ndmalogqr (sess, " set %s=%s",
506 buti->default_env.default_env_val[j].name,
507 buti->default_env.default_env_val[j].value);
510 ndmalogqr (sess, " empty default env");
511 ndmalogqr (sess, "");
514 ndmalogqr (sess, " Empty backup type info");
519 #endif /* !NDMOS_OPTION_NO_NDMP3 */
521 #ifndef NDMOS_OPTION_NO_NDMP4
523 NDMC_WITH_VOID_REQUEST(ndmp4_config_get_butype_info, NDMP4VER)
526 rc = NDMC_CALL(conn);
528 ndmalogqr (sess, " get_butype_info failed");
532 for (i = 0; i < reply->butype_info.butype_info_len; i++) {
533 ndmp4_butype_info * buti;
535 buti = &reply->butype_info.butype_info_val[i];
536 ndmalogqr (sess, " Backup type info of %s format",
538 ndmalogqr (sess, " attrs 0x%lx",
540 for (j = 0; j < buti->default_env.default_env_len; j++) {
541 ndmalogqr (sess, " set %s=%s",
542 buti->default_env.default_env_val[j].name,
543 buti->default_env.default_env_val[j].value);
546 ndmalogqr (sess, " empty default env");
547 ndmalogqr (sess, "");
550 ndmalogqr (sess, " Empty backup type info");
555 #endif /* !NDMOS_OPTION_NO_NDMP4 */
561 #ifndef NDMOS_EFFECT_NO_NDMP3_NOR_NDMP4
563 ndmca_opq_get_fs_info (struct ndm_session *sess, struct ndmconn *conn)
567 switch (conn->protocol_version) {
569 /* already tattled in ndmca_opq_host_info() */
572 #ifndef NDMOS_OPTION_NO_NDMP2
574 break; /* why are we here? */
575 #endif /* !NDMOS_OPTION_NO_NDMP2 */
576 #ifndef NDMOS_OPTION_NO_NDMP3
578 NDMC_WITH_VOID_REQUEST(ndmp3_config_get_fs_info, NDMP3VER)
581 rc = NDMC_CALL(conn);
583 ndmalogqr (sess, " get_fs_info failed");
587 for (i = 0; i < reply->fs_info.fs_info_len; i++) {
590 fsi = &reply->fs_info.fs_info_val[i];
592 ndmalogqr (sess, " File system %s",
593 fsi->fs_logical_device);
595 ndmalogqr (sess, " physdev %s",
596 fsi->fs_physical_device);
597 ndmalogqr (sess, " invalid 0x%lx", fsi->invalid);
598 if (fsi->invalid & NDMP3_FS_INFO_TOTAL_SIZE_INVALID)
599 ndmalogqr (sess, " TOTAL_SIZE_INVALID");
600 if (fsi->invalid & NDMP3_FS_INFO_USED_SIZE_INVALID)
601 ndmalogqr (sess, " USED_SIZE_INVALID");
602 if (fsi->invalid & NDMP3_FS_INFO_AVAIL_SIZE_INVALID)
603 ndmalogqr (sess, " AVAIL_SIZE_INVALID");
605 if (fsi->invalid & NDMP3_FS_INFO_TOTAL_INODES_INVALID)
606 ndmalogqr (sess, " TOTAL_INODES_INVALID");
607 if (fsi->invalid & NDMP3_FS_INFO_USED_INODES_INVALID)
608 ndmalogqr (sess, " USED_INODES_INVALID");
609 ndmalogqr (sess, " type %s", fsi->fs_type);
610 ndmalogqr (sess, " status %s", fsi->fs_status);
612 " space %lld total, %lld used, %lld avail",
617 ndmalogqr (sess, " inodes %lld total, %lld used",
621 for (j = 0; j < fsi->fs_env.fs_env_len; j++) {
622 ndmalogqr (sess, " set %s=%s",
623 fsi->fs_env.fs_env_val[j].name,
624 fsi->fs_env.fs_env_val[j].value);
627 ndmalogqr (sess, " empty default env");
628 ndmalogqr (sess, "");
631 ndmalogqr (sess, " Empty fs info");
636 #endif /* !NDMOS_OPTION_NO_NDMP3 */
637 #ifndef NDMOS_OPTION_NO_NDMP4
639 NDMC_WITH_VOID_REQUEST(ndmp4_config_get_fs_info, NDMP4VER)
642 rc = NDMC_CALL(conn);
644 ndmalogqr (sess, " get_fs_info failed");
648 for (i = 0; i < reply->fs_info.fs_info_len; i++) {
651 fsi = &reply->fs_info.fs_info_val[i];
653 ndmalogqr (sess, " File system %s",
654 fsi->fs_logical_device);
656 ndmalogqr (sess, " physdev %s",
657 fsi->fs_physical_device);
658 ndmalogqr (sess, " unsupported 0x%lx",
660 if (fsi->unsupported & NDMP4_FS_INFO_TOTAL_SIZE_UNS)
661 ndmalogqr (sess, " TOTAL_SIZE_UNS");
662 if (fsi->unsupported & NDMP4_FS_INFO_USED_SIZE_UNS)
663 ndmalogqr (sess, " USED_SIZE_UNS");
664 if (fsi->unsupported & NDMP4_FS_INFO_AVAIL_SIZE_UNS)
665 ndmalogqr (sess, " AVAIL_SIZE_UNS");
667 if (fsi->unsupported & NDMP4_FS_INFO_TOTAL_INODES_UNS)
668 ndmalogqr (sess, " TOTAL_INODES_UNS");
669 if (fsi->unsupported & NDMP4_FS_INFO_USED_INODES_UNS)
670 ndmalogqr (sess, " USED_INODES_UNS");
673 ndmalogqr (sess, " type %s", fsi->fs_type);
674 ndmalogqr (sess, " status %s", fsi->fs_status);
676 " space %lld total, %lld used, %lld avail",
681 ndmalogqr (sess, " inodes %lld total, %lld used",
685 for (j = 0; j < fsi->fs_env.fs_env_len; j++) {
686 ndmalogqr (sess, " set %s=%s",
687 fsi->fs_env.fs_env_val[j].name,
688 fsi->fs_env.fs_env_val[j].value);
691 ndmalogqr (sess, " empty default env");
692 ndmalogqr (sess, "");
695 ndmalogqr (sess, " Empty fs info");
700 #endif /* !NDMOS_OPTION_NO_NDMP4 */
707 ndmca_opq_show_device_info (struct ndm_session *sess,
708 ndmp9_device_info *info,
709 unsigned n_info, char *what)
711 unsigned int i, j, k;
713 for (i = 0; i < n_info; i++) {
714 ndmalogqr (sess, " %s %s", what, info[i].model);
715 for (j = 0; j < info[i].caplist.caplist_len; j++) {
716 ndmp9_device_capability *dc;
719 dc = &info[i].caplist.caplist_val[j];
721 ndmalogqr (sess, " device %s", dc->device);
722 if (!strcmp(what, "tape")) {
723 if (sess->plumb.tape->protocol_version == 3) {
724 attr = dc->v3attr.value;
725 ndmalogqr (sess, " attr 0x%lx",
727 if (attr & NDMP3_TAPE_ATTR_REWIND)
728 ndmalogqr (sess, " REWIND");
729 if (attr & NDMP3_TAPE_ATTR_UNLOAD)
730 ndmalogqr (sess, " UNLOAD");
733 for (k = 0; k < dc->capability.capability_len; k++) {
734 ndmalogqr (sess, " set %s=%s",
735 dc->capability.capability_val[k].name,
736 dc->capability.capability_val[k].value);
739 ndmalogqr (sess, " empty capabilities");
742 ndmalogqr (sess, " empty caplist");
743 ndmalogqr (sess, "");
746 ndmalogqr (sess, " Empty %s info", what);
752 ndmca_opq_get_tape_info (struct ndm_session *sess, struct ndmconn *conn)
756 NDMC_WITH_VOID_REQUEST(ndmp9_config_get_tape_info, NDMP9VER)
757 rc = NDMC_CALL(conn);
759 ndmalogqr (sess, " get_tape_info failed");
762 ndmca_opq_show_device_info (sess,
763 reply->config_info.tape_info.tape_info_val,
764 reply->config_info.tape_info.tape_info_len,
774 ndmca_opq_get_scsi_info (struct ndm_session *sess, struct ndmconn *conn)
778 NDMC_WITH_VOID_REQUEST(ndmp9_config_get_scsi_info, NDMP9VER)
779 rc = NDMC_CALL(conn);
781 ndmalogqr (sess, " get_scsi_info failed");
784 ndmca_opq_show_device_info (sess,
785 reply->config_info.scsi_info.scsi_info_val,
786 reply->config_info.scsi_info.scsi_info_len,
795 #endif /* !NDMOS_EFFECT_NO_NDMP3_NOR_NDMP4 */
798 ndmalogqr (struct ndm_session *sess, char *fmt, ...)
803 ndmalogfv (sess, "QR", 0, fmt, ap);
806 #endif /* !NDMOS_OPTION_NO_CONTROL_AGENT */