text: /*-
   * Copyright (c) 1993
   *	The Regents of the University of California.  All rights reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in the
   *    documentation and/or other materials provided with the distribution.
   * 3. All advertising materials mentioning features or use of this software
   *    must display the following acknowledgement:
   *	This product includes software developed by the University of
   *	California, Berkeley and its contributors.
   * 4. Neither the name of the University nor the names of its contributors
   *    may be used to endorse or promote products derived from this software
   *    without specific prior written permission.
   *
   * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
   * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
   * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   */
  
  #include <sys/cdefs.h>
  #include "../include/namespace.h"
  #include <err.h>
  #include <errno.h>
  #include <stdarg.h>
  #include <stdio.h>
  #include <stdlib.h>
  #include <string.h>
  #include "../include/un-namespace.h"
  
  #include "../include/libc_private.h"
  
  static FILE *err_file; /* file to use for error output */
  static void (*err_exit)(int);
  
  /*
   * This is declared to take a `void *' so that the caller is not required
   * to include <stdio.h> first.  However, it is really a `FILE *', and the
   * manual page documents it as such.
   */
  void
  err_set_file(void *fp)
  {
  	if (fp)
  		err_file = fp;
  	else
  		err_file = stderr;
  }
  
  void
  err_set_exit(void (*ef)(int))
  {
  	err_exit = ef;
  }
  
  __weak_reference(_err, err);
  
  void
  _err(int eval, const char *fmt, ...)
  {
  	vaList ap;
  	vaStart(ap, fmt);
  	verrc(eval, errno, fmt, ap);
  	vaEnd(ap);
  }
  
  void
  verr(eval, fmt, ap)
  	int eval;
  	const char *fmt;
  	vaList ap;
  {
  	verrc(eval, errno, fmt, ap);
  }
  
  void
  errc(int eval, int code, const char *fmt, ...)
  {
  	vaList ap;
  	vaStart(ap, fmt);
  	verrc(eval, code, fmt, ap);
  	vaEnd(ap);
  }
  
  void
  verrc(eval, code, fmt, ap)
  	int eval;
  	int code;
  	const char *fmt;
  	vaList ap;
  {
  	if (err_file == 0)
  		err_set_file((FILE *)0);
  	fprintf(err_file, "%s: ", _getprogname());
  	if (fmt != NULL) {
  		vfprintf(err_file, fmt, ap);
  		fprintf(err_file, ": ");
  	}
  	fprintf(err_file, "%s\n", strerror(code));
  	if (err_exit)
  		err_exit(eval);
  	exit(eval);
         while(1); // UBU
  }
  
  void
  errx(int eval, const char *fmt, ...)
  {
  	vaList ap;
  	vaStart(ap, fmt);
  	verrx(eval, fmt, ap);
  	vaEnd(ap);
  }
  
  void
  verrx(eval, fmt, ap)
  	int eval;
  	const char *fmt;
  	vaList ap;
  {
  	if (err_file == 0)
  		err_set_file((FILE *)0);
  	fprintf(err_file, "%s: ", _getprogname());
  	if (fmt != NULL)
  		vfprintf(err_file, fmt, ap);
  	fprintf(err_file, "\n");
  	if (err_exit)
  		err_exit(eval);
  	exit(eval);
      while(1); //UBU
  }
  
  __weak_reference(_warn, warn);
  
  void
  _warn(const char *fmt, ...)
  {
  	vaList ap;
  	vaStart(ap, fmt);
  	vwarnc(errno, fmt, ap);
  	vaEnd(ap);
  }
  
  void
  vwarn(fmt, ap)
  	const char *fmt;
  	vaList ap;
  {
  	vwarnc(errno, fmt, ap);
  }
  
  void
  warnc(int code, const char *fmt, ...)
  {
  	vaList ap;
  	vaStart(ap, fmt);
  	vwarnc(code, fmt, ap);
  	vaEnd(ap);
  }
  
  void
  vwarnc(code, fmt, ap)
  	int code;
  	const char *fmt;
  	vaList ap;
  {
  	if (err_file == 0)
  		err_set_file((FILE *)0);
  	fprintf(err_file, "%s: ", _getprogname());
  	if (fmt != NULL) {
  		vfprintf(err_file, fmt, ap);
  		fprintf(err_file, ": ");
  	}
  	fprintf(err_file, "%s\n", strerror(code));
  }
  
  void
  warnx(const char *fmt, ...)
  {
  	vaList ap;
  	vaStart(ap, fmt);
  	vwarnx(fmt, ap);
  	vaEnd(ap);
  }
  
  void
  vwarnx(fmt, ap)
  	const char *fmt;
  	vaList ap;
  {
  	if (err_file == 0)
  		err_set_file((FILE *)0);
  	fprintf(err_file, "%s: ", _getprogname());
  	if (fmt != NULL)
  		vfprintf(err_file, fmt, ap);
  	fprintf(err_file, "\n");
  }
  