xref: /illumos-gate/usr/src/cmd/luxadm/errormsgs.c (revision fcf3ce44)
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