aboutsummaryrefslogtreecommitdiff
path: root/networking
diff options
context:
space:
mode:
authorandersen <andersen@69ca8d6d-28ef-0310-b511-8ec308f3f277>2002-07-03 11:51:44 +0000
committerandersen <andersen@69ca8d6d-28ef-0310-b511-8ec308f3f277>2002-07-03 11:51:44 +0000
commitfbacddfc70820114f97842bddce9b6291c917d88 (patch)
tree7071145eeeea4dd92d18e05fce6d8e710dc67d52 /networking
parent900987843e32563488974222031be9c97c060610 (diff)
downloadbusybox-w32-fbacddfc70820114f97842bddce9b6291c917d88.tar.gz
busybox-w32-fbacddfc70820114f97842bddce9b6291c917d88.tar.bz2
busybox-w32-fbacddfc70820114f97842bddce9b6291c917d88.zip
A patch from Bart Visscher <magick@linux-fan.com> to add an
xconnect helper routine which does: -address and port resolving -tries to connect to all resolved addresses until connected -uses getaddrinfo, so works for IPv6 too This patch also ports rdate, telnet, and wget to use the new xconnect function. Thanks Bart! git-svn-id: svn://busybox.net/trunk/busybox@5004 69ca8d6d-28ef-0310-b511-8ec308f3f277
Diffstat (limited to 'networking')
-rw-r--r--networking/telnet.c96
-rw-r--r--networking/wget.c16
2 files changed, 11 insertions, 101 deletions
diff --git a/networking/telnet.c b/networking/telnet.c
index 53616c01d..86d672c2d 100644
--- a/networking/telnet.c
+++ b/networking/telnet.c
@@ -36,13 +36,11 @@
36#include <errno.h> 36#include <errno.h>
37#include <stdlib.h> 37#include <stdlib.h>
38#include <stdarg.h> 38#include <stdarg.h>
39#include <string.h>
40#include <signal.h> 39#include <signal.h>
41#include <arpa/telnet.h> 40#include <arpa/telnet.h>
42#include <sys/types.h> 41#include <sys/types.h>
43#include <sys/socket.h> 42#include <sys/socket.h>
44#include <netinet/in.h> 43#include <netinet/in.h>
45#include <netdb.h>
46#include "busybox.h" 44#include "busybox.h"
47 45
48#ifdef CONFIG_FEATURE_AUTOWIDTH 46#ifdef CONFIG_FEATURE_AUTOWIDTH
@@ -122,19 +120,12 @@ static inline void iacflush(void)
122} 120}
123 121
124/* Function prototypes */ 122/* Function prototypes */
125static int getport(char * p);
126static struct in_addr getserver(char * p);
127static void setup_sockaddr_in(struct sockaddr_in * addr, int port);
128static int remote_connect(struct in_addr addr, int port);
129static void rawmode(void); 123static void rawmode(void);
130static void cookmode(void); 124static void cookmode(void);
131static void do_linemode(void); 125static void do_linemode(void);
132static void will_charmode(void); 126static void will_charmode(void);
133static void telopt(byte c); 127static void telopt(byte c);
134static int subneg(byte c); 128static int subneg(byte c);
135#if 0
136static int local_bind(int port);
137#endif
138 129
139/* Some globals */ 130/* Some globals */
140static int one = 1; 131static int one = 1;
@@ -584,8 +575,8 @@ static void cookmode(void)
584 575
585extern int telnet_main(int argc, char** argv) 576extern int telnet_main(int argc, char** argv)
586{ 577{
587 struct in_addr host; 578 char *host;
588 int port; 579 char *port;
589 int len; 580 int len;
590#ifdef USE_POLL 581#ifdef USE_POLL
591 struct pollfd ufds[2]; 582 struct pollfd ufds[2];
@@ -615,11 +606,13 @@ extern int telnet_main(int argc, char** argv)
615 cfmakeraw(&G.termios_raw); 606 cfmakeraw(&G.termios_raw);
616 607
617 if (argc < 2) show_usage(); 608 if (argc < 2) show_usage();
618 port = (argc > 2)? getport(argv[2]): 23; 609 port = (argc > 2)? argv[2] : "23";
610
611 host = argv[1];
619 612
620 host = getserver(argv[1]); 613 G.netfd = xconnect(host, port);
621 614
622 G.netfd = remote_connect(host, port); 615 setsockopt(G.netfd, SOL_SOCKET, SO_KEEPALIVE, &one, sizeof one);
623 616
624 signal(SIGINT, fgotsig); 617 signal(SIGINT, fgotsig);
625 618
@@ -691,81 +684,6 @@ extern int telnet_main(int argc, char** argv)
691 } 684 }
692} 685}
693 686
694static int getport(char * p)
695{
696 unsigned int port = atoi(p);
697
698 if ((unsigned)(port - 1 ) > 65534)
699 {
700 error_msg_and_die("%s: bad port number", p);
701 }
702 return port;
703}
704
705static struct in_addr getserver(char * host)
706{
707 struct in_addr addr;
708
709 struct hostent * he;
710 he = xgethostbyname(host);
711 memcpy(&addr, he->h_addr, sizeof addr);
712
713 TRACE(1, ("addr: %s\n", inet_ntoa(addr)));
714
715 return addr;
716}
717
718static int create_socket(void)
719{
720 return socket(AF_INET, SOCK_STREAM, 0);
721}
722
723static void setup_sockaddr_in(struct sockaddr_in * addr, int port)
724{
725 memset(addr, 0, sizeof(struct sockaddr_in));
726 addr->sin_family = AF_INET;
727 addr->sin_port = htons(port);
728}
729
730#if 0
731static int local_bind(int port)
732{
733 struct sockaddr_in s_addr;
734 int s = create_socket();
735
736 setup_sockaddr_in(&s_addr, port);
737
738 setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &one, sizeof one);
739
740 if (bind(s, &s_addr, sizeof s_addr) < 0)
741 {
742 char * e = sys_errlist[errno];
743 syserrorexit("bind");
744 exit(1);
745 }
746 listen(s, 1);
747
748 return s;
749}
750#endif
751
752static int remote_connect(struct in_addr addr, int port)
753{
754 struct sockaddr_in s_addr;
755 int s = create_socket();
756
757 setup_sockaddr_in(&s_addr, port);
758 s_addr.sin_addr = addr;
759
760 setsockopt(s, SOL_SOCKET, SO_KEEPALIVE, &one, sizeof one);
761
762 if (connect(s, (struct sockaddr *)&s_addr, sizeof s_addr) < 0)
763 {
764 perror_msg_and_die("Unable to connect to remote host");
765 }
766 return s;
767}
768
769/* 687/*
770Local Variables: 688Local Variables:
771c-file-style: "linux" 689c-file-style: "linux"
diff --git a/networking/wget.c b/networking/wget.c
index 6974c70a8..c6200219b 100644
--- a/networking/wget.c
+++ b/networking/wget.c
@@ -563,24 +563,16 @@ void parse_url(char *url, struct host_info *h)
563 563
564FILE *open_socket(char *host, int port) 564FILE *open_socket(char *host, int port)
565{ 565{
566 struct sockaddr_in s_in;
567 struct hostent *hp;
568 int fd; 566 int fd;
569 FILE *fp; 567 FILE *fp;
568 char port_str[10];
570 569
571 memset(&s_in, 0, sizeof(s_in)); 570 snprintf(port_str, sizeof(port_str), "%d", port);
572 s_in.sin_family = AF_INET; 571 fd=xconnect(host, port_str);
573 hp = xgethostbyname(host);
574 memcpy(&s_in.sin_addr, hp->h_addr_list[0], hp->h_length);
575 s_in.sin_port = htons(port);
576 572
577 /* 573 /*
578 * Get the server onto a stdio stream. 574 * Get the server onto a stdio stream.
579 */ 575 */
580 if ((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
581 perror_msg_and_die("socket()");
582 if (connect(fd, (struct sockaddr *) &s_in, sizeof(s_in)) < 0)
583 perror_msg_and_die("connect(%s)", host);
584 if ((fp = fdopen(fd, "r+")) == NULL) 576 if ((fp = fdopen(fd, "r+")) == NULL)
585 perror_msg_and_die("fdopen()"); 577 perror_msg_and_die("fdopen()");
586 578
@@ -826,7 +818,7 @@ progressmeter(int flag)
826 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 818 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
827 * SUCH DAMAGE. 819 * SUCH DAMAGE.
828 * 820 *
829 * $Id: wget.c,v 1.49 2002/05/14 23:36:45 sandman Exp $ 821 * $Id: wget.c,v 1.50 2002/07/03 11:51:44 andersen Exp $
830 */ 822 */
831 823
832 824