less,klogd,syslogd,nc,tcpudp: exit on signal by killing itself, not exit(1)
*: minor shrink
This commit is contained in:
		| @@ -141,7 +141,7 @@ int dd_main(int argc, char **argv) | ||||
| #if ENABLE_FEATURE_DD_SIGNAL_HANDLING | ||||
| 	sigact.sa_handler = dd_output_status; | ||||
| 	sigact.sa_flags = SA_RESTART; | ||||
| 	sigemptyset(&sigact.sa_mask); | ||||
| 	/*sigemptyset(&sigact.sa_mask); - memset did it */ | ||||
| 	sigaction(SIGUSR1, &sigact, NULL); | ||||
| #endif | ||||
|  | ||||
| @@ -164,40 +164,40 @@ int dd_main(int argc, char **argv) | ||||
| 		if (what == 0) | ||||
| 			bb_show_usage(); | ||||
| 		arg += key_len; | ||||
| 		/* Must fit into positive ssize_t */ | ||||
| #if ENABLE_FEATURE_DD_IBS_OBS | ||||
| 			if (what == OP_ibs) { | ||||
| 				ibs = xatoul_range_sfx(arg, 1, ((size_t)-1L)/2, dd_suffixes); | ||||
| 				continue; | ||||
| 			} | ||||
| 			if (what == OP_obs) { | ||||
| 				obs = xatoul_range_sfx(arg, 1, ((size_t)-1L)/2, dd_suffixes); | ||||
| 				continue; | ||||
| 			} | ||||
| 			if (what == OP_conv) { | ||||
| 				while (1) { | ||||
| 					/* find ',', replace them with nil so we can use arg for | ||||
| 					 * index_in_strings() without copying. | ||||
| 					 * We rely on arg being non-null, else strchr would fault. | ||||
| 					 */ | ||||
| 					key = strchr(arg, ','); | ||||
| 					if (key) | ||||
| 						*key = '\0'; | ||||
| 					what = index_in_strings(keywords, arg) + 1; | ||||
| 					if (what < OP_conv_notrunc) | ||||
| 						bb_error_msg_and_die(bb_msg_invalid_arg, arg, "conv"); | ||||
| 					if (what == OP_conv_notrunc) | ||||
| 						flags |= FLAG_NOTRUNC; | ||||
| 					if (what == OP_conv_sync) | ||||
| 						flags |= FLAG_SYNC; | ||||
| 					if (what == OP_conv_noerror) | ||||
| 						flags |= FLAG_NOERROR; | ||||
| 					if (!key) /* no ',' left, so this was the last specifier */ | ||||
| 						break; | ||||
| 					arg = key + 1; /* skip this keyword and ',' */ | ||||
| 				} | ||||
| 				continue; | ||||
| 		if (what == OP_ibs) { | ||||
| 			/* Must fit into positive ssize_t */ | ||||
| 			ibs = xatoul_range_sfx(arg, 1, ((size_t)-1L)/2, dd_suffixes); | ||||
| 			continue; | ||||
| 		} | ||||
| 		if (what == OP_obs) { | ||||
| 			obs = xatoul_range_sfx(arg, 1, ((size_t)-1L)/2, dd_suffixes); | ||||
| 			continue; | ||||
| 		} | ||||
| 		if (what == OP_conv) { | ||||
| 			while (1) { | ||||
| 				/* find ',', replace them with NUL so we can use arg for | ||||
| 				 * index_in_strings() without copying. | ||||
| 				 * We rely on arg being non-null, else strchr would fault. | ||||
| 				 */ | ||||
| 				key = strchr(arg, ','); | ||||
| 				if (key) | ||||
| 					*key = '\0'; | ||||
| 				what = index_in_strings(keywords, arg) + 1; | ||||
| 				if (what < OP_conv_notrunc) | ||||
| 					bb_error_msg_and_die(bb_msg_invalid_arg, arg, "conv"); | ||||
| 				if (what == OP_conv_notrunc) | ||||
| 					flags |= FLAG_NOTRUNC; | ||||
| 				if (what == OP_conv_sync) | ||||
| 					flags |= FLAG_SYNC; | ||||
| 				if (what == OP_conv_noerror) | ||||
| 					flags |= FLAG_NOERROR; | ||||
| 				if (!key) /* no ',' left, so this was the last specifier */ | ||||
| 					break; | ||||
| 				arg = key + 1; /* skip this keyword and ',' */ | ||||
| 			} | ||||
| 			continue; | ||||
| 		} | ||||
| #endif | ||||
| 		if (what == OP_bs) { | ||||
| 			ibs = obs = xatoul_range_sfx(arg, 1, ((size_t)-1L)/2, dd_suffixes); | ||||
|   | ||||
| @@ -1168,8 +1168,8 @@ int fsck_main(int argc, char **argv) | ||||
|  | ||||
| 	memset(&sa, 0, sizeof(sa)); | ||||
| 	sa.sa_handler = signal_cancel; | ||||
| 	sigaction(SIGINT, &sa, 0); | ||||
| 	sigaction(SIGTERM, &sa, 0); | ||||
| 	sigaction(SIGINT, &sa, NULL); | ||||
| 	sigaction(SIGTERM, &sa, NULL); | ||||
|  | ||||
| 	setbuf(stdout, NULL); | ||||
|  | ||||
|   | ||||
| @@ -309,6 +309,7 @@ void sig_block(int); | ||||
| void sig_unblock(int); | ||||
| /* UNUSED: void sig_blocknone(void); */ | ||||
| void sig_pause(void); | ||||
| void kill_myself_with_sig(int sig) ATTRIBUTE_NORETURN; | ||||
|  | ||||
|  | ||||
| void xsetgid(gid_t gid); | ||||
|   | ||||
| @@ -68,7 +68,7 @@ static void sig_term_handler(int sig) | ||||
| { | ||||
| 	if (verbose) | ||||
| 		printf("%s: info: sigterm received, exit\n", applet_name); | ||||
| 	exit(0); | ||||
| 	kill_myself_with_sig(sig); | ||||
| } | ||||
|  | ||||
| /* Little bloated, but tries to give accurate info how child exited. | ||||
|   | ||||
| @@ -78,3 +78,17 @@ void sig_pause(void) | ||||
| 	sigemptyset(&ss); | ||||
| 	sigsuspend(&ss); | ||||
| } | ||||
|  | ||||
| /* Assuming the sig is fatal */ | ||||
| void kill_myself_with_sig(int sig) | ||||
| { | ||||
| 	sigset_t set; | ||||
|  | ||||
| 	signal(sig, SIG_DFL); | ||||
|  | ||||
| 	sigemptyset(&set); | ||||
| 	sigaddset(&set, sig); | ||||
| 	sigprocmask(SIG_UNBLOCK, &set, NULL); | ||||
| 	raise(sig); | ||||
| 	_exit(1); /* Should not reach it */ | ||||
| } | ||||
|   | ||||
| @@ -214,13 +214,12 @@ static void alarm_handler(int sig ATTRIBUTE_UNUSED) | ||||
| 	 * arrive here when their connection is broken. | ||||
| 	 * We don't want to block here */ | ||||
| 	ndelay_on(1); | ||||
| 	ndelay_on(2); | ||||
| 	printf("\r\nLogin timed out after %d seconds\r\n", TIMEOUT); | ||||
| 	fflush(stdout); | ||||
| 	/* unix API is brain damaged regarding O_NONBLOCK, | ||||
| 	 * we should undo it, or else we can affect other processes */ | ||||
| 	ndelay_off(1); | ||||
| 	ndelay_off(2); | ||||
| 	exit(EXIT_SUCCESS); | ||||
| 	_exit(EXIT_SUCCESS); | ||||
| } | ||||
|  | ||||
| int login_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; | ||||
|   | ||||
| @@ -174,7 +174,9 @@ static void less_exit(int code) | ||||
| { | ||||
| 	bb_putchar('\n'); | ||||
| 	set_tty_cooked(); | ||||
| 	exit(code); /* TODO: "suicide mode" for code == -signal */ | ||||
| 	if (code < 0) | ||||
| 		kill_myself_with_sig(- code); /* does not return */ | ||||
| 	exit(code); | ||||
| } | ||||
|  | ||||
| /* Move the cursor to a position (x,y), where (0,0) is the | ||||
| @@ -1328,9 +1330,9 @@ static void keypress_process(int keypress) | ||||
| 		number_process(keypress); | ||||
| } | ||||
|  | ||||
| static void sig_catcher(int sig ATTRIBUTE_UNUSED) | ||||
| static void sig_catcher(int sig) | ||||
| { | ||||
| 	less_exit(1) /* TODO: "suicide mode" for code == -signal */ | ||||
| 	less_exit(- sig); | ||||
| } | ||||
|  | ||||
| int less_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; | ||||
|   | ||||
| @@ -43,7 +43,7 @@ Cf: | ||||
| #define TIMEOUT_LONG 10 | ||||
| #define MAXERRORS 10 | ||||
|  | ||||
| static int read_byte(int fd, unsigned int timeout) | ||||
| static int read_byte(int fd, unsigned timeout) | ||||
| { | ||||
| 	char buf[1]; | ||||
| 	int n; | ||||
|   | ||||
| @@ -1327,7 +1327,7 @@ int inetd_main(int argc, char **argv) | ||||
| 	} | ||||
|  | ||||
| 	memset((char *) &sa, 0, sizeof(sa)); | ||||
| 	sigemptyset(&sa.sa_mask); | ||||
| 	/*sigemptyset(&sa.sa_mask); - memset did it */ | ||||
| 	sigaddset(&sa.sa_mask, SIGALRM); | ||||
| 	sigaddset(&sa.sa_mask, SIGCHLD); | ||||
| 	sigaddset(&sa.sa_mask, SIGHUP); | ||||
|   | ||||
| @@ -163,7 +163,7 @@ static void catch(int sig) | ||||
| 	if (o_verbose > 1)                /* normally we don't care */ | ||||
| 		fprintf(stderr, SENT_N_RECV_M, wrote_net, wrote_out); | ||||
| 	fprintf(stderr, "punt!\n"); | ||||
| 	exit(1); | ||||
| 	kill_myself_with_sig(sig); | ||||
| } | ||||
|  | ||||
| /* unarm  */ | ||||
|   | ||||
| @@ -43,7 +43,7 @@ static void save_state(void) | ||||
| 	xioctl(handle, TIOCGETD, &saved_disc); | ||||
| } | ||||
|  | ||||
| static int set_termios_state_and_warn(struct termios *state) | ||||
| static int set_termios_state_or_warn(struct termios *state) | ||||
| { | ||||
| 	int ret; | ||||
|  | ||||
| @@ -78,12 +78,12 @@ static void restore_state_and_exit(int exitcode) | ||||
| 	memcpy(&state, &saved_state, sizeof(state)); | ||||
| 	cfsetispeed(&state, B0); | ||||
| 	cfsetospeed(&state, B0); | ||||
| 	if (set_termios_state_and_warn(&state)) | ||||
| 	if (set_termios_state_or_warn(&state)) | ||||
| 		exitcode = 1; | ||||
| 	sleep(1); | ||||
|  | ||||
| 	/* Restore line status */ | ||||
| 	if (set_termios_state_and_warn(&saved_state)) | ||||
| 	if (set_termios_state_or_warn(&saved_state)) | ||||
| 		exit(EXIT_FAILURE); | ||||
| 	if (ENABLE_FEATURE_CLEAN_UP) | ||||
| 		close(handle); | ||||
| @@ -99,7 +99,7 @@ static void set_state(struct termios *state, int encap) | ||||
| 	int disc; | ||||
|  | ||||
| 	/* Set line status */ | ||||
| 	if (set_termios_state_and_warn(state)) | ||||
| 	if (set_termios_state_or_warn(state)) | ||||
| 		goto bad; | ||||
| 	/* Set line discliple (N_SLIP always) */ | ||||
| 	disc = N_SLIP; | ||||
|   | ||||
| @@ -808,12 +808,7 @@ static void sigexit(int sig) | ||||
| 	if (sig <= 0) | ||||
| 		_exit(- sig); | ||||
|  | ||||
| 	/* Enable only this sig and kill ourself with it */ | ||||
| 	signal(sig, SIG_DFL); | ||||
| 	sigdelset(&block_all, sig); | ||||
| 	sigprocmask(SIG_SETMASK, &block_all, NULL); | ||||
| 	raise(sig); | ||||
| 	_exit(1); /* Should not reach it */ | ||||
| 	kill_myself_with_sig(sig); /* does not return */ | ||||
| } | ||||
|  | ||||
| /* Restores tty foreground process group, and exits. */ | ||||
|   | ||||
| @@ -26,7 +26,7 @@ static void klogd_signal(int sig ATTRIBUTE_UNUSED) | ||||
| 	klogctl(7, NULL, 0); | ||||
| 	klogctl(0, NULL, 0); | ||||
| 	syslog(LOG_NOTICE, "klogd: exiting"); | ||||
| 	exit(EXIT_SUCCESS); | ||||
| 	kill_myself_with_sig(sig); | ||||
| } | ||||
|  | ||||
| #define log_buffer bb_common_bufsiz1 | ||||
|   | ||||
| @@ -475,7 +475,7 @@ static void quit_signal(int sig) | ||||
| 	puts("syslogd exiting"); | ||||
| 	if (ENABLE_FEATURE_IPC_SYSLOG) | ||||
| 		ipcsyslog_cleanup(); | ||||
| 	exit(1); | ||||
| 	kill_myself_with_sig(sig); | ||||
| } | ||||
|  | ||||
| #ifdef SYSLOGD_MARK | ||||
|   | ||||
		Reference in New Issue
	
	Block a user