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