31#include "klibloader.h"
33#include <tdeapplication.h>
36#include <sys/socket.h>
63static int (*F_SOCKSinit) (
char *) = 0L;
64static int (*F_connect) (int,
const struct sockaddr *, ksocklen_t) = 0L;
65static signed long int (*F_read) (int,
void *,
unsigned long int) = 0L;
66static signed long int (*F_write) (int,
const void *,
unsigned long int) = 0L;
67static int (*F_recvfrom) (int,
void *,
unsigned long int, int,
struct sockaddr *,
69static int (*F_sendto) (int,
const void *,
unsigned long int, int,
70 const struct sockaddr *, ksocklen_t) = 0L;
71static int (*F_recv) (int,
void *,
unsigned long int, int) = 0L;
72static int (*F_send) (int,
const void *,
unsigned long int, int) = 0L;
73static int (*F_getsockname) (int,
struct sockaddr *, ksocklen_t *) = 0L;
74static int (*F_getpeername) (int,
struct sockaddr *, ksocklen_t *) = 0L;
75static int (*F_accept) (int,
struct sockaddr *, ksocklen_t *) = 0L;
76static int (*F_select) (int, fd_set *, fd_set *, fd_set *,
77 struct timeval *) = 0L;
78static int (*F_listen) (int, int) = 0L;
79static int (*F_bind) (int,
const struct sockaddr *, ksocklen_t) = 0L;
86 virtual ~KSocksTable();
89 TQMap<SymbolKeys,TQString> symbols;
92 bool hasWorkingAsyncConnect;
96KSocksTable::KSocksTable() : myname(
"Unknown"), hasWorkingAsyncConnect(true) {
99KSocksTable::~KSocksTable() {
127class KNECSocksTable :
public KSocksTable {
130 virtual ~KNECSocksTable();
134KNECSocksTable::KNECSocksTable() : KSocksTable() {
135 myname =
i18n(
"NEC SOCKS client");
136 symbols.insert(S_SOCKSinit,
"SOCKSinit");
137 symbols.insert(S_connect,
"connect");
138 symbols.insert(S_read,
"read");
139 symbols.insert(S_write,
"write");
140 symbols.insert(S_recvfrom,
"recvfrom");
141 symbols.insert(S_sendto,
"sendto");
142 symbols.insert(S_recv,
"recv");
143 symbols.insert(S_send,
"send");
144 symbols.insert(S_getsockname,
"getsockname");
145 symbols.insert(S_getpeername,
"getpeername");
146 symbols.insert(S_accept,
"accept");
147 symbols.insert(S_select,
"select");
148 symbols.insert(S_listen,
"listen");
149 symbols.insert(S_bind,
"bind");
152KNECSocksTable::~KNECSocksTable() {
162class KDanteSocksTable :
public KSocksTable {
165 virtual ~KDanteSocksTable();
168KDanteSocksTable::KDanteSocksTable() : KSocksTable() {
169 hasWorkingAsyncConnect =
false;
170 myname =
i18n(
"Dante SOCKS client");
171 symbols.insert(S_SOCKSinit,
"SOCKSinit");
172 symbols.insert(S_connect,
"Rconnect");
173 symbols.insert(S_read,
"Rread");
174 symbols.insert(S_write,
"Rwrite");
175 symbols.insert(S_recvfrom,
"Rrecvfrom");
176 symbols.insert(S_sendto,
"Rsendto");
177 symbols.insert(S_recv,
"Rrecv");
178 symbols.insert(S_send,
"Rsend");
179 symbols.insert(S_getsockname,
"Rgetsockname");
180 symbols.insert(S_getpeername,
"Rgetpeername");
181 symbols.insert(S_accept,
"Raccept");
182 symbols.insert(S_select,
"Rselect");
183 symbols.insert(S_listen,
"Rlisten");
184 symbols.insert(S_bind,
"Rbind");
188KDanteSocksTable::~KDanteSocksTable() {
200bool KSocks::_disabled =
true;
202bool KSocks::_disabled =
false;
230 if (_me && _disabled) {
242KSocks::KSocks(
TDEConfigBase *config) : _socksLib(0L), _st(0L) {
257 <<
"/usr/" SYSTEM_LIBDIR
"/"
259 <<
"/usr/local/" SYSTEM_LIBDIR
"/"
261 <<
"/usr/local/socks5/" SYSTEM_LIBDIR
"/"
262 <<
"/usr/local/socks5/lib/"
263 <<
"/opt/socks5/" SYSTEM_LIBDIR
"/"
264 <<
"/opt/socks5/lib/";
265 _libNames <<
"libsocks.so"
269 <<
"libsocks5_sh.so";
272 TQStringList newlibs = config->
readListEntry(
"SOCKS_lib_path");
274 for (TQStringList::Iterator it = newlibs.begin();
277 TQString thisone = *it;
278 if (thisone[thisone.length()-1] !=
'/') thisone +=
"/";
279 _libPaths << thisone;
280 kdDebug(171) <<
"KSocks added a new library path: " << thisone <<
endl;
295 if (_socksLib && _socksLib->
symbol(
"Rconnect")) {
296 _st =
new KDanteSocksTable;
299 }
else if (_socksLib && _socksLib->
symbol(
"connect")) {
300 _st =
new KNECSocksTable;
303 }
else if (_socksLib) {
308 for (TQStringList::Iterator pit = _libPaths.begin();
309 !_hasSocks && pit != _libPaths.end();
311 for (TQStringList::Iterator it = _libNames.begin();
312 it != _libNames.end();
314 _socksLib = ll->
library((*pit + *it).latin1());
316 if ((_meth == 1 || _meth == 2) &&
317 _socksLib->
symbol(
"S5LogShowThreadIDS") != 0L) {
318 kdDebug(171) <<
"Found NEC SOCKS" <<
endl;
319 _st =
new KNECSocksTable;
323 }
else if ((_meth == 1 || _meth == 3) &&
324 _socksLib->
symbol(
"sockaddr2ruleaddress") != 0L) {
325 kdDebug(171) <<
"Found Dante SOCKS" <<
endl;
326 _st =
new KDanteSocksTable;
339 for (TQMap<SymbolKeys,TQString>::Iterator it = _st->symbols.begin();
340 it != _st->symbols.end();
344 F_SOCKSinit = (int (*)(
char *))
345 _socksLib->
symbol(it.data().latin1());
348 F_connect = (int (*)(int,
const struct sockaddr *, ksocklen_t))
349 _socksLib->
symbol(it.data().latin1());
352 F_read = (
signed long int (*)(int,
void *,
unsigned long int))
353 _socksLib->
symbol(it.data().latin1());
356 F_write = (
signed long int (*)(int,
const void *,
unsigned long int))
357 _socksLib->
symbol(it.data().latin1());
360 F_recvfrom = (int (*)(int,
void *,
unsigned long int, int,
361 struct sockaddr *, ksocklen_t *))
362 _socksLib->
symbol(it.data().latin1());
365 F_sendto = (int (*)(int,
const void *,
unsigned long int, int,
366 const struct sockaddr *, ksocklen_t))
367 _socksLib->
symbol(it.data().latin1());
370 F_recv = (int (*)(int,
void *,
unsigned long int, int))
371 _socksLib->
symbol(it.data().latin1());
374 F_send = (int (*)(int,
const void *,
unsigned long int, int))
375 _socksLib->
symbol(it.data().latin1());
378 F_getsockname = (int (*)(int,
struct sockaddr *, ksocklen_t *))
379 _socksLib->
symbol(it.data().latin1());
382 F_getpeername = (int (*)(int,
struct sockaddr *, ksocklen_t *))
383 _socksLib->
symbol(it.data().latin1());
386 F_accept = (int (*)(int,
struct sockaddr *, ksocklen_t *))
387 _socksLib->
symbol(it.data().latin1());
390 F_select = (int (*)(int, fd_set *, fd_set *, fd_set *,
struct timeval *))
391 _socksLib->
symbol(it.data().latin1());
394 F_listen = (int (*)(int, int))
395 _socksLib->
symbol(it.data().latin1());
398 F_bind = (int (*)(int,
const struct sockaddr *, ksocklen_t))
399 _socksLib->
symbol(it.data().latin1());
402 kdDebug(171) <<
"KSocks got a symbol it doesn't know about!" <<
endl;
409 int rc = (*F_SOCKSinit)((
char *)
"KDE");
412 else kdDebug(171) <<
"SOCKS has been activated!" <<
endl;
432void KSocks::stopSocks() {
470 return (_useSocks && _st) ? _st->hasWorkingAsyncConnect :
true;
480 ksocklen_t addrlen) {
481 if (_useSocks && F_connect)
482 return (*F_connect)(sockfd, serv_addr, addrlen);
483 else return ::connect(sockfd, (sockaddr*) serv_addr, (socklen_t)addrlen);
487signed long int KSocks::read (
int fd,
void *buf,
unsigned long int count) {
488 if (_useSocks && F_read)
489 return (*F_read)(fd, buf, count);
490 else return ::read(fd, buf, count);
494signed long int KSocks::write (
int fd,
const void *buf,
unsigned long int count) {
495 if (_useSocks && F_write)
496 return (*F_write)(fd, buf, count);
497 else return ::write(fd, buf, count);
502 sockaddr *from, ksocklen_t *fromlen) {
503 if (_useSocks && F_recvfrom) {
504 return (*F_recvfrom)(s, buf, len, flags, from, fromlen);
506 socklen_t casted_len = (socklen_t) *fromlen;
507 int rc =
::recvfrom(s, (
char*) buf, len, flags, from, &casted_len);
508 *fromlen = casted_len;
515 const sockaddr *to, ksocklen_t tolen) {
516 if (_useSocks && F_sendto)
517 return (*F_sendto)(s, msg, len, flags, to, tolen);
518 else return ::sendto(s, (
char*) msg, len, flags, to, (socklen_t)tolen);
523 if (_useSocks && F_recv)
524 return (*F_recv)(s, buf, len, flags);
525 else return ::recv(s, (
char*) buf, len, flags);
529int KSocks::send (
int s,
const void *msg,
unsigned long int len,
int flags) {
530 if (_useSocks && F_send)
531 return (*F_send)(s, msg, len, flags);
532 else return ::send(s, (
char*) msg, len, flags);
537 if (_useSocks && F_getsockname) {
538 return (*F_getsockname)(s, name, namelen);
540 socklen_t casted_len = *namelen;
542 *namelen = casted_len;
549 if (_useSocks && F_getpeername) {
550 return (*F_getpeername)(s, name, namelen);
552 socklen_t casted_len = *namelen;
554 *namelen = casted_len;
561 if (_useSocks && F_accept) {
562 return (*F_accept)(s, addr, addrlen);
564 socklen_t casted_len = *addrlen;
565 int rc =
::accept(s, addr, &casted_len);
566 *addrlen = casted_len;
573 fd_set *exceptfds,
struct timeval *timeout) {
574 if (_useSocks && F_select)
575 return (*F_select)(n, readfds, writefds, exceptfds, timeout);
576 else return ::select(n, readfds, writefds, exceptfds, timeout);
581 if (_useSocks && F_listen)
582 return (*F_listen)(s, backlog);
583 else return ::listen(s, backlog);
587int KSocks::bind (
int sockfd,
const sockaddr *my_addr, ksocklen_t addrlen) {
588 if (_useSocks && F_bind)
589 return (*F_bind)(sockfd, my_addr, addrlen);
590 else return ::bind(sockfd, my_addr, (socklen_t)addrlen);
594 if (_useSocks && F_bind)
595 return (*F_bind)(sockfd, my_addr, addrlen);
596 else return ::bind(sockfd, my_addr, (socklen_t)addrlen);
The KLibLoader allows you to load libraries dynamically at runtime.
static KLibLoader * self()
Returns a pointer to the factory.
virtual KLibrary * library(const char *libname)
Loads and initializes a library.
void unload() const
Unloads the library.
void * symbol(const char *name) const
Looks up a symbol from the library.
This class provides you with an interface to a SOCKS Proxy server.
int getpeername(int s, sockaddr *name, ksocklen_t *namelen)
This is the re-implementation of libc's function of the same name.
signed long int write(int fd, const void *buf, unsigned long int count)
This is the re-implementation of libc's function of the same name.
static KSocks * self()
Return an instance of class KSocks *.
int listen(int s, int backlog)
This is the re-implementation of libc's function of the same name.
int recvfrom(int s, void *buf, unsigned long int len, int flags, sockaddr *from, ksocklen_t *fromlen)
This is the re-implementation of libc's function of the same name.
int getsockname(int s, sockaddr *name, ksocklen_t *namelen)
This is the re-implementation of libc's function of the same name.
void die()
If you're using this, you're probably doing something wrong.
bool hasWorkingAsyncConnect()
Returns whether asynchronous connects work with the selected SOCKS impementation.
static void setConfig(TDEConfigBase *config)
Set this before the first call to KSocks::self() and it will use config to read its configuration fro...
int sendto(int s, const void *msg, unsigned long int len, int flags, const sockaddr *to, ksocklen_t tolen)
This is the re-implementation of libc's function of the same name.
signed long int read(int fd, void *buf, unsigned long int count)
This is the re-implementation of libc's function of the same name.
void disableSocks()
Disable the use of SOCKS immediately.
void enableSocks()
Enable the use of SOCKS immediately if hasSocks() is true.
int recv(int s, void *buf, unsigned long int len, int flags)
This is the re-implementation of libc's function of the same name.
int send(int s, const void *msg, unsigned long int len, int flags)
This is the re-implementation of libc's function of the same name.
bool hasSocks()
Checks whether SOCKS is available for use.
int bind(int sockfd, sockaddr *my_addr, ksocklen_t addrlen)
This is the re-implementation of libc's function of the same name.
int select(int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout)
This is the re-implementation of libc's function of the same name.
static void disable()
Set this before the first call to KSocks::self() and it will fail to initialize SOCKS.
int accept(int s, sockaddr *addr, ksocklen_t *addrlen)
This is the re-implementation of libc's function of the same name.
int connect(int sockfd, const sockaddr *serv_addr, ksocklen_t addrlen)
This is the re-implementation of libc's function of the same name.
static bool activated()
Checks whether KSocks has been started (ie someone called self())
bool usingSocks()
Checks whether SOCKS is currently being used.
Little helper class to clean up static objects that are held as pointer.
KDE Configuration Management abstract base class.
int readNumEntry(const TQString &pKey, int nDefault=0) const
Reads a numerical value.
bool readBoolEntry(const TQString &pKey, bool bDefault=false) const
Reads a boolean entry.
int readListEntry(const TQString &pKey, TQStrList &list, char sep=',') const
Reads a list of strings.
TQString readPathEntry(const TQString &pKey, const TQString &aDefault=TQString::null) const
Reads a path.
A TDEConfigBase derived class for one specific group in a TDEConfig object.
TQString i18n(const char *text)
i18n is the function that does everything you need to translate a string.
kndbgstream & endl(kndbgstream &s)
Does nothing.