From e4bb139a97d023e50d9dfd029c7529f95cfb3a2a Mon Sep 17 00:00:00 2001 From: Mark Janssen Date: Sat, 20 Apr 2002 15:00:16 +0000 Subject: [PATCH] Nearing completion for version 1.1.0 Added 'standalone-mode'. This will make proxytunnel an even more versatile tool, allowing it to be used virtually anywhere and anytime. Idea by Maniac, Code from The Muppet Started work on some more changes (not working yet) - Not forking to background in standalone mode - Reading options from .proxytunnel file, to make commandline work easier and faster git-svn-id: https://proxytunnel.svn.sourceforge.net/svnroot/proxytunnel/trunk/proxytunnel@18 bc163920-b10d-0410-b2c5-a5491ca2ceef --- CHANGES | 14 +++- CREDITS | 2 +- Makefile | 2 +- README | 6 +- cmdline.c | 37 ++++++++- cmdline.h | 5 +- config.h | 6 +- proxytunnel | Bin 16854 -> 20457 bytes proxytunnel.c | 214 +++++++++++++++++++++++++++++++++++++++++--------- 9 files changed, 234 insertions(+), 52 deletions(-) diff --git a/CHANGES b/CHANGES index d6ed70b..701c9cc 100755 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,11 @@ +Changes to proxytunnel version 1.1.0 -- Sat Apr 20 16:00:00 CET 2002 + +- Added the -a (--standalone=INT) option. It is mutually exclusive with + -i (--inetd), and it instructs proxytunnel to fork in the background + as a standalone daemon, listening on connections on the specified + port and forwarding these connections through the specified + proxy/tunnel. + Changes to proxytunnel version 1.0.8 -- Fri Apr 19 10:25:00 CET 2002 - Fixed help-text when system doesn't support long-options @@ -15,7 +23,7 @@ Changes to proxytunnel version 1.0.7 -- Sat Nov 24 12:32:02 CET 2001 possible string format attacks. -- Maniac - Some code cleanup and reformatting -- Maniac - Added '-q' / '--quiet' flag to suppress status messages, Proxytunnel - can not be completely quiet and transparant. (Not when also providing + can now be completely quiet and transparent. (Not when also providing the '-v' flag naturally) -- Maniac - Changed ipbuf size to 16, which should be enough. -- Maniac @@ -50,8 +58,8 @@ Changes to proxytunnel version 1.0.3 -- Sat Nov 10 21:36:42 CET 2001 - Due to getopts, some error handling when entering incorrect command line options -- Maniac -- In addition to using http auth, which we allready had, we can now also - connect to proxy's that do NOT use http auth, simply do not specify a +- In addition to using HTTP auth, which we already had, we can now also + connect to proxy's that do NOT use HTTP auth, simply do not specify a username and password. If you specify these, they will be passed on to the proxy, otherwise we won't go into auth phase. -- Maniac diff --git a/CREDITS b/CREDITS index 3fb130e..66949ee 100644 --- a/CREDITS +++ b/CREDITS @@ -12,7 +12,7 @@ people. Andrew Griffiths" - String format fixes -Furthermore we would like to thank the wonderfull people at SourceForge +Furthermore we would like to thank the wonderful people at SourceForge for hosting our development. Jos Visser && Mark Janssen diff --git a/Makefile b/Makefile index 39abc14..0f7f5ca 100755 --- a/Makefile +++ b/Makefile @@ -8,7 +8,7 @@ LDFLAGS = INSTALLPATH = /usr/local/bin # Solaris needs this (According to Martin Senft ) -# CFLAGS = -I /usr/include -Wall +# CFLAGS = -I/usr/include -Wall # LDFLAGS = -lsocket -lnsl PROGNAME = proxytunnel diff --git a/README b/README index 6016b4e..3ff498b 100755 --- a/README +++ b/README @@ -3,8 +3,8 @@ proxytunnel ----------- Author: Jos Visser , Mark Janssen -Date: Wed Nov 28 09:46:19 CET 2001 -Version: 1.0.7 +Date: Sat Apr 20 15:57:52 CEST 2002 +Version: 1.1.0 Hi all, @@ -19,7 +19,7 @@ with some other application, feel free, and let me know! Usage: Proxytunnel is very easy to use, when running proxytunnel with the help -option it specifies it's commandline options. +option it specifies it's command-line options. $ ./proxytunnel --help Proxytunnel 1.0.7 diff --git a/cmdline.c b/cmdline.c index d6e894d..b23d191 100755 --- a/cmdline.c +++ b/cmdline.c @@ -1,5 +1,5 @@ -/* Proxytunnel - (C) 2001 Jos Visser / Mark Janssen */ -/* Contact: josv@osp.nl / maniac@maniac.nl */ +/* Proxytunnel - (C) 2001-2002 Jos Visser / Mark Janssen */ +/* Contact: josv@osp.nl / maniac@maniac.nl */ /* * This program is free software; you can redistribute it and/or modify @@ -49,7 +49,10 @@ cmdline_parser_print_help (void) "Usage: %s [OPTIONS]...\n\ -h --help Print help and exit\n\ -V --version Print version and exit\n\ + -c --config=FILE Read config options from file (FIXME)\n\ -i --inetd Run from inetd (default=off)\n\ + -a INT --standalone=INT Run as standalone daemon on specified port\n\ + -f --nobackground Don't for to background in standalone mode (FIXME)\n\ -u STRING --user=STRING Username to send to HTTPS proxy for auth\n\ -s STRING --pass=STRING Password to send to HTTPS proxy for auth\n\ -g STRING --proxyhost=STRING HTTPS Proxy host to connect to\n\ @@ -61,6 +64,12 @@ cmdline_parser_print_help (void) -q --quiet Suppress messages (default=off)\n\ ", PACKAGE); + printf( "\nExamples:\n" +"%s [ -h | -V ]\n" +"%s -i [ -u user -s pass ] -g host -G port -d host -D port [ -n ] [ -v | -q ]\n" +"%s -a port [ -u user -s pass ] -g host -G port -d host -D port [ -n ] [ -v | -q ]\n", PACKAGE, PACKAGE, PACKAGE ); + + #ifndef HAVE_GETOPT_LONG printf( "\n" "Notice: This version is compiled without support for long options.\n" @@ -113,6 +122,7 @@ int cmdline_parser( int argc, char * const *argv, struct gengetopt_args_info *ar args_info->verbose_flag = 0; \ args_info->inetd_flag = 0; \ args_info->quiet_flag = 0; \ + args_info->standalone_arg = 0; \ } clear_args(); @@ -142,13 +152,14 @@ int cmdline_parser( int argc, char * const *argv, struct gengetopt_args_info *ar { "dottedquad", 0, NULL, 'n' }, { "verbose", 0, NULL, 'v' }, { "inetd", 0, NULL, 'i' }, + { "standalone", 1, NULL, 'a' }, { "quiet", 0, NULL, 'q' }, { NULL, 0, NULL, 0 } }; - c = getopt_long (argc, argv, "hViu:s:g:G:d:D:nvq", long_options, &option_index); + c = getopt_long (argc, argv, "hVia:u:s:g:G:d:D:nvq", long_options, &option_index); #else - c = getopt( argc, argv, "hViu:s:g:G:d:D:nvq" ); + c = getopt( argc, argv, "hVia:u:s:g:G:d:D:nvq" ); #endif if (c == -1) break; /* Exit from `while (1)' loop. */ @@ -161,9 +172,27 @@ int cmdline_parser( int argc, char * const *argv, struct gengetopt_args_info *ar exit (0); case 'i': /* Run from inetd. */ + if ( args_info->standalone_arg > 0 ) + { + fprintf( stderr, "%s: '--inetd' ('-i') conflicts with '--standalone' ('-a')\n", PACKAGE ); + exit( 1 ); + } args_info->inetd_flag = !(args_info->inetd_flag); break; + case 'a': /* Run as standalone daemon */ + if ( args_info->inetd_flag ) + { + fprintf( stderr, "%s: `--standalone' (`-a') conflicts with `--inetd' (`-i')\n", PACKAGE ); + exit (1); + } + if ( ( args_info->standalone_arg = atoi( optarg ) ) < 1 ) + { + fprintf( stderr, "%s: Illegal port value for `--standalone' (`-a')\n", PACKAGE); + exit (1); + } + break; + case 'V': /* Print version and exit. */ clear_args (); cmdline_parser_print_version (); diff --git a/cmdline.h b/cmdline.h index 06db0dd..dbfad3b 100755 --- a/cmdline.h +++ b/cmdline.h @@ -1,5 +1,5 @@ -/* Proxytunnel - (C) 2001 Jos Visser / Mark Janssen */ -/* Contact: josv@osp.nl / maniac@maniac.nl */ +/* Proxytunnel - (C) 2001-2002 Jos Visser / Mark Janssen */ +/* Contact: josv@osp.nl / maniac@maniac.nl */ /* * This program is free software; you can redistribute it and/or modify @@ -47,6 +47,7 @@ struct gengetopt_args_info { int verbose_given; /* Whether verbose was given. */ int inetd_given; /* Whether inetd was given. */ int quiet_given; /* Whether quiet mode was given. */ + int standalone_arg; /* Turn on stdalone (-a) on port */ } ; int cmdline_parser( int argc, char * const *argv, struct gengetopt_args_info *args_info ); diff --git a/config.h b/config.h index 6e4f7f4..a4e0cd7 100755 --- a/config.h +++ b/config.h @@ -1,5 +1,5 @@ -/* Proxytunnel - (C) 2001 Jos Visser / Mark Janssen */ -/* Contact: josv@osp.nl / maniac@maniac.nl */ +/* Proxytunnel - (C) 2001-2002 Jos Visser / Mark Janssen */ +/* Contact: josv@osp.nl / maniac@maniac.nl */ /* * This program is free software; you can redistribute it and/or modify @@ -19,5 +19,5 @@ #define VERSION "1.0.8" #define PACKAGE "Proxytunnel" -#define PURPOSE "Build generic tunnels through HTTPS proxys" +#define PURPOSE "Build generic tunnels through HTTPS proxies" #define AUTHORS "Jos Visser (Muppet) , Mark Janssen (Maniac) " diff --git a/proxytunnel b/proxytunnel index a7f91b02052c0803228e39c62e1d1af90db47b8f..02e4b14ac5ccf008022ef5596af9315c891f1126 100755 GIT binary patch literal 20457 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 bc^}AuuCU4+gzVYDf&catd(SL5wCMi=QVyN# literal 16854 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 diff --git a/proxytunnel.c b/proxytunnel.c index b194c1b..6c59d9e 100755 --- a/proxytunnel.c +++ b/proxytunnel.c @@ -1,5 +1,5 @@ -/* Proxytunnel - (C) 2001 Jos Visser / Mark Janssen */ -/* Contact: josv@osp.nl / maniac@maniac.nl */ +/* Proxytunnel - (C) 2001-2002 Jos Visser / Mark Janssen */ +/* Contact: josv@osp.nl / maniac@maniac.nl */ /* * This program is free software; you can redistribute it and/or modify @@ -29,6 +29,8 @@ #include #include #include +#include +#include #include "config.h" #include "cmdline.h" @@ -43,6 +45,9 @@ static const char base64digits[] = int sd; /* The tunnel's socket descriptor */ int read_fd=0; /* The file descriptor to read from */ int write_fd=1; /* The file destriptor to write to */ +char *program_name; /* Guess what? */ +int i_am_daemon; /* Also... */ + /* * All the command line options @@ -50,7 +55,7 @@ int write_fd=1; /* The file destriptor to write to */ struct gengetopt_args_info args_info; #define SIZE 80 -char basicauth[SIZE]; /* Buffer to hold the proxy's basic auth */ +char basicauth[SIZE]; /* Buffer to hold the proxies basic authentication data */ #define SIZE2 65536 char buf[SIZE2]; /* Data transfer buffer */ @@ -62,17 +67,46 @@ char buf[SIZE2]; /* Data transfer buffer */ #define MAX( x, y ) ( ( (x)>(y) ) ? (x) : (y) ) #endif +/* + * Give a message to the user + */ +void message( char *s, ... ) +{ + va_list ap; + char buf[1024]; + + va_start( ap, s ); + vsnprintf( buf, sizeof( buf ), s, ap ); + va_end( ap ); + + if ( i_am_daemon ) + syslog( LOG_NOTICE, buf ); + else + fputs( buf, stderr ); +} + +/* + * My own perror function (uses the internal message) + */ +void my_perror( char *msg ) +{ + char *err = strerror( errno ); + + message( "Error! %s: %s\n", msg, err ); +} /* * Kill the program (signal handler) */ -void signal_handler(int signal) { +void signal_handler( int signal ) +{ close(0); close(1); - if (sd!=0) close(sd); + if ( sd != 0 ) + close( sd ); - fprintf(stderr,"Tunnel closed on signal %d\n",signal); + message( "Tunnel closed on signal %d\n", signal ); exit(1); } @@ -130,7 +164,7 @@ void tunnel_connect() { */ if( ( sd = socket( AF_INET, SOCK_STREAM, 0 ) ) < 0 ) { - perror("Can not create socket"); + my_perror("Can not create socket"); exit(1); } @@ -139,13 +173,13 @@ void tunnel_connect() { */ if( ! ( he = gethostbyname( args_info.proxyhost_arg ) ) ) { - perror("Proxy host not found"); + my_perror("Proxy host not found"); exit(1); } if( args_info.verbose_flag ) { - fprintf( stderr, "%s is %d.%d.%d.%d\n", + message( "%s is %d.%d.%d.%d\n", args_info.proxyhost_arg, he->h_addr[0] & 255, he->h_addr[1] & 255, @@ -166,16 +200,19 @@ void tunnel_connect() { */ if( connect( sd, (struct sockaddr*) &sa, sizeof( sa ) ) < 0 ) { - perror("connect() failed"); + my_perror("connect() failed"); exit(1); } if( ! args_info.quiet_flag ) { - fprintf( stderr, "Connected to %s:%d\n", + message( "Connected to %s:%d\n", args_info.proxyhost_arg, args_info.proxyport_arg ); } + + /* Make sure we get warned when someone hangs up on us */ + signal(SIGHUP,signal_handler); } /* @@ -201,7 +238,7 @@ void make_basicauth() if( args_info.verbose_flag ) { - fprintf( stderr, "Proxy basic auth is %s\n", basicauth ); + message( "Proxy basic auth is %s\n", basicauth ); } free( p ); @@ -225,7 +262,7 @@ void readline() { if( recv( sd, &c ,1 ,0 ) < 0) { - perror( "Socket read error" ); + my_perror( "Socket read error" ); exit( 1 ); } @@ -237,7 +274,7 @@ void readline() *p = 0; if( args_info.verbose_flag ) - fprintf( stderr, "%s", buf ); + message( "%s", buf ); } /* @@ -250,17 +287,17 @@ void analyze_HTTP() if (strcmp( p, "HTTP/1.0" ) != 0 && strcmp( p, "HTTP/1.1" ) != 0) { - fprintf(stderr,"Unsupported HTTP version number %s\n",p); - exit(1); + message( "Unsupported HTTP version number %s\n", p ); + exit( 1 ); } p = strtok( 0, " "); if( strcmp( p, "200" ) != 0 ) { - fprintf( stderr, "HTTP return code: '%s'\n", p ); + message( "HTTP return code: '%s'\n", p ); p += strlen( p ) + 1; - fprintf( stderr, "%s\n", p ); + message( "%s\n", p ); exit( 1 ); } } @@ -289,20 +326,20 @@ void proxy_protocol() if( args_info.verbose_flag ) { - fprintf( stderr, "DEBUG: ipbuf = '%s'\n", ipbuf ); - fprintf( stderr, "DEBUG: desthost = '%s'\n", + message( "DEBUG: ipbuf = '%s'\n", ipbuf ); + message( "DEBUG: desthost = '%s'\n", args_info.desthost_arg ); } args_info.desthost_arg = ipbuf; if( args_info.verbose_flag ) - fprintf( stderr, "DEBUG: desthost = '%s'\n", + message( "DEBUG: desthost = '%s'\n", args_info.desthost_arg ); } else if( args_info.verbose_flag ) - fprintf( stderr, "Can't lookup dest host: %s.\n", + message( "Can't lookup dest host: %s.\n", args_info.desthost_arg ); } @@ -328,14 +365,14 @@ void proxy_protocol() } if( args_info.verbose_flag ) - fprintf( stderr, "%s", buf); + message( "%s", buf); /* * Send the CONNECT instruction to the proxy */ if( send( sd, buf, strlen( buf ), 0 ) < 0 ) { - perror( "Socket write error" ); + my_perror( "Socket write error" ); exit( 1 ); } @@ -367,7 +404,7 @@ int copy(int from, int to) */ if ( ( n = read( from, buf, SIZE2 ) ) < 0 ) { - perror( "Socket read error" ); + my_perror( "Socket read error" ); exit( 1 ); } @@ -382,7 +419,7 @@ int copy(int from, int to) */ if ( write( to, buf, n ) != n ) { - perror( "Socket write error" ); + my_perror( "Socket write error" ); exit( 1 ); } @@ -419,7 +456,7 @@ void cpio() if( ! args_info.quiet_flag ) { - fprintf( stderr, "Starting tunnel\n" ); + message( "Starting tunnel\n" ); } /* @@ -477,7 +514,7 @@ void cpio() } else { - perror( "Exceptional condition" ); + my_perror( "Exceptional condition" ); break; } } @@ -495,15 +532,108 @@ void cpio() if( args_info.verbose_flag ) { - fprintf( stderr, "Tunnel closed\n" ); + message( "Tunnel closed\n" ); } } +/* + * Leave a goodbye message + */ +void einde() { + syslog(LOG_NOTICE,"Goodbye..."); + closelog(); +} + +/* + * Run as a standalone daemon + */ +void do_daemon() +{ + int listen_sd; + struct sockaddr_in sa_serv; + struct sockaddr_in sa_cli; + size_t client_len; + int pid = 0; + int sd_client; + char buf[80]; + unsigned char addr[4]; + + if ( ( listen_sd = socket( AF_INET, SOCK_STREAM, 0 ) ) < 0 ) + { + my_perror( "Server socket creation failed" ); + exit(1); + } + + memset( &sa_serv, '\0', sizeof( sa_serv ) ); + sa_serv.sin_family = AF_INET; + sa_serv.sin_addr.s_addr = INADDR_ANY; + sa_serv.sin_port = htons( args_info.standalone_arg ); + + if ( bind( listen_sd, (struct sockaddr * )&sa_serv, sizeof( sa_serv ) ) < 0) + { + my_perror("Server socket bind failed"); + exit(1); + } + + signal(SIGHUP,SIG_IGN); + signal(SIGCHLD,SIG_IGN); + + if ( ( pid = fork( ) ) < 0 ) + { + my_perror( "Cannot fork into the background" ); + exit( 1 ); + } + else if ( pid > 0 ) + { + message( "Forked into the background with pid %d\n", pid ); + exit(0); + } + + openlog( program_name, LOG_CONS|LOG_PID,LOG_DAEMON ); + i_am_daemon = 1; + atexit( einde ); + listen( listen_sd, 5 ); + + while (1==1) + { + sd_client = accept( listen_sd, + (struct sockaddr *)&sa_cli, &client_len ); + + if ( sd_client < 0 ) + { + syslog( LOG_ERR, "accept() failed. Bailing out..." ); + exit(1); + } + + if ( ( pid = fork() ) < 0 ) + { + syslog( LOG_ERR, "Cannot fork worker" ); + } + else if ( pid == 0 ) + { + read_fd = write_fd = sd_client; + tunnel_connect(); + proxy_protocol(); + cpio(); + exit( 0 ); + } + + memcpy( &addr, &sa_cli.sin_addr.s_addr, 4 ); + sprintf( buf, "%u.%u.%u.%u", addr[0], addr[1], addr[2], addr[3] ); + syslog( LOG_NOTICE, + "Started tunnel pid=%d for connection from %s", pid, buf ); + close( sd_client ); + } +} + + /* * We begin at the beginning */ int main( int argc, char *argv[] ) { + program_name = argv[0]; + /* * New and improved option handling, using GNU getopts -- Maniac */ @@ -512,6 +642,8 @@ int main( int argc, char *argv[] ) /* * This is what we do: + * - Check if we need to run as a daemon. If so, a completely + * different mainline is needed... * - Set a signal for the hangup (HUP) signal * - Optionally create the proxy basic authenticcation cookie * - Connect the sd socket to the proxy @@ -520,19 +652,31 @@ int main( int argc, char *argv[] ) */ signal( SIGHUP, signal_handler ); + if( args_info.user_given && args_info.pass_given ) { make_basicauth(); } - /* Inetd */ - if( args_info.inetd_flag ) + /* Do we need to run as a standalone daemon? */ + if ( args_info.standalone_arg > 0 ) { - write_fd=0; + /* Do processing in the other mainline... */ + do_daemon(); + } + else + { + /* Inetd trick */ + if( args_info.inetd_flag ) + { + write_fd=0; + } + + /* Main processing */ + tunnel_connect(); + proxy_protocol(); + cpio(); } - tunnel_connect(); - proxy_protocol(); - cpio(); exit( 0 ); }