[BusyBox] nc listening support

Matt Kraai kraai at alumni.carnegiemellon.edu
Sun Dec 17 17:22:20 UTC 2000


On Sun, Dec 17, 2000 at 08:43:39AM -0800, Matt Kraai wrote:
> OK to commit?

Here is an updated patch which fixes the usage information and
checks for extra/missing arguments.

Matt
-------------- next part --------------
Index: nc.c
===================================================================
RCS file: /var/cvs/busybox/nc.c,v
retrieving revision 1.8
diff -u -r1.8 nc.c
--- nc.c	2000/12/15 22:34:34	1.8
+++ nc.c	2000/12/17 17:22:08
@@ -40,7 +40,7 @@
 
 int nc_main(int argc, char **argv)
 {
-	int sfd;
+	int do_listen = 0, lport = 0, tmpfd, opt, sfd;
 	char buf[BUFSIZ];
 
 	struct sockaddr_in address;
@@ -48,24 +48,54 @@
 
 	fd_set readfds, testfds;
 
-	argc--;
-	argv++;
-	if (argc < 2 || **argv == '-') {
-		usage(nc_usage);
+	while ((opt = getopt(argc, argv, "lp:")) > 0) {
+		switch (opt) {
+			case 'l':
+				do_listen++;
+				break;
+			case 'p':
+				lport = atoi(optarg);
+				break;
+			default:
+				usage(nc_usage);
+		}
 	}
 
+	if ((do_listen && optind != argc) || (!do_listen && optind + 2 != argc))
+		usage(nc_usage);
+
 	if ((sfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
 		perror_msg_and_die("socket");
 
-	if ((hostinfo = gethostbyname(*argv)) == NULL)
-		error_msg_and_die("cannot resolve %s\n", *argv);
-
 	address.sin_family = AF_INET;
-	address.sin_addr = *(struct in_addr *) *hostinfo->h_addr_list;
-	address.sin_port = htons(atoi(*(++argv)));
+
+	if (lport != 0) {
+		memset(&address.sin_addr, 0, sizeof(address.sin_addr));
+		address.sin_port = htons(lport);
 
-	if (connect(sfd, (struct sockaddr *) &address, sizeof(address)) < 0)
-		perror_msg_and_die("connect");
+		if (bind(sfd, (struct sockaddr *) &address, sizeof(address)) < 0)
+			perror_msg_and_die("bind");
+	}
+
+	if (do_listen) {
+		if (listen(sfd, 1) < 0)
+			perror_msg_and_die("listen");
+
+		if ((tmpfd = accept(sfd, (struct sockaddr *) &address, &opt)) < 0)
+			perror_msg_and_die("accept");
+
+		close(sfd);
+		sfd = tmpfd;
+	} else {
+		if ((hostinfo = gethostbyname(argv[optind])) == NULL)
+			error_msg_and_die("cannot resolve %s\n", argv[optind]);
+
+		address.sin_addr = *(struct in_addr *) *hostinfo->h_addr_list;
+		address.sin_port = htons(atoi(argv[optind+1]));
+
+		if (connect(sfd, (struct sockaddr *) &address, sizeof(address)) < 0)
+			perror_msg_and_die("connect");
+	}
 
 	FD_ZERO(&readfds);
 	FD_SET(sfd, &readfds);
Index: usage.c
===================================================================
RCS file: /var/cvs/busybox/usage.c,v
retrieving revision 1.41
diff -u -r1.41 usage.c
--- usage.c	2000/12/13 17:59:37	1.41
+++ usage.c	2000/12/17 17:22:51
@@ -900,9 +900,13 @@
 
 #if defined BB_NC
 const char nc_usage[] =
-	"nc [IP] [port]\n" 
+	"nc [-p PORT] IP PORT\n" 
+	"   or: nc -l -p PORT\n"
 #ifndef BB_FEATURE_TRIVIAL_HELP
-	"\nNetcat opens a pipe to IP:port\n"
+	"\nNetcat opens a pipe to IP:PORT\n"
+	"Options:\n"
+	"\t-l\tListen on the socket.\n"
+	"\t-p PORT\tBind the local port to PORT.\n"
 #endif
 	;
 #endif
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 232 bytes
Desc: not available
Url : http://lists.busybox.net/pipermail/busybox/attachments/20001217/2dea6c5e/attachment.pgp 


More information about the busybox mailing list