text data bss dec hex filename 808035 611 6868 815514 c719a busybox_old 804472 611 6868 811951 c63af busybox_unstripped
		
			
				
	
	
		
			181 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			181 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/* vi: set sw=4 ts=4: */
 | 
						|
/*
 | 
						|
 * Signal name/number conversion routines.
 | 
						|
 *
 | 
						|
 * Copyright 2006 Rob Landley <rob@landley.net>
 | 
						|
 *
 | 
						|
 * Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
 | 
						|
 */
 | 
						|
 | 
						|
#include "libbb.h"
 | 
						|
 | 
						|
/* Believe it or not, but some arches have more than 32 SIGs!
 | 
						|
 * HPPA: SIGSTKFLT == 36. */
 | 
						|
 | 
						|
static const char signals[][7] = {
 | 
						|
	// SUSv3 says kill must support these, and specifies the numerical values,
 | 
						|
	// http://www.opengroup.org/onlinepubs/009695399/utilities/kill.html
 | 
						|
	// {0, "EXIT"}, {1, "HUP"}, {2, "INT"}, {3, "QUIT"},
 | 
						|
	// {6, "ABRT"}, {9, "KILL"}, {14, "ALRM"}, {15, "TERM"}
 | 
						|
	// And Posix adds the following:
 | 
						|
	// {SIGILL, "ILL"}, {SIGTRAP, "TRAP"}, {SIGFPE, "FPE"}, {SIGUSR1, "USR1"},
 | 
						|
	// {SIGSEGV, "SEGV"}, {SIGUSR2, "USR2"}, {SIGPIPE, "PIPE"}, {SIGCHLD, "CHLD"},
 | 
						|
	// {SIGCONT, "CONT"}, {SIGSTOP, "STOP"}, {SIGTSTP, "TSTP"}, {SIGTTIN, "TTIN"},
 | 
						|
	// {SIGTTOU, "TTOU"}
 | 
						|
 | 
						|
	[0] = "EXIT",
 | 
						|
#ifdef SIGHUP
 | 
						|
	[SIGHUP   ] = "HUP",
 | 
						|
#endif
 | 
						|
#ifdef SIGINT
 | 
						|
	[SIGINT   ] = "INT",
 | 
						|
#endif
 | 
						|
#ifdef SIGQUIT
 | 
						|
	[SIGQUIT  ] = "QUIT",
 | 
						|
#endif
 | 
						|
#ifdef SIGILL
 | 
						|
	[SIGILL   ] = "ILL",
 | 
						|
#endif
 | 
						|
#ifdef SIGTRAP
 | 
						|
	[SIGTRAP  ] = "TRAP",
 | 
						|
#endif
 | 
						|
#ifdef SIGABRT
 | 
						|
	[SIGABRT  ] = "ABRT",
 | 
						|
#endif
 | 
						|
#ifdef SIGBUS
 | 
						|
	[SIGBUS   ] = "BUS",
 | 
						|
#endif
 | 
						|
#ifdef SIGFPE
 | 
						|
	[SIGFPE   ] = "FPE",
 | 
						|
#endif
 | 
						|
#ifdef SIGKILL
 | 
						|
	[SIGKILL  ] = "KILL",
 | 
						|
#endif
 | 
						|
#ifdef SIGUSR1
 | 
						|
	[SIGUSR1  ] = "USR1",
 | 
						|
#endif
 | 
						|
#ifdef SIGSEGV
 | 
						|
	[SIGSEGV  ] = "SEGV",
 | 
						|
#endif
 | 
						|
#ifdef SIGUSR2
 | 
						|
	[SIGUSR2  ] = "USR2",
 | 
						|
#endif
 | 
						|
#ifdef SIGPIPE
 | 
						|
	[SIGPIPE  ] = "PIPE",
 | 
						|
#endif
 | 
						|
#ifdef SIGALRM
 | 
						|
	[SIGALRM  ] = "ALRM",
 | 
						|
#endif
 | 
						|
#ifdef SIGTERM
 | 
						|
	[SIGTERM  ] = "TERM",
 | 
						|
#endif
 | 
						|
#ifdef SIGSTKFLT
 | 
						|
	[SIGSTKFLT] = "STKFLT",
 | 
						|
#endif
 | 
						|
#ifdef SIGCHLD
 | 
						|
	[SIGCHLD  ] = "CHLD",
 | 
						|
#endif
 | 
						|
#ifdef SIGCONT
 | 
						|
	[SIGCONT  ] = "CONT",
 | 
						|
#endif
 | 
						|
#ifdef SIGSTOP
 | 
						|
	[SIGSTOP  ] = "STOP",
 | 
						|
#endif
 | 
						|
#ifdef SIGTSTP
 | 
						|
	[SIGTSTP  ] = "TSTP",
 | 
						|
#endif
 | 
						|
#ifdef SIGTTIN
 | 
						|
	[SIGTTIN  ] = "TTIN",
 | 
						|
#endif
 | 
						|
#ifdef SIGTTOU
 | 
						|
	[SIGTTOU  ] = "TTOU",
 | 
						|
#endif
 | 
						|
#ifdef SIGURG
 | 
						|
	[SIGURG   ] = "URG",
 | 
						|
#endif
 | 
						|
#ifdef SIGXCPU
 | 
						|
	[SIGXCPU  ] = "XCPU",
 | 
						|
#endif
 | 
						|
#ifdef SIGXFSZ
 | 
						|
	[SIGXFSZ  ] = "XFSZ",
 | 
						|
#endif
 | 
						|
#ifdef SIGVTALRM
 | 
						|
	[SIGVTALRM] = "VTALRM",
 | 
						|
#endif
 | 
						|
#ifdef SIGPROF
 | 
						|
	[SIGPROF  ] = "PROF",
 | 
						|
#endif
 | 
						|
#ifdef SIGWINCH
 | 
						|
	[SIGWINCH ] = "WINCH",
 | 
						|
#endif
 | 
						|
#ifdef SIGPOLL
 | 
						|
	[SIGPOLL  ] = "POLL",
 | 
						|
#endif
 | 
						|
#ifdef SIGPWR
 | 
						|
	[SIGPWR   ] = "PWR",
 | 
						|
#endif
 | 
						|
#ifdef SIGSYS
 | 
						|
	[SIGSYS   ] = "SYS",
 | 
						|
#endif
 | 
						|
};
 | 
						|
 | 
						|
// Convert signal name to number.
 | 
						|
 | 
						|
int FAST_FUNC get_signum(const char *name)
 | 
						|
{
 | 
						|
	unsigned i;
 | 
						|
 | 
						|
	i = bb_strtou(name, NULL, 10);
 | 
						|
	if (!errno)
 | 
						|
		return i;
 | 
						|
	if (strncasecmp(name, "SIG", 3) == 0)
 | 
						|
		name += 3;
 | 
						|
	for (i = 0; i < ARRAY_SIZE(signals); i++)
 | 
						|
		if (strcasecmp(name, signals[i]) == 0)
 | 
						|
			return i;
 | 
						|
 | 
						|
#if ENABLE_DESKTOP && (defined(SIGIOT) || defined(SIGIO))
 | 
						|
	/* SIGIO[T] are aliased to other names,
 | 
						|
	 * thus cannot be stored in the signals[] array.
 | 
						|
	 * Need special code to recognize them */
 | 
						|
	if ((name[0] | 0x20) == 'i' && (name[1] | 0x20) == 'o') {
 | 
						|
#ifdef SIGIO
 | 
						|
		if (!name[2])
 | 
						|
			return SIGIO;
 | 
						|
#endif
 | 
						|
#ifdef SIGIOT
 | 
						|
		if ((name[2] | 0x20) == 't' && !name[3])
 | 
						|
			return SIGIOT;
 | 
						|
#endif
 | 
						|
	}
 | 
						|
#endif
 | 
						|
 | 
						|
	return -1;
 | 
						|
}
 | 
						|
 | 
						|
// Convert signal number to name
 | 
						|
 | 
						|
const char* FAST_FUNC get_signame(int number)
 | 
						|
{
 | 
						|
	if ((unsigned)number < ARRAY_SIZE(signals)) {
 | 
						|
		if (signals[number][0]) /* if it's not an empty str */
 | 
						|
			return signals[number];
 | 
						|
	}
 | 
						|
 | 
						|
	return itoa(number);
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
// Print the whole signal list
 | 
						|
 | 
						|
void FAST_FUNC print_signames(void)
 | 
						|
{
 | 
						|
	unsigned signo;
 | 
						|
 | 
						|
	for (signo = 1; signo < ARRAY_SIZE(signals); signo++) {
 | 
						|
		const char *name = signals[signo];
 | 
						|
		if (name[0])
 | 
						|
			puts(name);
 | 
						|
	}
 | 
						|
}
 |