Add listening support.
This commit is contained in:
parent
df8ccb6350
commit
1d70267450
@ -959,9 +959,13 @@ const char mv_usage[] =
|
|||||||
|
|
||||||
#if defined BB_NC
|
#if defined BB_NC
|
||||||
const char nc_usage[] =
|
const char nc_usage[] =
|
||||||
"nc [IP] [port]"
|
"nc [-p PORT] IP PORT\n"
|
||||||
|
" or: nc -l -p PORT"
|
||||||
#ifndef BB_FEATURE_TRIVIAL_HELP
|
#ifndef BB_FEATURE_TRIVIAL_HELP
|
||||||
"\n\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."
|
||||||
#endif
|
#endif
|
||||||
;
|
;
|
||||||
#endif
|
#endif
|
||||||
|
@ -2452,7 +2452,12 @@
|
|||||||
</para>
|
</para>
|
||||||
|
|
||||||
<para>
|
<para>
|
||||||
Open a pipe to HOST:PORT.
|
or: nc -p PORT -l
|
||||||
|
</para>
|
||||||
|
|
||||||
|
|
||||||
|
<para>
|
||||||
|
Open a pipe to HOST:PORT or listen for a connection on PORT.
|
||||||
</para>
|
</para>
|
||||||
|
|
||||||
<para>
|
<para>
|
||||||
|
54
nc.c
54
nc.c
@ -41,7 +41,7 @@
|
|||||||
|
|
||||||
int nc_main(int argc, char **argv)
|
int nc_main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
int sfd;
|
int do_listen = 0, lport = 0, tmpfd, opt, sfd;
|
||||||
char buf[BUFSIZ];
|
char buf[BUFSIZ];
|
||||||
|
|
||||||
struct sockaddr_in address;
|
struct sockaddr_in address;
|
||||||
@ -49,24 +49,54 @@ int nc_main(int argc, char **argv)
|
|||||||
|
|
||||||
fd_set readfds, testfds;
|
fd_set readfds, testfds;
|
||||||
|
|
||||||
argc--;
|
while ((opt = getopt(argc, argv, "lp:")) > 0) {
|
||||||
argv++;
|
switch (opt) {
|
||||||
if (argc < 2 || **argv == '-') {
|
case 'l':
|
||||||
usage(nc_usage);
|
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)
|
if ((sfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
|
||||||
perror_msg_and_die("socket");
|
perror_msg_and_die("socket");
|
||||||
|
|
||||||
if ((hostinfo = gethostbyname(*argv)) == NULL)
|
|
||||||
error_msg_and_die("cannot resolve %s", *argv);
|
|
||||||
|
|
||||||
address.sin_family = AF_INET;
|
address.sin_family = AF_INET;
|
||||||
address.sin_addr = *(struct in_addr *) *hostinfo->h_addr_list;
|
|
||||||
address.sin_port = htons(atoi(*(++argv)));
|
|
||||||
|
|
||||||
if (connect(sfd, (struct sockaddr *) &address, sizeof(address)) < 0)
|
if (lport != 0) {
|
||||||
perror_msg_and_die("connect");
|
memset(&address.sin_addr, 0, sizeof(address.sin_addr));
|
||||||
|
address.sin_port = htons(lport);
|
||||||
|
|
||||||
|
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_ZERO(&readfds);
|
||||||
FD_SET(sfd, &readfds);
|
FD_SET(sfd, &readfds);
|
||||||
|
@ -41,7 +41,7 @@
|
|||||||
|
|
||||||
int nc_main(int argc, char **argv)
|
int nc_main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
int sfd;
|
int do_listen = 0, lport = 0, tmpfd, opt, sfd;
|
||||||
char buf[BUFSIZ];
|
char buf[BUFSIZ];
|
||||||
|
|
||||||
struct sockaddr_in address;
|
struct sockaddr_in address;
|
||||||
@ -49,24 +49,54 @@ int nc_main(int argc, char **argv)
|
|||||||
|
|
||||||
fd_set readfds, testfds;
|
fd_set readfds, testfds;
|
||||||
|
|
||||||
argc--;
|
while ((opt = getopt(argc, argv, "lp:")) > 0) {
|
||||||
argv++;
|
switch (opt) {
|
||||||
if (argc < 2 || **argv == '-') {
|
case 'l':
|
||||||
usage(nc_usage);
|
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)
|
if ((sfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
|
||||||
perror_msg_and_die("socket");
|
perror_msg_and_die("socket");
|
||||||
|
|
||||||
if ((hostinfo = gethostbyname(*argv)) == NULL)
|
|
||||||
error_msg_and_die("cannot resolve %s", *argv);
|
|
||||||
|
|
||||||
address.sin_family = AF_INET;
|
address.sin_family = AF_INET;
|
||||||
address.sin_addr = *(struct in_addr *) *hostinfo->h_addr_list;
|
|
||||||
address.sin_port = htons(atoi(*(++argv)));
|
|
||||||
|
|
||||||
if (connect(sfd, (struct sockaddr *) &address, sizeof(address)) < 0)
|
if (lport != 0) {
|
||||||
perror_msg_and_die("connect");
|
memset(&address.sin_addr, 0, sizeof(address.sin_addr));
|
||||||
|
address.sin_port = htons(lport);
|
||||||
|
|
||||||
|
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_ZERO(&readfds);
|
||||||
FD_SET(sfd, &readfds);
|
FD_SET(sfd, &readfds);
|
||||||
|
8
usage.c
8
usage.c
@ -959,9 +959,13 @@ const char mv_usage[] =
|
|||||||
|
|
||||||
#if defined BB_NC
|
#if defined BB_NC
|
||||||
const char nc_usage[] =
|
const char nc_usage[] =
|
||||||
"nc [IP] [port]"
|
"nc [-p PORT] IP PORT\n"
|
||||||
|
" or: nc -l -p PORT"
|
||||||
#ifndef BB_FEATURE_TRIVIAL_HELP
|
#ifndef BB_FEATURE_TRIVIAL_HELP
|
||||||
"\n\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."
|
||||||
#endif
|
#endif
|
||||||
;
|
;
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user