xref: /illumos-gate/usr/src/cmd/svr4pkg/libinst/log.c (revision 129b3e6c5b0ac55b5021a4c38db6387b6acdaaf1)
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 /*
23  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
24  * Use is subject to license terms.
25  */
26 
27 
28 /* unix system includes */
29 
30 #include <stdio.h>
31 #include <stdarg.h>
32 #include <stdlib.h>
33 #include <string.h>
34 #include <fcntl.h>
35 #include <sys/types.h>
36 #include <sys/stat.h>
37 #include <unistd.h>
38 #include <locale.h>
39 #include <errno.h>
40 #include <sys/param.h>
41 #include <instzones_api.h>
42 
43 /*
44  * consolidation pkg command library includes
45  */
46 
47 #include "pkglib.h"
48 
49 /*
50  * local pkg command library includes
51  */
52 
53 #include "install.h"
54 #include "libinst.h"
55 #include "libadm.h"
56 #include "messages.h"
57 
58 /* Should be defined by cc -D */
59 #if	!defined(TEXT_DOMAIN)
60 #define	TEXT_DOMAIN "SYS_TEST"
61 #endif
62 
63 /* local static data */
64 
65 static boolean_t	verbose = B_FALSE;
66 
67 /*
68  * Name:	log_msg
69  * Description:	Outputs messages to logging facility.
70  * Scope:	public
71  * Arguments:	a_type - the severity of the message
72  *		a_format - the printf format, plus its arguments
73  * Returns:	none
74  */
75 
76 /*PRINTFLIKE2*/
77 void
78 log_msg(LogMsgType a_type, const char *a_format, ...)
79 {
80 	FILE	*out;
81 	char	*rstr = (char *)NULL;
82 	char	bfr[1];
83 	char	*prefix;
84 	size_t	vres = 0;
85 	va_list	ap;
86 	char	*p = get_prog_name();
87 
88 	/* process message based on type */
89 
90 	switch (a_type) {
91 	case LOG_MSG_ERR:
92 	default:	/* treat unknown type as LOG_MSG_ERR */
93 		out = stderr;
94 		prefix = MSG_LOG_ERROR;
95 		break;
96 	case LOG_MSG_WRN:	/* warning message */
97 		out = stderr;
98 		prefix = MSG_LOG_WARNING;
99 		break;
100 	case LOG_MSG_INFO:	/* information message */
101 		out = stdout;
102 		prefix = NULL;
103 		break;
104 	case LOG_MSG_DEBUG:	/* debugging message */
105 		if (!log_get_verbose()) {
106 			/* no debug messages if not verbose mode */
107 			return;
108 		}
109 
110 		out = stderr;
111 		prefix = NULL;
112 
113 		/* output debug prefix to match echoDebug() format */
114 
115 		(void) fprintf(stderr, "# [%6d %3d", getpid(), getzoneid());
116 
117 		if ((p != (char *)NULL) && (*p != '\0')) {
118 			fprintf(stderr, " %-11s", p);
119 		}
120 
121 		(void) fprintf(stderr, "] ");
122 		break;
123 	}
124 
125 	/* output prefix if specified */
126 
127 	if (prefix != NULL) {
128 		(void) fprintf(out, "%s: ", prefix);
129 	}
130 
131 	/* determine size of the message in bytes */
132 
133 	va_start(ap, a_format);
134 	vres = vsnprintf(bfr, 1, a_format, ap);
135 	va_end(ap);
136 
137 	/* allocate storage to hold the message */
138 
139 	rstr = (char *)malloc(vres+2);
140 
141 	/* generate the results of the printf conversion */
142 
143 	va_start(ap, a_format);
144 	vres = vsnprintf(rstr, vres+1, a_format, ap);
145 	va_end(ap);
146 
147 	/* output formatted message to appropriate destination */
148 
149 	if (fprintf(out, "%s\n", rstr) < 0) {
150 		if (out != stderr) {
151 			/*
152 			 * nothing output, try stderr as a
153 			 * last resort
154 			 */
155 			(void) fprintf(stderr, ERR_LOG_FAIL, a_format);
156 		}
157 	}
158 
159 	/* free temporary message storage */
160 
161 	free(rstr);
162 }
163 
164 /*
165  * Name:	set_verbose
166  * Description:	Turns on verbose output
167  * Scope:	public
168  * Arguments:	verbose = B_TRUE indicates verbose mode
169  * Returns:	none
170  */
171 
172 void
173 log_set_verbose(boolean_t setting)
174 {
175 	verbose = setting;
176 }
177 
178 /*
179  * Name:	get_verbose
180  * Description:	Returns whether or not to output verbose messages
181  * Scope:	public
182  * Arguments:	none
183  * Returns:	B_TRUE - verbose messages should be output
184  */
185 
186 boolean_t
187 log_get_verbose()
188 {
189 	return (verbose);
190 }
191