21 #ifdef HAVE_SYS_TIME_H
31 #include "klibloader.h"
32 #include <tdeconfig.h>
33 #include <tdeapplication.h>
35 #include <sys/types.h>
36 #include <sys/socket.h>
63 static int (*F_SOCKSinit) (
char *) = 0L;
64 static int (*F_connect) (int,
const struct sockaddr *, ksocklen_t) = 0L;
65 static signed long int (*F_read) (int,
void *,
unsigned long int) = 0L;
66 static signed long int (*F_write) (int,
const void *,
unsigned long int) = 0L;
67 static int (*F_recvfrom) (int,
void *,
unsigned long int, int,
struct sockaddr *,
69 static int (*F_sendto) (int,
const void *,
unsigned long int, int,
70 const struct sockaddr *, ksocklen_t) = 0L;
71 static int (*F_recv) (int,
void *,
unsigned long int, int) = 0L;
72 static int (*F_send) (int,
const void *,
unsigned long int, int) = 0L;
73 static int (*F_getsockname) (int,
struct sockaddr *, ksocklen_t *) = 0L;
74 static int (*F_getpeername) (int,
struct sockaddr *, ksocklen_t *) = 0L;
75 static int (*F_accept) (int,
struct sockaddr *, ksocklen_t *) = 0L;
76 static int (*F_select) (int, fd_set *, fd_set *, fd_set *,
77 struct timeval *) = 0L;
78 static int (*F_listen) (int, int) = 0L;
79 static int (*F_bind) (int,
const struct sockaddr *, ksocklen_t) = 0L;
86 virtual ~KSocksTable();
89 TQMap<SymbolKeys,TQString> symbols;
92 bool hasWorkingAsyncConnect;
96 KSocksTable::KSocksTable() : myname(
"Unknown"), hasWorkingAsyncConnect(true) {
99 KSocksTable::~KSocksTable() {
127 class KNECSocksTable :
public KSocksTable {
130 virtual ~KNECSocksTable();
134 KNECSocksTable::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");
152 KNECSocksTable::~KNECSocksTable() {
162 class KDanteSocksTable :
public KSocksTable {
165 virtual ~KDanteSocksTable();
168 KDanteSocksTable::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");
188 KDanteSocksTable::~KDanteSocksTable() {
200 bool KSocks::_disabled =
true;
202 bool KSocks::_disabled =
false;
230 if (_me && _disabled) {
242 KSocks::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;
432 void 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);
487 signed 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);
494 signed 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);
522 int KSocks::recv (
int s,
void *buf,
unsigned long int len,
int flags) {
523 if (_useSocks && F_recv)
524 return (*F_recv)(s, buf, len, flags);
525 else return ::recv(s, (
char*) buf, len, flags);
529 int 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);
587 int 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);