1 /*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21 /*
22 * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
23 * Use is subject to license terms.
24 */
25
26
27
28
29 /*
30 * I18N message number ranges
31 * This file: 10000 - 10499
32 * Shared common messages: 1 - 1999
33 */
34
35 /* #define _POSIX_SOURCE 1 */
36
37
38 /* Includes */
39 #include <stdlib.h>
40 #include <stdio.h>
41 #include <fcntl.h>
42 #include <nl_types.h>
43 #include <sys/scsi/scsi.h>
44 #include <string.h>
45 #include <errno.h>
46 #include "common.h"
47 #include "errorcodes.h"
48
49
50
51 /* Defines */
52 #define MAXLEN 1000
53
54 /*
55 * Allocate space for and return a pointer to a string
56 * on the stack. If the string is null, create
57 * an empty string.
58 */
59 char *
alloc_string(char * s)60 alloc_string(char *s)
61 {
62 char *ns;
63
64 if (s == (char *)NULL) {
65 ns = (char *)calloc(1, 1);
66 } else {
67 ns = (char *)calloc(1, strlen(s) + 1);
68 if (ns != NULL) {
69 (void) strncpy(ns, s, (strlen(s) + 1));
70 }
71 }
72 return (ns);
73 }
74
75
76 /*
77 * Decodes the SCSI sense byte to a string.
78 *
79 * RETURNS:
80 * character string
81 */
82 static char *
decode_sense_byte(uchar_t status)83 decode_sense_byte(uchar_t status)
84 {
85 switch (status & STATUS_MASK) {
86 case STATUS_GOOD:
87 return (MSGSTR(10000, "Good status"));
88
89 case STATUS_CHECK:
90 return (MSGSTR(128, "Check condition"));
91
92 case STATUS_MET:
93 return (MSGSTR(124, "Condition met"));
94
95 case STATUS_BUSY:
96 return (MSGSTR(37, "Busy"));
97
98 case STATUS_INTERMEDIATE:
99 return (MSGSTR(10001, "Intermediate"));
100
101 case STATUS_INTERMEDIATE_MET:
102 return (MSGSTR(10002, "Intermediate - condition met"));
103
104 case STATUS_RESERVATION_CONFLICT:
105 return (MSGSTR(10003, "Reservation_conflict"));
106
107 case STATUS_TERMINATED:
108 return (MSGSTR(126, "Command terminated"));
109
110 case STATUS_QFULL:
111 return (MSGSTR(83, "Queue full"));
112
113 default:
114 return (MSGSTR(4, "Unknown status"));
115 }
116 }
117
118
119 /*
120 * This function finds a predefined error string to a given
121 * error number (errornum), allocates memory for the string
122 * and returns the corresponding error message to the caller.
123 *
124 * RETURNS
125 * error string if O.K.
126 * NULL otherwise
127 */
128 char
get_errString(int errornum)129 *get_errString(int errornum)
130 {
131 char err_msg[MAXLEN], *errStrg;
132
133 err_msg[0] = '\0'; /* Just in case */
134 if (errornum < L_BASE) {
135 /* Some sort of random system error most likely */
136 errStrg = strerror(errno);
137 if (errStrg != NULL) {
138 (void) strcpy(err_msg, errStrg);
139 } else { /* Something's _really_ messed up */
140 (void) sprintf(err_msg,
141 MSGSTR(10081,
142 " Error: could not decode the"
143 " error message.\n"
144 " The given error message is not"
145 " defined in the library.\n"
146 " Message number: %d.\n"), errornum);
147 }
148
149 /* Make sure ALL CASES set err_msg to something */
150 } else switch (errornum) {
151 case L_SCSI_ERROR:
152 (void) sprintf(err_msg,
153 MSGSTR(10096,
154 " Error: SCSI failure."));
155 break;
156
157 case L_PR_INVLD_TRNSFR_LEN:
158 (void) sprintf(err_msg,
159 MSGSTR(10005,
160 " Error: Persistant Reserve command"
161 " transfer length not word aligned."));
162 break;
163
164 case L_RD_NO_DISK_ELEM:
165 (void) sprintf(err_msg,
166 MSGSTR(10006,
167 " Error: Could not find the disk elements"
168 " in the Receive Diagnostic pages."));
169 break;
170
171 case L_RD_INVLD_TRNSFR_LEN:
172 (void) sprintf(err_msg,
173 MSGSTR(10007,
174 " Error: Receive Diagnostic command"
175 " transfer length not word aligned."));
176 break;
177
178 case L_ILLEGAL_MODE_SENSE_PAGE:
179 (void) sprintf(err_msg,
180 MSGSTR(10008,
181 " Error: Programming error - "
182 "illegal Mode Sense parameter."));
183 break;
184
185 case L_INVALID_NO_OF_ENVSEN_PAGES:
186 (void) sprintf(err_msg,
187 MSGSTR(10009,
188 " Error: Invalid no. of sense pages.\n"
189 " Could not get valid sense page"
190 " information from the device."));
191 break;
192
193 case L_INVALID_BUF_LEN:
194 (void) sprintf(err_msg,
195 MSGSTR(10010,
196 " Error: Invalid buffer length.\n"
197 " Could not get diagnostic "
198 " information from the device."));
199 break;
200
201 case L_INVALID_PATH:
202 (void) sprintf(err_msg,
203 MSGSTR(113,
204 " Error: Invalid pathname"));
205 break;
206
207 case L_NO_PHYS_PATH:
208 (void) sprintf(err_msg,
209 MSGSTR(10011,
210 " Error: Could not get"
211 " physical path to the device."));
212 break;
213
214 case L_NO_SES_PATH:
215 (void) sprintf(err_msg,
216 MSGSTR(10098,
217 " Error: No SES found"
218 " for the device path."));
219 break;
220
221 case L_INVLD_PATH_NO_SLASH_FND:
222 (void) sprintf(err_msg,
223 MSGSTR(10012,
224 "Error in the device physical path."));
225 break;
226
227 case L_INVLD_PATH_NO_ATSIGN_FND:
228 (void) sprintf(err_msg,
229 MSGSTR(10013,
230 " Error in the device physical path:"
231 " no @ found."));
232 break;
233
234 case L_INVALID_SLOT:
235 (void) sprintf(err_msg,
236 MSGSTR(10014,
237 " Error: Invalid path format."
238 " Invalid slot."));
239 break;
240
241 case L_INVALID_LED_RQST:
242 (void) sprintf(err_msg,
243 MSGSTR(10015,
244 " Error: Invalid LED request."));
245 break;
246
247 case L_INVALID_PATH_FORMAT:
248 (void) sprintf(err_msg,
249 MSGSTR(10016,
250 " Error: Invalid path format."));
251 break;
252
253 case L_OPEN_PATH_FAIL:
254 (void) sprintf(err_msg,
255 MSGSTR(10017,
256 " Error opening the path."));
257 break;
258
259 case L_INVALID_PASSWORD_LEN:
260 (void) sprintf(err_msg,
261 MSGSTR(10018,
262 "Error: Invalid password length."));
263 break;
264
265 case L_INVLD_PHYS_PATH_TO_DISK:
266 (void) sprintf(err_msg,
267 MSGSTR(10019,
268 " Error: Physical path not of a disk."));
269 break;
270
271 case L_INVLD_ID_FOUND:
272 (void) sprintf(err_msg,
273 MSGSTR(10020,
274 " Error in the device physical path:"
275 " Invalid ID found in the path."));
276 break;
277
278 case L_INVLD_WWN_FORMAT:
279 (void) sprintf(err_msg,
280 MSGSTR(10021,
281 " Error in the device physical path:"
282 " Invalid wwn format."));
283
284 break;
285
286 case L_NO_VALID_PATH:
287 (void) sprintf(err_msg,
288 MSGSTR(10022,
289 " Error: Could not find valid path to"
290 " the device."));
291 break;
292
293 case L_NO_WWN_FOUND_IN_PATH:
294 (void) sprintf(err_msg,
295 MSGSTR(10023,
296 " Error in the device physical path:"
297 " No WWN found."));
298
299 break;
300
301 case L_NO_NODE_WWN_IN_WWNLIST:
302 (void) sprintf(err_msg,
303 MSGSTR(10024,
304 " Error: Device's Node WWN is not"
305 " found in the WWN list.\n"));
306 break;
307
308 case L_NO_NODE_WWN_IN_BOXLIST:
309 (void) sprintf(err_msg,
310 MSGSTR(10025,
311 " Error: Device's Node WWN is not"
312 " found in the Box list.\n"));
313 break;
314
315 case L_NULL_WWN_LIST:
316 (void) sprintf(err_msg,
317 MSGSTR(10026,
318 " Error: Null WWN list found."));
319 break;
320
321 case L_NO_LOOP_ADDRS_FOUND:
322 (void) sprintf(err_msg,
323 MSGSTR(10027,
324 " Error: Could not find the loop address for "
325 " the device at physical path."));
326
327 break;
328
329 case L_INVLD_PORT_IN_PATH:
330 (void) sprintf(err_msg,
331 MSGSTR(10028,
332 "Error in the device physical path:"
333 " Invalid port number found."
334 " (Should be 0 or 1)."));
335
336 break;
337
338 case L_INVALID_LOOP_MAP:
339 (void) sprintf(err_msg,
340 MSGSTR(10029,
341 "Error: Invalid loop map found."));
342 break;
343
344 case L_SFIOCGMAP_IOCTL_FAIL:
345 (void) sprintf(err_msg,
346 MSGSTR(10030,
347 " Error: SFIOCGMAP ioctl failed."
348 " Cannot read loop map."));
349 break;
350
351 case L_FCIO_GETMAP_IOCTL_FAIL:
352 (void) sprintf(err_msg,
353 MSGSTR(10031,
354 " Error: FCIO_GETMAP ioctl failed."
355 " Cannot read loop map."));
356 break;
357
358 case L_FCIO_LINKSTATUS_FAILED:
359 (void) sprintf(err_msg,
360 MSGSTR(10032,
361 " Error: FCIO_LINKSTATUS ioctl failed."
362 " Cannot read loop map."));
363 break;
364
365 case L_FCIOGETMAP_INVLD_LEN:
366 (void) sprintf(err_msg,
367 MSGSTR(10033,
368 " Error: FCIO_GETMAP ioctl returned"
369 " an invalid parameter:"
370 " # entries to large."));
371 break;
372
373 case L_FCIO_FORCE_LIP_FAIL:
374 (void) sprintf(err_msg,
375 MSGSTR(10034,
376 " Error: FCIO_FORCE_LIP ioctl failed."));
377 break;
378
379 case L_FCIO_FORCE_LIP_PARTIAL_FAIL:
380 (void) sprintf(err_msg,
381 MSGSTR(10115,
382 " Error: FCIO_FORCE_LIP ioctl failed on one"
383 " or more (but not all) of the paths."));
384 break;
385
386 case L_DWNLD_CHKSUM_FAILED:
387 (void) sprintf(err_msg,
388 MSGSTR(10035,
389 "Error: Download file checksum failed."));
390
391 break;
392
393 case L_DWNLD_READ_HEADER_FAIL:
394 (void) sprintf(err_msg,
395 MSGSTR(10036,
396 " Error: Reading download file exec"
397 " header failed."));
398 break;
399
400 case L_DWNLD_READ_INCORRECT_BYTES:
401 (void) sprintf(err_msg,
402 MSGSTR(10037,
403 " Error: Incorrect number of bytes read."));
404 break;
405
406 case L_DWNLD_INVALID_TEXT_SIZE:
407 (void) sprintf(err_msg,
408 MSGSTR(10038,
409 " Error: Reading text segment: "
410 " Found wrong size."));
411 break;
412
413 case L_DWNLD_READ_ERROR:
414 (void) sprintf(err_msg,
415 MSGSTR(10039,
416 " Error: Failed to read download file."));
417 break;
418
419 case L_DWNLD_BAD_FRMWARE:
420 (void) sprintf(err_msg,
421 MSGSTR(10040,
422 " Error: Bad Firmware MAGIC."));
423 break;
424
425 case L_DWNLD_TIMED_OUT:
426 (void) sprintf(err_msg,
427 MSGSTR(10041,
428 " Error: Timed out in 5 minutes"
429 " waiting for the"
430 " IB to become available."));
431 break;
432
433 case L_REC_DIAG_PG1:
434 (void) sprintf(err_msg,
435 MSGSTR(10042,
436 " Error parsing the Receive"
437 " diagnostic page."));
438 break;
439
440 case L_TRANSFER_LEN:
441 (void) sprintf(err_msg,
442 MSGSTR(10043, " "));
443 break;
444
445 case L_REQUIRE_FILE:
446 (void) sprintf(err_msg,
447 MSGSTR(10109,
448 " Error: No default file. You must specify"
449 " the filename path."));
450 break;
451
452 case L_MALLOC_FAILED:
453 (void) sprintf(err_msg,
454 MSGSTR(10,
455 " Error: Unable to allocate memory."));
456 break;
457
458 case L_LOCALTIME_ERROR:
459 (void) sprintf(err_msg,
460 MSGSTR(10044,
461 " Error: Could not convert time"
462 " to broken-down time: Hrs/Mins/Secs."));
463 break;
464
465 case L_SELECT_ERROR:
466 (void) sprintf(err_msg,
467 MSGSTR(10045,
468 " select() error during retry:"
469 " Could not wait for"
470 " specified time."));
471 break;
472
473 case L_NO_DISK_DEV_FOUND:
474 (void) sprintf(err_msg,
475 MSGSTR(10046,
476 " Error: No disk devices found"
477 " in the /dev/rdsk"
478 " directory."));
479 break;
480
481 case L_NO_TAPE_DEV_FOUND:
482 (void) sprintf(err_msg,
483 MSGSTR(10047,
484 " Error: No tape devices found"
485 " in the /dev/rmt"
486 " directory."));
487 break;
488
489 case L_LSTAT_ERROR:
490 (void) sprintf(err_msg,
491 MSGSTR(10048,
492 " lstat() error: Cannot obtain status"
493 " for the device."));
494 break;
495
496 case L_SYMLINK_ERROR:
497 (void) sprintf(err_msg,
498 MSGSTR(10049,
499 " Error: Could not read the symbolic link."));
500 break;
501
502 case L_UNAME_FAILED:
503 (void) sprintf(err_msg,
504 MSGSTR(10050,
505 " uname() error: Could not obtain the"
506 " architeture of the host machine."));
507 break;
508
509 case L_DRVCONFIG_ERROR:
510 (void) sprintf(err_msg,
511 MSGSTR(10051,
512 " Error: Could not run drvconfig."));
513 break;
514
515 case L_DISKS_ERROR:
516 (void) sprintf(err_msg,
517 MSGSTR(10052,
518 " Error: Could not run disks."));
519 break;
520
521 case L_DEVLINKS_ERROR:
522 (void) sprintf(err_msg,
523 MSGSTR(10053,
524 " Error: Could not run devlinks."));
525 break;
526
527 case L_READ_DEV_DIR_ERROR:
528 (void) sprintf(err_msg,
529 MSGSTR(10054,
530 " Error: Could not read /dev/rdsk"
531 " directory."));
532 break;
533
534 case L_OPEN_ES_DIR_FAILED:
535 (void) sprintf(err_msg,
536 MSGSTR(10055,
537 " Error: Could not open /dev/es"
538 " directory."));
539 break;
540
541 case L_LSTAT_ES_DIR_ERROR:
542 (void) sprintf(err_msg,
543 MSGSTR(10056,
544 " lstat() error: Could not get status"
545 " for /dev/es directory."));
546 break;
547
548 case L_DEV_BUSY:
549 (void) sprintf(err_msg,
550 MSGSTR(10057,
551 " Error: Could not offline the device\n"
552 " May be Busy."));
553 break;
554
555 case L_EXCL_OPEN_FAILED:
556 (void) sprintf(err_msg,
557 MSGSTR(10058,
558 " Error: Could not open device in"
559 " exclusive mode."
560 " May already be open."));
561 break;
562
563 case L_DEVICE_RESERVED:
564 (void) sprintf(err_msg,
565 MSGSTR(10059,
566 " Error: Disk is reserved."));
567 break;
568
569 case L_DISKS_RESERVED:
570 (void) sprintf(err_msg,
571 MSGSTR(10060,
572 " Error: One or more disks in"
573 " SENA are reserved."));
574 break;
575
576 case L_SLOT_EMPTY:
577 (void) sprintf(err_msg,
578 MSGSTR(10061,
579 " Error: Slot is empty."));
580 break;
581
582 case L_ACQUIRE_FAIL:
583 (void) sprintf(err_msg,
584 MSGSTR(10062,
585 " Error: Could not acquire"
586 " the device."));
587 break;
588
589 case L_POWER_OFF_FAIL_BUSY:
590 (void) sprintf(err_msg,
591 MSGSTR(10063,
592 " Error: Could not power off the device.\n"
593 " May be Busy."));
594 break;
595
596 case L_ENCL_NAME_CHANGE_FAIL:
597 (void) sprintf(err_msg,
598 MSGSTR(10064,
599 " Error: The Enclosure name change failed."));
600 break;
601
602 case L_DUPLICATE_ENCLOSURES:
603 (void) sprintf(err_msg,
604 MSGSTR(10065,
605 " Error: There are two or more enclosures"
606 " with the same name."
607 " Please use a logical or physical"
608 " pathname."));
609 break;
610
611 case L_INVALID_NUM_DISKS_ENCL:
612 (void) sprintf(err_msg,
613 MSGSTR(10066,
614 " Error: The number of disks in the"
615 " front & rear of the enclosure are"
616 " different."
617 " This is not a supported configuration."));
618 break;
619
620 case L_ENCL_INVALID_PATH:
621 (void) sprintf(err_msg,
622 MSGSTR(10067,
623 " Error: Invalid path."
624 " Device is not a SENA subsystem."));
625 break;
626
627 case L_NO_ENCL_LIST_FOUND:
628 (void) sprintf(err_msg,
629 MSGSTR(10068,
630 " Error: Cannot get the Box list."));
631 break;
632
633 case L_IB_NO_ELEM_FOUND:
634 (void) sprintf(err_msg,
635 MSGSTR(10069,
636 " Error: No elements returned from"
637 " enclosure (IB)."));
638 break;
639
640 case L_GET_STATUS_FAILED:
641 (void) sprintf(err_msg,
642 MSGSTR(10070,
643 " Error: Get status failed."));
644 break;
645
646 case L_RD_PG_MIN_BUFF:
647 (void) sprintf(err_msg,
648 MSGSTR(10071,
649 " Error: Reading page from IB.\n"
650 " Buffer size too small."));
651 break;
652
653 case L_RD_PG_INVLD_CODE:
654 (void) sprintf(err_msg,
655 MSGSTR(10072,
656 " Error: Reading page from IB\n"
657 " Invalid page code or page len found."));
658 break;
659
660 case L_BP_BUSY_RESERVED:
661 (void) sprintf(err_msg,
662 MSGSTR(10073,
663 " Error: There is a busy or reserved disk"
664 " attached to this backplane.\n"
665 " You must close the disk,\n"
666 " or release the disk,\n"
667 " or resubmit the command using"
668 " the Force option."));
669 break;
670
671 case L_BP_BUSY:
672 (void) sprintf(err_msg,
673 MSGSTR(10074,
674 " Error: There is a busy disk"
675 " attached to this backplane.\n"
676 " You must close the disk,\n"
677 " or resubmit the command using"
678 " the Force option."));
679 break;
680
681 case L_BP_RESERVED:
682 (void) sprintf(err_msg,
683 MSGSTR(10075,
684 " Error: There is a reserved disk"
685 " attached to this backplane.\n"
686 " You must release the disk,\n"
687 " or resubmit the subcommand using"
688 " the Force option."));
689 break;
690
691 case L_NO_BP_ELEM_FOUND:
692 (void) sprintf(err_msg,
693 MSGSTR(10076,
694 " Error: No Back plane elements found"
695 " in the enclosure."));
696 break;
697
698 case L_SSA_CONFLICT:
699 (void) sprintf(err_msg,
700 MSGSTR(10077,
701 " There is a conflict between the "
702 "enclosure name and an SSA name of "
703 "same form, cN.\n"
704 " Please use a logical or physical "
705 "pathname."));
706 break;
707
708 case L_WARNING:
709 (void) sprintf(err_msg,
710 MSGSTR(10078, " Warning:"));
711
712 break;
713
714 case L_TH_JOIN:
715 (void) sprintf(err_msg,
716 MSGSTR(10079,
717 " Error: Thread join failed."));
718 break;
719
720 case L_FCIO_RESET_LINK_FAIL:
721 (void) sprintf(err_msg,
722 MSGSTR(10082,
723 " Error: FCIO_RESET_LINK ioctl failed.\n"
724 " Could not reset the loop."));
725 break;
726
727 case L_FCIO_GET_FCODE_REV_FAIL:
728 (void) sprintf(err_msg,
729 MSGSTR(10083,
730 " Error: FCIO_GET_FCODE_REV ioctl failed.\n"
731 " Could not get the fcode version."));
732 break;
733
734 case L_FCIO_GET_FW_REV_FAIL:
735 (void) sprintf(err_msg,
736 MSGSTR(10084,
737 " Error: FCIO_GET_FW_REV ioctl failed.\n"
738 " Could not get the firmware revision."));
739 break;
740
741 case L_NO_DEVICES_FOUND:
742 (void) sprintf(err_msg,
743 MSGSTR(10085,
744 " No FC devices found."));
745 break;
746
747 case L_INVALID_DEVICE_COUNT:
748 (void) sprintf(err_msg,
749 MSGSTR(10086,
750 " Error: FCIO_GET_DEV_LIST ioctl returned"
751 " an invalid device count."));
752 break;
753
754 case L_FCIO_GET_NUM_DEVS_FAIL:
755 (void) sprintf(err_msg,
756 MSGSTR(10087,
757 " Error: FCIO_GET_NUM_DEVS ioctl failed.\n"
758 " Could not get the number of devices."));
759 break;
760
761 case L_FCIO_GET_DEV_LIST_FAIL:
762 (void) sprintf(err_msg,
763 MSGSTR(10088,
764 " Error: FCIO_GET_DEV_LIST ioctl failed.\n"
765 " Could not get the device list."));
766 break;
767
768 case L_FCIO_GET_LINK_STATUS_FAIL:
769 (void) sprintf(err_msg,
770 MSGSTR(10089,
771 " Error: FCIO_GET_LINK_STATUS ioctl failed.\n"
772 " Could not get the link status."));
773 break;
774
775 case L_PORT_OFFLINE_FAIL:
776 (void) sprintf(err_msg,
777 MSGSTR(10090,
778 " Error: ioctl to offline the port failed."));
779 break;
780
781 case L_PORT_OFFLINE_UNSUPPORTED:
782 (void) sprintf(err_msg,
783 MSGSTR(10091,
784 " Error: The driver does not support ioctl to"
785 " disable the FCA port."));
786 break;
787
788 case L_PORT_ONLINE_FAIL:
789 (void) sprintf(err_msg,
790 MSGSTR(10092,
791 " Error: ioctl to online the port failed."));
792 break;
793
794 case L_PORT_ONLINE_UNSUPPORTED:
795 (void) sprintf(err_msg,
796 MSGSTR(10093,
797 " Error: The driver does not support ioctl to"
798 " enable the FCA port."));
799 break;
800
801 case L_FCP_TGT_INQUIRY_FAIL:
802 (void) sprintf(err_msg,
803 MSGSTR(10094,
804 " Error: FCP_TGT_INQUIRY ioctl failed.\n"
805 " Could not get the target inquiry data"
806 " from FCP."));
807 break;
808
809 case L_FSTAT_ERROR:
810 (void) sprintf(err_msg,
811 MSGSTR(10095,
812 " fstat() error: Cannot obtain status"
813 " for the device."));
814 break;
815
816 case L_FCIO_GET_HOST_PARAMS_FAIL:
817 (void) sprintf(err_msg,
818 MSGSTR(10097,
819 " Error: FCIO_GET_HOST_PARAMS ioctl failed.\n"
820 " Could not get the host parameters."));
821 break;
822
823 case L_STAT_ERROR:
824 (void) sprintf(err_msg,
825 MSGSTR(10099,
826 " stat() error: Cannot obtain status"
827 " for the device."));
828 break;
829
830 case L_DEV_SNAPSHOT_FAILED:
831 (void) sprintf(err_msg,
832 MSGSTR(10100,
833 " Error: Could not retrieve device tree"
834 " snapshot."));
835 break;
836
837 case L_LOOPBACK_UNSUPPORTED:
838 (void) sprintf(err_msg,
839 MSGSTR(10101,
840 " Error: Loopback mode is unsupported for this"
841 " device."));
842 break;
843
844 case L_LOOPBACK_FAILED:
845 (void) sprintf(err_msg,
846 MSGSTR(10102,
847 " Error: Error occurred during loopback mode"
848 " set."));
849 break;
850
851 case L_FCIO_GET_TOPOLOGY_FAIL:
852 (void) sprintf(err_msg,
853 MSGSTR(10103,
854 " Error: FCIO_GET_TOPOLOGY ioctl failed.\n"
855 " Could not get the fca port topology."));
856 break;
857
858 case L_UNEXPECTED_FC_TOPOLOGY:
859 (void) sprintf(err_msg,
860 MSGSTR(10104,
861 " Error: Unexpected Fibre Channel topology"
862 " found."));
863 break;
864
865 case L_INVALID_PRIVATE_LOOP_ADDRESS:
866 (void) sprintf(err_msg,
867 MSGSTR(10105,
868 " Error: AL_PA is not a valid private loop"
869 " address."));
870 break;
871
872 case L_NO_FABRIC_ADDR_FOUND:
873 (void) sprintf(err_msg,
874 MSGSTR(10106,
875 " Error: Could not find the fabric address"
876 " for the device at physical path."));
877 break;
878
879 case L_INVALID_FABRIC_ADDRESS:
880 (void) sprintf(err_msg,
881 MSGSTR(10107,
882 " Error: Device port address on the Fabric"
883 " topology is not valid."));
884 break;
885
886 case L_PT_PT_FC_TOP_NOT_SUPPORTED:
887 (void) sprintf(err_msg,
888 MSGSTR(10108,
889 " Error: Point to Point Fibre Channel "
890 "topology is currently not supported."));
891 break;
892
893 case L_FCIO_DEV_LOGIN_FAIL:
894 (void) sprintf(err_msg,
895 MSGSTR(10310,
896 " Error: FCIO_DEV_LOGIN ioctl failed."));
897 break;
898
899 case L_FCIO_DEV_LOGOUT_FAIL:
900 (void) sprintf(err_msg,
901 MSGSTR(10311,
902 " Error: FCIO_DEV_LOGOUT ioctl failed."));
903 break;
904
905 case L_OPNOSUPP_ON_TOPOLOGY:
906 (void) sprintf(err_msg,
907 MSGSTR(10312,
908 " Error: operation not supported "
909 "on connected topology."));
910 break;
911
912 case L_INVALID_PATH_TYPE:
913 (void) sprintf(err_msg,
914 MSGSTR(10313,
915 " Error: operation not supported "
916 "on the path."));
917 break;
918
919 case L_FCIO_GET_STATE_FAIL:
920 (void) sprintf(err_msg,
921 MSGSTR(10314,
922 " Error: FCIO_GET_STATE ioctl failed."));
923 break;
924
925 case L_WWN_NOT_FOUND_IN_DEV_LIST:
926 (void) sprintf(err_msg,
927 MSGSTR(10315,
928 " Error: device WWN not found in "
929 "device list."));
930 break;
931
932 case L_STAT_RMT_DIR_ERROR:
933 (void) sprintf(err_msg,
934 MSGSTR(10110,
935 " stat() error: Could not get status"
936 " for /dev/rmt directory."));
937 break;
938
939 case L_STAT_DEV_DIR_ERROR:
940 (void) sprintf(err_msg,
941 MSGSTR(10111,
942 " stat() error: Could not get status"
943 " for /dev/dsk directory."));
944 break;
945
946 case L_PROM_INIT_FAILED:
947 (void) sprintf(err_msg,
948 MSGSTR(10234,
949 " Error: di_prom_init failure"));
950 break;
951
952 case L_PORT_DRIVER_NOT_FOUND:
953 (void) sprintf(err_msg,
954 MSGSTR(10113,
955 " Error: requested port driver"
956 " does not exist"));
957 break;
958
959 case L_PHYS_PATH_NOT_FOUND:
960 (void) sprintf(err_msg,
961 MSGSTR(10114,
962 " Error: requested phys path does not exist"));
963 break;
964
965 case L_GET_DEV_LIST_ULP_FAILURE:
966 (void) sprintf(err_msg,
967 MSGSTR(10150,
968 " Error: g_get_dev_list failed on ULP "
969 "processing of target device(s)"));
970 break;
971
972 case L_SCSI_VHCI_ERROR:
973 (void) sprintf(err_msg,
974 MSGSTR(10230,
975 " Error: Unable to perform failover"));
976 break;
977
978 case L_SCSI_VHCI_ALREADY_ACTIVE:
979 (void) sprintf(err_msg,
980 MSGSTR(10231,
981 " Error: Pathclass already active"));
982 break;
983
984 case L_NO_DEVID:
985 (void) sprintf(err_msg,
986 MSGSTR(10232,
987 " Error: No device identifier found"));
988 break;
989
990 case L_DRIVER_NOTSUPP:
991 (void) sprintf(err_msg,
992 MSGSTR(10233,
993 " Error: Driver not supported"));
994 break;
995
996 case L_PROC_WWN_ARG_ERROR:
997 (void) sprintf(err_msg,
998 MSGSTR(10235,
999 " Error: process WWN argument"));
1000 break;
1001
1002 case L_NO_WWN_PROP_FOUND:
1003 (void) sprintf(err_msg,
1004 MSGSTR(10236,
1005 " Error: WWN prop not found"));
1006 break;
1007
1008 case L_NO_DRIVER_NODES_FOUND:
1009 (void) sprintf(err_msg,
1010 MSGSTR(10237,
1011 " Error: Requested driver nodes not found"));
1012 break;
1013
1014 case L_INVALID_MAP_DEV_ADDR:
1015 (void) sprintf(err_msg,
1016 MSGSTR(10330,
1017 " Error: Invalid map device handle found"));
1018 break;
1019
1020 case L_INVALID_MAP_DEV_PROP_TYPE:
1021 (void) sprintf(err_msg,
1022 MSGSTR(10331,
1023 " Error: Invalid device property type found"));
1024 break;
1025
1026 case L_INVALID_MAP_DEV_PROP_NAME:
1027 (void) sprintf(err_msg,
1028 MSGSTR(10332,
1029 " Error: Invalid device property name found"));
1030 break;
1031
1032 case L_INVALID_MAP_DEV_PROP:
1033 (void) sprintf(err_msg,
1034 MSGSTR(10333,
1035 " Error: Invalid device property handle "
1036 "found"));
1037 break;
1038
1039 case L_SCSI_VHCI_NO_STANDBY:
1040 (void) sprintf(err_msg,
1041 MSGSTR(10334,
1042 " Error: Unable to perform failover, "
1043 "standby path unavailable"));
1044 break;
1045
1046 case L_SCSI_VHCI_FAILOVER_NOTSUP:
1047 (void) sprintf(err_msg,
1048 MSGSTR(10335,
1049 " Error: Device does not support failover"));
1050 break;
1051
1052 case L_SCSI_VHCI_FAILOVER_BUSY:
1053 (void) sprintf(err_msg,
1054 MSGSTR(10336,
1055 " Error: Failover currently in progress"));
1056 break;
1057
1058 case L_NO_SUCH_DEV_FOUND:
1059 (void) sprintf(err_msg,
1060 MSGSTR(10337,
1061 " Error: No such device found"));
1062 break;
1063
1064 case L_NO_SUCH_PROP_FOUND:
1065 (void) sprintf(err_msg,
1066 MSGSTR(10338,
1067 " Error: No such property found"));
1068 break;
1069
1070 case L_INVALID_ARG:
1071 (void) sprintf(err_msg,
1072 MSGSTR(10339,
1073 " Error: Invalid argument found"));
1074 break;
1075
1076 default:
1077
1078 if (((L_SCSI_ERROR ^ errornum) == STATUS_GOOD) ||
1079 ((L_SCSI_ERROR ^ errornum) == STATUS_BUSY) ||
1080 ((L_SCSI_ERROR ^ errornum) == STATUS_CHECK) ||
1081 ((L_SCSI_ERROR ^ errornum) == STATUS_MET) ||
1082 ((L_SCSI_ERROR ^ errornum) == STATUS_INTERMEDIATE) ||
1083 ((L_SCSI_ERROR ^ errornum) == STATUS_INTERMEDIATE_MET) ||
1084 ((L_SCSI_ERROR ^ errornum) == STATUS_RESERVATION_CONFLICT) ||
1085 ((L_SCSI_ERROR ^ errornum) == STATUS_TERMINATED) ||
1086 ((L_SCSI_ERROR ^ errornum) == STATUS_QFULL)) {
1087 (void) sprintf(err_msg,
1088 MSGSTR(10080,
1089 " SCSI Error - Sense Byte:(0x%x) %s \n"
1090 " Error: Retry failed."),
1091 (L_SCSI_ERROR ^ errornum) & STATUS_MASK,
1092 decode_sense_byte((uchar_t)L_SCSI_ERROR ^ errornum));
1093 } else {
1094 (void) sprintf(err_msg,
1095 MSGSTR(10081,
1096 " Error: could not decode the"
1097 " error message.\n"
1098 " The given error message is not"
1099 " defined in the library.\n"
1100 " Message number: %d.\n"), errornum);
1101 }
1102
1103 } /* end of switch */
1104
1105 errStrg = alloc_string(err_msg);
1106
1107 return (errStrg);
1108 }
1109