xref: /illumos-gate/usr/src/lib/libc/port/gen/err.c (revision 621b6cf7)
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 /*
2323a1cceaSRoger A. Faulkner  * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
247c478bd9Sstevel@tonic-gate  */
257c478bd9Sstevel@tonic-gate 
26*621b6cf7SAndy Fiddaman /*
27*621b6cf7SAndy Fiddaman  * Copyright 2022 OmniOS Community Edition (OmniOSce) Association.
28*621b6cf7SAndy Fiddaman  */
29*621b6cf7SAndy Fiddaman 
307257d1b4Sraf #include "lint.h"
31a574db85Sraf #include "file64.h"
32a574db85Sraf #include "mtlib.h"
3323a1cceaSRoger A. Faulkner #include "thr_uberdata.h"
34d362b749Svk #include <sys/types.h>
35d362b749Svk #include <err.h>
367c478bd9Sstevel@tonic-gate #include <stdio.h>
377c478bd9Sstevel@tonic-gate #include <stdlib.h>
387c478bd9Sstevel@tonic-gate #include <stdarg.h>
397c478bd9Sstevel@tonic-gate #include <string.h>
407c478bd9Sstevel@tonic-gate #include <errno.h>
4123a1cceaSRoger A. Faulkner #include <dlfcn.h>
42a574db85Sraf #include "stdiom.h"
437c478bd9Sstevel@tonic-gate 
447c478bd9Sstevel@tonic-gate /* Function exit/warning functions and global variables. */
457c478bd9Sstevel@tonic-gate 
4623a1cceaSRoger A. Faulkner const char *__progname;		/* GNU/Linux/BSD compatibility */
4723a1cceaSRoger A. Faulkner 
4823a1cceaSRoger A. Faulkner #define	PROGNAMESIZE	128	/* buffer size for __progname */
4923a1cceaSRoger A. Faulkner 
5023a1cceaSRoger A. Faulkner const char *
getprogname(void)5123a1cceaSRoger A. Faulkner getprogname(void)
5223a1cceaSRoger A. Faulkner {
5323a1cceaSRoger A. Faulkner 	return (__progname);
5423a1cceaSRoger A. Faulkner }
5523a1cceaSRoger A. Faulkner 
5623a1cceaSRoger A. Faulkner void
setprogname(const char * argv0)5723a1cceaSRoger A. Faulkner setprogname(const char *argv0)
5823a1cceaSRoger A. Faulkner {
5923a1cceaSRoger A. Faulkner 	uberdata_t *udp = curthread->ul_uberdata;
6023a1cceaSRoger A. Faulkner 	const char *progname;
6123a1cceaSRoger A. Faulkner 
6223a1cceaSRoger A. Faulkner 	if ((progname = strrchr(argv0, '/')) == NULL)
6323a1cceaSRoger A. Faulkner 		progname = argv0;
6423a1cceaSRoger A. Faulkner 	else
6523a1cceaSRoger A. Faulkner 		progname++;
6623a1cceaSRoger A. Faulkner 
6723a1cceaSRoger A. Faulkner 	if (udp->progname == NULL)
6823a1cceaSRoger A. Faulkner 		udp->progname = lmalloc(PROGNAMESIZE);
6923a1cceaSRoger A. Faulkner 	(void) strlcpy(udp->progname, progname, PROGNAMESIZE);
7023a1cceaSRoger A. Faulkner 	__progname = udp->progname;
7123a1cceaSRoger A. Faulkner }
7223a1cceaSRoger A. Faulkner 
7323a1cceaSRoger A. Faulkner /* called only from libc_init() */
7423a1cceaSRoger A. Faulkner void
init_progname(void)7523a1cceaSRoger A. Faulkner init_progname(void)
7623a1cceaSRoger A. Faulkner {
7723a1cceaSRoger A. Faulkner 	Dl_argsinfo_t args;
7823a1cceaSRoger A. Faulkner 	const char *argv0;
7923a1cceaSRoger A. Faulkner 
80315e6955SRoger A. Faulkner 	if (dlinfo(RTLD_SELF, RTLD_DI_ARGSINFO, &args) < 0 ||
81315e6955SRoger A. Faulkner 	    args.dla_argc <= 0 ||
82315e6955SRoger A. Faulkner 	    (argv0 = args.dla_argv[0]) == NULL)
8323a1cceaSRoger A. Faulkner 		argv0 = "UNKNOWN";
84315e6955SRoger A. Faulkner 
8523a1cceaSRoger A. Faulkner 	setprogname(argv0);
8623a1cceaSRoger A. Faulkner }
877c478bd9Sstevel@tonic-gate 
887c478bd9Sstevel@tonic-gate /*
897c478bd9Sstevel@tonic-gate  * warncore() is the workhorse of these functions.  Everything else has
907c478bd9Sstevel@tonic-gate  * a warncore() component in it.
917c478bd9Sstevel@tonic-gate  */
92a574db85Sraf static rmutex_t *
warncore(FILE * fp,const char * fmt,va_list args)93e3320f40Smarkfen warncore(FILE *fp, const char *fmt, va_list args)
947c478bd9Sstevel@tonic-gate {
95a574db85Sraf 	rmutex_t *lk;
96a574db85Sraf 
97a574db85Sraf 	FLOCKFILE(lk, fp);
98f7b942dfSvk 
9923a1cceaSRoger A. Faulkner 	if (__progname != NULL)
10023a1cceaSRoger A. Faulkner 		(void) fprintf(fp, "%s: ", __progname);
1017c478bd9Sstevel@tonic-gate 
1027c478bd9Sstevel@tonic-gate 	if (fmt != NULL) {
103e3320f40Smarkfen 		(void) vfprintf(fp, fmt, args);
1047c478bd9Sstevel@tonic-gate 	}
105a574db85Sraf 
106a574db85Sraf 	return (lk);
1077c478bd9Sstevel@tonic-gate }
1087c478bd9Sstevel@tonic-gate 
1097c478bd9Sstevel@tonic-gate /* Finish a warning with a newline and a flush of stderr. */
1107c478bd9Sstevel@tonic-gate static void
warnfinish(FILE * fp,rmutex_t * lk)111a574db85Sraf warnfinish(FILE *fp, rmutex_t *lk)
1127c478bd9Sstevel@tonic-gate {
113e3320f40Smarkfen 	(void) fputc('\n', fp);
114e3320f40Smarkfen 	(void) fflush(fp);
115a574db85Sraf 	FUNLOCKFILE(lk);
1167c478bd9Sstevel@tonic-gate }
1177c478bd9Sstevel@tonic-gate 
118*621b6cf7SAndy Fiddaman static void
vwarnfp(FILE * fp,int code,const char * fmt,va_list args)119*621b6cf7SAndy Fiddaman vwarnfp(FILE *fp, int code, const char *fmt, va_list args)
1207c478bd9Sstevel@tonic-gate {
121a574db85Sraf 	rmutex_t *lk;
122a574db85Sraf 
123a574db85Sraf 	lk = warncore(fp, fmt, args);
124*621b6cf7SAndy Fiddaman 	if (fmt != NULL) {
125*621b6cf7SAndy Fiddaman 		(void) fputc(':', fp);
126*621b6cf7SAndy Fiddaman 		(void) fputc(' ', fp);
127*621b6cf7SAndy Fiddaman 	}
128*621b6cf7SAndy Fiddaman 	(void) fputs(strerror(code), fp);
129a574db85Sraf 	warnfinish(fp, lk);
1307c478bd9Sstevel@tonic-gate }
1317c478bd9Sstevel@tonic-gate 
1327c478bd9Sstevel@tonic-gate void
vwarnx(const char * fmt,va_list args)133d362b749Svk vwarnx(const char *fmt, va_list args)
134d362b749Svk {
135a574db85Sraf 	rmutex_t *lk;
1367c478bd9Sstevel@tonic-gate 
137*621b6cf7SAndy Fiddaman 	lk = warncore(stderr, fmt, args);
138*621b6cf7SAndy Fiddaman 	warnfinish(stderr, lk);
139e3320f40Smarkfen }
140e3320f40Smarkfen 
141e3320f40Smarkfen void
vwarn(const char * fmt,va_list args)142e3320f40Smarkfen vwarn(const char *fmt, va_list args)
143e3320f40Smarkfen {
144*621b6cf7SAndy Fiddaman 	vwarnfp(stderr, errno, fmt, args);
1457c478bd9Sstevel@tonic-gate }
1467c478bd9Sstevel@tonic-gate 
1477c478bd9Sstevel@tonic-gate void
vwarnc(int code,const char * fmt,va_list args)148*621b6cf7SAndy Fiddaman vwarnc(int code, const char *fmt, va_list args)
1497c478bd9Sstevel@tonic-gate {
150*621b6cf7SAndy Fiddaman 	vwarnfp(stderr, code, fmt, args);
1517c478bd9Sstevel@tonic-gate }
1527c478bd9Sstevel@tonic-gate 
1537c478bd9Sstevel@tonic-gate void
warnx(const char * fmt,...)154*621b6cf7SAndy Fiddaman warnx(const char *fmt, ...)
1557c478bd9Sstevel@tonic-gate {
1567c478bd9Sstevel@tonic-gate 	va_list args;
1577c478bd9Sstevel@tonic-gate 
1587c478bd9Sstevel@tonic-gate 	va_start(args, fmt);
159*621b6cf7SAndy Fiddaman 	vwarnx(fmt, args);
1607c478bd9Sstevel@tonic-gate 	va_end(args);
1617c478bd9Sstevel@tonic-gate }
1627c478bd9Sstevel@tonic-gate 
163e3320f40Smarkfen void
warn(const char * fmt,...)164*621b6cf7SAndy Fiddaman warn(const char *fmt, ...)
165e3320f40Smarkfen {
166e3320f40Smarkfen 	va_list args;
167e3320f40Smarkfen 
168e3320f40Smarkfen 	va_start(args, fmt);
169*621b6cf7SAndy Fiddaman 	vwarn(fmt, args);
170e3320f40Smarkfen 	va_end(args);
171e3320f40Smarkfen }
172e3320f40Smarkfen 
173e3320f40Smarkfen void
warnc(int code,const char * fmt,...)174*621b6cf7SAndy Fiddaman warnc(int code, const char *fmt, ...)
175e3320f40Smarkfen {
176e3320f40Smarkfen 	va_list args;
177e3320f40Smarkfen 
178e3320f40Smarkfen 	va_start(args, fmt);
179*621b6cf7SAndy Fiddaman 	vwarnc(code, fmt, args);
180e3320f40Smarkfen 	va_end(args);
181e3320f40Smarkfen }
182e3320f40Smarkfen 
1837c478bd9Sstevel@tonic-gate void
err(int status,const char * fmt,...)1847c478bd9Sstevel@tonic-gate err(int status, const char *fmt, ...)
1857c478bd9Sstevel@tonic-gate {
1867c478bd9Sstevel@tonic-gate 	va_list args;
1877c478bd9Sstevel@tonic-gate 
1887c478bd9Sstevel@tonic-gate 	va_start(args, fmt);
1897c478bd9Sstevel@tonic-gate 	vwarn(fmt, args);
1907c478bd9Sstevel@tonic-gate 	va_end(args);
1917c478bd9Sstevel@tonic-gate 	exit(status);
1927c478bd9Sstevel@tonic-gate }
1937c478bd9Sstevel@tonic-gate 
194d362b749Svk void
errc(int status,int code,const char * fmt,...)195*621b6cf7SAndy Fiddaman errc(int status, int code, const char *fmt, ...)
196d362b749Svk {
197d362b749Svk 	va_list args;
198d362b749Svk 
199d362b749Svk 	va_start(args, fmt);
200*621b6cf7SAndy Fiddaman 	vwarnc(code, fmt, args);
201d362b749Svk 	va_end(args);
202d362b749Svk 	exit(status);
203d362b749Svk }
204d362b749Svk 
2057c478bd9Sstevel@tonic-gate void
verr(int status,const char * fmt,va_list args)2067c478bd9Sstevel@tonic-gate verr(int status, const char *fmt, va_list args)
2077c478bd9Sstevel@tonic-gate {
2087c478bd9Sstevel@tonic-gate 	vwarn(fmt, args);
2097c478bd9Sstevel@tonic-gate 	exit(status);
2107c478bd9Sstevel@tonic-gate }
2117c478bd9Sstevel@tonic-gate 
212d362b749Svk void
verrc(int status,int code,const char * fmt,va_list args)213*621b6cf7SAndy Fiddaman verrc(int status, int code, const char *fmt, va_list args)
214d362b749Svk {
215*621b6cf7SAndy Fiddaman 	vwarnc(code, fmt, args);
216d362b749Svk 	exit(status);
217d362b749Svk }
218d362b749Svk 
2197c478bd9Sstevel@tonic-gate void
errx(int status,const char * fmt,...)2207c478bd9Sstevel@tonic-gate errx(int status, const char *fmt, ...)
2217c478bd9Sstevel@tonic-gate {
2227c478bd9Sstevel@tonic-gate 	va_list args;
2237c478bd9Sstevel@tonic-gate 
2247c478bd9Sstevel@tonic-gate 	va_start(args, fmt);
2257c478bd9Sstevel@tonic-gate 	vwarnx(fmt, args);
2267c478bd9Sstevel@tonic-gate 	va_end(args);
2277c478bd9Sstevel@tonic-gate 	exit(status);
2287c478bd9Sstevel@tonic-gate }
2297c478bd9Sstevel@tonic-gate 
230d362b749Svk void
verrx(int status,const char * fmt,va_list args)231*621b6cf7SAndy Fiddaman verrx(int status, const char *fmt, va_list args)
232*621b6cf7SAndy Fiddaman {
233*621b6cf7SAndy Fiddaman 	vwarnx(fmt, args);
234*621b6cf7SAndy Fiddaman 	exit(status);
235*621b6cf7SAndy Fiddaman }
236*621b6cf7SAndy Fiddaman 
237*621b6cf7SAndy Fiddaman /*
238*621b6cf7SAndy Fiddaman  * The following functions are here as the targets of filters in libipsecutil.
239*621b6cf7SAndy Fiddaman  */
240*621b6cf7SAndy Fiddaman 
241*621b6cf7SAndy Fiddaman void
_vwarnxfp(FILE * fp,const char * fmt,va_list args)242*621b6cf7SAndy Fiddaman _vwarnxfp(FILE *fp, const char *fmt, va_list args)
243*621b6cf7SAndy Fiddaman {
244*621b6cf7SAndy Fiddaman 	rmutex_t *lk;
245*621b6cf7SAndy Fiddaman 
246*621b6cf7SAndy Fiddaman 	lk = warncore(fp, fmt, args);
247*621b6cf7SAndy Fiddaman 	warnfinish(fp, lk);
248*621b6cf7SAndy Fiddaman }
249*621b6cf7SAndy Fiddaman 
250*621b6cf7SAndy Fiddaman void
_vwarnfp(FILE * fp,const char * fmt,va_list args)251*621b6cf7SAndy Fiddaman _vwarnfp(FILE *fp, const char *fmt, va_list args)
252*621b6cf7SAndy Fiddaman {
253*621b6cf7SAndy Fiddaman 	vwarnfp(fp, errno, fmt, args);
254*621b6cf7SAndy Fiddaman }
255*621b6cf7SAndy Fiddaman 
256*621b6cf7SAndy Fiddaman void
_warnfp(FILE * fp,const char * fmt,...)257*621b6cf7SAndy Fiddaman _warnfp(FILE *fp, const char *fmt, ...)
258*621b6cf7SAndy Fiddaman {
259*621b6cf7SAndy Fiddaman 	va_list args;
260*621b6cf7SAndy Fiddaman 
261*621b6cf7SAndy Fiddaman 	va_start(args, fmt);
262*621b6cf7SAndy Fiddaman 	_vwarnfp(fp, fmt, args);
263*621b6cf7SAndy Fiddaman 	va_end(args);
264*621b6cf7SAndy Fiddaman }
265*621b6cf7SAndy Fiddaman 
266*621b6cf7SAndy Fiddaman void
_warnxfp(FILE * fp,const char * fmt,...)267*621b6cf7SAndy Fiddaman _warnxfp(FILE *fp, const char *fmt, ...)
268d362b749Svk {
269d362b749Svk 	va_list args;
270d362b749Svk 
271d362b749Svk 	va_start(args, fmt);
272d362b749Svk 	_vwarnxfp(fp, fmt, args);
273d362b749Svk 	va_end(args);
274*621b6cf7SAndy Fiddaman }
275*621b6cf7SAndy Fiddaman 
276*621b6cf7SAndy Fiddaman void
_errfp(FILE * fp,int status,const char * fmt,...)277*621b6cf7SAndy Fiddaman _errfp(FILE *fp, int status, const char *fmt, ...)
278*621b6cf7SAndy Fiddaman {
279*621b6cf7SAndy Fiddaman 	va_list args;
280*621b6cf7SAndy Fiddaman 
281*621b6cf7SAndy Fiddaman 	va_start(args, fmt);
282*621b6cf7SAndy Fiddaman 	_vwarnfp(fp, fmt, args);
283*621b6cf7SAndy Fiddaman 	va_end(args);
284d362b749Svk 	exit(status);
285d362b749Svk }
286d362b749Svk 
2877c478bd9Sstevel@tonic-gate void
_verrfp(FILE * fp,int status,const char * fmt,va_list args)288*621b6cf7SAndy Fiddaman _verrfp(FILE *fp, int status, const char *fmt, va_list args)
2897c478bd9Sstevel@tonic-gate {
290*621b6cf7SAndy Fiddaman 	_vwarnfp(fp, fmt, args);
291*621b6cf7SAndy Fiddaman 	exit(status);
292*621b6cf7SAndy Fiddaman }
293*621b6cf7SAndy Fiddaman 
294*621b6cf7SAndy Fiddaman void
_errxfp(FILE * fp,int status,const char * fmt,...)295*621b6cf7SAndy Fiddaman _errxfp(FILE *fp, int status, const char *fmt, ...)
296*621b6cf7SAndy Fiddaman {
297*621b6cf7SAndy Fiddaman 	va_list args;
298*621b6cf7SAndy Fiddaman 
299*621b6cf7SAndy Fiddaman 	va_start(args, fmt);
300*621b6cf7SAndy Fiddaman 	_vwarnxfp(fp, fmt, args);
301*621b6cf7SAndy Fiddaman 	va_end(args);
3027c478bd9Sstevel@tonic-gate 	exit(status);
3037c478bd9Sstevel@tonic-gate }
304d362b749Svk 
305d362b749Svk void
_verrxfp(FILE * fp,int status,const char * fmt,va_list args)306d362b749Svk _verrxfp(FILE *fp, int status, const char *fmt, va_list args)
307d362b749Svk {
308d362b749Svk 	_vwarnxfp(fp, fmt, args);
309d362b749Svk 	exit(status);
310d362b749Svk }
311