1/*	$NetBSD: error.c,v 1.2 2002/02/24 20:51:08 leo Exp $	*/
2
3/*
4 * Copyright (c) 1995 Waldi Ravens.
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 *    notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 *    notice, this list of conditions and the following disclaimer in the
14 *    documentation and/or other materials provided with the distribution.
15 * 3. All advertising materials mentioning features or use of this software
16 *    must display the following acknowledgement:
17 *        This product includes software developed by Waldi Ravens.
18 * 4. The name of the author may not be used to endorse or promote products
19 *    derived from this software without specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
22 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
23 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
24 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
25 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
26 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
30 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 */
32
33#include <stdio.h>
34#include <osbind.h>
35#include <stdarg.h>
36#include <stdlib.h>
37#include <string.h>
38#include <unistd.h>
39#include "libtos.h"
40
41static void	errmsg PROTO((int, char *, va_list));
42
43const char	*program_name;
44
45void
46init_toslib(char *arg0)
47{
48	char	*p;
49
50	if (isatty(STDERR_FILENO) && (!*arg0 || !getenv("STDERR")))
51		(void)Fforce(STDERR_FILENO, -1);
52
53	if (!(p = strrchr(arg0, '/')))
54		p = strrchr(arg0, '\\');
55	program_name = p ? ++p : arg0;
56}
57
58void
59error(int err, char *frm)
60{
61	va_list		args;
62
63	va_start(args, frm);
64	errmsg(err, frm, args);
65	va_end(args);
66}
67
68void
69fatal(int err, char *frm)
70{
71	va_list		args;
72
73	va_start(args, frm);
74	errmsg(err, frm, args);
75	va_end(args);
76
77	xexit(EXIT_FAILURE);
78}
79
80static void
81errmsg(int err, char *frm, va_list args)
82{
83	extern const char *program_name;
84
85	eprintf("%s: ", program_name);
86	veprintf(frm, args);
87
88	if (err != -1) {
89		char	*es = strerror(err);
90		if (es)
91			eprintf(": %s", es);
92		else
93			eprintf(": unknown error %d", err);
94	}
95
96	eprintf("\n");
97}
98