7712 mandoc -Tlint does always exit with error code 0
[unleashed.git] / usr / src / lib / lvm / libmeta / common / meta_error.c
blob4f1f67fa590f84dc148ee9929bd45ab088c95370
1 /*
2 * CDDL HEADER START
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.
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.
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]
19 * CDDL HEADER END
22 * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
23 * Use is subject to license terms.
26 #pragma ident "%Z%%M% %I% %E% SMI"
29 * Just in case we're not in a build environment, make sure that
30 * TEXT_DOMAIN gets set to something.
32 #if !defined(TEXT_DOMAIN)
33 #define TEXT_DOMAIN "SYS_TEST"
34 #endif
37 * print metedevice errors
40 #include <meta.h>
41 #include <sys/lvm/md_mddb.h>
43 #include <syslog.h>
46 * clear error
48 void
49 mdclrerror(
50 md_error_t *ep
53 if (ep->name != NULL)
54 Free(ep->name);
55 if (ep->host != NULL)
56 Free(ep->host);
57 if (ep->extra != NULL)
58 Free(ep->extra);
59 (void) memset(ep, '\0', sizeof (*ep));
63 * cook names
65 static char *
66 md_name(
67 minor_t mnum
70 char *name;
72 /* get name, or fake it */
73 if ((name = get_mdname(NULL, mnum)) == NULL) {
74 char buf[40];
76 (void) sprintf(buf, "%lu/%lu", MD_MIN2SET(mnum),
77 MD_MIN2UNIT(mnum));
78 return (Strdup(buf));
80 return (Strdup(name));
83 static char *
84 dev_name(
85 set_t setno,
86 md_dev64_t dev
89 char *name;
91 /* get name or fake it */
92 if (dev == NODEV64)
93 return (Strdup(dgettext(TEXT_DOMAIN, "unknown device")));
94 if ((name = get_devname(setno, dev)) == NULL) {
95 char buf[40];
97 (void) sprintf(buf, "%lu.%lu", meta_getmajor(dev),
98 meta_getminor(dev));
99 return (Strdup(buf));
101 return (Strdup(name));
104 static char *
105 hsp_name(
106 hsp_t hsp
109 char *name;
111 if ((name = get_hspname(NULL, hsp)) == NULL) {
112 char buf[40];
114 (void) sprintf(buf, "%u/%u", HSP_SET(hsp), HSP_ID(hsp));
115 return (Strdup(buf));
117 return (Strdup(name));
120 static char *
121 set_name(
122 set_t setno
125 mdsetname_t *sp;
126 md_error_t xep = mdnullerror;
128 if (setno == MD_SET_BAD)
129 return (NULL);
131 if ((sp = metasetnosetname(setno, &xep)) == NULL) {
132 char buf[40];
134 mdclrerror(&xep);
135 (void) sprintf(buf, "setno %u", setno);
136 return (Strdup(buf));
138 return (Strdup(sp->setname));
142 * fill in all the appropriate md_error_t fields
144 static void
145 metacookerror(
146 md_error_t *ep, /* generic error */
147 char *name /* optional name or host */
150 /* get host name */
151 if (ep->host != NULL) {
152 Free(ep->host);
153 ep->host = NULL;
155 if ((ep->info.errclass == MDEC_RPC) &&
156 (name != NULL) && (*name != '\0')) {
157 ep->host = Strdup(name);
158 name = NULL;
159 } else
160 ep->host = Strdup(mynode());
162 /* get appropriate name */
163 if (ep->name != NULL) {
164 Free(ep->name);
165 ep->name = NULL;
167 if ((name != NULL) && (*name != '\0')) {
168 ep->name = Strdup(name);
169 } else {
170 switch (ep->info.errclass) {
172 /* can't do anything about these */
173 case MDEC_VOID:
174 case MDEC_SYS:
175 case MDEC_RPC:
176 default:
177 break;
179 /* device name */
180 case MDEC_DEV:
182 md_dev_error_t *ip =
183 &ep->info.md_error_info_t_u.dev_error;
185 ep->name = dev_name(MD_SET_BAD, ip->dev);
186 break;
189 /* device name */
190 case MDEC_USE:
192 md_use_error_t *ip =
193 &ep->info.md_error_info_t_u.use_error;
195 ep->name = dev_name(MD_SET_BAD, ip->dev);
196 if (ip->where == NULL) {
197 ip->where = Strdup(dgettext(TEXT_DOMAIN,
198 "unknown"));
200 break;
203 /* metadevice name */
204 case MDEC_MD:
206 md_md_error_t *ip =
207 &ep->info.md_error_info_t_u.md_error;
209 ep->name = md_name(ip->mnum);
210 break;
213 /* component name */
214 case MDEC_COMP:
216 md_comp_error_t *ip =
217 &ep->info.md_error_info_t_u.comp_error;
218 char *mdname, *devname;
219 size_t len;
221 mdname = md_name(ip->comp.mnum);
222 devname = dev_name(MD_MIN2SET(ip->comp.mnum),
223 ip->comp.dev);
224 len = strlen(mdname) + strlen(": ")
225 + strlen(devname) + 1;
226 ep->name = Malloc(len);
227 (void) snprintf(ep->name, len, "%s: %s",
228 mdname, devname);
229 Free(mdname);
230 Free(devname);
231 break;
234 /* hotspare pool name */
235 case MDEC_HSP:
237 md_hsp_error_t *ip =
238 &ep->info.md_error_info_t_u.hsp_error;
240 ep->name = hsp_name(ip->hsp);
241 break;
244 /* hotspare name */
245 case MDEC_HS:
247 md_hs_error_t *ip =
248 &ep->info.md_error_info_t_u.hs_error;
249 char *hspname, *devname;
250 size_t len;
252 hspname = hsp_name(ip->hs.hsp);
253 devname = dev_name(HSP_SET(ip->hs.hsp), ip->hs.dev);
254 len = strlen(hspname) + strlen(": ")
255 + strlen(devname) + 1;
256 ep->name = Malloc(len);
257 (void) snprintf(ep->name, len, "%s: %s",
258 hspname, devname);
259 Free(hspname);
260 Free(devname);
261 break;
264 /* mddb name */
265 case MDEC_MDDB:
267 md_mddb_error_t *ip =
268 &ep->info.md_error_info_t_u.mddb_error;
269 if (ip->mnum != NODEV32)
270 ep->name = md_name(ip->mnum);
271 ep->name = set_name(ip->setno);
272 break;
275 /* set name */
276 case MDEC_DS:
278 md_ds_error_t *ip =
279 &ep->info.md_error_info_t_u.ds_error;
281 ep->name = set_name(ip->setno);
282 break;
289 * simple error
292 mderror(
293 md_error_t *ep,
294 md_void_errno_t errnum,
295 char *name
298 md_void_error_t *ip = &ep->info.md_error_info_t_u.void_error;
300 mdclrerror(ep);
301 ep->info.errclass = MDEC_VOID;
302 ip->errnum = errnum;
304 metacookerror(ep, name);
305 return (-1);
309 * system error
312 mdsyserror(
313 md_error_t *ep,
314 int errnum,
315 char *name
318 md_sys_error_t *ip = &ep->info.md_error_info_t_u.sys_error;
320 mdclrerror(ep);
321 if (errnum != 0) {
322 ep->info.errclass = MDEC_SYS;
323 ip->errnum = errnum;
326 metacookerror(ep, name);
327 return (-1);
331 * RPC error
334 mdrpcerror(
335 md_error_t *ep,
336 CLIENT *clntp,
337 char *host,
338 char *extra
341 md_rpc_error_t *ip = &ep->info.md_error_info_t_u.rpc_error;
342 struct rpc_err rpcerr;
344 mdclrerror(ep);
345 clnt_geterr(clntp, &rpcerr);
346 ep->info.errclass = MDEC_RPC;
347 ip->errnum = rpcerr.re_status;
349 metacookerror(ep, host);
350 mderrorextra(ep, extra);
351 return (-1);
355 * RPC create error
358 mdrpccreateerror(
359 md_error_t *ep,
360 char *host,
361 char *extra
364 md_rpc_error_t *ip = &ep->info.md_error_info_t_u.rpc_error;
366 mdclrerror(ep);
367 ep->info.errclass = MDEC_RPC;
368 ip->errnum = rpc_createerr.cf_stat;
370 metacookerror(ep, host);
371 mderrorextra(ep, extra);
372 return (-1);
376 * device error
379 mddeverror(
380 md_error_t *ep,
381 md_dev_errno_t errnum,
382 md_dev64_t dev,
383 char *name
386 md_dev_error_t *ip = &ep->info.md_error_info_t_u.dev_error;
388 mdclrerror(ep);
389 ep->info.errclass = MDEC_DEV;
390 ip->errnum = errnum;
391 ip->dev = dev;
393 metacookerror(ep, name);
394 return (-1);
398 * use error
401 mduseerror(
402 md_error_t *ep,
403 md_use_errno_t errnum,
404 md_dev64_t dev,
405 char *where,
406 char *name
409 md_use_error_t *ip = &ep->info.md_error_info_t_u.use_error;
411 assert(where != NULL);
412 mdclrerror(ep);
413 ep->info.errclass = MDEC_USE;
414 ip->errnum = errnum;
415 ip->dev = dev;
416 ip->where = Strdup(where);
418 metacookerror(ep, name);
419 return (-1);
423 * overlap error
426 mdoverlaperror(
427 md_error_t *ep,
428 md_overlap_errno_t errnum,
429 char *name,
430 char *where,
431 char *overlap
434 md_overlap_error_t *ip =
435 &ep->info.md_error_info_t_u.overlap_error;
437 assert(overlap != NULL);
438 mdclrerror(ep);
439 ep->info.errclass = MDEC_OVERLAP;
440 ip->errnum = errnum;
441 ip->overlap = Strdup(overlap);
442 ip->where = NULL;
443 if (where != NULL)
444 ip->where = Strdup(where);
446 metacookerror(ep, name);
447 return (-1);
451 * metadevice error
454 mdmderror(
455 md_error_t *ep,
456 md_md_errno_t errnum,
457 minor_t mnum,
458 char *name
461 md_md_error_t *ip = &ep->info.md_error_info_t_u.md_error;
463 mdclrerror(ep);
464 ep->info.errclass = MDEC_MD;
465 ip->errnum = errnum;
466 ip->mnum = mnum;
468 metacookerror(ep, name);
469 return (-1);
473 * component error
476 mdcomperror(
477 md_error_t *ep,
478 md_comp_errno_t errnum,
479 minor_t mnum,
480 md_dev64_t dev,
481 char *name
484 md_comp_error_t *ip = &ep->info.md_error_info_t_u.comp_error;
486 mdclrerror(ep);
487 ep->info.errclass = MDEC_COMP;
488 ip->errnum = errnum;
489 ip->comp.mnum = mnum;
490 ip->comp.dev = dev;
492 metacookerror(ep, name);
493 return (-1);
497 * hotspare pool error
500 mdhsperror(
501 md_error_t *ep,
502 md_hsp_errno_t errnum,
503 hsp_t hsp,
504 char *name
507 md_hsp_error_t *ip = &ep->info.md_error_info_t_u.hsp_error;
509 mdclrerror(ep);
510 ep->info.errclass = MDEC_HSP;
511 ip->errnum = errnum;
512 ip->hsp = hsp;
514 metacookerror(ep, name);
515 return (-1);
519 * hotspare error
522 mdhserror(
523 md_error_t *ep,
524 md_hs_errno_t errnum,
525 hsp_t hsp,
526 md_dev64_t dev,
527 char *name
530 md_hs_error_t *ip = &ep->info.md_error_info_t_u.hs_error;
532 mdclrerror(ep);
533 ep->info.errclass = MDEC_HS;
534 ip->errnum = errnum;
535 ip->hs.hsp = hsp;
536 ip->hs.dev = dev;
538 metacookerror(ep, name);
539 return (-1);
543 * MDDB error
546 mdmddberror(
547 md_error_t *ep,
548 md_mddb_errno_t errnum,
549 minor_t mnum,
550 set_t setno,
551 size_t size,
552 char *name
555 md_mddb_error_t *ip = &ep->info.md_error_info_t_u.mddb_error;
557 mdclrerror(ep);
558 ep->info.errclass = MDEC_MDDB;
559 ip->errnum = errnum;
560 ip->mnum = mnum;
561 ip->setno = setno;
562 ip->size = size;
564 metacookerror(ep, name);
565 return (-1);
569 * metadevice diskset (ds) error
572 mddserror(
573 md_error_t *ep,
574 md_ds_errno_t errnum,
575 set_t setno,
576 char *node,
577 char *drive,
578 char *name
581 md_ds_error_t *ip = &ep->info.md_error_info_t_u.ds_error;
583 mdclrerror(ep);
584 ep->info.errclass = MDEC_DS;
585 ip->errnum = errnum;
586 ip->setno = setno;
587 ip->node = ((node != NULL) ? Strdup(node) : NULL);
588 ip->drive = ((drive != NULL) ? Strdup(drive) : NULL);
590 metacookerror(ep, name);
591 return (-1);
595 * clear/attach extra context information
597 void
598 mderrorextra(
599 md_error_t *ep,
600 char *extra
603 if (ep->extra != NULL)
604 Free(ep->extra);
605 if (extra != NULL)
606 ep->extra = Strdup(extra);
607 else
608 ep->extra = NULL;
612 * steal (copy) an error code safely
615 mdstealerror(
616 md_error_t *to,
617 md_error_t *from
620 mdclrerror(to);
621 *to = *from;
622 (void) memset(from, '\0', sizeof (*from));
623 return (-1);
627 * do an ioctl, cook the error, and return status
630 metaioctl(
631 int cmd,
632 void *data,
633 md_error_t *ep,
634 char *name
637 int fd;
639 /* open admin device */
640 if ((fd = open_admin(ep)) < 0)
641 return (-1);
643 /* do ioctl */
644 mdclrerror(ep);
645 if (ioctl(fd, cmd, data) != 0) {
646 return (mdsyserror(ep, errno, name));
647 } else if (! mdisok(ep)) {
648 metacookerror(ep, name);
649 return (-1);
652 /* return success */
653 return (0);
657 * print void class errors
659 static char *
660 void_to_str(
661 md_error_t *ep,
662 char *buf,
663 size_t size
666 md_void_error_t *ip = &ep->info.md_error_info_t_u.void_error;
667 char *p = buf + strlen(buf);
668 size_t psize = size - strlen(buf);
670 switch (ip->errnum) {
671 case MDE_NONE:
672 (void) snprintf(p, psize,
673 dgettext(TEXT_DOMAIN, "no error"));
674 break;
675 case MDE_UNIT_NOT_FOUND:
676 (void) snprintf(p, psize,
677 dgettext(TEXT_DOMAIN, "unit not found"));
678 break;
679 case MDE_DUPDRIVE:
680 (void) snprintf(p, psize,
681 dgettext(TEXT_DOMAIN, "drive specified more than once"));
682 break;
683 case MDE_INVAL_HSOP:
684 (void) snprintf(p, psize,
685 dgettext(TEXT_DOMAIN, "illegal hot spare operation"));
686 break;
687 case MDE_NO_SET:
688 (void) snprintf(p, psize,
689 dgettext(TEXT_DOMAIN, "no such set"));
690 break;
691 case MDE_SET_DIFF:
692 (void) snprintf(p, psize,
693 dgettext(TEXT_DOMAIN, "set name is inconsistent"));
694 break;
695 case MDE_BAD_RD_OPT:
696 (void) snprintf(p, psize,
697 dgettext(TEXT_DOMAIN, "invalid read option"));
698 break;
699 case MDE_BAD_WR_OPT:
700 (void) snprintf(p, psize,
701 dgettext(TEXT_DOMAIN, "invalid write option"));
702 break;
703 case MDE_BAD_PASS_NUM:
704 (void) snprintf(p, psize,
705 dgettext(TEXT_DOMAIN, "invalid pass number"));
706 break;
707 case MDE_BAD_RESYNC_OPT:
708 (void) snprintf(p, psize,
709 dgettext(TEXT_DOMAIN, "invalid resync option"));
710 break;
711 case MDE_BAD_INTERLACE:
712 (void) snprintf(p, psize,
713 dgettext(TEXT_DOMAIN, "invalid interlace"));
714 break;
715 case MDE_NO_HSPS:
716 (void) snprintf(p, psize,
717 dgettext(TEXT_DOMAIN, "no hotspare pools found"));
718 break;
719 case MDE_NOTENOUGH_DB:
720 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
721 "must have at least 1 database (-f overrides)"));
722 break;
723 case MDE_DELDB_NOTALLOWED:
724 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
725 "cannot delete the last database replica in the diskset"));
726 break;
727 case MDE_DEL_VALIDDB_NOTALLOWED:
728 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
729 "Deleting specified valid replicas results in stale "
730 "state database. Configuration changes with stale "
731 "database result in panic(-f overrides)"));
732 break;
733 case MDE_SYSTEM_FILE:
734 (void) snprintf(p, psize,
735 dgettext(TEXT_DOMAIN, "error in system file"));
736 break;
737 case MDE_MDDB_FILE:
738 (void) snprintf(p, psize,
739 dgettext(TEXT_DOMAIN, "error in mddb.cf file"));
740 break;
741 case MDE_MDDB_CKSUM:
742 (void) snprintf(p, psize,
743 dgettext(TEXT_DOMAIN, "checksum error in mddb.cf file"));
744 break;
745 case MDE_VFSTAB_FILE:
746 (void) snprintf(p, psize,
747 dgettext(TEXT_DOMAIN, "error in vfstab file"));
748 break;
749 case MDE_NOSLICE:
750 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
751 "invalid slice number for drive name"));
752 break;
753 case MDE_SYNTAX:
754 (void) snprintf(p, psize,
755 dgettext(TEXT_DOMAIN, "syntax error"));
756 break;
757 case MDE_OPTION:
758 (void) snprintf(p, psize,
759 dgettext(TEXT_DOMAIN, "illegal option"));
760 break;
761 case MDE_TAKE_OWN:
762 (void) snprintf(p, psize,
763 dgettext(TEXT_DOMAIN, "failed to reserve any drives"));
764 break;
765 case MDE_NOT_DRIVENAME:
766 (void) snprintf(p, psize,
767 dgettext(TEXT_DOMAIN, "not a valid drive name"));
768 break;
769 case MDE_RESERVED:
770 (void) snprintf(p, psize,
771 dgettext(TEXT_DOMAIN, "reserved by another host"));
772 break;
773 case MDE_DVERSION:
774 (void) snprintf(p, psize,
775 dgettext(TEXT_DOMAIN, "driver version mismatch"));
776 break;
777 case MDE_MVERSION:
778 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
779 "metadevice state database version mismatch"));
780 break;
781 case MDE_TESTERROR:
782 (void) snprintf(p, psize,
783 dgettext(TEXT_DOMAIN, "TEST ERROR MESSAGE"));
784 break;
785 case MDE_BAD_ORIG_NCOL:
786 (void) snprintf(p, psize,
787 dgettext(TEXT_DOMAIN, "invalid column count"));
788 break;
789 case MDE_RAID_INVALID:
790 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
791 "devices were not RAIDed previously or "
792 "are specified in the wrong order"));
793 break;
794 case MDE_MED_ERROR:
795 break;
796 case MDE_TOOMANYMED:
797 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
798 "too many mediator hosts requested"));
799 break;
800 case MDE_NOMED:
801 (void) snprintf(p, psize,
802 dgettext(TEXT_DOMAIN, "no mediator hosts found"));
803 break;
804 case MDE_ONLYNODENAME:
805 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
806 "only the nodename of a host is required for deletes"));
807 break;
808 case MDE_RAID_BAD_PW_CNT:
809 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
810 "simultaneous writes out of range"));
811 break;
812 case MDE_DEVID_TOOBIG:
813 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
814 "relocation information size is greater than reported"));
815 break;
816 case MDE_NOPERM:
817 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
818 "Permission denied. You must have root privilege "
819 "to execute this command."));
820 break;
821 case MDE_NODEVID:
822 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
823 "Device relocation information not available "
824 "for this device"));
825 break;
826 case MDE_NOROOT:
827 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
828 "no root filesystem in /etc/mnttab"));
829 break;
830 case MDE_EOF_TRANS:
831 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
832 MD_EOF_TRANS_MSG));
833 break;
834 case MDE_NOT_MN:
835 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
836 "option only valid within a multi-owner set"));
837 break;
838 case MDE_ABR_SET:
839 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
840 "Invalid command for mirror with ABR set"));
841 break;
842 case MDE_INVAL_MNOP:
843 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
844 "Invalid operation on multi-owner set"));
845 break;
846 case MDE_MNSET_NOTRANS:
847 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
848 "Trans metadevice not supported on multi-owner set"));
849 break;
850 case MDE_MNSET_NORAID:
851 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
852 "RAID-5 metadevice not supported on multi-owner set"));
853 break;
854 case MDE_FORCE_DEL_ALL_DRV:
855 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
856 "Must specify -f option to delete all drives from set"));
857 break;
858 case MDE_STRIPE_TRUNC_SINGLE:
859 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
860 "The necessary rounding would result in data loss. "
861 "You can avoid this by concatenating additional devices "
862 "totaling at least %s blocks, or by increasing the size "
863 "of the specified component by exactly %s blocks."),
864 ep->extra, ep->extra);
865 break;
866 case MDE_STRIPE_TRUNC_MULTIPLE:
867 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
868 "The necessary rounding would result in data loss. "
869 "You can avoid this by concatenating additional devices "
870 "totaling at least %s blocks."), ep->extra);
871 break;
872 case MDE_SMF_FAIL:
873 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
874 "failed to enable/disable SVM service"));
875 break;
876 case MDE_SMF_NO_SERVICE:
877 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
878 "service(s) not online in SMF"));
879 break;
880 case MDE_AMBIGUOUS_DEV:
881 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
882 "Specify complete path to avoid ambiguity."));
883 break;
884 case MDE_NAME_IN_USE:
885 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
886 "Name already in use for metadevice or hot spare pool."));
887 break;
888 case MDE_NAME_ILLEGAL:
889 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
890 "Invalid name for metadevice or hot spare pool."));
891 break;
892 case MDE_ZONE_ADMIN:
893 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
894 "Volume administration unavailable within non-global zones."));
895 break;
896 case MDE_MISSING_DEVID_DISK:
897 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
898 "device id does not exist."));
899 break;
900 default:
901 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
902 "unknown void error code %d"), ip->errnum);
903 break;
906 return (buf);
910 * print sys class errors
912 static char *
913 sys_to_str(
914 md_error_t *ep,
915 char *buf,
916 size_t size
919 md_sys_error_t *ip = &ep->info.md_error_info_t_u.sys_error;
920 char *emsg;
921 char *p = buf + strlen(buf);
922 size_t psize = size - strlen(buf);
924 if ((emsg = strerror(ip->errnum)) == NULL) {
925 (void) snprintf(p, psize,
926 dgettext(TEXT_DOMAIN, "unknown errno %d out of range"),
927 ip->errnum);
928 } else {
929 (void) snprintf(p, psize, "%s", emsg);
932 return (buf);
936 * print RPC class errors
938 static char *
939 rpc_to_str(
940 md_error_t *ep,
941 char *buf,
942 size_t size
945 md_rpc_error_t *ip = &ep->info.md_error_info_t_u.rpc_error;
946 char *p = buf + strlen(buf);
947 size_t psize = size - strlen(buf);
949 (void) snprintf(p, psize, "%s", clnt_sperrno(ip->errnum));
950 return (buf);
954 * print dev class errors
956 static char *
957 dev_to_str(
958 md_error_t *ep,
959 char *buf,
960 size_t size
963 md_dev_error_t *ip = &ep->info.md_error_info_t_u.dev_error;
964 char *p = buf + strlen(buf);
965 size_t psize = size - strlen(buf);
967 switch (ip->errnum) {
968 case MDE_INVAL_HS:
969 (void) snprintf(p, psize,
970 dgettext(TEXT_DOMAIN, "hotspare doesn't exist"));
971 break;
972 case MDE_FIX_INVAL_STATE:
973 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
974 "cannot enable hotspared device"));
975 break;
976 case MDE_FIX_INVAL_HS_STATE:
977 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
978 "hotspare isn't broken, can't enable"));
979 break;
980 case MDE_NOT_META:
981 (void) snprintf(p, psize,
982 dgettext(TEXT_DOMAIN, "not a metadevice"));
983 break;
984 case MDE_IS_DUMP:
985 (void) snprintf(p, psize,
986 dgettext(TEXT_DOMAIN, "is a dump device"));
987 break;
988 case MDE_IS_META:
989 (void) snprintf(p, psize,
990 dgettext(TEXT_DOMAIN, "is a metadevice"));
991 break;
992 case MDE_IS_SWAPPED:
993 (void) snprintf(p, psize,
994 dgettext(TEXT_DOMAIN, "is swapped on"));
995 break;
996 case MDE_NAME_SPACE:
997 (void) snprintf(p, psize,
998 dgettext(TEXT_DOMAIN, "namespace error"));
999 break;
1000 case MDE_IN_SHARED_SET:
1001 (void) snprintf(p, psize,
1002 dgettext(TEXT_DOMAIN, "device in shared set"));
1003 break;
1004 case MDE_NOT_IN_SET:
1005 (void) snprintf(p, psize,
1006 dgettext(TEXT_DOMAIN, "device not in set"));
1007 break;
1008 case MDE_NOT_DISK:
1009 (void) snprintf(p, psize,
1010 dgettext(TEXT_DOMAIN, "not a disk device"));
1011 break;
1012 case MDE_CANT_CONFIRM:
1013 (void) snprintf(p, psize,
1014 dgettext(TEXT_DOMAIN, "can't confirm device"));
1015 break;
1016 case MDE_INVALID_PART:
1017 (void) snprintf(p, psize,
1018 dgettext(TEXT_DOMAIN, "invalid partition"));
1019 break;
1020 case MDE_HAS_MDDB:
1021 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1022 "has a metadevice database replica"));
1023 break;
1024 case MDE_NO_DB:
1025 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1026 "no metadevice database replica on device"));
1027 break;
1028 case MDE_CANTVERIFY_VTOC:
1029 (void) snprintf(p, psize,
1030 dgettext(TEXT_DOMAIN, "unable to verify the vtoc"));
1031 break;
1032 case MDE_NOT_LOCAL:
1033 (void) snprintf(p, psize,
1034 dgettext(TEXT_DOMAIN, "not in local set"));
1035 break;
1036 case MDE_DEVICES_NAME:
1037 (void) snprintf(p, psize,
1038 dgettext(TEXT_DOMAIN, "can't parse /devices name"));
1039 break;
1040 case MDE_REPCOMP_INVAL:
1041 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1042 "replica slice is not usable as a metadevice component"));
1043 break;
1044 case MDE_REPCOMP_ONLY:
1045 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1046 "only replica slice is usable for a diskset "
1047 "database replica"));
1048 break;
1049 case MDE_INV_ROOT:
1050 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1051 "invalid root device for this operation"));
1052 break;
1053 case MDE_MULTNM:
1054 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1055 "multiple entries for device in Solaris Volume Manager "
1056 "configuration"));
1057 break;
1058 case MDE_TOO_MANY_PARTS:
1059 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1060 "Disks with more than %d partitions are not supported "
1061 "in Solaris Volume Manager"), MD_MAX_PARTS);
1062 break;
1063 case MDE_REPART_REPLICA:
1064 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1065 "cannot repartition a slice with an existing replica"));
1066 break;
1067 case MDE_DISKNAMETOOLONG:
1068 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1069 "disk name is too long with device ids disabled "
1070 "in Solaris Volume Manager. Check /kernel/drv/md.conf "
1071 "for md_devid_destroy, remove it and reboot"));
1072 break;
1073 default:
1074 (void) snprintf(p, psize,
1075 dgettext(TEXT_DOMAIN, "unknown dev error code %d"),
1076 ip->errnum);
1077 break;
1080 return (buf);
1084 * print overlap class errors
1086 static char *
1087 overlap_to_str(
1088 md_error_t *ep,
1089 char *buf,
1090 size_t size
1093 md_overlap_error_t *ip =
1094 &ep->info.md_error_info_t_u.overlap_error;
1095 char *p = buf + strlen(buf);
1096 size_t psize = size - strlen(buf);
1098 switch (ip->errnum) {
1099 case MDE_OVERLAP_MOUNTED:
1100 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1101 "overlaps with %s which is mounted as \'%s\'"),
1102 ip->overlap, ip->where);
1103 break;
1104 case MDE_OVERLAP_SWAP:
1105 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1106 "overlaps with %s which is a swap device"), ip->overlap);
1107 break;
1108 case MDE_OVERLAP_DUMP:
1109 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1110 "overlaps with %s which is the dump device"), ip->overlap);
1111 break;
1112 default:
1113 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1114 "unknown overlap error code %d"), ip->errnum);
1115 break;
1118 return (buf);
1122 * print use class errors
1124 static char *
1125 use_to_str(
1126 md_error_t *ep,
1127 char *buf,
1128 size_t size
1131 md_use_error_t *ip = &ep->info.md_error_info_t_u.use_error;
1132 char *p = buf + strlen(buf);
1133 size_t psize = size - strlen(buf);
1135 switch (ip->errnum) {
1136 case MDE_IS_MOUNTED:
1137 (void) snprintf(p, psize,
1138 dgettext(TEXT_DOMAIN, "is mounted on %s"),
1139 ip->where);
1140 break;
1141 case MDE_ALREADY:
1143 * when the object of the error (existing device that
1144 * would being used by SVM) is the metadb then it is necessary
1145 * to explicitly specify the string in the error message so
1146 * that it can be successfully localized for the Asian locales.
1148 if (strcmp(ip->where, MDB_STR) != 0) {
1149 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1150 "has appeared more than once in the "
1151 "specification of %s"), ip->where);
1152 } else {
1153 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1154 "has appeared more than once in the "
1155 "specification of " MDB_STR));
1157 break;
1158 case MDE_OVERLAP:
1160 * when the object of the error (existing device that
1161 * would overlap) is the metadb then it is necessary
1162 * to explicitly specify the string in the error message so
1163 * that it can be successfully localized for the Asian locales.
1165 if (strcmp(ip->where, MDB_STR) != 0) {
1166 (void) snprintf(p, psize,
1167 dgettext(TEXT_DOMAIN, "overlaps with device in %s"),
1168 ip->where);
1169 } else {
1170 (void) snprintf(p, psize,
1171 dgettext(TEXT_DOMAIN, "overlaps with device in "
1172 MDB_STR));
1174 break;
1175 case MDE_SAME_DEVID:
1177 * when the object of the error (existing device in the
1178 * metaconfiguration that has the same devid)
1179 * is the metadb then it is necessary
1180 * to explicitly specify the string in the error message so
1181 * that it can be successfully localized for the Asian locales.
1183 if (strcmp(ip->where, MDB_STR) != 0) {
1184 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1185 "identical devid detected on %s"), ip->where);
1186 } else {
1187 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1188 "identical devid detected in " MDB_STR));
1190 break;
1191 default:
1192 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1193 "unknown dev error code %d"), ip->errnum);
1194 break;
1197 return (buf);
1201 * print md class errors
1203 static char *
1204 md_to_str(
1205 md_error_t *ep,
1206 char *buf,
1207 size_t size
1210 md_md_error_t *ip = &ep->info.md_error_info_t_u.md_error;
1211 char *p = buf + strlen(buf);
1212 size_t psize = size - strlen(buf);
1214 switch (ip->errnum) {
1215 case MDE_INVAL_UNIT:
1216 (void) snprintf(p, psize,
1217 dgettext(TEXT_DOMAIN, "invalid unit"));
1218 break;
1219 case MDE_UNIT_NOT_SETUP:
1220 (void) snprintf(p, psize,
1221 dgettext(TEXT_DOMAIN, "unit not set up"));
1222 break;
1223 case MDE_UNIT_ALREADY_SETUP:
1224 (void) snprintf(p, psize,
1225 dgettext(TEXT_DOMAIN, "unit already set up"));
1226 break;
1227 case MDE_NOT_MM:
1228 (void) snprintf(p, psize,
1229 dgettext(TEXT_DOMAIN, "unit is not a mirror"));
1230 break;
1231 case MDE_IS_SM:
1232 (void) snprintf(p, psize,
1233 dgettext(TEXT_DOMAIN, "illegal to clear submirror"));
1234 break;
1235 case MDE_IS_OPEN:
1236 (void) snprintf(p, psize,
1237 dgettext(TEXT_DOMAIN, "metadevice is open"));
1238 break;
1239 case MDE_C_WITH_INVAL_SM:
1240 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1241 "attempted to clear mirror with submirror(s) "
1242 "in invalid state"));
1243 break;
1244 case MDE_RESYNC_ACTIVE:
1245 (void) snprintf(p, psize,
1246 dgettext(TEXT_DOMAIN, "resync in progress"));
1247 break;
1248 case MDE_LAST_SM_RE:
1249 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1250 "attempt to replace a component on the last "
1251 "running submirror"));
1252 break;
1253 case MDE_MIRROR_FULL:
1254 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1255 "mirror has maximum number of submirrors"));
1256 break;
1257 case MDE_IN_UNAVAIL_STATE:
1258 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1259 "component is in unavailable state; run 'metastat -i'"));
1260 break;
1261 case MDE_IN_USE:
1262 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1263 "metadevice in use"));
1264 break;
1265 case MDE_SM_TOO_SMALL:
1266 (void) snprintf(p, psize,
1267 dgettext(TEXT_DOMAIN, "submirror too small to attach"));
1268 break;
1269 case MDE_NO_LABELED_SM:
1270 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1271 "can't attach labeled submirror to an unlabeled mirror"));
1272 break;
1273 case MDE_SM_OPEN_ERR:
1274 (void) snprintf(p, psize,
1275 dgettext(TEXT_DOMAIN, "submirror open error"));
1276 break;
1277 case MDE_CANT_FIND_SM:
1278 (void) snprintf(p, psize,
1279 dgettext(TEXT_DOMAIN, "can't find submirror in mirror"));
1280 break;
1281 case MDE_LAST_SM:
1282 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1283 "attempt to detach last running submirror"));
1284 break;
1285 case MDE_NO_READABLE_SM:
1286 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1287 "operation would result in no readable submirrors"));
1288 break;
1289 case MDE_SM_FAILED_COMPS:
1290 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1291 "attempt an operation on a submirror "
1292 "that has erred components"));
1293 break;
1294 case MDE_ILLEGAL_SM_STATE:
1295 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1296 "attempt operation on a submirror in illegal state"));
1297 break;
1298 case MDE_RR_ALLOC_ERROR:
1299 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1300 "attach failed, unable to allocate new resync info"));
1301 break;
1302 case MDE_MIRROR_OPEN_FAILURE:
1303 (void) snprintf(p, psize,
1304 dgettext(TEXT_DOMAIN, "insufficient devices to open"));
1305 break;
1306 case MDE_MIRROR_THREAD_FAILURE:
1307 (void) snprintf(p, psize,
1308 dgettext(TEXT_DOMAIN, "mirror thread failure"));
1309 break;
1310 case MDE_GROW_DELAYED:
1311 (void) snprintf(p, psize,
1312 dgettext(TEXT_DOMAIN, "growing of metadevice delayed"));
1313 break;
1314 case MDE_NOT_MT:
1315 (void) snprintf(p, psize,
1316 dgettext(TEXT_DOMAIN, "unit is not a trans"));
1317 break;
1318 case MDE_HS_IN_USE:
1319 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1320 "can't modify hot spare pool, hot spare in use"));
1321 break;
1322 case MDE_HAS_LOG:
1323 (void) snprintf(p, psize,
1324 dgettext(TEXT_DOMAIN, "already has log"));
1325 break;
1326 case MDE_UNKNOWN_TYPE:
1327 (void) snprintf(p, psize,
1328 dgettext(TEXT_DOMAIN, "unknown metadevice type"));
1329 break;
1330 case MDE_NOT_STRIPE:
1331 (void) snprintf(p, psize,
1332 dgettext(TEXT_DOMAIN, "unit is not a concat/stripe"));
1333 break;
1334 case MDE_NOT_RAID:
1335 (void) snprintf(p, psize,
1336 dgettext(TEXT_DOMAIN, "unit is not a RAID"));
1337 break;
1338 case MDE_NROWS:
1339 (void) snprintf(p, psize,
1340 dgettext(TEXT_DOMAIN, "not enough stripes specified"));
1341 break;
1342 case MDE_NCOMPS:
1343 (void) snprintf(p, psize,
1344 dgettext(TEXT_DOMAIN, "not enough components specified"));
1345 break;
1346 case MDE_NSUBMIRS:
1347 (void) snprintf(p, psize,
1348 dgettext(TEXT_DOMAIN, "not enough submirrors specified"));
1349 break;
1350 case MDE_BAD_STRIPE:
1351 (void) snprintf(p, psize,
1352 dgettext(TEXT_DOMAIN, "invalid stripe configuration"));
1353 break;
1354 case MDE_BAD_MIRROR:
1355 (void) snprintf(p, psize,
1356 dgettext(TEXT_DOMAIN, "invalid mirror configuration"));
1357 break;
1358 case MDE_BAD_TRANS:
1359 (void) snprintf(p, psize,
1360 dgettext(TEXT_DOMAIN, "invalid trans configuration"));
1361 break;
1362 case MDE_BAD_RAID:
1363 (void) snprintf(p, psize,
1364 dgettext(TEXT_DOMAIN, "invalid RAID configuration"));
1365 break;
1366 case MDE_RAID_OPEN_FAILURE:
1367 (void) snprintf(p, psize,
1368 dgettext(TEXT_DOMAIN, "resync unable to open RAID unit"));
1369 break;
1370 case MDE_RAID_THREAD_FAILURE:
1371 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1372 "attempt to start resync thread failed"));
1373 break;
1374 case MDE_RAID_NEED_FORCE:
1375 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1376 "operation requires -f (force) flag"));
1377 break;
1378 case MDE_NO_LOG:
1379 (void) snprintf(p, psize,
1380 dgettext(TEXT_DOMAIN, "log has already been detached"));
1381 break;
1382 case MDE_RAID_DOI:
1383 (void) snprintf(p, psize,
1384 dgettext(TEXT_DOMAIN, "only valid action is metaclear"));
1385 break;
1386 case MDE_RAID_LAST_ERRED:
1387 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1388 "in Last Erred state, "
1389 "errored components must be replaced"));
1390 break;
1391 case MDE_RAID_NOT_OKAY:
1392 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1393 "all components must be Okay to perform this operation"));
1394 break;
1395 case MDE_RENAME_BUSY:
1396 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1397 "metadevice is temporarily too busy for renames"));
1398 break;
1399 case MDE_RENAME_SOURCE_BAD:
1400 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1401 "source metadevice is not able to be renamed"));
1402 break;
1403 case MDE_RENAME_TARGET_BAD:
1404 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1405 "target metadevice is not able to be renamed"));
1406 break;
1407 case MDE_RENAME_TARGET_UNRELATED:
1408 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1409 "target metadevice is not related to source metadevice"));
1410 break;
1411 case MDE_RENAME_CONFIG_ERROR:
1412 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1413 "metadevice driver configuration error; "
1414 "rename can't occur"));
1415 break;
1416 case MDE_RENAME_ORDER:
1417 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1418 "units may not be renamed in that order"));
1419 break;
1420 case MDE_RECOVER_FAILED:
1421 (void) snprintf(p, psize,
1422 dgettext(TEXT_DOMAIN, "recovery failed"));
1423 break;
1424 case MDE_SP_NOSPACE:
1425 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1426 "not enough space available for request"));
1427 break;
1428 case MDE_SP_BADWMREAD:
1429 (void) snprintf(p, psize,
1430 dgettext(TEXT_DOMAIN, "error reading extent header"));
1431 break;
1432 case MDE_SP_BADWMWRITE:
1433 (void) snprintf(p, psize,
1434 dgettext(TEXT_DOMAIN, "error writing extent header"));
1435 break;
1436 case MDE_SP_BADWMMAGIC:
1437 (void) snprintf(p, psize,
1438 dgettext(TEXT_DOMAIN, "bad magic number in extent header"));
1439 break;
1440 case MDE_SP_BADWMCRC:
1441 (void) snprintf(p, psize,
1442 dgettext(TEXT_DOMAIN, "bad checksum in extent header"));
1443 break;
1444 case MDE_NOT_SP:
1445 (void) snprintf(p, psize,
1446 dgettext(TEXT_DOMAIN, "unit is not a soft partition"));
1447 break;
1448 case MDE_SP_OVERLAP:
1449 (void) snprintf(p, psize,
1450 dgettext(TEXT_DOMAIN, "overlapping extents specified"));
1451 break;
1452 case MDE_SP_BAD_LENGTH:
1453 (void) snprintf(p, psize,
1454 dgettext(TEXT_DOMAIN, "bad length specified"));
1455 break;
1456 case MDE_SP_NOSP:
1457 (void) snprintf(p, psize,
1458 dgettext(TEXT_DOMAIN, "no soft partitions on this device"));
1459 break;
1460 case MDE_UNIT_TOO_LARGE:
1461 (void) snprintf(p, psize,
1462 dgettext(TEXT_DOMAIN, "Volume size cannot exceed 1 TByte"));
1463 break;
1464 case MDE_LOG_TOO_LARGE:
1465 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1466 "Trans log size must be less than 1 TByte"));
1467 break;
1468 default:
1469 (void) snprintf(p, psize,
1470 dgettext(TEXT_DOMAIN, "unknown md error code %d"),
1471 ip->errnum);
1472 break;
1475 return (buf);
1479 * print comp class errors
1481 static char *
1482 comp_to_str(
1483 md_error_t *ep,
1484 char *buf,
1485 size_t size
1488 md_comp_error_t *ip = &ep->info.md_error_info_t_u.comp_error;
1489 char *p = buf + strlen(buf);
1490 size_t psize = size - strlen(buf);
1492 switch (ip->errnum) {
1493 case MDE_CANT_FIND_COMP:
1494 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1495 "can't find component in unit"));
1496 break;
1497 case MDE_REPL_INVAL_STATE:
1498 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1499 "component in invalid state to replace - "
1500 "Replace \"Maintenance\" components first"));
1501 break;
1502 case MDE_COMP_TOO_SMALL:
1503 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1504 "replace failure, new component is too small"));
1505 break;
1506 case MDE_COMP_OPEN_ERR:
1507 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1508 "unable to open concat/stripe component"));
1509 break;
1510 case MDE_RAID_COMP_ERRED:
1511 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1512 "must replace errored component first"));
1513 break;
1514 case MDE_MAXIO:
1515 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1516 "maxtransfer is too small"));
1517 break;
1518 case MDE_SP_COMP_OPEN_ERR:
1519 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1520 "error opening device under soft partition. Check"
1521 " device status, then use metadevadm(1M)."));
1522 break;
1523 default:
1524 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1525 "unknown comp error code %d"), ip->errnum);
1526 break;
1529 return (buf);
1533 * print hsp class errors
1535 static char *
1536 hsp_to_str(
1537 md_error_t *ep,
1538 char *buf,
1539 size_t size
1542 md_hsp_error_t *ip = &ep->info.md_error_info_t_u.hsp_error;
1543 char *p = buf + strlen(buf);
1544 size_t psize = size - strlen(buf);
1546 switch (ip->errnum) {
1547 case MDE_HSP_CREATE_FAILURE:
1548 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1549 "hotspare pool database create failure"));
1550 break;
1551 case MDE_HSP_IN_USE:
1552 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1553 "hotspare pool in use"));
1554 break;
1555 case MDE_INVAL_HSP:
1556 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1557 "invalid hotspare pool"));
1558 break;
1559 case MDE_HSP_BUSY:
1560 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1561 "hotspare pool is busy"));
1562 break;
1563 case MDE_HSP_REF:
1564 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1565 "hotspare pool is referenced"));
1566 break;
1567 case MDE_HSP_ALREADY_SETUP:
1568 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1569 "hotspare pool is already setup"));
1570 break;
1571 case MDE_BAD_HSP:
1572 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1573 "invalid hotspare pool configuration"));
1574 break;
1575 case MDE_HSP_UNIT_TOO_LARGE:
1576 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1577 "units in the hotspare pool cannot exceed 1 TByte"));
1578 break;
1579 default:
1580 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1581 "unknown hsp error code %d"), ip->errnum);
1582 break;
1585 return (buf);
1589 * print hs class errors
1591 static char *
1592 hs_to_str(
1593 md_error_t *ep,
1594 char *buf,
1595 size_t size
1598 md_hs_error_t *ip = &ep->info.md_error_info_t_u.hs_error;
1599 char *p = buf + strlen(buf);
1600 size_t psize = size - strlen(buf);
1602 switch (ip->errnum) {
1603 case MDE_HS_RESVD:
1604 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1605 "hotspare is in use"));
1606 break;
1607 case MDE_HS_CREATE_FAILURE:
1608 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1609 "hotspare database create failure"));
1610 break;
1611 case MDE_HS_INUSE:
1612 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1613 "add or replace failed, hot spare is already in use"));
1614 break;
1615 case MDE_HS_UNIT_TOO_LARGE:
1616 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1617 "hotspare size cannot exceed 1 TByte"));
1618 break;
1619 default:
1620 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1621 "unknown hs error code %d"), ip->errnum);
1622 break;
1625 return (buf);
1629 * print mddb class errors
1631 static char *
1632 mddb_to_str(
1633 md_error_t *ep,
1634 char *buf,
1635 size_t size
1638 md_mddb_error_t *ip = &ep->info.md_error_info_t_u.mddb_error;
1639 char *p = buf + strlen(buf);
1640 size_t psize = size - strlen(buf);
1642 switch (ip->errnum) {
1643 case MDE_TOOMANY_REPLICAS:
1644 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1645 "%d metadevice database replicas is too many; the maximum is %d"),
1646 ip->size, MDDB_NLB);
1647 break;
1648 case MDE_REPLICA_TOOSMALL:
1649 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1650 "device size %d is too small for metadevice database replica"),
1651 ip->size);
1652 break;
1653 case MDE_NOTVERIFIED:
1654 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1655 "data not returned correctly from disk"));
1656 break;
1657 case MDE_DB_INVALID:
1658 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1659 "invalid argument"));
1660 break;
1661 case MDE_DB_EXISTS:
1662 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1663 "metadevice database replica exists on device"));
1664 break;
1665 case MDE_DB_MASTER:
1666 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1667 "has bad master block on device"));
1668 break;
1669 case MDE_DB_TOOSMALL:
1670 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1671 "device is too small"));
1672 break;
1673 case MDE_DB_NORECORD:
1674 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1675 "no such metadevice database record"));
1676 break;
1677 case MDE_DB_NOSPACE:
1678 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1679 "metadevice database is full, can't create new records"));
1680 break;
1681 case MDE_DB_NOTNOW:
1682 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1683 "metadevice database has too few replicas, for "
1684 "metadevice database operation"));
1685 break;
1686 case MDE_DB_NODB:
1687 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1688 "there are no existing databases"));
1689 break;
1690 case MDE_DB_NOTOWNER:
1691 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1692 "not owner of metadevice database"));
1693 break;
1694 case MDE_DB_STALE:
1695 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1696 "stale databases"));
1697 break;
1698 case MDE_DB_TOOFEW:
1699 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1700 "not enough databases"));
1701 break;
1702 case MDE_DB_TAGDATA:
1703 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1704 "tagged data detected, user intervention required"));
1705 break;
1706 case MDE_DB_ACCOK:
1707 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1708 "50% replicas & 50% mediator hosts available, "
1709 "user intervention required"));
1710 break;
1711 case MDE_DB_NTAGDATA:
1712 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1713 "no tagged data available or only one tag found"));
1714 break;
1715 case MDE_DB_ACCNOTOK:
1716 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1717 "50% replicas & 50% mediator hosts not available"));
1718 break;
1719 case MDE_DB_NOLOCBLK:
1720 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1721 "no valid locator blocks were found"));
1722 break;
1723 case MDE_DB_NOLOCNMS:
1724 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1725 "no valid locator name information was found"));
1726 break;
1727 case MDE_DB_NODIRBLK:
1728 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1729 "no valid directory blocks were found"));
1730 break;
1731 case MDE_DB_NOTAGREC:
1732 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1733 "no tag record was allocated, so data "
1734 "tagging is disabled"));
1735 break;
1736 case MDE_DB_NOTAG:
1737 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1738 "no tag records exist or no matching tag was found"));
1739 break;
1740 case MDE_DB_BLKRANGE:
1741 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1742 "logical block number %d out of range"), ip->size);
1743 break;
1744 default:
1745 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1746 "unknown mddb error code %d"), ip->errnum);
1747 break;
1750 return (buf);
1754 * print diskset (ds) class errors
1756 static char *
1757 ds_to_str(
1758 md_error_t *ep,
1759 char *buf,
1760 size_t size
1763 md_ds_error_t *ip = &ep->info.md_error_info_t_u.ds_error;
1764 char *p = buf + strlen(buf);
1765 size_t psize = size - strlen(buf);
1767 switch (ip->errnum) {
1768 case MDE_DS_DUPHOST:
1769 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1770 "host %s is specified more than once"), ip->node);
1771 break;
1772 case MDE_DS_NOTNODENAME:
1773 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1774 "\"%s\" is not a nodename, but a network name"), ip->node);
1775 break;
1776 case MDE_DS_SELFNOTIN:
1777 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1778 "nodename of host %s creating the set must be included"),
1779 ip->node);
1780 break;
1781 case MDE_DS_NODEHASSET:
1782 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1783 "host %s already has set"), ip->node);
1784 break;
1785 case MDE_DS_NODENOSET:
1786 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1787 "host %s does not have set"), ip->node);
1788 break;
1789 case MDE_DS_NOOWNER:
1790 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1791 "must be owner of the set for this command"));
1792 break;
1793 case MDE_DS_NOTOWNER:
1794 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1795 "only the current owner %s may operate on this set"),
1796 ip->node);
1797 break;
1798 case MDE_DS_NODEISNOTOWNER:
1799 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1800 "host %s is not the owner"), ip->node);
1801 break;
1802 case MDE_DS_NODEINSET:
1803 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1804 "host %s is already in the set"), ip->node);
1805 break;
1806 case MDE_DS_NODENOTINSET:
1807 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1808 "host %s is not in the set"), ip->node);
1809 break;
1810 case MDE_DS_SETNUMBUSY:
1811 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1812 "host %s already has a set numbered %ld"),
1813 ip->node, ip->setno);
1814 break;
1815 case MDE_DS_SETNUMNOTAVAIL:
1816 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1817 "no available set numbers"));
1818 break;
1819 case MDE_DS_SETNAMEBUSY:
1820 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1821 "set name is in-use or invalid on host %s"), ip->node);
1822 break;
1823 case MDE_DS_DRIVENOTCOMMON:
1824 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1825 "drive %s is not common with host %s"),
1826 ip->drive, ip->node);
1827 break;
1828 case MDE_DS_DRIVEINSET:
1829 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1830 "drive %s is in set %s"), ip->drive, ip->node);
1831 break;
1832 case MDE_DS_DRIVENOTINSET:
1833 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1834 "drive %s is not in set"), ip->drive);
1835 break;
1836 case MDE_DS_DRIVEINUSE:
1837 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1838 "drive %s is in use"), ip->drive);
1839 break;
1840 case MDE_DS_DUPDRIVE:
1841 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1842 "drive %s is specified more than once"), ip->drive);
1843 break;
1844 case MDE_DS_INVALIDSETNAME:
1845 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1846 "set name contains invalid characters"));
1847 break;
1848 case MDE_DS_HASDRIVES:
1849 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1850 "unable to delete set, it still has drives"));
1851 break;
1852 case MDE_DS_SIDENUMNOTAVAIL:
1853 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1854 "maximum number of nodenames exceeded"));
1855 break;
1856 case MDE_DS_SETNAMETOOLONG:
1857 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1858 "set name is too long"));
1859 break;
1860 case MDE_DS_NODENAMETOOLONG:
1861 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1862 "host name %s is too long"), ip->node);
1863 break;
1864 case MDE_DS_OHACANTDELSELF:
1865 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1866 "administrator host %s deletion disallowed in one host admin mode"),
1867 ip->node);
1868 break;
1869 case MDE_DS_HOSTNOSIDE:
1870 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1871 "side information missing for host %s"), ip->node);
1872 break;
1873 case MDE_DS_SETLOCKED:
1874 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1875 "host %s is modifying set - try later or restart rpc.metad"),
1876 ip->drive);
1877 break;
1878 case MDE_DS_ULKSBADKEY:
1879 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1880 "set unlock failed - bad key"));
1881 break;
1882 case MDE_DS_LKSBADKEY:
1883 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1884 "set lock failed - bad key"));
1885 break;
1886 case MDE_DS_WRITEWITHSULK:
1887 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1888 "write operation attempted on set with set unlocked"));
1889 break;
1890 case MDE_DS_SETCLEANUP:
1891 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1892 "set \"%s\" is out of date - cleaning up - take failed"),
1893 ip->node);
1894 break;
1895 case MDE_DS_CANTDELSELF:
1896 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1897 "administrator host %s can't be deleted, other hosts still in set\n"
1898 "Use -f to override"), ip->node);
1899 break;
1900 case MDE_DS_HASMED:
1901 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1902 "unable to delete set, it still has mediator hosts"));
1903 break;
1904 case MDE_DS_TOOMANYALIAS:
1905 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1906 "%s causes there to be more aliases than allowed"),
1907 ip->node);
1908 break;
1909 case MDE_DS_ISMED:
1910 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1911 "%s is already a mediator host"), ip->node);
1912 break;
1913 case MDE_DS_ISNOTMED:
1914 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1915 "%s is not a mediator host"), ip->node);
1916 break;
1917 case MDE_DS_INVALIDMEDNAME:
1918 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1919 "mediator name \"%s\" contains invalid characters"),
1920 ip->node);
1921 break;
1922 case MDE_DS_ALIASNOMATCH:
1923 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1924 "mediator alias \"%s\" is not an alias for host "
1925 "\"%s\""), ip->node, ip->drive);
1926 break;
1927 case MDE_DS_NOMEDONHOST:
1928 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1929 "unable to contact %s on host \"%s\""),
1930 MED_SERVNAME, ip->node);
1931 break;
1932 case MDE_DS_DRIVENOTONHOST:
1933 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1934 "drive %s is not present on host %s"),
1935 ip->drive, ip->node);
1936 break;
1937 case MDE_DS_CANTDELMASTER:
1938 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1939 "master %s can't be deleted, other hosts still in set"),
1940 ip->node);
1941 break;
1942 case MDE_DS_NOTINMEMBERLIST:
1943 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1944 "node %s is not in membership list"),
1945 ip->node);
1946 break;
1947 case MDE_DS_MNCANTDELSELF:
1948 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1949 "host %s can't delete self from multi-owner set\n"
1950 "while other hosts still in set"),
1951 ip->node);
1952 break;
1953 case MDE_DS_RPCVERSMISMATCH:
1954 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1955 "host %s does not support multi-owner diskset"),
1956 ip->node);
1957 break;
1958 case MDE_DS_WITHDRAWMASTER:
1959 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1960 "master host %s cannot withdraw from multi-owner diskset "
1961 "when other owner nodes are still present in diskset"),
1962 ip->node);
1963 break;
1964 case MDE_DS_CANTRESNARF:
1965 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1966 "imported set could not be loaded"));
1967 break;
1968 case MDE_DS_INSUFQUORUM:
1969 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1970 "insufficient replica quorum detected. Use "
1971 "-f to force import of the set"));
1972 break;
1973 case MDE_DS_EXTENDEDNM:
1974 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1975 "multiple namespace records detected"));
1976 break;
1977 case MDE_DS_COMMDCTL_SUSPEND_NYD:
1978 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1979 "rpc.mdcommd on host %s is not yet drained during "
1980 "suspend operation"),
1981 ip->node);
1982 break;
1983 case MDE_DS_COMMDCTL_SUSPEND_FAIL:
1984 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1985 "rpc.mdcommd on host %s failed suspend operation"),
1986 ip->node);
1987 break;
1988 case MDE_DS_COMMDCTL_REINIT_FAIL:
1989 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1990 "rpc.mdcommd on host %s failed reinitialization operation"),
1991 ip->node);
1992 break;
1993 case MDE_DS_COMMDCTL_RESUME_FAIL:
1994 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
1995 "rpc.mdcommd on host %s failed resume operation"),
1996 ip->node);
1997 break;
1998 case MDE_DS_NOTNOW_RECONFIG:
1999 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
2000 "command terminated, host %s starting reconfig cycle"),
2001 ip->node);
2002 break;
2003 case MDE_DS_NOTNOW_CMD:
2004 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
2005 "metaset or metadb command already running on diskset "
2006 "on host %s"), ip->node);
2007 break;
2008 case MDE_DS_COMMD_SEND_FAIL:
2009 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
2010 "rpc.mdcommd on host %s failed operation"),
2011 ip->node);
2012 break;
2013 case MDE_DS_MASTER_ONLY:
2014 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
2015 "this command must be run on the master node of the set,"
2016 " which is currently %s"), ip->node);
2017 break;
2018 case MDE_DS_SINGLEHOST:
2019 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
2020 "diskset is auto-take; cannot accept additional hosts"));
2021 break;
2022 case MDE_DS_AUTONOTSET:
2023 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
2024 "auto-take is not enabled on diskset"));
2025 break;
2026 case MDE_DS_INVALIDDEVID:
2027 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
2028 "Invalid device id on drive %s on host %s"), ip->drive,
2029 ip->node);
2030 break;
2031 case MDE_DS_SETNOTIMP:
2032 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
2033 "Unable to import set on node %s"), ip->node);
2034 break;
2035 case MDE_DS_NOTSELFIDENTIFY:
2036 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
2037 "Drive %s won't be self identifying"), ip->drive);
2038 break;
2039 default:
2040 (void) snprintf(p, psize, dgettext(TEXT_DOMAIN,
2041 "unknown diskset error code %d"), ip->errnum);
2042 break;
2045 return (buf);
2049 * convert error to printable string
2051 static char *
2052 mde_to_str(
2053 md_error_t *ep
2056 static char buf[BUFSIZ];
2057 size_t bufsz;
2059 /* intialize buf */
2060 buf[0] = '\0';
2061 bufsz = sizeof (buf);
2063 /* class specific */
2064 switch (ep->info.errclass) {
2065 case MDEC_VOID:
2066 return (void_to_str(ep, buf, bufsz));
2067 case MDEC_SYS:
2068 return (sys_to_str(ep, buf, bufsz));
2069 case MDEC_RPC:
2070 return (rpc_to_str(ep, buf, bufsz));
2071 case MDEC_DEV:
2072 return (dev_to_str(ep, buf, bufsz));
2073 case MDEC_USE:
2074 return (use_to_str(ep, buf, bufsz));
2075 case MDEC_MD:
2076 return (md_to_str(ep, buf, bufsz));
2077 case MDEC_COMP:
2078 return (comp_to_str(ep, buf, bufsz));
2079 case MDEC_HSP:
2080 return (hsp_to_str(ep, buf, bufsz));
2081 case MDEC_HS:
2082 return (hs_to_str(ep, buf, bufsz));
2083 case MDEC_MDDB:
2084 return (mddb_to_str(ep, buf, bufsz));
2085 case MDEC_DS:
2086 return (ds_to_str(ep, buf, bufsz));
2087 case MDEC_OVERLAP:
2088 return (overlap_to_str(ep, buf, bufsz));
2089 default:
2090 (void) snprintf(buf, bufsz,
2091 dgettext(TEXT_DOMAIN, "unknown error class %d"),
2092 ep->info.errclass);
2093 return (buf);
2098 * print log prefix
2100 void
2101 md_logpfx(
2102 FILE *fp
2105 time_t t;
2106 struct tm *tm;
2107 char buf[100];
2109 if ((time(&t) != (time_t)-1) &&
2110 ((tm = localtime(&t)) != NULL) &&
2111 (strftime(buf, sizeof (buf), (char *)0, tm) < sizeof (buf))) {
2112 (void) fprintf(fp, "%s: ", buf);
2114 (void) fprintf(fp, "%s: ", myname);
2118 * varargs sperror()
2120 /*PRINTFLIKE2*/
2121 static char *
2122 mde_vsperror(
2123 md_error_t *ep,
2124 const char *fmt,
2125 va_list ap
2128 static char buf[BUFSIZ];
2129 size_t bufsz = sizeof (buf);
2130 char *p = buf;
2131 char *host1 = "";
2132 char *host2 = "";
2133 char *extra1 = "";
2134 char *extra2 = "";
2135 char *name1 = "";
2136 char *name2 = "";
2138 /* get stuff */
2139 if ((ep->host != NULL) && (*(ep->host) != '\0')) {
2140 host1 = ep->host;
2141 host2 = ": ";
2143 if ((ep->extra != NULL) && (*(ep->extra) != '\0')) {
2144 extra1 = ep->extra;
2145 extra2 = ": ";
2147 if ((ep->name != NULL) && (*(ep->name) != '\0')) {
2148 name1 = ep->name;
2149 name2 = ": ";
2152 /* context */
2153 (void) snprintf(p, bufsz, "%s%s%s%s%s%s",
2154 host1, host2, extra1, extra2, name1, name2);
2155 p = &buf[strlen(buf)];
2156 bufsz -= strlen(buf);
2158 /* user defined part */
2159 if ((fmt != NULL) && (*fmt != '\0')) {
2160 (void) vsnprintf(p, bufsz, fmt, ap);
2161 p = &buf[strlen(buf)];
2162 bufsz = sizeof (buf) - strlen(buf);
2163 (void) snprintf(p, bufsz, ": ");
2164 p = &buf[strlen(buf)];
2165 bufsz = sizeof (buf) - strlen(buf);
2168 /* error code */
2169 (void) snprintf(p, bufsz, "%s\n", mde_to_str(ep));
2171 /* return error message */
2172 return (buf);
2176 * printf-like sperror()
2178 /*PRINTFLIKE2*/
2179 char *
2180 mde_sperror(
2181 md_error_t *ep,
2182 const char *fmt,
2186 va_list ap;
2187 char *emsg;
2189 va_start(ap, fmt);
2190 emsg = mde_vsperror(ep, fmt, ap);
2191 va_end(ap);
2192 return (emsg);
2196 * printf-like perror()
2198 /*PRINTFLIKE2*/
2199 void
2200 mde_perror(
2201 md_error_t *ep,
2202 const char *fmt,
2206 va_list ap;
2207 char *emsg;
2209 /* get error message */
2210 va_start(ap, fmt);
2211 emsg = mde_vsperror(ep, fmt, ap);
2212 va_end(ap);
2213 assert((emsg != NULL) && (*emsg != '\0'));
2215 /* stderr */
2216 (void) fprintf(stderr, "%s: %s\n", myname, emsg);
2217 (void) fflush(stderr);
2219 /* metalog */
2220 if (metalogfp != NULL) {
2221 md_logpfx(metalogfp);
2222 (void) fprintf(metalogfp, "%s\n", emsg);
2223 (void) fflush(metalogfp);
2224 (void) fsync(fileno(metalogfp));
2227 /* syslog */
2228 if (metasyslog) {
2229 syslog(LOG_ERR, emsg);
2234 * printf-like perror()
2236 /*PRINTFLIKE1*/
2237 void
2238 md_perror(
2239 const char *fmt,
2243 md_error_t status = mdnullerror;
2244 va_list ap;
2245 char *emsg;
2247 /* get error message */
2248 (void) mdsyserror(&status, errno, NULL);
2249 va_start(ap, fmt);
2250 emsg = mde_vsperror(&status, fmt, ap);
2251 va_end(ap);
2252 assert((emsg != NULL) && (*emsg != '\0'));
2253 mdclrerror(&status);
2255 /* stderr */
2256 (void) fprintf(stderr, "%s: %s\n", myname, emsg);
2257 (void) fflush(stderr);
2259 /* metalog */
2260 if (metalogfp != NULL) {
2261 md_logpfx(metalogfp);
2262 (void) fprintf(metalogfp, "%s\n", emsg);
2263 (void) fflush(metalogfp);
2264 (void) fsync(fileno(metalogfp));
2267 /* syslog */
2268 if (metasyslog) {
2269 syslog(LOG_ERR, emsg);
2274 * printf-like log
2276 /*PRINTFLIKE1*/
2277 void
2278 md_eprintf(
2279 const char *fmt,
2283 va_list ap;
2285 /* begin */
2286 va_start(ap, fmt);
2288 /* stderr */
2289 (void) fprintf(stderr, "%s: ", myname);
2290 (void) vfprintf(stderr, fmt, ap);
2291 (void) fflush(stderr);
2293 /* metalog */
2294 if (metalogfp != NULL) {
2295 md_logpfx(metalogfp);
2296 (void) vfprintf(metalogfp, fmt, ap);
2297 (void) fflush(metalogfp);
2298 (void) fsync(fileno(metalogfp));
2301 /* syslog */
2302 if (metasyslog) {
2303 vsyslog(LOG_ERR, fmt, ap);
2306 /* end */
2307 va_end(ap);
2311 * metaclust timing messages logging routine
2313 * level - The class of the message to be logged. Message will be logged
2314 * if this is less than or equal to the verbosity level.
2316 void
2317 meta_mc_log(int level, const char *fmt, ...)
2319 va_list args;
2321 va_start(args, fmt);
2323 * Log all messages upto MC_LOG2 to syslog regardless of the
2324 * verbosity level
2326 if (metasyslog && (level <= MC_LOG2)) {
2327 if (level <= MC_LOG1)
2328 (void) vsyslog(LOG_ERR, fmt, args);
2329 else
2330 (void) vsyslog(LOG_INFO, fmt, args);
2333 * Print all messages to stderr provided the message level is
2334 * within the verbosity level
2336 if (level <= verbosity) {
2337 (void) fprintf(stderr, "%s: ", myname);
2338 (void) vfprintf(stderr, fmt, args);
2339 (void) fprintf(stderr, "\n");
2340 (void) fflush(stderr);
2342 va_end(args);