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.