104 lines
4.0 KiB
Diff
104 lines
4.0 KiB
Diff
#! /bin/sh /usr/share/dpatch/dpatch-run
|
|
## 06_fallback.dpatch by Tamas SZERB <toma@rulez.org>
|
|
##
|
|
## All lines beginning with `## DP:' are a description of the patch.
|
|
## DP: Establish direct connection instead of sockified if
|
|
## DP: there is no default server specified and the
|
|
## DP: fallback = yes.
|
|
|
|
--- a/parser.h
|
|
+++ b/parser.h
|
|
@@ -33,6 +33,7 @@ struct parsedfile {
|
|
struct netent *localnets;
|
|
struct serverent defaultserver;
|
|
struct serverent *paths;
|
|
+ int fallback;
|
|
};
|
|
|
|
/* Functions provided by parser module */
|
|
--- a/parser.c
|
|
+++ b/parser.c
|
|
@@ -35,6 +35,7 @@ static int handle_local(struct parsedfil
|
|
static int handle_defuser(struct parsedfile *, int, char *);
|
|
static int handle_defpass(struct parsedfile *, int, char *);
|
|
static int make_netent(char *value, struct netent **ent);
|
|
+static int handle_fallback(struct parsedfile *, int, char *);
|
|
|
|
char __attribute__ ((visibility ("hidden")))
|
|
*find_config(char *line) {
|
|
@@ -181,6 +182,8 @@ static int handle_line(struct parsedfile
|
|
handle_defpass(config, lineno, words[2]);
|
|
} else if (!strcmp(words[0], "local")) {
|
|
handle_local(config, lineno, words[2]);
|
|
+ } else if (!strcmp(words[0], "fallback")) {
|
|
+ handle_fallback(config, lineno, words[2]);
|
|
} else {
|
|
show_msg(MSGERR, "Invalid pair type (%s) specified "
|
|
"on line %d in configuration file, "
|
|
@@ -512,6 +515,19 @@ static int handle_local(struct parsedfil
|
|
return(0);
|
|
}
|
|
|
|
+static int handle_fallback(struct parsedfile *config, int lineno, char *value) {
|
|
+ char *v = strsplit(NULL, &value, " ");
|
|
+ if (config->fallback !=0) {
|
|
+ show_msg(MSGERR, "Fallback may only be specified "
|
|
+ "once in configuration file.\n",
|
|
+ lineno, currentcontext->lineno);
|
|
+ } else {
|
|
+ if(!strcmp(v, "yes")) config->fallback = 1;
|
|
+ if(!strcmp(v, "no")) config->fallback = 0;
|
|
+ }
|
|
+ return(0);
|
|
+}
|
|
+
|
|
/* Construct a netent given a string like */
|
|
/* "198.126.0.1[:portno[-portno]]/255.255.255.0" */
|
|
int make_netent(char *value, struct netent **ent) {
|
|
--- a/tsocks.c
|
|
+++ b/tsocks.c
|
|
@@ -294,11 +294,20 @@ int connect(CONNECT_SIGNATURE) {
|
|
(path->address ? path->address : "(Not Provided)"));
|
|
if (path->address == NULL) {
|
|
if (path == &(config->defaultserver)) {
|
|
- show_msg(MSGERR, "Connection needs to be made "
|
|
- "via default server but "
|
|
- "the default server has not "
|
|
- "been specified. Falling back to direct connection.\n");
|
|
- return(realconnect(__fd, __addr, __len));
|
|
+ if (config->fallback) {
|
|
+ show_msg(MSGERR, "Connection needs to be made "
|
|
+ "via default server but "
|
|
+ "the default server has not "
|
|
+ "been specified. Fallback is 'yes' so "
|
|
+ "Falling back to direct connection.\n");
|
|
+ return(realconnect(__fd, __addr, __len));
|
|
+ } else {
|
|
+ show_msg(MSGERR, "Connection needs to be made "
|
|
+ "via default server but "
|
|
+ "the default server has not "
|
|
+ "been specified. Fallback is 'no' so "
|
|
+ "coudln't establish the connection.\n");
|
|
+ }
|
|
}
|
|
else
|
|
show_msg(MSGERR, "Connection needs to be made "
|
|
--- a/tsocks.conf.5
|
|
+++ b/tsocks.conf.5
|
|
@@ -135,6 +135,15 @@ tsocks gives an error message and aborts
|
|
This parameter protects the user against accidentally establishing
|
|
unwanted unsockified (ie. direct) connection.
|
|
|
|
+.TP
|
|
+.I fallback
|
|
+This directive allows to fall back to direct connection if no default
|
|
+server present in the configuration and fallback = yes.
|
|
+If fallback = no or not specified and there is no default server, the
|
|
+tsocks gives an error message and aborts.
|
|
+This parameter protects the user against accidentally establishing
|
|
+unwanted unsockified (ie. direct) connection.
|
|
+
|
|
.SH UTILITIES
|
|
tsocks comes with two utilities that can be useful in creating and verifying
|
|
the tsocks configuration file.
|