Add netcat -i option, per patch from Cristian Ionescu-Idbohrn
<cristian.ionescu-idbohrn@axis.com>
This commit is contained in:
		| @@ -1267,6 +1267,7 @@ | |||||||
| 	"Options:\n" \ | 	"Options:\n" \ | ||||||
| 	"\t-l\t\tlisten mode, for inbound connects\n" \ | 	"\t-l\t\tlisten mode, for inbound connects\n" \ | ||||||
| 	"\t-p PORT\t\tlocal port number\n" \ | 	"\t-p PORT\t\tlocal port number\n" \ | ||||||
|  | 	"\t-i SECS\t\tdelay interval for lines sent\n" \ | ||||||
| 	"\t-e PROG\t\tprogram to exec after connect (dangerous!)" | 	"\t-e PROG\t\tprogram to exec after connect (dangerous!)" | ||||||
| #define nc_example_usage \ | #define nc_example_usage \ | ||||||
| 	"$ nc foobar.somedomain.com 25\n" \ | 	"$ nc foobar.somedomain.com 25\n" \ | ||||||
|   | |||||||
| @@ -40,17 +40,22 @@ | |||||||
| #include <sys/ioctl.h> | #include <sys/ioctl.h> | ||||||
| #include "busybox.h" | #include "busybox.h" | ||||||
|  |  | ||||||
|  | #define GAPING_SECURITY_HOLE | ||||||
|  |  | ||||||
| int nc_main(int argc, char **argv) | int nc_main(int argc, char **argv) | ||||||
| { | { | ||||||
| 	int do_listen = 0, lport = 0, tmpfd, opt, sfd; | 	int do_listen = 0, lport = 0, delay = 0, tmpfd, opt, sfd; | ||||||
| 	char buf[BUFSIZ]; | 	char buf[BUFSIZ]; | ||||||
|  | #ifdef GAPING_SECURITY_HOLE | ||||||
|  | 	char * pr00gie = NULL;                   | ||||||
|  | #endif | ||||||
|  |  | ||||||
| 	struct sockaddr_in address; | 	struct sockaddr_in address; | ||||||
| 	struct hostent *hostinfo; | 	struct hostent *hostinfo; | ||||||
|  |  | ||||||
| 	fd_set readfds, testfds; | 	fd_set readfds, testfds; | ||||||
|  |  | ||||||
| 	while ((opt = getopt(argc, argv, "lp:")) > 0) { | 	while ((opt = getopt(argc, argv, "lp:i:e:")) > 0) { | ||||||
| 		switch (opt) { | 		switch (opt) { | ||||||
| 			case 'l': | 			case 'l': | ||||||
| 				do_listen++; | 				do_listen++; | ||||||
| @@ -58,11 +63,27 @@ int nc_main(int argc, char **argv) | |||||||
| 			case 'p': | 			case 'p': | ||||||
| 				lport = atoi(optarg); | 				lport = atoi(optarg); | ||||||
| 				break; | 				break; | ||||||
|  | 			case 'i': | ||||||
|  | 				delay = atoi(optarg); | ||||||
|  | 				break; | ||||||
|  | #ifdef GAPING_SECURITY_HOLE | ||||||
|  | 			case 'e': | ||||||
|  | 				pr00gie = optarg; | ||||||
|  | 				break; | ||||||
|  | #endif | ||||||
| 			default: | 			default: | ||||||
| 				show_usage(); | 				show_usage(); | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | #ifdef GAPING_SECURITY_HOLE | ||||||
|  | 	if (pr00gie) { | ||||||
|  | 		/* won't need stdin */ | ||||||
|  | 		close (fileno(stdin));                           | ||||||
|  | 	} | ||||||
|  | #endif /* GAPING_SECURITY_HOLE */ | ||||||
|  |  | ||||||
|  |  | ||||||
| 	if ((do_listen && optind != argc) || (!do_listen && optind + 2 != argc)) | 	if ((do_listen && optind != argc) || (!do_listen && optind + 2 != argc)) | ||||||
| 		show_usage(); | 		show_usage(); | ||||||
|  |  | ||||||
| @@ -100,6 +121,20 @@ int nc_main(int argc, char **argv) | |||||||
| 			perror_msg_and_die("connect"); | 			perror_msg_and_die("connect"); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | #ifdef GAPING_SECURITY_HOLE | ||||||
|  | 	/* -e given? */ | ||||||
|  | 	if (pr00gie) { | ||||||
|  | 		dup2(sfd, 0); | ||||||
|  | 		close(sfd); | ||||||
|  | 		dup2 (0, 1); | ||||||
|  | 		dup2 (0, 2); | ||||||
|  | 		execl (pr00gie, pr00gie, NULL); | ||||||
|  | 		/* Don't print stuff or it will go over the wire.... */ | ||||||
|  | 		_exit(-1); | ||||||
|  | 	} | ||||||
|  | #endif /* GAPING_SECURITY_HOLE */ | ||||||
|  |  | ||||||
|  |  | ||||||
| 	FD_ZERO(&readfds); | 	FD_ZERO(&readfds); | ||||||
| 	FD_SET(sfd, &readfds); | 	FD_SET(sfd, &readfds); | ||||||
| 	FD_SET(STDIN_FILENO, &readfds); | 	FD_SET(STDIN_FILENO, &readfds); | ||||||
| @@ -131,6 +166,9 @@ int nc_main(int argc, char **argv) | |||||||
|  |  | ||||||
| 				if (full_write(ofd, buf, nread) < 0) | 				if (full_write(ofd, buf, nread) < 0) | ||||||
| 					perror_msg_and_die("write"); | 					perror_msg_and_die("write"); | ||||||
|  | 				if (delay > 0) { | ||||||
|  | 					sleep(delay); | ||||||
|  | 				} | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user