158f0484fSRodney W. Grimes /*-
28a16b7a1SPedro F. Giffuni * SPDX-License-Identifier: BSD-3-Clause
38a16b7a1SPedro F. Giffuni *
458f0484fSRodney W. Grimes * Copyright (c) 1993
558f0484fSRodney W. Grimes * The Regents of the University of California. All rights reserved.
658f0484fSRodney W. Grimes *
758f0484fSRodney W. Grimes * Redistribution and use in source and binary forms, with or without
858f0484fSRodney W. Grimes * modification, are permitted provided that the following conditions
958f0484fSRodney W. Grimes * are met:
1058f0484fSRodney W. Grimes * 1. Redistributions of source code must retain the above copyright
1158f0484fSRodney W. Grimes * notice, this list of conditions and the following disclaimer.
1258f0484fSRodney W. Grimes * 2. Redistributions in binary form must reproduce the above copyright
1358f0484fSRodney W. Grimes * notice, this list of conditions and the following disclaimer in the
1458f0484fSRodney W. Grimes * documentation and/or other materials provided with the distribution.
15fbbd9655SWarner Losh * 3. Neither the name of the University nor the names of its contributors
1658f0484fSRodney W. Grimes * may be used to endorse or promote products derived from this software
1758f0484fSRodney W. Grimes * without specific prior written permission.
1858f0484fSRodney W. Grimes *
1958f0484fSRodney W. Grimes * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
2058f0484fSRodney W. Grimes * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2158f0484fSRodney W. Grimes * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2258f0484fSRodney W. Grimes * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
2358f0484fSRodney W. Grimes * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2458f0484fSRodney W. Grimes * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2558f0484fSRodney W. Grimes * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2658f0484fSRodney W. Grimes * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2758f0484fSRodney W. Grimes * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2858f0484fSRodney W. Grimes * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2958f0484fSRodney W. Grimes * SUCH DAMAGE.
3058f0484fSRodney W. Grimes */
3158f0484fSRodney W. Grimes
321643f03dSBruce Evans #include "namespace.h"
3358f0484fSRodney W. Grimes #include <err.h>
3458f0484fSRodney W. Grimes #include <errno.h>
354cd01193SMark Murray #include <stdarg.h>
3658f0484fSRodney W. Grimes #include <stdio.h>
3758f0484fSRodney W. Grimes #include <stdlib.h>
3858f0484fSRodney W. Grimes #include <string.h>
394cd01193SMark Murray #include "un-namespace.h"
4058f0484fSRodney W. Grimes
414cd01193SMark Murray #include "libc_private.h"
4258f0484fSRodney W. Grimes
433688be0eSGarrett Wollman static FILE *err_file; /* file to use for error output */
443688be0eSGarrett Wollman static void (*err_exit)(int);
453688be0eSGarrett Wollman
46b4b4fb87SGarrett Wollman /*
47b4b4fb87SGarrett Wollman * This is declared to take a `void *' so that the caller is not required
48b4b4fb87SGarrett Wollman * to include <stdio.h> first. However, it is really a `FILE *', and the
49b4b4fb87SGarrett Wollman * manual page documents it as such.
50b4b4fb87SGarrett Wollman */
513688be0eSGarrett Wollman void
err_set_file(void * fp)523688be0eSGarrett Wollman err_set_file(void *fp)
533688be0eSGarrett Wollman {
543688be0eSGarrett Wollman if (fp)
553688be0eSGarrett Wollman err_file = fp;
563688be0eSGarrett Wollman else
573688be0eSGarrett Wollman err_file = stderr;
583688be0eSGarrett Wollman }
593688be0eSGarrett Wollman
603688be0eSGarrett Wollman void
err_set_exit(void (* ef)(int))613688be0eSGarrett Wollman err_set_exit(void (*ef)(int))
623688be0eSGarrett Wollman {
633688be0eSGarrett Wollman err_exit = ef;
643688be0eSGarrett Wollman }
653688be0eSGarrett Wollman
66ac8e56a7SBruce Evans __weak_reference(_err, err);
67ac8e56a7SBruce Evans
68eaa86f9dSBruce Evans void
_err(int eval,const char * fmt,...)69ac8e56a7SBruce Evans _err(int eval, const char *fmt, ...)
7058f0484fSRodney W. Grimes {
7158f0484fSRodney W. Grimes va_list ap;
7258f0484fSRodney W. Grimes va_start(ap, fmt);
73b4b4fb87SGarrett Wollman verrc(eval, errno, fmt, ap);
7458f0484fSRodney W. Grimes va_end(ap);
7558f0484fSRodney W. Grimes }
7658f0484fSRodney W. Grimes
77eaa86f9dSBruce Evans void
verr(int eval,const char * fmt,va_list ap)7855b6b759SCraig Rodrigues verr(int eval, const char *fmt, va_list ap)
7958f0484fSRodney W. Grimes {
80b4b4fb87SGarrett Wollman verrc(eval, errno, fmt, ap);
8158f0484fSRodney W. Grimes }
82b4b4fb87SGarrett Wollman
83b4b4fb87SGarrett Wollman void
errc(int eval,int code,const char * fmt,...)84b4b4fb87SGarrett Wollman errc(int eval, int code, const char *fmt, ...)
85b4b4fb87SGarrett Wollman {
86b4b4fb87SGarrett Wollman va_list ap;
87b4b4fb87SGarrett Wollman va_start(ap, fmt);
88b4b4fb87SGarrett Wollman verrc(eval, code, fmt, ap);
89b4b4fb87SGarrett Wollman va_end(ap);
90b4b4fb87SGarrett Wollman }
91b4b4fb87SGarrett Wollman
92b4b4fb87SGarrett Wollman void
verrc(int eval,int code,const char * fmt,va_list ap)9322e5baf7SWarner Losh verrc(int eval, int code, const char *fmt, va_list ap)
94b4b4fb87SGarrett Wollman {
95513004a2SPedro F. Giffuni if (err_file == NULL)
9613841637SEnji Cooper err_set_file(NULL);
974cd01193SMark Murray fprintf(err_file, "%s: ", _getprogname());
98b4b4fb87SGarrett Wollman if (fmt != NULL) {
99b4b4fb87SGarrett Wollman vfprintf(err_file, fmt, ap);
100b4b4fb87SGarrett Wollman fprintf(err_file, ": ");
101b4b4fb87SGarrett Wollman }
102b4b4fb87SGarrett Wollman fprintf(err_file, "%s\n", strerror(code));
1033688be0eSGarrett Wollman if (err_exit)
1043688be0eSGarrett Wollman err_exit(eval);
10558f0484fSRodney W. Grimes exit(eval);
10658f0484fSRodney W. Grimes }
10758f0484fSRodney W. Grimes
108eaa86f9dSBruce Evans void
errx(int eval,const char * fmt,...)10958f0484fSRodney W. Grimes errx(int eval, const char *fmt, ...)
11058f0484fSRodney W. Grimes {
11158f0484fSRodney W. Grimes va_list ap;
11258f0484fSRodney W. Grimes va_start(ap, fmt);
11358f0484fSRodney W. Grimes verrx(eval, fmt, ap);
11458f0484fSRodney W. Grimes va_end(ap);
11558f0484fSRodney W. Grimes }
11658f0484fSRodney W. Grimes
117eaa86f9dSBruce Evans void
verrx(int eval,const char * fmt,va_list ap)11822e5baf7SWarner Losh verrx(int eval, const char *fmt, va_list ap)
11958f0484fSRodney W. Grimes {
120513004a2SPedro F. Giffuni if (err_file == NULL)
12113841637SEnji Cooper err_set_file(NULL);
1224cd01193SMark Murray fprintf(err_file, "%s: ", _getprogname());
12358f0484fSRodney W. Grimes if (fmt != NULL)
124b4b4fb87SGarrett Wollman vfprintf(err_file, fmt, ap);
125b4b4fb87SGarrett Wollman fprintf(err_file, "\n");
1263688be0eSGarrett Wollman if (err_exit)
1273688be0eSGarrett Wollman err_exit(eval);
12858f0484fSRodney W. Grimes exit(eval);
12958f0484fSRodney W. Grimes }
13058f0484fSRodney W. Grimes
1311643f03dSBruce Evans __weak_reference(_warn, warn);
1321643f03dSBruce Evans
13358f0484fSRodney W. Grimes void
_warn(const char * fmt,...)1341643f03dSBruce Evans _warn(const char *fmt, ...)
13558f0484fSRodney W. Grimes {
13658f0484fSRodney W. Grimes va_list ap;
13758f0484fSRodney W. Grimes va_start(ap, fmt);
138b4b4fb87SGarrett Wollman vwarnc(errno, fmt, ap);
13958f0484fSRodney W. Grimes va_end(ap);
14058f0484fSRodney W. Grimes }
14158f0484fSRodney W. Grimes
14258f0484fSRodney W. Grimes void
vwarn(const char * fmt,va_list ap)14322e5baf7SWarner Losh vwarn(const char *fmt, va_list ap)
14458f0484fSRodney W. Grimes {
145b4b4fb87SGarrett Wollman vwarnc(errno, fmt, ap);
14658f0484fSRodney W. Grimes }
14758f0484fSRodney W. Grimes
14858f0484fSRodney W. Grimes void
warnc(int code,const char * fmt,...)149b4b4fb87SGarrett Wollman warnc(int code, const char *fmt, ...)
15058f0484fSRodney W. Grimes {
15158f0484fSRodney W. Grimes va_list ap;
15258f0484fSRodney W. Grimes va_start(ap, fmt);
153b4b4fb87SGarrett Wollman vwarnc(code, fmt, ap);
154b4b4fb87SGarrett Wollman va_end(ap);
155b4b4fb87SGarrett Wollman }
156b4b4fb87SGarrett Wollman
157b4b4fb87SGarrett Wollman void
vwarnc(int code,const char * fmt,va_list ap)15822e5baf7SWarner Losh vwarnc(int code, const char *fmt, va_list ap)
159b4b4fb87SGarrett Wollman {
160*b38d86a5SWarner Losh int saved_errno;
1614e0771b2SWarner Losh
1624e0771b2SWarner Losh saved_errno = errno;
163513004a2SPedro F. Giffuni if (err_file == NULL)
16413841637SEnji Cooper err_set_file(NULL);
1654cd01193SMark Murray fprintf(err_file, "%s: ", _getprogname());
166b4b4fb87SGarrett Wollman if (fmt != NULL) {
167b4b4fb87SGarrett Wollman vfprintf(err_file, fmt, ap);
168b4b4fb87SGarrett Wollman fprintf(err_file, ": ");
169b4b4fb87SGarrett Wollman }
170b4b4fb87SGarrett Wollman fprintf(err_file, "%s\n", strerror(code));
1714e0771b2SWarner Losh errno = saved_errno;
172b4b4fb87SGarrett Wollman }
173b4b4fb87SGarrett Wollman
174b4b4fb87SGarrett Wollman void
warnx(const char * fmt,...)175b4b4fb87SGarrett Wollman warnx(const char *fmt, ...)
176b4b4fb87SGarrett Wollman {
177b4b4fb87SGarrett Wollman va_list ap;
178b4b4fb87SGarrett Wollman va_start(ap, fmt);
17975a21a38SGarrett Wollman vwarnx(fmt, ap);
18058f0484fSRodney W. Grimes va_end(ap);
18158f0484fSRodney W. Grimes }
18258f0484fSRodney W. Grimes
18358f0484fSRodney W. Grimes void
vwarnx(const char * fmt,va_list ap)18422e5baf7SWarner Losh vwarnx(const char *fmt, va_list ap)
18558f0484fSRodney W. Grimes {
186*b38d86a5SWarner Losh int saved_errno;
1874e0771b2SWarner Losh
1884e0771b2SWarner Losh saved_errno = errno;
189513004a2SPedro F. Giffuni if (err_file == NULL)
19013841637SEnji Cooper err_set_file(NULL);
1914cd01193SMark Murray fprintf(err_file, "%s: ", _getprogname());
19258f0484fSRodney W. Grimes if (fmt != NULL)
193b4b4fb87SGarrett Wollman vfprintf(err_file, fmt, ap);
194b4b4fb87SGarrett Wollman fprintf(err_file, "\n");
1954e0771b2SWarner Losh errno = saved_errno;
19658f0484fSRodney W. Grimes }
197