xref: /illumos-gate/usr/src/lib/libc/port/gen/err.c (revision 7257d1b4)
17c478bd9Sstevel@tonic-gate /*
27c478bd9Sstevel@tonic-gate  * CDDL HEADER START
37c478bd9Sstevel@tonic-gate  *
47c478bd9Sstevel@tonic-gate  * The contents of this file are subject to the terms of the
5e3320f40Smarkfen  * Common Development and Distribution License (the "License").
6e3320f40Smarkfen  * You may not use this file except in compliance with the License.
77c478bd9Sstevel@tonic-gate  *
87c478bd9Sstevel@tonic-gate  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
97c478bd9Sstevel@tonic-gate  * or http://www.opensolaris.org/os/licensing.
107c478bd9Sstevel@tonic-gate  * See the License for the specific language governing permissions
117c478bd9Sstevel@tonic-gate  * and limitations under the License.
127c478bd9Sstevel@tonic-gate  *
137c478bd9Sstevel@tonic-gate  * When distributing Covered Code, include this CDDL HEADER in each
147c478bd9Sstevel@tonic-gate  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
157c478bd9Sstevel@tonic-gate  * If applicable, add the following below this CDDL HEADER, with the
167c478bd9Sstevel@tonic-gate  * fields enclosed by brackets "[]" replaced with your own identifying
177c478bd9Sstevel@tonic-gate  * information: Portions Copyright [yyyy] [name of copyright owner]
187c478bd9Sstevel@tonic-gate  *
197c478bd9Sstevel@tonic-gate  * CDDL HEADER END
207c478bd9Sstevel@tonic-gate  */
21a574db85Sraf 
227c478bd9Sstevel@tonic-gate /*
23a574db85Sraf  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
247c478bd9Sstevel@tonic-gate  * Use is subject to license terms.
257c478bd9Sstevel@tonic-gate  */
267c478bd9Sstevel@tonic-gate 
277c478bd9Sstevel@tonic-gate #pragma ident	"%Z%%M%	%I%	%E% SMI"
287c478bd9Sstevel@tonic-gate 
29*7257d1b4Sraf #include "lint.h"
30a574db85Sraf #include "file64.h"
31a574db85Sraf #include "mtlib.h"
32d362b749Svk #include <sys/types.h>
33d362b749Svk #include <err.h>
347c478bd9Sstevel@tonic-gate #include <stdio.h>
357c478bd9Sstevel@tonic-gate #include <stdlib.h>
367c478bd9Sstevel@tonic-gate #include <stdarg.h>
377c478bd9Sstevel@tonic-gate #include <string.h>
387c478bd9Sstevel@tonic-gate #include <errno.h>
39a574db85Sraf #include "stdiom.h"
407c478bd9Sstevel@tonic-gate 
417c478bd9Sstevel@tonic-gate /* Function exit/warning functions and global variables. */
427c478bd9Sstevel@tonic-gate 
437c478bd9Sstevel@tonic-gate static const char *progname;
447c478bd9Sstevel@tonic-gate 
457c478bd9Sstevel@tonic-gate /*
467c478bd9Sstevel@tonic-gate  * warncore() is the workhorse of these functions.  Everything else has
477c478bd9Sstevel@tonic-gate  * a warncore() component in it.
487c478bd9Sstevel@tonic-gate  */
49a574db85Sraf static rmutex_t *
50e3320f40Smarkfen warncore(FILE *fp, const char *fmt, va_list args)
517c478bd9Sstevel@tonic-gate {
52f7b942dfSvk 	const char *execname;
53a574db85Sraf 	rmutex_t *lk;
54a574db85Sraf 
55a574db85Sraf 	FLOCKFILE(lk, fp);
56f7b942dfSvk 
577c478bd9Sstevel@tonic-gate 	if (progname == NULL) {
58f7b942dfSvk 		execname = getexecname();
59f7b942dfSvk 		if ((execname != NULL) &&
60f7b942dfSvk 		    ((progname = strrchr(execname, '/')) != NULL))
617c478bd9Sstevel@tonic-gate 			progname++;
62f7b942dfSvk 		else
63f7b942dfSvk 			progname = execname;
647c478bd9Sstevel@tonic-gate 	}
657c478bd9Sstevel@tonic-gate 
66f7b942dfSvk 	if (progname != NULL)
67f7b942dfSvk 		(void) fprintf(fp, "%s: ", progname);
687c478bd9Sstevel@tonic-gate 
697c478bd9Sstevel@tonic-gate 	if (fmt != NULL) {
70e3320f40Smarkfen 		(void) vfprintf(fp, fmt, args);
717c478bd9Sstevel@tonic-gate 	}
72a574db85Sraf 
73a574db85Sraf 	return (lk);
747c478bd9Sstevel@tonic-gate }
757c478bd9Sstevel@tonic-gate 
767c478bd9Sstevel@tonic-gate /* Finish a warning with a newline and a flush of stderr. */
777c478bd9Sstevel@tonic-gate static void
78a574db85Sraf warnfinish(FILE *fp, rmutex_t *lk)
797c478bd9Sstevel@tonic-gate {
80e3320f40Smarkfen 	(void) fputc('\n', fp);
81e3320f40Smarkfen 	(void) fflush(fp);
82a574db85Sraf 	FUNLOCKFILE(lk);
837c478bd9Sstevel@tonic-gate }
847c478bd9Sstevel@tonic-gate 
857c478bd9Sstevel@tonic-gate void
86d362b749Svk _vwarnxfp(FILE *fp, const char *fmt, va_list args)
877c478bd9Sstevel@tonic-gate {
88a574db85Sraf 	rmutex_t *lk;
89a574db85Sraf 
90a574db85Sraf 	lk = warncore(fp, fmt, args);
91a574db85Sraf 	warnfinish(fp, lk);
927c478bd9Sstevel@tonic-gate }
937c478bd9Sstevel@tonic-gate 
947c478bd9Sstevel@tonic-gate void
95d362b749Svk vwarnx(const char *fmt, va_list args)
96d362b749Svk {
97d362b749Svk 	_vwarnxfp(stderr, fmt, args);
98d362b749Svk }
99d362b749Svk 
100d362b749Svk void
101d362b749Svk _vwarnfp(FILE *fp, const char *fmt, va_list args)
1027c478bd9Sstevel@tonic-gate {
1037c478bd9Sstevel@tonic-gate 	int tmperr = errno;	/* Capture errno now. */
104a574db85Sraf 	rmutex_t *lk;
1057c478bd9Sstevel@tonic-gate 
106a574db85Sraf 	lk = warncore(fp, fmt, args);
107d362b749Svk 	if (fmt != NULL) {
108d362b749Svk 		(void) fputc(':', fp);
109d362b749Svk 		(void) fputc(' ', fp);
110d362b749Svk 	}
111e3320f40Smarkfen 	(void) fputs(strerror(tmperr), fp);
112a574db85Sraf 	warnfinish(fp, lk);
113e3320f40Smarkfen }
114e3320f40Smarkfen 
115e3320f40Smarkfen void
116e3320f40Smarkfen vwarn(const char *fmt, va_list args)
117e3320f40Smarkfen {
118d362b749Svk 	_vwarnfp(stderr, fmt, args);
1197c478bd9Sstevel@tonic-gate }
1207c478bd9Sstevel@tonic-gate 
1217c478bd9Sstevel@tonic-gate /* PRINTFLIKE1 */
1227c478bd9Sstevel@tonic-gate void
1237c478bd9Sstevel@tonic-gate warnx(const char *fmt, ...)
1247c478bd9Sstevel@tonic-gate {
1257c478bd9Sstevel@tonic-gate 	va_list args;
1267c478bd9Sstevel@tonic-gate 
1277c478bd9Sstevel@tonic-gate 	va_start(args, fmt);
1287c478bd9Sstevel@tonic-gate 	vwarnx(fmt, args);
1297c478bd9Sstevel@tonic-gate 	va_end(args);
1307c478bd9Sstevel@tonic-gate }
1317c478bd9Sstevel@tonic-gate 
1327c478bd9Sstevel@tonic-gate void
133d362b749Svk _warnfp(FILE *fp, const char *fmt, ...)
1347c478bd9Sstevel@tonic-gate {
1357c478bd9Sstevel@tonic-gate 	va_list args;
1367c478bd9Sstevel@tonic-gate 
1377c478bd9Sstevel@tonic-gate 	va_start(args, fmt);
138d362b749Svk 	_vwarnfp(fp, fmt, args);
1397c478bd9Sstevel@tonic-gate 	va_end(args);
1407c478bd9Sstevel@tonic-gate }
1417c478bd9Sstevel@tonic-gate 
142e3320f40Smarkfen void
143d362b749Svk _warnxfp(FILE *fp, const char *fmt, ...)
144e3320f40Smarkfen {
145e3320f40Smarkfen 	va_list args;
146e3320f40Smarkfen 
147e3320f40Smarkfen 	va_start(args, fmt);
148d362b749Svk 	_vwarnxfp(fp, fmt, args);
149e3320f40Smarkfen 	va_end(args);
150e3320f40Smarkfen }
151e3320f40Smarkfen 
152d362b749Svk /* PRINTFLIKE1 */
153e3320f40Smarkfen void
154d362b749Svk warn(const char *fmt, ...)
155e3320f40Smarkfen {
156e3320f40Smarkfen 	va_list args;
157e3320f40Smarkfen 
158e3320f40Smarkfen 	va_start(args, fmt);
159d362b749Svk 	vwarn(fmt, args);
160e3320f40Smarkfen 	va_end(args);
161e3320f40Smarkfen }
162e3320f40Smarkfen 
1637c478bd9Sstevel@tonic-gate /* PRINTFLIKE2 */
1647c478bd9Sstevel@tonic-gate void
1657c478bd9Sstevel@tonic-gate err(int status, const char *fmt, ...)
1667c478bd9Sstevel@tonic-gate {
1677c478bd9Sstevel@tonic-gate 	va_list args;
1687c478bd9Sstevel@tonic-gate 
1697c478bd9Sstevel@tonic-gate 	va_start(args, fmt);
1707c478bd9Sstevel@tonic-gate 	vwarn(fmt, args);
1717c478bd9Sstevel@tonic-gate 	va_end(args);
1727c478bd9Sstevel@tonic-gate 	exit(status);
1737c478bd9Sstevel@tonic-gate }
1747c478bd9Sstevel@tonic-gate 
175d362b749Svk void
176d362b749Svk _errfp(FILE *fp, int status, const char *fmt, ...)
177d362b749Svk {
178d362b749Svk 	va_list args;
179d362b749Svk 
180d362b749Svk 	va_start(args, fmt);
181d362b749Svk 	_vwarnfp(fp, fmt, args);
182d362b749Svk 	va_end(args);
183d362b749Svk 	exit(status);
184d362b749Svk }
185d362b749Svk 
1867c478bd9Sstevel@tonic-gate void
1877c478bd9Sstevel@tonic-gate verr(int status, const char *fmt, va_list args)
1887c478bd9Sstevel@tonic-gate {
1897c478bd9Sstevel@tonic-gate 	vwarn(fmt, args);
1907c478bd9Sstevel@tonic-gate 	exit(status);
1917c478bd9Sstevel@tonic-gate }
1927c478bd9Sstevel@tonic-gate 
193d362b749Svk void
194d362b749Svk _verrfp(FILE *fp, int status, const char *fmt, va_list args)
195d362b749Svk {
196d362b749Svk 	_vwarnfp(fp, fmt, args);
197d362b749Svk 	exit(status);
198d362b749Svk }
199d362b749Svk 
2007c478bd9Sstevel@tonic-gate /* PRINTFLIKE2 */
2017c478bd9Sstevel@tonic-gate void
2027c478bd9Sstevel@tonic-gate errx(int status, const char *fmt, ...)
2037c478bd9Sstevel@tonic-gate {
2047c478bd9Sstevel@tonic-gate 	va_list args;
2057c478bd9Sstevel@tonic-gate 
2067c478bd9Sstevel@tonic-gate 	va_start(args, fmt);
2077c478bd9Sstevel@tonic-gate 	vwarnx(fmt, args);
2087c478bd9Sstevel@tonic-gate 	va_end(args);
2097c478bd9Sstevel@tonic-gate 	exit(status);
2107c478bd9Sstevel@tonic-gate }
2117c478bd9Sstevel@tonic-gate 
212d362b749Svk void
213d362b749Svk _errxfp(FILE *fp, int status, const char *fmt, ...)
214d362b749Svk {
215d362b749Svk 	va_list args;
216d362b749Svk 
217d362b749Svk 	va_start(args, fmt);
218d362b749Svk 	_vwarnxfp(fp, fmt, args);
219d362b749Svk 	va_end(args);
220d362b749Svk 	exit(status);
221d362b749Svk }
222d362b749Svk 
2237c478bd9Sstevel@tonic-gate void
2247c478bd9Sstevel@tonic-gate verrx(int status, const char *fmt, va_list args)
2257c478bd9Sstevel@tonic-gate {
2267c478bd9Sstevel@tonic-gate 	vwarnx(fmt, args);
2277c478bd9Sstevel@tonic-gate 	exit(status);
2287c478bd9Sstevel@tonic-gate }
229d362b749Svk 
230d362b749Svk void
231d362b749Svk _verrxfp(FILE *fp, int status, const char *fmt, va_list args)
232d362b749Svk {
233d362b749Svk 	_vwarnxfp(fp, fmt, args);
234d362b749Svk 	exit(status);
235d362b749Svk }
236