diff options
| author | Eric Andersen <andersen@codepoet.org> | 2002-04-26 23:59:12 +0000 | 
|---|---|---|
| committer | Eric Andersen <andersen@codepoet.org> | 2002-04-26 23:59:12 +0000 | 
| commit | 1323c940fd651a818e133f5c13f28b708998420a (patch) | |
| tree | a73ac5d076263be38e8e419ea07b565a1acf0296 | |
| parent | 00a6a750357d49d3e9cedf3edee7ae2aceae6748 (diff) | |
| download | busybox-1323c940fd651a818e133f5c13f28b708998420a.tar.gz | |
Add netcat -i option, per patch from Cristian Ionescu-Idbohrn
<cristian.ionescu-idbohrn@axis.com>
| -rw-r--r-- | include/usage.h | 1 | ||||
| -rw-r--r-- | networking/nc.c | 42 | 
2 files changed, 41 insertions, 2 deletions
diff --git a/include/usage.h b/include/usage.h index d690d90f9..ad34dfcff 100644 --- a/include/usage.h +++ b/include/usage.h @@ -1267,6 +1267,7 @@  	"Options:\n" \  	"\t-l\t\tlisten mode, for inbound connects\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!)"  #define nc_example_usage \  	"$ nc foobar.somedomain.com 25\n" \ diff --git a/networking/nc.c b/networking/nc.c index 5335872e5..e1741cdb3 100644 --- a/networking/nc.c +++ b/networking/nc.c @@ -40,17 +40,22 @@  #include <sys/ioctl.h>  #include "busybox.h" +#define GAPING_SECURITY_HOLE +  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]; +#ifdef GAPING_SECURITY_HOLE +	char * pr00gie = NULL;                   +#endif  	struct sockaddr_in address;  	struct hostent *hostinfo;  	fd_set readfds, testfds; -	while ((opt = getopt(argc, argv, "lp:")) > 0) { +	while ((opt = getopt(argc, argv, "lp:i:e:")) > 0) {  		switch (opt) {  			case 'l':  				do_listen++; @@ -58,11 +63,27 @@ int nc_main(int argc, char **argv)  			case 'p':  				lport = atoi(optarg);  				break; +			case 'i': +				delay = atoi(optarg); +				break; +#ifdef GAPING_SECURITY_HOLE +			case 'e': +				pr00gie = optarg; +				break; +#endif  			default:  				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))  		show_usage(); @@ -100,6 +121,20 @@ int nc_main(int argc, char **argv)  			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_SET(sfd, &readfds);  	FD_SET(STDIN_FILENO, &readfds); @@ -131,6 +166,9 @@ int nc_main(int argc, char **argv)  				if (full_write(ofd, buf, nread) < 0)  					perror_msg_and_die("write"); +				if (delay > 0) { +					sleep(delay); +				}  			}  		}  	}  | 
