xref: /openbsd-src/usr.bin/cvs/fatal.c (revision 3bfd7915d6076571998328b4f33c0426126ff4d7)
1*3bfd7915Sjoris /*	$OpenBSD: fatal.c,v 1.14 2008/06/12 03:54:43 joris Exp $ */
20450b43bSjoris /*
30450b43bSjoris  * Copyright (c) 2002 Markus Friedl.  All rights reserved.
40450b43bSjoris  *
50450b43bSjoris  * Redistribution and use in source and binary forms, with or without
60450b43bSjoris  * modification, are permitted provided that the following conditions
70450b43bSjoris  * are met:
80450b43bSjoris  * 1. Redistributions of source code must retain the above copyright
90450b43bSjoris  *    notice, this list of conditions and the following disclaimer.
100450b43bSjoris  * 2. Redistributions in binary form must reproduce the above copyright
110450b43bSjoris  *    notice, this list of conditions and the following disclaimer in the
120450b43bSjoris  *    documentation and/or other materials provided with the distribution.
130450b43bSjoris  *
140450b43bSjoris  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
150450b43bSjoris  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
160450b43bSjoris  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
170450b43bSjoris  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
180450b43bSjoris  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
190450b43bSjoris  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
200450b43bSjoris  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
210450b43bSjoris  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
220450b43bSjoris  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
230450b43bSjoris  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
240450b43bSjoris  */
250450b43bSjoris 
261f8531bdSotto #include <sys/stat.h>
271f8531bdSotto 
281d062063Sray #include <err.h>
291f8531bdSotto #include <fcntl.h>
301f8531bdSotto #include <stdlib.h>
310450b43bSjoris 
320450b43bSjoris #include "cvs.h"
339fac60a5Sjoris #include "remote.h"
340450b43bSjoris 
350450b43bSjoris /* Fatal messages.  This function never returns. */
360450b43bSjoris 
370450b43bSjoris void
fatal(const char * fmt,...)380450b43bSjoris fatal(const char *fmt,...)
390450b43bSjoris {
408c13001eSray 	static int been_here;
410450b43bSjoris 	va_list args;
4230d6d63aSjoris 
438c13001eSray 	/* Fatal should not loop, (the functions below can fatal). */
448c13001eSray 	if (been_here++)
451d062063Sray 		errx(1, "fatal loop");
468c13001eSray 
47*3bfd7915Sjoris 	if (sig_received != 0) {
48*3bfd7915Sjoris 		cvs_log(LP_ABORT, "received signal %d", sig_received);
49*3bfd7915Sjoris 	} else {
500450b43bSjoris 		va_start(args, fmt);
514d5fe279Sjoris 		cvs_vlog(LP_ABORT, fmt, args);
520450b43bSjoris 		va_end(args);
53*3bfd7915Sjoris 	}
543ad3fb45Sjoris 
55b0d19690Stobias 	if (current_cvsroot != NULL)
563ad3fb45Sjoris 		cvs_cleanup();
573ad3fb45Sjoris 
58134ccf9fSniallo 	exit(1);
590450b43bSjoris }
60