- New INSTALL document describing different ways to build "tunala" and
possible problems. - New file breakage.c handles (so far) missing functions. - Get rid of some signed/unsigned/const warnings thanks to solaris-cc - Add autoconf/automake input files, and helper scripts to populate missing (but auto-generated) files. This change adds a configure.in and Makefile.am to build everything using autoconf, automake, and libtool - and adds "gunk" scripts to generate the various files those things need (and clean then up again after). This means that "autogunk.sh" needs to be run first on a system with the autotools, but the resulting directory should be "configure"able and compilable on systems without those tools.
This commit is contained in:
parent
3e3dac9f97
commit
3866752e7e
119
demos/tunala/INSTALL
Normal file
119
demos/tunala/INSTALL
Normal file
@ -0,0 +1,119 @@
|
|||||||
|
There are two ways to build this code;
|
||||||
|
|
||||||
|
(1) Manually
|
||||||
|
|
||||||
|
(2) Using all-singing all-dancing (all-confusing) autotools, ie. autoconf,
|
||||||
|
automake, libtool, and their little friends (autoheader, etc).
|
||||||
|
|
||||||
|
=================
|
||||||
|
Building Manually
|
||||||
|
=================
|
||||||
|
|
||||||
|
There is a basic "Makefile" in this directory that gets moved out of the way and
|
||||||
|
ignored when building with autoconf et al. This Makefile is suitable for
|
||||||
|
building tunala on Linux using gcc. Any other platform probably requires some
|
||||||
|
tweaking. Here are the various bits you might need to do if you want to build
|
||||||
|
this way and the default Makefile isn't sufficient;
|
||||||
|
|
||||||
|
* Compiler: Edit the "CC" definition in Makefile
|
||||||
|
|
||||||
|
* Headers, features: tunala.h controls what happens in the non-autoconf world.
|
||||||
|
It, by default, assumes the system has *everything* (except autoconf's
|
||||||
|
"config.h") so if a target system is missing something it must define the
|
||||||
|
appropriate "NO_***" symbols in CFLAGS. These include;
|
||||||
|
|
||||||
|
- NO_HAVE_UNISTD_H, NO_HAVE_FCNTL_H, NO_HAVE_LIMITS_H
|
||||||
|
Indicates the compiling system doesn't have (or need) these header files.
|
||||||
|
- NO_HAVE_STRSTR, NO_HAVE_STRTOUL
|
||||||
|
Indicates the compiling system doesn't have these functions. Replacements
|
||||||
|
are compiled and used in breakage.c
|
||||||
|
- NO_HAVE_SELECT, NO_HAVE_SOCKET
|
||||||
|
Pointless symbols - these indicate select() and/or socket() are missing in
|
||||||
|
which case the program won't compile anyway.
|
||||||
|
|
||||||
|
If you want to specify any of these, add them with "-D" prefixed to each in
|
||||||
|
the CFLAGS definition in Makefile.
|
||||||
|
|
||||||
|
* Compilation flags: edit DEBUG_FLAGS and/or CFLAGS directly to control the
|
||||||
|
flags passed to the compiler. This can also be used to change the degree of
|
||||||
|
optimisation.
|
||||||
|
|
||||||
|
* Linker flags: some systems (eg. Solaris) require extra linker flags such as;
|
||||||
|
-ldl, -lsocket, -lnsl, etc. If unsure, bring up the man page for whichever
|
||||||
|
function is "undefined" when the linker fails - that usually indicates what
|
||||||
|
you need to add. Make changes to the LINK_FLAGS symbol.
|
||||||
|
|
||||||
|
* Linker command: if a different linker syntax or even a different program is
|
||||||
|
required to link, edit the linker line directly in the "tunala:" target
|
||||||
|
definition - it currently assumes the "CC" (compiler) program is used to link.
|
||||||
|
|
||||||
|
======================
|
||||||
|
Building Automagically
|
||||||
|
======================
|
||||||
|
|
||||||
|
Automagic building is handled courtesy of autoconf, automake, and libtool. There
|
||||||
|
is in fact two steps required to build, and only the first has to be done on a
|
||||||
|
system with these tools installed (and if I was prepared to bloat out the CVS
|
||||||
|
repository, I could store these extra files, but I'm not).
|
||||||
|
|
||||||
|
First step: "autogunk.sh"
|
||||||
|
-------------------------
|
||||||
|
|
||||||
|
The "./autogunk.sh" script will call all the necessary autotool commands to
|
||||||
|
create missing files and run automake and autoconf. The result is that a
|
||||||
|
"./configure" script should be generated and a "Makefile.in" generated from the
|
||||||
|
supplied "Makefile.am". NB: This script also moves the "manual" Makefile (see
|
||||||
|
above) out of the way and calls it "Makefile.plain" - the "ungunk" script
|
||||||
|
reverses this to leave the directory it was previously.
|
||||||
|
|
||||||
|
Once "ungunk" has been run, the resulting directory should be able to build on
|
||||||
|
other systems without autoconf, automake, or libtool. Which is what the second
|
||||||
|
step describes;
|
||||||
|
|
||||||
|
Second step: "./configure"
|
||||||
|
--------------------------
|
||||||
|
|
||||||
|
The second step is to run the generated "./configure" script to create a
|
||||||
|
config.h header for your system and to generate a "Makefile" (generated from
|
||||||
|
"Makefile.in") tweaked to compile on your system. This is the standard sort of
|
||||||
|
thing you see in GNU packages, for example, and the standard tricks also work.
|
||||||
|
Eg. to override "configure"'s choice of compiler, set the CC environment
|
||||||
|
variable prior to running configure, eg.
|
||||||
|
|
||||||
|
CC=gcc ./configure
|
||||||
|
|
||||||
|
would cause "gcc" to be used even if there is an otherwise preferable (to
|
||||||
|
autoconf) native compiler on your system.
|
||||||
|
|
||||||
|
*IMPORTANT* It's highly recommended to pass "--disable-shared" to the configure
|
||||||
|
script. Otherwise, libtool may elect to build most of the code as a
|
||||||
|
shared-library, hide various bits of it in dotted directories and generating
|
||||||
|
wrapper scripts in place of the linked binary. The autotool stuff, when "make
|
||||||
|
install" is run (which you probably won't want to do for this dinky little
|
||||||
|
thing) will unravel all that mess and either install a small executable +
|
||||||
|
shared-lib or will install a linked executable. Passing the above flag ensures
|
||||||
|
this is all done statically even if the platform supports building and using
|
||||||
|
shared-libraries. Ie;
|
||||||
|
|
||||||
|
./configure --disable-shared
|
||||||
|
|
||||||
|
After this run "make" and it should build the "tunala" executable.
|
||||||
|
|
||||||
|
Notes
|
||||||
|
-----
|
||||||
|
|
||||||
|
- Some versions of autoconf (or automake?) generate a Makefile syntax that gives
|
||||||
|
trouble to some "make" programs on some systems (eg. OpenBSD). If this
|
||||||
|
happens, either build 'Manually' (see above) or use "gmake" instead of "make".
|
||||||
|
I don't like this either but like even less the idea of sifting into all the
|
||||||
|
script magic crud that's involved.
|
||||||
|
|
||||||
|
- On a solaris system I tried, the "configure" script specified some broken
|
||||||
|
compiler flags in the resulting Makefile that don't even get echoed to
|
||||||
|
stdout/err when the error happens (evil!). If this happens, go into the
|
||||||
|
generated Makefile, find the two affected targets ("%.o:" and "%.lo"), and
|
||||||
|
remove the offending hidden option in the $(COMPILE) line all the sludge after
|
||||||
|
the two first lines of script (ie. after the "echo" and the "COMPILE" lines).
|
||||||
|
NB: This will probably only function if "--disable-shared" was used, otherwise
|
||||||
|
who knows what would result ...
|
||||||
|
|
@ -11,14 +11,14 @@ RM=rm -f
|
|||||||
CC=gcc
|
CC=gcc
|
||||||
DEBUG_FLAGS=-g -ggdb3 -Wall -Wshadow
|
DEBUG_FLAGS=-g -ggdb3 -Wall -Wshadow
|
||||||
INCLUDE_FLAGS=-I$(SSL_INCLUDEDIR)
|
INCLUDE_FLAGS=-I$(SSL_INCLUDEDIR)
|
||||||
CFLAGS=$(DEBUG_FLAGS) $(INCLUDE_FLAGS)
|
CFLAGS=$(DEBUG_FLAGS) $(INCLUDE_FLAGS) -DNO_CONFIG_H
|
||||||
COMPILE=$(CC) $(CFLAGS) -c
|
COMPILE=$(CC) $(CFLAGS) -c
|
||||||
|
|
||||||
# Edit, particularly the "-ldl" if not building with "dlfcn" support
|
# Edit, particularly the "-ldl" if not building with "dlfcn" support
|
||||||
LINK_FLAGS=-L$(SSL_LIBDIR) -lssl -lcrypto -ldl
|
LINK_FLAGS=-L$(SSL_LIBDIR) -lssl -lcrypto -ldl
|
||||||
|
|
||||||
SRCS=buffer.c cb.c ip.c sm.c tunala.c
|
SRCS=buffer.c cb.c ip.c sm.c tunala.c breakage.c
|
||||||
OBJS=buffer.o cb.o ip.o sm.o tunala.o
|
OBJS=buffer.o cb.o ip.o sm.o tunala.o breakage.o
|
||||||
|
|
||||||
TARGETS=tunala
|
TARGETS=tunala
|
||||||
|
|
||||||
|
11
demos/tunala/Makefile.am
Normal file
11
demos/tunala/Makefile.am
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
# Our includes come from the OpenSSL build-tree we're in
|
||||||
|
INCLUDES = -I$(top_builddir)/../../include
|
||||||
|
|
||||||
|
lib_LTLIBRARIES = libtunala.la
|
||||||
|
|
||||||
|
libtunala_la_SOURCES = buffer.c cb.c ip.c sm.c breakage.c
|
||||||
|
|
||||||
|
bin_PROGRAMS = tunala
|
||||||
|
|
||||||
|
tunala_SOURCES = tunala.c
|
||||||
|
tunala_LDADD = libtunala.la -L$(top_builddir)/../.. -lssl -lcrypto
|
@ -188,20 +188,16 @@ flags inside the Makefile. Likewise, if you want to tweak the building, it's
|
|||||||
best to try and do so in the makefile (eg. removing the debug flags and adding
|
best to try and do so in the makefile (eg. removing the debug flags and adding
|
||||||
optimisation flags).
|
optimisation flags).
|
||||||
|
|
||||||
Secondly, this code so far has only ever been built and run on Linux - network
|
Secondly, this code has mostly only been tested on Linux. However, some
|
||||||
specifics are more than likely to create little glitches on other unixen,
|
autoconf/etc support has been added and the code has been compiled on openbsd
|
||||||
particularly Solaris in my experience. If you're not on Linux, please read the
|
and solaris using that.
|
||||||
code wherever compilation flares up and try to make the necessary changes -
|
|
||||||
usually the man-page associated with the relevant function is enough (eg. all
|
|
||||||
that AF_INET/PF_INET stuff, subtlely different parameters to various
|
|
||||||
IPv4-related functions like socket(), bind(), fcntl(), etc).
|
|
||||||
|
|
||||||
Thirdly, if you are Win32, you probably need to do some *major* rewriting of
|
Thirdly, if you are Win32, you probably need to do some *major* rewriting of
|
||||||
ip.c to stand a hope in hell. Good luck, and please mail me the diff if you do
|
ip.c to stand a hope in hell. Good luck, and please mail me the diff if you do
|
||||||
this, otherwise I will take a look at another time. It can certainly be done,
|
this, otherwise I will take a look at another time. It can certainly be done,
|
||||||
but it's very non-POSIXy.
|
but it's very non-POSIXy.
|
||||||
|
|
||||||
Type make.
|
See the INSTALL document for details on building.
|
||||||
|
|
||||||
Now, if you don't have an executable "tunala" compiled, go back to "First,...".
|
Now, if you don't have an executable "tunala" compiled, go back to "First,...".
|
||||||
Rinse and repeat.
|
Rinse and repeat.
|
||||||
@ -217,8 +213,10 @@ In another console, type;
|
|||||||
-cert A-server.pem -server 1 -out_totals -v_peer -v_strict
|
-cert A-server.pem -server 1 -out_totals -v_peer -v_strict
|
||||||
|
|
||||||
Now if you open another console and "telnet localhost 8080", you should be
|
Now if you open another console and "telnet localhost 8080", you should be
|
||||||
tunneled through to the telnet service on your local machine. Feel free to
|
tunneled through to the telnet service on your local machine (if it's running -
|
||||||
experiment :-)
|
you could change it to port "22" and tunnel ssh instead if you so desired). When
|
||||||
|
you logout of the telnet session, the tunnel should cleanly shutdown and show
|
||||||
|
you some traffic stats in both consoles. Feel free to experiment. :-)
|
||||||
|
|
||||||
Notes:
|
Notes:
|
||||||
|
|
||||||
|
25
demos/tunala/autogunk.sh
Executable file
25
demos/tunala/autogunk.sh
Executable file
@ -0,0 +1,25 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
# This script tries to follow the "GNU way" w.r.t. the autobits.
|
||||||
|
# This does of course generate a number of irritating files.
|
||||||
|
# Try to get over it (I am getting there myself).
|
||||||
|
|
||||||
|
# This should generate any missing crud, and then run autoconf which should turn
|
||||||
|
# configure.in into a "./configure" script and "Makefile.am" into a
|
||||||
|
# "Makefile.in". Then running "./configure" should turn "Makefile.in" into
|
||||||
|
# "Makefile" and should generate the config.h containing your systems various
|
||||||
|
# settings. I know ... what a hassle ...
|
||||||
|
|
||||||
|
# Also, sometimes these autobits things generate bizarre output (looking like
|
||||||
|
# errors). So I direct everything "elsewhere" ...
|
||||||
|
|
||||||
|
(aclocal
|
||||||
|
autoheader
|
||||||
|
libtoolize --copy --force
|
||||||
|
automake --foreign --add-missing --copy
|
||||||
|
autoconf) 1> /dev/null 2>&1
|
||||||
|
|
||||||
|
# Move the "no-autotools" Makefile out of the way
|
||||||
|
if test ! -f Makefile.plain; then
|
||||||
|
mv Makefile Makefile.plain
|
||||||
|
fi
|
18
demos/tunala/autoungunk.sh
Executable file
18
demos/tunala/autoungunk.sh
Executable file
@ -0,0 +1,18 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
# This script tries to clean up as much as is possible from whatever diabolical
|
||||||
|
# mess has been left in the directory thanks to autoconf, automake, and their
|
||||||
|
# friends.
|
||||||
|
|
||||||
|
if test -f Makefile; then
|
||||||
|
make distclean
|
||||||
|
rm -f Makefile
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test -f Makefile.plain; then
|
||||||
|
mv Makefile.plain Makefile
|
||||||
|
fi
|
||||||
|
|
||||||
|
rm -f aclocal.m4 config.* configure install-sh \
|
||||||
|
missing mkinstalldirs stamp-h.* Makefile.in \
|
||||||
|
ltconfig ltmain.sh
|
66
demos/tunala/breakage.c
Normal file
66
demos/tunala/breakage.c
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
#include "tunala.h"
|
||||||
|
|
||||||
|
int int_strtoul(const char *str, unsigned long *val)
|
||||||
|
{
|
||||||
|
#ifdef HAVE_STRTOUL
|
||||||
|
char *tmp;
|
||||||
|
unsigned long ret = strtoul(str, &tmp, 10);
|
||||||
|
if((str == tmp) || (*tmp != '\0'))
|
||||||
|
/* The value didn't parse cleanly */
|
||||||
|
return 0;
|
||||||
|
if(ret == ULONG_MAX)
|
||||||
|
/* We hit a limit */
|
||||||
|
return 0;
|
||||||
|
*val = ret;
|
||||||
|
return 1;
|
||||||
|
#else
|
||||||
|
char buf[2];
|
||||||
|
unsigned long ret = 0;
|
||||||
|
buf[1] = '\0';
|
||||||
|
if(str == '\0')
|
||||||
|
/* An empty string ... */
|
||||||
|
return 0;
|
||||||
|
while(*str != '\0') {
|
||||||
|
/* We have to multiply 'ret' by 10 before absorbing the next
|
||||||
|
* digit. If this will overflow, catch it now. */
|
||||||
|
if(ret && (((ULONG_MAX + 10) / ret) < 10))
|
||||||
|
return 0;
|
||||||
|
ret *= 10;
|
||||||
|
if(!isdigit(*str))
|
||||||
|
return 0;
|
||||||
|
buf[0] = *str;
|
||||||
|
ret += atoi(buf);
|
||||||
|
str++;
|
||||||
|
}
|
||||||
|
*val = ret;
|
||||||
|
return 1;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifndef HAVE_STRSTR
|
||||||
|
char *int_strstr(const char *haystack, const char *needle)
|
||||||
|
{
|
||||||
|
const char *sub_haystack = haystack, *sub_needle = needle;
|
||||||
|
unsigned int offset = 0;
|
||||||
|
if(!needle)
|
||||||
|
return haystack;
|
||||||
|
if(!haystack)
|
||||||
|
return NULL;
|
||||||
|
while((*sub_haystack != '\0') && (*sub_needle != '\0')) {
|
||||||
|
if(sub_haystack[offset] == sub_needle) {
|
||||||
|
/* sub_haystack is still a candidate */
|
||||||
|
offset++;
|
||||||
|
sub_needle++;
|
||||||
|
} else {
|
||||||
|
/* sub_haystack is no longer a possibility */
|
||||||
|
sub_haystack++;
|
||||||
|
offset = 0;
|
||||||
|
sub_needle = needle;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(*sub_haystack == '\0')
|
||||||
|
/* Found nothing */
|
||||||
|
return NULL;
|
||||||
|
return sub_haystack;
|
||||||
|
}
|
||||||
|
#endif
|
28
demos/tunala/configure.in
Normal file
28
demos/tunala/configure.in
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
dnl Process this file with autoconf to produce a configure script.
|
||||||
|
AC_INIT(tunala.c)
|
||||||
|
AM_CONFIG_HEADER(config.h)
|
||||||
|
AM_INIT_AUTOMAKE(tunala, 0.0.1-dev)
|
||||||
|
|
||||||
|
dnl Checks for programs.
|
||||||
|
AC_PROG_CC
|
||||||
|
AC_PROG_LIBTOOL
|
||||||
|
AM_PROG_LIBTOOL
|
||||||
|
|
||||||
|
dnl Checks for libraries.
|
||||||
|
AC_CHECK_LIB(dl, dlopen)
|
||||||
|
AC_CHECK_LIB(socket, socket)
|
||||||
|
AC_CHECK_LIB(nsl, gethostbyname)
|
||||||
|
|
||||||
|
dnl Checks for header files.
|
||||||
|
AC_HEADER_STDC
|
||||||
|
AC_CHECK_HEADERS(fcntl.h limits.h unistd.h)
|
||||||
|
|
||||||
|
dnl Checks for typedefs, structures, and compiler characteristics.
|
||||||
|
AC_C_CONST
|
||||||
|
|
||||||
|
dnl Checks for library functions.
|
||||||
|
AC_CHECK_FUNCS(strstr strtoul)
|
||||||
|
AC_CHECK_FUNCS(select socket)
|
||||||
|
AC_CHECK_FUNCS(dlopen)
|
||||||
|
|
||||||
|
AC_OUTPUT(Makefile)
|
@ -18,7 +18,7 @@ int ip_initialise(void)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ip_create_listener_split(const unsigned char *ip, unsigned short port)
|
int ip_create_listener_split(const char *ip, unsigned short port)
|
||||||
{
|
{
|
||||||
struct sockaddr_in in_addr;
|
struct sockaddr_in in_addr;
|
||||||
int fd = -1;
|
int fd = -1;
|
||||||
@ -36,7 +36,7 @@ int ip_create_listener_split(const unsigned char *ip, unsigned short port)
|
|||||||
memcpy(&in_addr.sin_addr.s_addr, ip, 4);
|
memcpy(&in_addr.sin_addr.s_addr, ip, 4);
|
||||||
in_addr.sin_port = htons(port);
|
in_addr.sin_port = htons(port);
|
||||||
/* Bind to the required port/address/interface */
|
/* Bind to the required port/address/interface */
|
||||||
if(bind(fd, &in_addr, sizeof(struct sockaddr_in)) != 0)
|
if(bind(fd, (struct sockaddr *)&in_addr, sizeof(struct sockaddr_in)) != 0)
|
||||||
goto err;
|
goto err;
|
||||||
/* Start "listening" */
|
/* Start "listening" */
|
||||||
if(listen(fd, IP_LISTENER_BACKLOG) != 0)
|
if(listen(fd, IP_LISTENER_BACKLOG) != 0)
|
||||||
@ -48,7 +48,7 @@ err:
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ip_create_connection_split(const unsigned char *ip, unsigned short port)
|
int ip_create_connection_split(const char *ip, unsigned short port)
|
||||||
{
|
{
|
||||||
struct sockaddr_in in_addr;
|
struct sockaddr_in in_addr;
|
||||||
int flags, fd = -1;
|
int flags, fd = -1;
|
||||||
@ -65,7 +65,8 @@ int ip_create_connection_split(const unsigned char *ip, unsigned short port)
|
|||||||
memcpy(&in_addr.sin_addr.s_addr, ip, 4);
|
memcpy(&in_addr.sin_addr.s_addr, ip, 4);
|
||||||
in_addr.sin_port = htons(port);
|
in_addr.sin_port = htons(port);
|
||||||
/* Start a connect (non-blocking, in all likelihood) */
|
/* Start a connect (non-blocking, in all likelihood) */
|
||||||
if((connect(fd, &in_addr, sizeof(struct sockaddr_in)) != 0) &&
|
if((connect(fd, (struct sockaddr *)&in_addr,
|
||||||
|
sizeof(struct sockaddr_in)) != 0) &&
|
||||||
(errno != EINPROGRESS))
|
(errno != EINPROGRESS))
|
||||||
goto err;
|
goto err;
|
||||||
return fd;
|
return fd;
|
||||||
@ -75,17 +76,16 @@ err:
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static unsigned char all_local_ip[] = {0x00,0x00,0x00,0x00};
|
static char all_local_ip[] = {0x00,0x00,0x00,0x00};
|
||||||
|
|
||||||
int ip_parse_address(const char *address, unsigned char **parsed_ip,
|
int ip_parse_address(const char *address, const char **parsed_ip,
|
||||||
unsigned short *parsed_port, int accept_all_ip)
|
unsigned short *parsed_port, int accept_all_ip)
|
||||||
{
|
{
|
||||||
char buf[256];
|
char buf[256];
|
||||||
struct hostent *lookup;
|
struct hostent *lookup;
|
||||||
unsigned long port;
|
unsigned long port;
|
||||||
char *temp;
|
|
||||||
const char *ptr = strstr(address, ":");
|
const char *ptr = strstr(address, ":");
|
||||||
unsigned char *ip = all_local_ip;
|
const char *ip = all_local_ip;
|
||||||
|
|
||||||
if(!ptr) {
|
if(!ptr) {
|
||||||
/* We assume we're listening on all local interfaces and have
|
/* We assume we're listening on all local interfaces and have
|
||||||
@ -110,8 +110,7 @@ int ip_parse_address(const char *address, unsigned char **parsed_ip,
|
|||||||
determine_port:
|
determine_port:
|
||||||
if(strlen(ptr) < 1)
|
if(strlen(ptr) < 1)
|
||||||
return 0;
|
return 0;
|
||||||
port = strtoul(ptr, &temp, 10);
|
if(!int_strtoul(ptr, &port) || (port > 65535))
|
||||||
if((temp == ptr) || (*temp != '\0') || (port > 65535))
|
|
||||||
return 0;
|
return 0;
|
||||||
*parsed_ip = ip;
|
*parsed_ip = ip;
|
||||||
*parsed_port = (unsigned short)port;
|
*parsed_port = (unsigned short)port;
|
||||||
@ -120,7 +119,7 @@ determine_port:
|
|||||||
|
|
||||||
int ip_create_listener(const char *address)
|
int ip_create_listener(const char *address)
|
||||||
{
|
{
|
||||||
unsigned char *ip;
|
const char *ip;
|
||||||
unsigned short port;
|
unsigned short port;
|
||||||
|
|
||||||
if(!ip_parse_address(address, &ip, &port, 1))
|
if(!ip_parse_address(address, &ip, &port, 1))
|
||||||
@ -130,7 +129,7 @@ int ip_create_listener(const char *address)
|
|||||||
|
|
||||||
int ip_create_connection(const char *address)
|
int ip_create_connection(const char *address)
|
||||||
{
|
{
|
||||||
unsigned char *ip;
|
const char *ip;
|
||||||
unsigned short port;
|
unsigned short port;
|
||||||
|
|
||||||
if(!ip_parse_address(address, &ip, &port, 0))
|
if(!ip_parse_address(address, &ip, &port, 0))
|
||||||
|
@ -80,7 +80,7 @@ static int selector_select(tunala_selector_t *selector);
|
|||||||
* which case *newfd is populated. */
|
* which case *newfd is populated. */
|
||||||
static int selector_get_listener(tunala_selector_t *selector, int fd, int *newfd);
|
static int selector_get_listener(tunala_selector_t *selector, int fd, int *newfd);
|
||||||
static int tunala_world_new_item(tunala_world_t *world, int fd,
|
static int tunala_world_new_item(tunala_world_t *world, int fd,
|
||||||
const unsigned char *ip, unsigned short port, int flipped);
|
const char *ip, unsigned short port, int flipped);
|
||||||
static void tunala_world_del_item(tunala_world_t *world, unsigned int idx);
|
static void tunala_world_del_item(tunala_world_t *world, unsigned int idx);
|
||||||
static int tunala_item_io(tunala_selector_t *selector, tunala_item_t *item);
|
static int tunala_item_io(tunala_selector_t *selector, tunala_item_t *item);
|
||||||
|
|
||||||
@ -219,9 +219,7 @@ static int err_str1(const char *fmt, const char *str1)
|
|||||||
static int parse_max_tunnels(const char *s, unsigned int *maxtunnels)
|
static int parse_max_tunnels(const char *s, unsigned int *maxtunnels)
|
||||||
{
|
{
|
||||||
unsigned long l;
|
unsigned long l;
|
||||||
char *temp;
|
if(!int_strtoul(s, &l) || (l < 1) || (l > 1024)) {
|
||||||
l = strtoul(s, &temp, 10);
|
|
||||||
if((temp == s) || (*temp != '\0') || (l < 1) || (l > 1024)) {
|
|
||||||
fprintf(stderr, "Error, '%s' is an invalid value for "
|
fprintf(stderr, "Error, '%s' is an invalid value for "
|
||||||
"maxtunnels\n", s);
|
"maxtunnels\n", s);
|
||||||
return 0;
|
return 0;
|
||||||
@ -233,9 +231,7 @@ static int parse_max_tunnels(const char *s, unsigned int *maxtunnels)
|
|||||||
static int parse_server_mode(const char *s, int *servermode)
|
static int parse_server_mode(const char *s, int *servermode)
|
||||||
{
|
{
|
||||||
unsigned long l;
|
unsigned long l;
|
||||||
char *temp;
|
if(!int_strtoul(s, &l) || (l > 1)) {
|
||||||
l = strtoul(s, &temp, 10);
|
|
||||||
if((temp == s) || (*temp != '\0') || (l > 1)) {
|
|
||||||
fprintf(stderr, "Error, '%s' is an invalid value for the "
|
fprintf(stderr, "Error, '%s' is an invalid value for the "
|
||||||
"server mode\n", s);
|
"server mode\n", s);
|
||||||
return 0;
|
return 0;
|
||||||
@ -258,9 +254,7 @@ static int parse_dh_special(const char *s, const char **dh_special)
|
|||||||
static int parse_verify_level(const char *s, unsigned int *verify_level)
|
static int parse_verify_level(const char *s, unsigned int *verify_level)
|
||||||
{
|
{
|
||||||
unsigned long l;
|
unsigned long l;
|
||||||
char *temp;
|
if(!int_strtoul(s, &l) || (l > 3)) {
|
||||||
l = strtoul(s, &temp, 10);
|
|
||||||
if((temp == s) || (*temp != '\0') || (l > 3)) {
|
|
||||||
fprintf(stderr, "Error, '%s' is an invalid value for "
|
fprintf(stderr, "Error, '%s' is an invalid value for "
|
||||||
"out_verify\n", s);
|
"out_verify\n", s);
|
||||||
return 0;
|
return 0;
|
||||||
@ -272,9 +266,7 @@ static int parse_verify_level(const char *s, unsigned int *verify_level)
|
|||||||
static int parse_verify_depth(const char *s, unsigned int *verify_depth)
|
static int parse_verify_depth(const char *s, unsigned int *verify_depth)
|
||||||
{
|
{
|
||||||
unsigned long l;
|
unsigned long l;
|
||||||
char *temp;
|
if(!int_strtoul(s, &l) || (l < 1) || (l > 50)) {
|
||||||
l = strtoul(s, &temp, 10);
|
|
||||||
if((temp == s) || (*temp != '\0') || (l < 1) || (l > 50)) {
|
|
||||||
fprintf(stderr, "Error, '%s' is an invalid value for "
|
fprintf(stderr, "Error, '%s' is an invalid value for "
|
||||||
"verify_depth\n", s);
|
"verify_depth\n", s);
|
||||||
return 0;
|
return 0;
|
||||||
@ -299,7 +291,7 @@ int main(int argc, char *argv[])
|
|||||||
int newfd;
|
int newfd;
|
||||||
tunala_world_t world;
|
tunala_world_t world;
|
||||||
tunala_item_t *t_item;
|
tunala_item_t *t_item;
|
||||||
unsigned char *proxy_ip;
|
const char *proxy_ip;
|
||||||
unsigned short proxy_port;
|
unsigned short proxy_port;
|
||||||
/* Overridables */
|
/* Overridables */
|
||||||
const char *proxyhost = def_proxyhost;
|
const char *proxyhost = def_proxyhost;
|
||||||
@ -527,7 +519,7 @@ main_loop:
|
|||||||
switch(selector_select(&world.selector)) {
|
switch(selector_select(&world.selector)) {
|
||||||
case -1:
|
case -1:
|
||||||
fprintf(stderr, "selector_select returned a badness error.\n");
|
fprintf(stderr, "selector_select returned a badness error.\n");
|
||||||
abort();
|
goto shouldnt_happen;
|
||||||
case 0:
|
case 0:
|
||||||
fprintf(stderr, "Warn, selector_select returned 0 - signal??\n");
|
fprintf(stderr, "Warn, selector_select returned 0 - signal??\n");
|
||||||
goto main_loop;
|
goto main_loop;
|
||||||
@ -589,6 +581,7 @@ skip_totals:
|
|||||||
}
|
}
|
||||||
goto main_loop;
|
goto main_loop;
|
||||||
/* Should never get here */
|
/* Should never get here */
|
||||||
|
shouldnt_happen:
|
||||||
abort();
|
abort();
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -736,6 +729,7 @@ static SSL_CTX *initialise_ssl_ctx(int server_mode, const char *engine_id,
|
|||||||
if(meth == NULL)
|
if(meth == NULL)
|
||||||
goto err;
|
goto err;
|
||||||
if(engine_id) {
|
if(engine_id) {
|
||||||
|
ENGINE_load_builtin_engines();
|
||||||
if((e = ENGINE_by_id(engine_id)) == NULL) {
|
if((e = ENGINE_by_id(engine_id)) == NULL) {
|
||||||
fprintf(stderr, "Error obtaining '%s' engine, openssl "
|
fprintf(stderr, "Error obtaining '%s' engine, openssl "
|
||||||
"errors follow\n", engine_id);
|
"errors follow\n", engine_id);
|
||||||
@ -935,7 +929,7 @@ static int tunala_world_make_room(tunala_world_t *world)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int tunala_world_new_item(tunala_world_t *world, int fd,
|
static int tunala_world_new_item(tunala_world_t *world, int fd,
|
||||||
const unsigned char *ip, unsigned short port, int flipped)
|
const char *ip, unsigned short port, int flipped)
|
||||||
{
|
{
|
||||||
tunala_item_t *item;
|
tunala_item_t *item;
|
||||||
int newfd;
|
int newfd;
|
||||||
|
@ -17,13 +17,57 @@
|
|||||||
#ifndef _TUNALA_H
|
#ifndef _TUNALA_H
|
||||||
#define _TUNALA_H
|
#define _TUNALA_H
|
||||||
|
|
||||||
|
/* pull in autoconf fluff */
|
||||||
|
#ifndef NO_CONFIG_H
|
||||||
|
#include "config.h"
|
||||||
|
#else
|
||||||
|
/* We don't have autoconf, we have to set all of these unless a tweaked Makefile
|
||||||
|
* tells us not to ... */
|
||||||
|
/* headers */
|
||||||
|
#ifndef NO_HAVE_SELECT
|
||||||
|
#define HAVE_SELECT
|
||||||
|
#endif
|
||||||
|
#ifndef NO_HAVE_SOCKET
|
||||||
|
#define HAVE_SOCKET
|
||||||
|
#endif
|
||||||
|
#ifndef NO_HAVE_UNISTD_H
|
||||||
|
#define HAVE_UNISTD_H
|
||||||
|
#endif
|
||||||
|
#ifndef NO_HAVE_FCNTL_H
|
||||||
|
#define HAVE_FCNTL_H
|
||||||
|
#endif
|
||||||
|
#ifndef NO_HAVE_LIMITS_H
|
||||||
|
#define HAVE_LIMITS_H
|
||||||
|
#endif
|
||||||
|
/* features */
|
||||||
|
#ifndef NO_HAVE_STRSTR
|
||||||
|
#define HAVE_STRSTR
|
||||||
|
#endif
|
||||||
|
#ifndef NO_HAVE_STRTOUL
|
||||||
|
#define HAVE_STRTOUL
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(HAVE_SELECT) || !defined(HAVE_SOCKET)
|
||||||
|
#error "can't build without some network basics like select() and socket()"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
#ifndef NO_SYSTEM_H
|
#ifndef NO_SYSTEM_H
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#ifdef HAVE_UNISTD_H
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_FCNTL_H
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_LIMITS_H
|
||||||
|
#include <limits.h>
|
||||||
|
#endif
|
||||||
#include <netdb.h>
|
#include <netdb.h>
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
|
#include <sys/types.h>
|
||||||
#include <netinet/in.h>
|
#include <netinet/in.h>
|
||||||
#endif /* !defined(NO_SYSTEM_H) */
|
#endif /* !defined(NO_SYSTEM_H) */
|
||||||
|
|
||||||
@ -143,20 +187,28 @@ int ip_initialise(void);
|
|||||||
/* ip is the 4-byte ip address (eg. 127.0.0.1 is {0x7F,0x00,0x00,0x01}), port is
|
/* ip is the 4-byte ip address (eg. 127.0.0.1 is {0x7F,0x00,0x00,0x01}), port is
|
||||||
* the port to listen on (host byte order), and the return value is the
|
* the port to listen on (host byte order), and the return value is the
|
||||||
* file-descriptor or -1 on error. */
|
* file-descriptor or -1 on error. */
|
||||||
int ip_create_listener_split(const unsigned char *ip, unsigned short port);
|
int ip_create_listener_split(const char *ip, unsigned short port);
|
||||||
/* Same semantics as above. */
|
/* Same semantics as above. */
|
||||||
int ip_create_connection_split(const unsigned char *ip, unsigned short port);
|
int ip_create_connection_split(const char *ip, unsigned short port);
|
||||||
/* Converts a string into the ip/port before calling the above */
|
/* Converts a string into the ip/port before calling the above */
|
||||||
int ip_create_listener(const char *address);
|
int ip_create_listener(const char *address);
|
||||||
int ip_create_connection(const char *address);
|
int ip_create_connection(const char *address);
|
||||||
/* Just does a string conversion on its own. NB: If accept_all_ip is non-zero,
|
/* Just does a string conversion on its own. NB: If accept_all_ip is non-zero,
|
||||||
* then the address string could be just a port. Ie. it's suitable for a
|
* then the address string could be just a port. Ie. it's suitable for a
|
||||||
* listening address but not a connecting address. */
|
* listening address but not a connecting address. */
|
||||||
int ip_parse_address(const char *address, unsigned char **parsed_ip,
|
int ip_parse_address(const char *address, const char **parsed_ip,
|
||||||
unsigned short *port, int accept_all_ip);
|
unsigned short *port, int accept_all_ip);
|
||||||
/* Accepts an incoming connection through the listener. Assumes selects and
|
/* Accepts an incoming connection through the listener. Assumes selects and
|
||||||
* what-not have deemed it an appropriate thing to do. */
|
* what-not have deemed it an appropriate thing to do. */
|
||||||
int ip_accept_connection(int listen_fd);
|
int ip_accept_connection(int listen_fd);
|
||||||
#endif /* !defined(NO_IP) */
|
#endif /* !defined(NO_IP) */
|
||||||
|
|
||||||
|
/* These functions wrap up things that can be portability hassles. */
|
||||||
|
int int_strtoul(const char *str, unsigned long *val);
|
||||||
|
#ifdef HAVE_STRSTR
|
||||||
|
#define int_strstr strstr
|
||||||
|
#else
|
||||||
|
char *int_strstr(const char *haystack, const char *needle);
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif /* !defined(_TUNALA_H) */
|
#endif /* !defined(_TUNALA_H) */
|
||||||
|
Loading…
Reference in New Issue
Block a user