diff --git a/connect-1.95.c b/connect-1.100.c similarity index 93% rename from connect-1.95.c rename to connect-1.100.c index 9056d00..b275b77 100644 --- a/connect-1.95.c +++ b/connect-1.100.c @@ -1,7 +1,7 @@ /*********************************************************************** * connect.c -- Make socket connection using SOCKS4/5 and HTTP tunnel. * - * Copyright (c) 2000-2004 Shun-ichi Goto + * Copyright (c) 2000-2006 Shun-ichi Goto * Copyright (c) 2002, J. Grant (English Corrections) * * This program is free software; you can redistribute it and/or @@ -22,7 +22,7 @@ * PROJECT: My Test Program * AUTHOR: Shun-ichi GOTO * CREATE: Wed Jun 21, 2000 - * REVISION: $Revision: 1.96 $ + * REVISION: $Revision$ * --------------------------------------------------------- * * Getting Source @@ -252,7 +252,7 @@ #ifndef LINT -static char *vcid = "$Id: connect.c,v 1.96 2006/05/02 15:24:13 gotoh Exp $"; +static char *vcid = "$Id$"; #endif /* Microsoft Visual C/C++ has _snprintf() and _vsnprintf() */ @@ -290,8 +290,10 @@ static char *usage = "usage: %s [-dnhst45] [-p local-port]" /* name of this program */ char *progname = NULL; char *progdesc = "connect --- simple relaying command via proxy."; -char *rcs_revstr = "$Revision: 1.96 $"; +char *rcs_revstr = "$Revision$"; char *revstr = NULL; +int major_version = 1; +int minor_version = 0; /* set of character for strspn() */ const char *digits = "0123456789"; @@ -527,14 +529,16 @@ xmalloc (size_t size) return ret; } -void -downcase( char *buf ) +char * +downcase( char *str ) { + char *buf = str; while ( *buf ) { if ( isupper(*buf) ) *buf += 'a'-'A'; buf++; } + return str; /* return converted arg */ } char * @@ -787,6 +791,7 @@ getparam(const char* name) struct ADDRPAIR { struct in_addr addr; struct in_addr mask; + char *name; int negative; }; @@ -815,17 +820,40 @@ add_direct_addr (struct in_addr *addr, struct in_addr *mask, int negative) iaddr = *addr; mask_addr(&iaddr, mask, sizeof(iaddr)); s = strdup(inet_ntoa(iaddr)); - debug("adding direct address entry: %s/%s\n", s, inet_ntoa(*mask)); + debug("adding direct addr entry: %s%s/%s\n", + negative? "!": "", s, inet_ntoa(*mask)); free(s); memcpy( &direct_addr_list[n_direct_addr_list].addr, &iaddr, sizeof(iaddr)); memcpy( &direct_addr_list[n_direct_addr_list].mask, mask, sizeof(*mask)); + direct_addr_list[n_direct_addr_list].name = NULL; direct_addr_list[n_direct_addr_list].negative = negative; n_direct_addr_list++; return 0; } + +/* add domain/host name entry to direct name table */ +int +add_direct_host( const char *name, int negative) +{ + if ( MAX_DIRECT_ADDR_LIST <= n_direct_addr_list ) { + error("direct address table is full!\n"); + return -1; + } + if (*name == '*') + name++; + if (*name == '.') + name++; + debug("adding direct name entry: %s%s\n", negative? "!": "", name); + direct_addr_list[n_direct_addr_list].name = downcase(strdup(name)); + direct_addr_list[n_direct_addr_list].negative = negative; + n_direct_addr_list++; + return 0; +} + + int parse_addr_pair (const char *str, struct in_addr *addr, struct in_addr *mask) { @@ -842,7 +870,6 @@ parse_addr_pair (const char *str, struct in_addr *addr, struct in_addr *mask) int i, n; assert( str != NULL ); - debug("parsing address pair: '%s'\n", str); addr->s_addr = 0; mask->s_addr = 0; ptr = str; @@ -946,7 +973,7 @@ initialize_direct_addr (void) if ( !parse_addr_pair( beg, &addr, &mask ) ) { add_direct_addr( &addr, &mask, negative ); } else { - error("invalid addr format in %s: %s\n", envkey, beg); + add_direct_host( beg, negative ); } if ( next != NULL ) beg = next; @@ -963,34 +990,126 @@ cmp_addr (void *addr1, void *addr2, int addrlen) } int -is_direct_address (const struct sockaddr_in *addr) +is_direct_address (const struct in_addr addr) { - int i; - struct in_addr saddr, iaddr; - - saddr = addr->sin_addr; + int i, neg; + struct in_addr iaddr; /* Note: assume IPV4 address !! */ for (i=0; i 1 (exact match) + ends_with("foo.bar.com", "bar.com") => 1 (domain match) + ends_with("foo.beebar.com", "bar.com") => 0 (partial match) + ends_with("bar", "bar.com") => 0 (shorter) + */ +domain_match(const char *s1, const char *s2) +{ + int len1, len2; + const char *tail1, *tail2; + len1 = strlen(s1); + len2 = strlen(s2); + if (len1 < len2 || len1 == 0 || len2 == 0) + return 0; /* not match */ + tail1 = s1 + len1; + tail2 = s2 + len2; + while (0 < len1 && 0 < len2) { + if (*--tail1 != *--tail2) + break; /* not match */ + len1--, len2--; + } + if (len2 != 0) + return 0; /* not match */ + /* Now exact match, domain match or partial match. + Return true if exact or domain match. + Or continue checking. */ + if (tail1 == s1 || tail1[-1] == '.') + return 1; /* match! */ + return 0; /* not match */ +} + +/* Check given NAME is ends with one of + registered direct name entry. + Return 1 if matched, or 0. +*/ +int +is_direct_name (const char *name) +{ + int len, i; + const char *tail; + debug("checking %s is for direct?\n", name); + name = downcase(strdup(name)); + len = strlen(name); + if (len < 1) + return 0; /* false */ + tail = &name[len]; + for (i=0; i= 0)&& - (is_direct_address(&saddr))) { - debug("%s is connected directly\n", dest_host); - relay_method = METHOD_DIRECT; - host = dest_host; - port = dest_port; - } else { - host = relay_host; - port = relay_port; - } - + /* resolve address of proxy or direct target */ if (local_resolve (host, &saddr) < 0) { error("can't resolve hostname: %s\n", host); return SOCKET_ERROR; @@ -2585,22 +2680,19 @@ do_repeater( SOCKET local_in, SOCKET local_out, SOCKET remote ) /* remote => local */ if ( FD_ISSET(remote, &ifds) && (rbuf_len < (int)sizeof(rbuf)) ) { len = recv( remote, rbuf + rbuf_len, sizeof(rbuf)-rbuf_len, 0); - if ( len == 0 ) { - debug("connection closed by peer\n"); + if ( len == 0 || (len == -1 && socket_errno() == ECONNRESET)) { + debug("connection %s by peer\n", + (len==0)? "closed": "reset"); close_reason = REASON_CLOSED_BY_REMOTE; f_remote = 0; /* no more read from socket */ f_local = 0; } else if ( len == -1 ) { - if (socket_errno() != ECONNRESET) { - /* error */ - fatal("recv() faield, %d\n", socket_errno()); - } else { - debug("ECONNRESET detected\n"); - } + /* error */ + fatal("recv() failed, %d\n", socket_errno()); } else { debug("recv %d bytes\n", len); if ( 1 < f_debug ) /* more verbose */ - report_bytes( "<<<", rbuf, rbuf_len); + report_bytes( "<<<", rbuf+rbuf_len, len); rbuf_len += len; } } @@ -2636,13 +2728,13 @@ do_repeater( SOCKET local_in, SOCKET local_out, SOCKET remote ) /* flush data in buffer to socket */ if ( 0 < lbuf_len ) { len = send(remote, lbuf, lbuf_len, 0); - if ( 1 < f_debug ) /* more verbose */ - report_bytes( ">>>", lbuf, lbuf_len); if ( len == -1 ) { fatal("send() failed, %d\n", socket_errno()); } else if ( 0 < len ) { + if ( 1 < f_debug ) /* more verbose */ + report_bytes( ">>>", lbuf, len); /* move data on to top of buffer */ - debug("send %d bytes\n", len); + debug("sent %d bytes\n", len); lbuf_len -= len; if ( 0 < lbuf_len ) memcpy( lbuf, lbuf+len, lbuf_len ); @@ -2771,7 +2863,7 @@ main( int argc, char **argv ) /* initialization */ make_revstr(); getarg( argc, argv ); - debug("Program is $Revision: 1.96 $\n"); + debug("Program is $Revision$\n"); /* Open local_in and local_out if forwarding a port */ if ( local_type == LOCAL_SOCKET ) { @@ -2793,6 +2885,8 @@ retry: set_timeout (connect_timeout); #endif /* not _WIN32 */ + if (check_direct(dest_host)) + relay_method = METHOD_DIRECT; /* make connection */ if ( relay_method == METHOD_DIRECT ) { remote = open_connection (dest_host, dest_port); diff --git a/connect-proxy.spec b/connect-proxy.spec index 9948a89..a81381d 100644 --- a/connect-proxy.spec +++ b/connect-proxy.spec @@ -1,6 +1,6 @@ Name: connect-proxy -Version: 1.95 -Release: 5%{?dist} +Version: 1.100 +Release: 1%{?dist} Summary: SSH Proxy command helper Group: Applications/System @@ -56,6 +56,9 @@ rm -rf $RPM_BUILD_ROOT %{_bindir}/%{name} %changelog +* Wed Feb 13 2008 Jarod Wilson 1.100-1 +- Upgrade to r100. + * Tue Sep 05 2006 Jarod Wilson 1.95-5 - Rebuild for new glibc