From 85aec8878d40fb3329314aedcdab1f4c2e74c2b0 Mon Sep 17 00:00:00 2001 From: Adam Hamsik Date: Fri, 25 Feb 2011 14:21:34 +0200 Subject: [PATCH] Add my multiple config file fixes to proxychain. --- proxychains/libproxychains.c | 17 ++++++++++-- proxychains/main.c | 51 +++++++++++++++++++++++++++++++----- proxychains/proxychains | 23 +++++++++++++--- 3 files changed, 79 insertions(+), 12 deletions(-) diff --git a/proxychains/libproxychains.c b/proxychains/libproxychains.c index dce610f..ae28518 100644 --- a/proxychains/libproxychains.c +++ b/proxychains/libproxychains.c @@ -136,16 +136,20 @@ static void init_lib() init_l = 1; } +/* + * XXX. Same thing is defined in proxychains main.c it + * needs to be changed, too. + */ +#define PROXYCHAINS_CONF_FILE "PROXYCHAINS_CONF_FILE" static inline void get_chain_data( proxy_data *pd, unsigned int *proxy_count, chain_type *ct) { - - int count=0,port_n=0,list=0; char buff[1024],type[1024],host[1024],user[1024]; + char *env; FILE* file; if(proxychains_got_chain_data) @@ -156,8 +160,17 @@ static inline void get_chain_data( tcp_connect_time_out=10*1000; *ct=DYNAMIC_TYPE; + env = NULL; + + /* + * Get path to configuration file from env this file has priority + * if it's defined. + */ + env = getenv(PROXYCHAINS_CONF_FILE); + snprintf(buff,256,"%s/.proxychains/proxychains.conf",getenv("HOME")); + if(!(file=fopen(env,"r"))) if(!(file=fopen("./proxychains.conf","r"))) if(!(file=fopen(buff,"r"))) if(!(file=fopen("/etc/proxychains.conf","r"))) diff --git a/proxychains/main.c b/proxychains/main.c index d6935fd..50a5ffe 100644 --- a/proxychains/main.c +++ b/proxychains/main.c @@ -1,6 +1,6 @@ /*************************************************************************** main.c - description - ------------------- + q ------------------- begin : Tue May 14 2002 copyright : netcreature (C) 2002 email : netcreature@users.sourceforge.net @@ -32,17 +32,54 @@ #include #include +extern char *optarg; +extern int optind, opterr, optopt + +/* + * XXX. Same thing is defined in proxychains main.c it + * needs to be changed, too. + */ +#define PROXYCHAINS_CONF_FILE "PROXYCHAINS_CONF_FILE" + +static usage(void) +{ + + printf("\nUsage: %s [h] [f] config_file program_name [arguments]\n" + "\t for example : proxychains telnet somehost.com\n" + "More help in README file\n", argv[0], ); +} + int main(int argc, char *argv[]) { - if(argc<2) - { - printf("\nUsage: proxychains program_name [arguments]\n" - "\t for example : proxychains telnet somehost.com\n" - "More help in README file\n"); - return 0 ; + char *path; + + path = NULL; + + while ((opt = getopt(argc, argv, "fh:")) != -1) { + switch (opt) { + case 'h': + usage(); + break; + case 'f': + path = (char *)optarg; + break; + default: /* '?' */ + usage(); + exit(EXIT_FAILURE); + } } + + printf("Proxychains are going to use %s as config file.\n", path); + printf("argv = %s\n", argv[1]); + + /* Set PROXYCHAINS_CONF_FILE to get proxychains lib to + use new config file. */ + setenv(PROXYCHAINS_CONF_FILE, path, 1); + + /*XXX. proxychains might be installed in some different location */ putenv("LD_PRELOAD=/usr/lib/libproxychains.so"); execvp(argv[1],&argv[1]); perror("proxychains can't load process...."); + return EXIT_SUCCESS; } diff --git a/proxychains/proxychains b/proxychains/proxychains index 5f77180..1c47b97 100755 --- a/proxychains/proxychains +++ b/proxychains/proxychains @@ -1,9 +1,26 @@ #!/bin/sh echo "ProxyChains-3.1 (http://proxychains.sf.net)" -if [ $# = 0 ] ; then + +usage() { + echo " usage:" - echo " proxychains [args]" + echo " $0 [h] [f config-file] [args]" exit +} + +if [ $# = 0 ] ; then + usage fi -export LD_PRELOAD=libproxychains.so + +if [ $1 = "-h" ]; then + usage +fi + +if [ "$1" = "-f" ]; then + export PROXYCHAINS_CONF_FILE=$2; + shift; + shift; +fi + +export LD_PRELOAD=libproxychains.so.3 exec "$@"