mirror of
				https://github.com/postgres/postgres.git
				synced 2025-11-03 09:13:20 +03:00 
			
		
		
		
	
		
			
				
	
	
		
			61 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			61 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/*
 | 
						|
**
 | 
						|
**		halt.c
 | 
						|
**
 | 
						|
**		This is used to print out error messages and exit
 | 
						|
*/
 | 
						|
 | 
						|
#include <varargs.h>
 | 
						|
#include <signal.h>
 | 
						|
#include <stdio.h>
 | 
						|
#include <stdlib.h>
 | 
						|
#include <string.h>
 | 
						|
#include <errno.h>
 | 
						|
 | 
						|
 | 
						|
/*-------------------------------------------------------------------------
 | 
						|
**
 | 
						|
**		halt - print error message, and call clean up routine or exit
 | 
						|
**
 | 
						|
**------------------------------------------------------------------------*/
 | 
						|
 | 
						|
/*VARARGS*/
 | 
						|
void
 | 
						|
halt(va_alist)
 | 
						|
va_dcl
 | 
						|
{
 | 
						|
	va_list		arg_ptr;
 | 
						|
	char	   *format,
 | 
						|
			   *pstr;
 | 
						|
	void		(*sig_func) ();
 | 
						|
 | 
						|
	va_start(arg_ptr);
 | 
						|
	format = va_arg(arg_ptr, char *);
 | 
						|
	if (strncmp(format, "PERROR", 6) != 0)
 | 
						|
		vfprintf(stderr, format, arg_ptr);
 | 
						|
	else
 | 
						|
	{
 | 
						|
		for (pstr = format + 6; *pstr == ' ' || *pstr == ':'; pstr++)
 | 
						|
			;
 | 
						|
		vfprintf(stderr, pstr, arg_ptr);
 | 
						|
		perror("");
 | 
						|
	}
 | 
						|
	va_end(arg_ptr);
 | 
						|
	fflush(stderr);
 | 
						|
 | 
						|
	/* call one clean up function if defined */
 | 
						|
	if ((sig_func = signal(SIGTERM, SIG_DFL)) !=SIG_DFL &&
 | 
						|
		sig_func !=SIG_IGN)
 | 
						|
		(*sig_func) (0);
 | 
						|
	else if ((sig_func = signal(SIGHUP, SIG_DFL)) !=SIG_DFL &&
 | 
						|
			 sig_func !=SIG_IGN)
 | 
						|
		(*sig_func) (0);
 | 
						|
	else if ((sig_func = signal(SIGINT, SIG_DFL)) !=SIG_DFL &&
 | 
						|
			 sig_func !=SIG_IGN)
 | 
						|
		(*sig_func) (0);
 | 
						|
	else if ((sig_func = signal(SIGQUIT, SIG_DFL)) !=SIG_DFL &&
 | 
						|
			 sig_func !=SIG_IGN)
 | 
						|
		(*sig_func) (0);
 | 
						|
	exit(1);
 | 
						|
}
 |