summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/Makefile.am12
-rw-r--r--src/activefor.h47
-rw-r--r--src/afclient.c917
-rw-r--r--src/afclient.h3
-rw-r--r--src/afserver.c1681
-rw-r--r--src/ar_options_struct.c2
-rw-r--r--src/client_configuration_struct.c282
-rw-r--r--src/client_configuration_struct.h55
-rw-r--r--src/client_initialization.c114
-rw-r--r--src/client_initialization.h12
-rw-r--r--src/client_realm_struct.c1094
-rw-r--r--src/client_realm_struct.h143
-rw-r--r--src/client_reverse_udp.c77
-rw-r--r--src/client_reverse_udp.h7
-rw-r--r--src/clientnames.c56
-rw-r--r--src/clientnames.h13
-rw-r--r--src/file.c262
-rw-r--r--src/file.h6
-rw-r--r--src/file_client.c261
-rw-r--r--src/file_server.c367
-rw-r--r--src/http_proxy_client.c25
-rw-r--r--src/http_proxy_client.h4
-rw-r--r--src/logging.c2
-rw-r--r--src/module_struct.c217
-rw-r--r--src/module_struct.h (renamed from src/modules.h)26
-rw-r--r--src/modules.c69
-rw-r--r--src/network.c66
-rw-r--r--src/network.h3
-rw-r--r--src/realmnames.c18
-rw-r--r--src/realmnames.h5
-rw-r--r--src/server_check.c6
-rw-r--r--src/server_check.h2
-rw-r--r--src/server_configuration_struct.c286
-rw-r--r--src/server_configuration_struct.h55
-rw-r--r--src/server_eval.c6
-rw-r--r--src/server_eval.h2
-rw-r--r--src/server_find.c12
-rw-r--r--src/server_find.h2
-rw-r--r--src/server_realm_struct.c1327
-rw-r--r--src/server_realm_struct.h141
-rw-r--r--src/server_remoteadmin.c208
-rw-r--r--src/server_remoteadmin.h2
-rw-r--r--src/server_remove.c72
-rw-r--r--src/server_remove.h4
-rw-r--r--src/server_signals.c26
-rw-r--r--src/ssl_fd_struct.c5
-rw-r--r--src/usage.c17
-rw-r--r--src/usernames.c12
-rw-r--r--src/usernames.h5
49 files changed, 6230 insertions, 1806 deletions
diff --git a/src/Makefile.am b/src/Makefile.am
index f512ce8..6f8b46b 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -6,13 +6,15 @@ afserver_SOURCES = afserver.c network.c file.c stats.c buf_list_node_struct.c bu
thread_management.c server_signals.c usage.c logging.c daemon.c ssl_fd_struct.c \
user_stats_struct.c usr_cli_struct.c connect_user_struct.c string_functions.c \
audit_list_node_struct.c audit_list_struct.c connect_client_struct.c timeval_functions.c \
- header_buffer_struct.c
+ header_buffer_struct.c server_realm_struct.c server_configuration_struct.c file_server.c
afclient_LDFLAGS = ${USE_RDYNAMIC} ${LINKED_LDLIB}
-afclient_SOURCES = afclient.c network.c stats.c buf_list_node_struct.c buf_list_struct.c modules.c \
- client_remoteadmin.c make_ssl_handshake.c first_run.c inet_ntop.c realmnames.c \
- usernames.c http_proxy_functions.c http_proxy_client.c \
+afclient_SOURCES = afclient.c network.c file.c stats.c buf_list_node_struct.c buf_list_struct.c \
+ module_struct.c client_remoteadmin.c make_ssl_handshake.c first_run.c inet_ntop.c \
+ realmnames.c usernames.c http_proxy_functions.c http_proxy_client.c \
http_proxy_options_struct.c thread_management.c client_reverse_udp.c server_check.c \
client_initialization.c client_shutdown.c client_signals.c usage.c logging.c \
daemon.c base64.c ssl_routines.c connect_user_struct.c user_stats_struct.c \
string_functions.c ar_options_struct.c audit_list_node_struct.c audit_list_struct.c \
- ssl_fd_struct.c timeval_functions.c
+ ssl_fd_struct.c timeval_functions.c server_realm_struct.c server_configuration_struct.c \
+ usr_cli_struct.c connect_client_struct.c header_buffer_struct.c \
+ client_configuration_struct.c file_client.c client_realm_struct.c
diff --git a/src/activefor.h b/src/activefor.h
index ec2fcc5..4fcdbe0 100644
--- a/src/activefor.h
+++ b/src/activefor.h
@@ -49,8 +49,9 @@
#define S_STATE_OPENING 6
#define S_STATE_OPEN 7
#define S_STATE_STOPPED 11
+#define S_STATE_OPENING_CLOSED 17
-#define AF_VER(info) info" v0.7.2"
+#define AF_VER(info) info" v0.7.4"
#define TYPE_TCP 1
#define TYPE_UDP 3
@@ -85,49 +86,5 @@
#define TYPE_SET_COMP(type) (type|=TYPE_COMP)
#define TYPE_IS_COMP(type) (type&TYPE_COMP)
-typedef struct {
- char* hostname;
- char* users;
- char* clients;
- char* raclients;
- char* usrpcli;
- char* clim;
- char* timeout;
- char* realmname;
- unsigned char pass[4];
- int usercon;
- int usernum;
- int clicon;
- int clinum;
- int raclicon;
- int raclinum;
- int upcnum;
- int tmout;
- int climode;
- int usrclinum;
- int clientcounter;
- int usercounter;
- char type;
- char tunneltype;
- char dnslookups;
- char baseport;
- char audit;
- socklen_t addrlen;
- struct sockaddr* cliaddr;
- ConnectUser** contable;
- ConnectClient** clitable;
- ConnectClient** raclitable;
- UsrCli** usrclitable;
-} RealmT;
-
-typedef struct {
- char* certif;
- char* keys;
- char* dateformat;
- int size;
- time_t starttime;
- RealmT* realmtable;
-} ConfigurationT;
-
#endif
diff --git a/src/afclient.c b/src/afclient.c
index c41ee68..b450543 100644
--- a/src/afclient.c
+++ b/src/afclient.c
@@ -33,6 +33,7 @@ static struct option long_options[] = {
{"verbose", 0, 0, 'v'},
{"keyfile", 1, 0, 'k'},
{"storefile", 1, 0, 's'},
+ {"cfgfile", 1, 0, 'f'},
{"log", 1, 0, 'o'},
{"pass", 1, 0, 301},
{"ignorepkeys", 0, 0, 302},
@@ -61,53 +62,62 @@ static struct option long_options[] = {
{"ar-start", 0, 0, 305},
{"ar-quit", 0, 0, 306},
{"noar", 0, 0, 307},
+ {"localname", 1, 0, 311},
+ {"localport", 1, 0, 312},
+ {"localdesname", 1, 0, 313},
{0, 0, 0, 0}
};
+ClientConfiguration* cconfig;
+
int
main(int argc, char **argv)
{
+
/*
* variables
*/
int i, n, numofcon, length, buflength, notsent, temp, temp2;
- ConnectUser** contable = NULL;
- SslFd* master = SslFd_new();
+ ConnectUser** usersTable = NULL;
unsigned char buff[9000];
char hostname[100];
- int maxfdp1, usernum, usercon;
- socklen_t len, addrlen;
- struct sockaddr* cliaddr;
+ int maxfdp1, usercon;
+ socklen_t aLength, addressLength;
+ struct sockaddr* clientAddress;
fd_set rset, allset, wset, tmpset;
- struct timeval keepalive;
+ struct timeval keepAlive;
int timeout = 0;
char verbose = 0;
- char remote = 0;
- char sendkapackets = 0;
- char* name = NULL;
-#ifdef HAVE_LIBPTHREAD
HttpProxyOptions* hpo = HttpProxyOptions_new();
-#endif
+ char hpoUsed = 0;
ArOptions* ao = ArOptions_new();
- char* id = NULL;
- char* manage = NULL;
- char* desnam = NULL;
- char* despor = NULL;
+ ClientRealm* pointer;
+ char aoUsed = 0;
+ char passwordWasSet = 0;
+ char* realmId = NULL;
+ char* serverName = NULL;
+ char* managePort = NULL;
+ char* hostName = NULL;
+ char* destinationPort = NULL;
+ char* localName = NULL;
+ char* localPort = NULL;
+ char* localDestinationName = NULL;
char* keys = NULL;
char* store = NULL;
char* dateformat = NULL;
- char* katimeout = NULL;
- char ipfam = 0;
- unsigned char pass[4] = {1, 2, 3, 4};
- char udp = 0;
- char reverse = 0;
- char tunneltype = 0;
- char type = 0;
- char ignorepkeys = 0;
+ char* kaTimeout = NULL;
+ char* filenam = NULL;
+ char ipFamily = 0;
+ unsigned char password[4] = {1, 2, 3, 4};
+ char udpMode = 0;
+ char reverseMode = 0;
+ char remoteMode = 0;
+ char realmType = 0;
+ char ignorePublicKeys = 0;
struct sigaction act;
#ifdef HAVE_LIBDL
- moduleT module = {0, NULL, NULL, NULL, NULL}, secmodule = {0, NULL, NULL, NULL, NULL};
+ Module *moduleA = Module_new(), *moduleB = Module_new();
#endif
SSL_METHOD* method;
SSL_CTX* ctx = NULL;
@@ -128,11 +138,12 @@ main(int argc, char **argv)
exit(1);
}
- if (master == NULL) {
+#ifdef HAVE_LIBDL
+ if ((moduleA == NULL) || (moduleB == NULL)) {
printf("Problems with memory allocation... exiting\n");
exit(1);
}
-
+#endif
sigfillset(&(act.sa_mask));
act.sa_flags = 0;
@@ -140,6 +151,7 @@ main(int argc, char **argv)
sigaction(SIGPIPE, &act, NULL);
act.sa_handler = client_sig_int;
sigaction(SIGINT, &act, NULL);
+ sigaction(SIGTERM, &act, NULL);
#ifdef HAVE_LIBPTHREAD
remember_mainthread();
@@ -163,7 +175,7 @@ main(int argc, char **argv)
while ((n = getopt_long(argc, argv,
GETOPT_LONG_LIBDL(GETOPT_LONG_LIBPTHREAD(
- GETOPT_LONG_AF_INET6("huUn:m:d:p:vk:s:o:i:D:rP:X:VK:A:T:")))
+ GETOPT_LONG_AF_INET6("huUn:m:d:p:vk:s:o:i:D:rP:X:VK:A:T:f:")))
, long_options, 0)) != -1) {
switch (n) {
case 'h': {
@@ -171,45 +183,50 @@ main(int argc, char **argv)
break;
}
case 'n': {
- name = optarg;
+ serverName = optarg;
break;
}
#ifdef HAVE_LIBPTHREAD
case 'S': {
HttpProxyOptions_use_https(hpo);
+ hpoUsed = 1;
break;
}
case 'P': {
HttpProxyOptions_set_proxyname(hpo, optarg);
+ hpoUsed = 1;
break;
}
case 'X': {
HttpProxyOptions_set_proxyport(hpo, optarg);
+ hpoUsed = 1;
break;
}
case 'B': {
HttpProxyOptions_set_proxyauth_type(hpo, PROXYAUTH_TYPE_BASIC);
+ hpoUsed = 1;
break;
}
case 'C': {
HttpProxyOptions_set_proxyauth_cred(hpo, optarg);
+ hpoUsed = 1;
break;
}
#endif
case 'i': {
- id = optarg;
+ realmId = optarg;
break;
}
case 'm': {
- manage = optarg;
+ managePort = optarg;
break;
}
case 'd': {
- desnam = optarg;
+ hostName = optarg;
break;
}
case 'p': {
- despor = optarg;
+ destinationPort = optarg;
break;
}
case 'v': {
@@ -217,11 +234,11 @@ main(int argc, char **argv)
break;
}
case 'u': {
- udp = 1;
+ udpMode = 1;
break;
}
case 'U': {
- reverse = 1;
+ reverseMode = 1;
break;
}
case 'k': {
@@ -232,61 +249,81 @@ main(int argc, char **argv)
store = optarg;
break;
}
+ case 'f': {
+ filenam = optarg;
+ break;
+ }
case 'o': {
addlogtarget(optarg);
break;
}
case 301: {
n = strlen(optarg);
- memset(pass, 0, 4);
+ memset(password, 0, 4);
for (i = 0; i < n; ++i) {
- pass[i%4] += optarg[i];
+ password[i%4] += optarg[i];
}
+ passwordWasSet = 1;
break;
}
case 302: {
- ignorepkeys = 1;
+ ignorePublicKeys = 1;
break;
}
case 305: {
ArOptions_set_arStart(ao, AR_OPTION_ENABLED);
+ aoUsed = 1;
break;
}
case 306: {
ArOptions_set_arQuit(ao, AR_OPTION_ENABLED);
+ aoUsed = 1;
break;
}
case 307: {
ArOptions_set_arPremature(ao, AR_OPTION_DISABLED);
+ aoUsed = 1;
+ break;
+ }
+ case 311: {
+ localName = optarg;
+ break;
+ }
+ case 312: {
+ localPort = optarg;
+ break;
+ }
+ case 313: {
+ localDestinationName = optarg;
break;
}
#ifdef AF_INET6
case '4': {
- if (ipfam != 0) {
- ipfam = -1;
+ if (ipFamily != 0) {
+ ipFamily = -1;
}
else {
- ipfam = 4;
+ ipFamily = 4;
}
break;
}
case '6': {
- if (ipfam != 0) {
- ipfam = -1;
+ if (ipFamily != 0) {
+ ipFamily = -1;
}
else {
- ipfam = 6;
+ ipFamily = 6;
}
break;
}
#endif
#ifdef HAVE_LIBDL
case 'l': {
- module.name = optarg;
+ Module_set_fileName(moduleA, optarg);
break;
}
case 'L': {
- secmodule.name = optarg;
+ Module_set_fileName(moduleB, optarg);
break;
}
#endif
@@ -295,7 +332,7 @@ main(int argc, char **argv)
break;
}
case 'r': {
- remote = 1;
+ remoteMode = 1;
break;
}
case 'V': {
@@ -304,16 +341,17 @@ main(int argc, char **argv)
break;
}
case 'K': {
- katimeout = optarg;
- sendkapackets = 1;
+ kaTimeout = optarg;
break;
}
case 'A': {
ArOptions_set_s_arTries(ao, optarg);
+ aoUsed = 1;
break;
}
case 'T': {
ArOptions_set_s_arDelay(ao, optarg);
+ aoUsed = 1;
break;
}
case '?': {
@@ -327,92 +365,297 @@ main(int argc, char **argv)
client_short_usage("Unrecognized non-option elements");
}
- if (name == NULL) {
+ if (filenam != NULL) {
+ cconfig = cparsefile(filenam, &n);
+ if (n) {
+ printf("parsing failed! line:%d\n", n);
+ exit(1);
+ }
+ else {
+ if (keys == NULL) {
+ if (ClientConfiguration_get_keysFile(cconfig) == NULL) {
+ ClientConfiguration_set_keysFile(cconfig, "client.rsa");
+ }
+ }
+ else {
+ ClientConfiguration_set_keysFile(cconfig, keys);
+ }
+ if (store == NULL) {
+ if (ClientConfiguration_get_storeFile(cconfig) == NULL) {
+ ClientConfiguration_set_storeFile(cconfig, "known_hosts");
+ }
+ }
+ else {
+ ClientConfiguration_set_storeFile(cconfig, store);
+ }
+ if (dateformat != NULL) {
+ ClientConfiguration_set_dateFormat(cconfig, dateformat);
+ }
+ if (ignorePublicKeys) {
+ ClientConfiguration_set_ignorePublicKeys(cconfig, ignorePublicKeys);
+ }
+
+ initializelogging(verbose, ClientConfiguration_get_dateFormat(cconfig));
+
+ aflog(LOG_T_INIT, LOG_I_INFO,
+ "client's cfg file OK! (readed realms: %d)", ClientConfiguration_get_realmsNumber(cconfig));
+ if ((ClientConfiguration_get_realmsNumber(cconfig) == 0) ||
+ (ClientConfiguration_get_realmsTable(cconfig) == NULL) ||
+ ((pointer = ClientConfiguration_get_realmsTable(cconfig)[0]) == NULL)) {
+ aflog(LOG_T_INIT, LOG_I_CRIT,
+ "Working without sense is really without sense...");
+ exit(1);
+ }
+ if (hpoUsed) {
+ ClientRealm_set_httpProxyOptions(pointer, hpo);
+ }
+ else {
+ HttpProxyOptions_free(&hpo);
+ }
+ if (aoUsed) {
+ ClientRealm_set_arOptions(pointer, ao);
+ }
+ else {
+ ArOptions_free(&ao);
+ }
+ if ((serverName != NULL) && (ClientRealm_get_serverName(pointer) == NULL)) {
+ ClientRealm_set_serverName(pointer, serverName);
+ }
+ if ((managePort != NULL) && (ClientRealm_get_managePort(pointer) == NULL)) {
+ ClientRealm_set_managePort(pointer, managePort);
+ }
+ if ((hostName != NULL) && (ClientRealm_get_hostName(pointer) == NULL)) {
+ ClientRealm_set_hostName(pointer, hostName);
+ }
+ if ((destinationPort != NULL) && (ClientRealm_get_destinationPort(pointer) == NULL)) {
+ ClientRealm_set_destinationPort(pointer, destinationPort);
+ }
+ if ((realmId != NULL) && (ClientRealm_get_realmId(pointer) == NULL)) {
+ ClientRealm_set_realmId(pointer, realmId);
+ }
+ if ((localName != NULL) && (ClientRealm_get_localName(pointer) == NULL)) {
+ ClientRealm_set_localName(pointer, localName);
+ }
+ if ((localPort != NULL) && (ClientRealm_get_localPort(pointer) == NULL)) {
+ ClientRealm_set_localPort(pointer, localPort);
+ }
+ if ((localDestinationName != NULL) & (ClientRealm_get_localDestinationName(pointer) == NULL)) {
+ ClientRealm_set_localDestinationName(pointer, localDestinationName);
+ }
+ if ((kaTimeout != NULL) && (ClientRealm_get_sKeepAliveTimeout(pointer) == NULL)) {
+ ClientRealm_set_sKeepAliveTimeout(pointer, kaTimeout);
+ }
+ if (reverseMode) {
+ aflog(LOG_T_INIT, LOG_I_WARNING,
+ "Warning: reverseudp will be ignored");
+ }
+ if (udpMode) {
+ aflog(LOG_T_INIT, LOG_I_WARNING,
+ "Warning: udpmode will be ignored");
+ }
+ if (remoteMode) {
+ aflog(LOG_T_INIT, LOG_I_WARNING,
+ "Warning: remoteadmin will be ignored");
+ }
+ if (passwordWasSet) {
+ aflog(LOG_T_INIT, LOG_I_WARNING,
+ "Warning: pass will be ignored");
+ }
+#ifdef HAVE_LIBDL
+ if (Module_get_fileName(moduleA)) {
+ aflog(LOG_T_INIT, LOG_I_WARNING,
+ "Warning: load will be ignored");
+ }
+ if (Module_get_fileName(moduleB)) {
+ aflog(LOG_T_INIT, LOG_I_WARNING,
+ "Warning: Load will be ignored");
+ }
+#endif
+ }
+ }
+ else {
+ cconfig = ClientConfiguration_new();
+ if (cconfig == NULL) {
+ printf("Can't allocate memory for client configuration... exiting\n");
+ exit(1);
+ }
+ ClientConfiguration_set_keysFile(cconfig, keys);
+ ClientConfiguration_set_storeFile(cconfig, store);
+ ClientConfiguration_set_dateFormat(cconfig, dateformat);
+ ClientConfiguration_set_realmsNumber(cconfig, 1);
+ ClientConfiguration_set_ignorePublicKeys(cconfig, ignorePublicKeys);
+
+ initializelogging(verbose, ClientConfiguration_get_dateFormat(cconfig));
+
+ if (ClientConfiguration_get_keysFile(cconfig) == NULL) {
+ ClientConfiguration_set_keysFile(cconfig, "client.rsa");
+ }
+ if (ClientConfiguration_get_storeFile(cconfig) == NULL) {
+ ClientConfiguration_set_storeFile(cconfig, "known_hosts");
+ }
+ ClientConfiguration_set_realmsTable(cconfig,
+ calloc(ClientConfiguration_get_realmsNumber(cconfig), sizeof(ClientRealm*)));
+ if (ClientConfiguration_get_realmsTable(cconfig) == NULL) {
+ aflog(LOG_T_INIT, LOG_I_CRIT,
+ "Can't allocate memory for ClientRealm* table... exiting");
+ exit(1);
+ }
+ pointer = ClientRealm_new();
+ if (pointer == NULL) {
+ aflog(LOG_T_INIT, LOG_I_CRIT,
+ "Can't allocate memory for ClientRealm structure... exiting");
+ exit(1);
+ }
+
+ ClientConfiguration_get_realmsTable(cconfig)[0] = pointer;
+ ClientRealm_set_serverName(pointer, serverName);
+ ClientRealm_set_managePort(pointer, managePort);
+ ClientRealm_set_hostName(pointer, hostName);
+ ClientRealm_set_destinationPort(pointer, destinationPort);
+ ClientRealm_set_realmId(pointer, realmId);
+ ClientRealm_set_httpProxyOptions(pointer, hpo);
+ ClientRealm_set_arOptions(pointer, ao);
+ ClientRealm_set_password(pointer, password);
+ ClientRealm_set_localName(pointer, localName);
+ ClientRealm_set_localPort(pointer, localPort);
+ ClientRealm_set_localDestinationName(pointer, localDestinationName);
+ ClientRealm_set_realmId(pointer, realmId);
+ ClientRealm_set_sKeepAliveTimeout(pointer, kaTimeout);
+#ifdef HAVE_LIBDL
+ ClientRealm_set_userModule(pointer, moduleA);
+ ClientRealm_set_serviceModule(pointer, moduleB);
+#endif
+
+ if (reverseMode) {
+ if (ClientRealm_get_clientMode(pointer) == CLIENTREALM_MODE_TCP) {
+ ClientRealm_set_clientMode(pointer, CLIENTREALM_MODE_REVERSE);
+ }
+ else {
+ ClientRealm_set_clientMode(pointer, CLIENTREALM_MODE_UNKNOWN);
+ }
+ }
+ if (udpMode) {
+ if (ClientRealm_get_clientMode(pointer) == CLIENTREALM_MODE_TCP) {
+ ClientRealm_set_clientMode(pointer, CLIENTREALM_MODE_UDP);
+ }
+ else {
+ ClientRealm_set_clientMode(pointer, CLIENTREALM_MODE_UNKNOWN);
+ }
+ }
+ if (remoteMode) {
+ if (ClientRealm_get_clientMode(pointer) == CLIENTREALM_MODE_TCP) {
+ ClientRealm_set_clientMode(pointer, CLIENTREALM_MODE_REMOTE);
+ }
+ else {
+ ClientRealm_set_clientMode(pointer, CLIENTREALM_MODE_UNKNOWN);
+ }
+ }
+ }
+
+ /*
+ * WARNING: we have only one ClientRealm at the moment
+ */
+
+ if (ClientRealm_get_serverName(pointer) == NULL) {
client_short_usage("Name of the server is required");
}
- if (manage == NULL) {
- manage = "50126";
- if (reverse)
+ if (ClientRealm_get_clientMode(pointer) == CLIENTREALM_MODE_UNKNOWN) {
+ aflog(LOG_T_INIT, LOG_I_CRIT,
+ "Conflicting/unknown client modes... exiting");
+ exit(1);
+ }
+ if (ClientRealm_get_managePort(pointer) == NULL) {
+ ClientRealm_set_managePort(pointer, "50126");
+ if (ClientRealm_get_clientMode(pointer) == CLIENTREALM_MODE_REVERSE)
client_short_usage("Port on the server is required in reverse mode");
}
#ifdef HAVE_LIBPTHREAD
- if ((HttpProxyOptions_get_proxyname(hpo)) || (HttpProxyOptions_get_proxyport(hpo))) {
- if (tunneltype == 0) {
- tunneltype = 1;
+ if ((HttpProxyOptions_get_proxyname(ClientRealm_get_httpProxyOptions(pointer))) ||
+ (HttpProxyOptions_get_proxyport(ClientRealm_get_httpProxyOptions(pointer)))) {
+ if (ClientRealm_get_tunnelType(pointer) == CLIENTREALM_TUNNELTYPE_DIRECT) {
+ ClientRealm_set_tunnelType(pointer, CLIENTREALM_TUNNELTYPE_HTTPPROXY);
}
else {
- tunneltype = -1;
+ ClientRealm_set_tunnelType(pointer, CLIENTREALM_TUNNELTYPE_UNKNOWN);
}
}
- if (tunneltype == 1) {
- if (HttpProxyOptions_get_proxyport(hpo) == NULL) {
- HttpProxyOptions_set_proxyport(hpo, "8080");
+ if (ClientRealm_get_tunnelType(pointer) == CLIENTREALM_TUNNELTYPE_HTTPPROXY) {
+ if (HttpProxyOptions_get_proxyport(ClientRealm_get_httpProxyOptions(pointer)) == NULL) {
+ HttpProxyOptions_set_proxyport(ClientRealm_get_httpProxyOptions(pointer), "8080");
}
}
#endif
- if (keys == NULL) {
- keys = "client.rsa";
- }
- if (store == NULL) {
- store = "known_hosts";
- }
- if ((reverse == 0) && (remote == 0) && (desnam == NULL)) {
+ if ((ClientRealm_get_clientMode(pointer) != CLIENTREALM_MODE_REVERSE) &&
+ (ClientRealm_get_clientMode(pointer) != CLIENTREALM_MODE_REMOTE) &&
+ (ClientRealm_get_hostName(pointer) == NULL)) {
gethostname(hostname, 100);
- desnam = hostname;
+ ClientRealm_set_hostName(pointer, hostname);
}
- if ((!remote) && (despor == NULL)) {
+ if ((ClientRealm_get_clientMode(pointer) != CLIENTREALM_MODE_REMOTE) &&
+ (ClientRealm_get_destinationPort(pointer) == NULL)) {
client_short_usage("Destination port number is required");
}
-
- initializelogging(verbose, dateformat);
- if (sendkapackets) {
- check_value(&timeout, katimeout, "Invalid timeout value");
- keepalive.tv_sec = timeout;
- keepalive.tv_usec = 0;
+ if (ClientRealm_get_sKeepAliveTimeout(pointer)) {
+ ClientRealm_set_keepAliveTimeout(pointer,
+ check_value(ClientRealm_get_sKeepAliveTimeout(pointer), "Invalid timeout value"));
+ keepAlive.tv_sec = ClientRealm_get_keepAliveTimeout(pointer);
+ keepAlive.tv_usec = 0;
+ ClientRealm_set_keepAlive(pointer, keepAlive);
+ }
+ ArOptions_evaluate_values(ClientRealm_get_arOptions(pointer));
+
+ if (ignorePublicKeys) {
+ ClientConfiguration_set_ignorePublicKeys(cconfig, ignorePublicKeys);
}
- ArOptions_evaluate_values(ao);
#ifdef HAVE_LIBDL
- if (loadmodule(&module)) {
+ if (Module_loadModule(ClientRealm_get_userModule(pointer))) {
aflog(LOG_T_INIT, LOG_I_CRIT,
- "Loading a module %s failed!", module.name);
+ "Loading a module %s failed!", Module_get_fileName(ClientRealm_get_userModule(pointer)));
exit(1);
}
- if (loadmodule(&secmodule)) {
+ if (Module_loadModule(ClientRealm_get_serviceModule(pointer))) {
aflog(LOG_T_INIT, LOG_I_CRIT,
- "Loading a module %s failed!", secmodule.name);
+ "Loading a module %s failed!", Module_get_fileName(ClientRealm_get_serviceModule(pointer)));
exit(1);
}
#endif
-
- TYPE_SET_SSL(type);
- TYPE_SET_ZLIB(type);
+
+ TYPE_SET_ZERO(realmType);
+ TYPE_SET_SSL(realmType);
+ TYPE_SET_ZLIB(realmType);
#ifdef AF_INET6
- if (ipfam == -1) {
+ if ((ipFamily != 0) && (ClientRealm_get_ipFamily(pointer) <= 0)) {
+ ClientRealm_set_ipFamily(pointer, ipFamily);
+ }
+ if (ClientRealm_get_ipFamily(pointer) == -1) {
aflog(LOG_T_INIT, LOG_I_CRIT,
"Conflicting types of ip protocol family... exiting");
exit(1);
}
- else if (ipfam == 4) {
- TYPE_SET_IPV4(type);
+ else if (ClientRealm_get_ipFamily(pointer) == 4) {
+ TYPE_SET_IPV4(realmType);
}
- else if (ipfam == 6) {
- TYPE_SET_IPV6(type);
+ else if (ClientRealm_get_ipFamily(pointer) == 6) {
+ TYPE_SET_IPV6(realmType);
}
#endif
- ipfam = 0x01;
+ ipFamily = 0x01;
#ifdef AF_INET6
- if (TYPE_IS_IPV4(type)) {
- ipfam |= 0x02;
+ if (TYPE_IS_IPV4(realmType)) {
+ ipFamily |= 0x02;
}
- else if (TYPE_IS_IPV6(type)) {
- ipfam |= 0x04;
+ else if (TYPE_IS_IPV6(realmType)) {
+ ipFamily |= 0x04;
}
#endif
- if (!reverse) {
+ ClientRealm_set_ipFamily(pointer, ipFamily);
+ ClientRealm_set_realmType(pointer, realmType);
+
+ if (ClientRealm_get_clientMode(pointer) != CLIENTREALM_MODE_REVERSE) {
SSL_library_init();
method = SSLv3_client_method();
ctx = SSL_CTX_new(method);
@@ -429,102 +672,117 @@ main(int argc, char **argv)
"Warning: Creating ./apf directory failed (%d)", temp2);
}
}
+ store = ClientConfiguration_get_storeFile(cconfig);
if ((temp2 = create_publickey_store(&store))) {
aflog(LOG_T_INIT, LOG_I_WARNING,
"Warning: Something bad happened when creating public key store... (%d)", temp2);
}
+ ClientConfiguration_set_storeFile(cconfig, store);
+ keys = ClientConfiguration_get_keysFile(cconfig);
if ((temp2 = generate_rsa_key(&keys))) {
aflog(LOG_T_INIT, LOG_I_WARNING,
"Warning: Something bad happened when generating rsa keys... (%d)", temp2);
}
+ ClientConfiguration_set_keysFile(cconfig, keys);
if (SSL_CTX_use_RSAPrivateKey_file(ctx, keys, SSL_FILETYPE_PEM) != 1) {
aflog(LOG_T_INIT, LOG_I_CRIT,
"Setting rsa key failed (%s)... exiting", keys);
exit(1);
}
- if ((!remote) && (!verbose))
+ if ((ClientRealm_get_clientMode(pointer) != CLIENTREALM_MODE_REMOTE) &&
+ (!verbose))
daemon(0, 0);
- if (remote) {
+ if (ClientRealm_get_clientMode(pointer) == CLIENTREALM_MODE_REMOTE) {
temp2 = -1;
- if (despor) {
- if (ip_listen(&n, desnam, despor, &addrlen, ipfam)) {
+ if (ClientRealm_get_destinationPort(pointer)) {
+ if (ip_listen(&n, ClientRealm_get_serverName(pointer),
+ ClientRealm_get_destinationPort(pointer),
+ &addressLength,
+ ClientRealm_get_ipFamily(pointer))) {
#ifdef AF_INET6
aflog(LOG_T_INIT, LOG_I_CRIT,
"tcp_listen_%s error for %s, %s",
- (ipfam & 0x02)?"ipv4":(ipfam & 0x04)?"ipv6":"unspec", desnam, despor);
+ (ClientRealm_get_ipFamily(pointer) & 0x02) ?
+ "ipv4" :
+ (ClientRealm_get_ipFamily(pointer) & 0x04) ?
+ "ipv6" :
+ "unspec",
+ ClientRealm_get_serverName(pointer),
+ ClientRealm_get_destinationPort(pointer));
#else
aflog(LOG_T_INIT, LOG_I_CRIT,
- "tcp_listen error for %s, %s", desnam, despor);
+ "tcp_listen error for %s, %s", ClientRealm_get_serverName(pointer),
+ ClientRealm_get_destinationPort(pointer));
#endif
exit(1);
}
- cliaddr = malloc(addrlen);
- temp2 = accept(n, cliaddr, &addrlen);
+ clientAddress = malloc(addressLength);
+ if (clientAddress == NULL) {
+ aflog(LOG_T_INIT, LOG_I_CRIT,
+ "Can't allocate memory for sockaddr structure... exiting");
+ exit(1);
+ }
+ ClientRealm_set_addressLength(pointer, addressLength);
+ ClientRealm_set_clientAddress(pointer, clientAddress);
+ temp2 = accept(n, ClientRealm_get_clientAddress(pointer), &addressLength);
}
}
}
- i = ArOptions_get_arTries(ao);
- usernum = 0;
- SslFd_set_fd(master, -1);
+ i = ArOptions_get_arTries(ClientRealm_get_arOptions(pointer));
+ SslFd_set_fd(ClientRealm_get_masterSslFd(pointer), -1);
do {
temp = 0;
- if (SslFd_get_fd(master) != -1) {
- close(SslFd_get_fd(master));
+ if (SslFd_get_fd(ClientRealm_get_masterSslFd(pointer)) != -1) {
+ close(SslFd_get_fd(ClientRealm_get_masterSslFd(pointer)));
}
- close_connections(usernum, &contable);
- SslFd_set_ssl(master, NULL);
+ ClientRealm_closeUsersConnections(pointer);
+ SslFd_set_ssl(ClientRealm_get_masterSslFd(pointer), NULL);
- if (!reverse) {
+ if (ClientRealm_get_clientMode(pointer) != CLIENTREALM_MODE_REVERSE) {
if (temp == 0) {
-#ifdef HAVE_LIBPTHREAD
- if (initialize_client_stage1(tunneltype, master, name, manage, hpo,
- ipfam, ctx, buff, pass,
- (ArOptions_get_arStart(ao) == AR_OPTION_ENABLED) ? 0 : 1,
- ignorepkeys)) {
-#else
- if (initialize_client_stage1(tunneltype, master, name, manage, NULL,
- ipfam, ctx, buff, pass,
- (ArOptions_get_arStart(ao) == AR_OPTION_ENABLED) ? 0 : 1,
- ignorepkeys)) {
-#endif
+ if (initialize_client_stage1(pointer, ctx, buff,
+ (ArOptions_get_arStart(ClientRealm_get_arOptions(pointer)) == AR_OPTION_ENABLED) ? 0 : 1,
+ ClientConfiguration_get_ignorePublicKeys(cconfig))) {
temp = 1;
}
}
- if ((temp == 0) && remote) {
- return client_admin(type, master, buff, temp2, id);
+ if ((temp == 0) && (ClientRealm_get_clientMode(pointer) == CLIENTREALM_MODE_REMOTE)) {
+ return client_admin(ClientRealm_get_realmType(pointer),
+ ClientRealm_get_masterSslFd(pointer), buff, temp2,
+ ClientRealm_get_realmId(pointer));
}
if (temp == 0) {
- if (initialize_client_stage2(&type, master, &usernum, buff,
- (ArOptions_get_arStart(ao) == AR_OPTION_ENABLED) ? 0 : 1)) {
+ realmType = ClientRealm_get_realmType(pointer);
+ if (initialize_client_stage2(pointer, buff,
+ (ArOptions_get_arStart(ClientRealm_get_arOptions(pointer)) == AR_OPTION_ENABLED) ? 0 : 1)) {
temp = 1;
}
}
} /* !reverse */
else {
- if (initialize_client_reverse_udp(&usernum, master, name, manage, ipfam,
- (ArOptions_get_arStart(ao) == AR_OPTION_ENABLED) ? 0 : 1)) {
+ if (initialize_client_reverse_udp(pointer)) {
temp = 1;
}
}
if (temp == 0) {
- if (initialize_client_stage3(&contable, master, usernum, &buflength, &len, &allset, &wset, &maxfdp1,
- (ArOptions_get_arStart(ao) == AR_OPTION_ENABLED) ? 0 : 1)) {
+ if (initialize_client_stage3(pointer, &buflength, &allset, &wset, &maxfdp1,
+ (ArOptions_get_arStart(ClientRealm_get_arOptions(pointer)) == AR_OPTION_ENABLED) ? 0 : 1)) {
temp = 1;
}
}
/* UDP REVERSE MODE */
- if ((temp == 0) && reverse) {
- client_reverse_udp(contable, master, desnam, despor, type, buff, buflength);
+ if ((temp == 0) && (ClientRealm_get_clientMode(pointer) == CLIENTREALM_MODE_REVERSE)) {
+ client_reverse_udp(pointer, buff, buflength);
}
if (i > 0) {
@@ -533,9 +791,10 @@ main(int argc, char **argv)
if ((i != 0) && (temp == 1)) {
aflog(LOG_T_INIT, LOG_I_INFO,
"Trying to reconnect...");
- mysleep(ArOptions_get_arDelay(ao));
+ mysleep(ArOptions_get_arDelay(ClientRealm_get_arOptions(pointer)));
}
if (temp == 0) {
+ ClientRealm_set_realmType(pointer, realmType);
break;
}
} while (i);
@@ -543,33 +802,37 @@ main(int argc, char **argv)
/* NORMAL MODE */
aflog(LOG_T_CLIENT, LOG_I_INFO,
- "CLIENT STARTED mode: %s", (udp)?"udp":"tcp");
+ "CLIENT STARTED mode: %s", (ClientRealm_get_clientMode(pointer) == CLIENTREALM_MODE_UDP) ? "udp" : "tcp");
aflog(LOG_T_CLIENT, LOG_I_INFO,
- "SERVER SSL: %s, ZLIB: %s, MODE: %s", (TYPE_IS_SSL(type))?"yes":"no",
- (TYPE_IS_ZLIB(type))?"yes":"no", (TYPE_IS_TCP(type))?"tcp":"udp");
+ "SERVER SSL: %s, ZLIB: %s, MODE: %s", (TYPE_IS_SSL(ClientRealm_get_realmType(pointer))) ? "yes" : "no",
+ (TYPE_IS_ZLIB(ClientRealm_get_realmType(pointer))) ? "yes" : "no",
+ (TYPE_IS_TCP(ClientRealm_get_realmType(pointer))) ? "tcp" : "udp");
aflog(LOG_T_CLIENT, LOG_I_NOTICE,
- "CIPHER: %s VER: %s", SSL_get_cipher_name(SslFd_get_ssl(master)),
- SSL_get_cipher_version(SslFd_get_ssl(master)));
+ "CIPHER: %s VER: %s", SSL_get_cipher_name(SslFd_get_ssl(ClientRealm_get_masterSslFd(pointer))),
+ SSL_get_cipher_version(SslFd_get_ssl(ClientRealm_get_masterSslFd(pointer))));
#ifdef HAVE_LIBDL
- if (ismloaded(&module)) {
+ if (Module_isModuleLoaded(ClientRealm_get_userModule(pointer))) {
aflog(LOG_T_CLIENT, LOG_I_INFO,
- "LOADED MODULE: %s INFO: %s", module.name, module.info());
+ "LOADED MODULE: %s INFO: %s", Module_get_fileName(ClientRealm_get_userModule(pointer)),
+ Module_function_info(ClientRealm_get_userModule(pointer)));
}
- if (ismloaded(&secmodule)) {
+ if (Module_isModuleLoaded(ClientRealm_get_serviceModule(pointer))) {
aflog(LOG_T_CLIENT, LOG_I_INFO,
- "LOADED MODULE (ser): %s INFO: %s", secmodule.name, secmodule.info());
+ "LOADED MODULE (ser): %s INFO: %s", Module_get_fileName(ClientRealm_get_serviceModule(pointer)),
+ Module_function_info(ClientRealm_get_serviceModule(pointer)));
}
#endif
- if (id != NULL) {
+ if (ClientRealm_get_realmId(pointer) != NULL) {
buff[0] = AF_S_LOGIN;
buff[1] = buff[2] = 0;
- n = strlen(id);
- memcpy(&buff[5], id, n);
+ n = strlen(ClientRealm_get_realmId(pointer));
+ memcpy(&buff[5], ClientRealm_get_realmId(pointer), n);
buff[3] = n >> 8; /* high bits of message length */
buff[4] = n; /* low bits of message length */
- SslFd_send_message(type, master, buff, n+5);
+ SslFd_send_message(ClientRealm_get_realmType(pointer),
+ ClientRealm_get_masterSslFd(pointer), buff, n+5);
aflog(LOG_T_CLIENT, LOG_I_INFO,
- "ID SENT: %s", id);
+ "ID SENT: %s", ClientRealm_get_realmId(pointer));
}
for ( ; ; ) {
@@ -577,14 +840,16 @@ main(int argc, char **argv)
tmpset = wset;
aflog(LOG_T_MAIN, LOG_I_DDEBUG,
"select");
- if (sendkapackets) {
- if (select(maxfdp1, &rset, &tmpset, NULL, &keepalive) == 0) {
+ if (ClientRealm_get_sKeepAliveTimeout(pointer)) {
+ if (select(maxfdp1, &rset, &tmpset, NULL, ClientRealm_get_keepAlivePointer(pointer)) == 0) {
aflog(LOG_T_CLIENT, LOG_I_DEBUG,
"timeout: sending keep-alive packet");
buff[0] = AF_S_KEEP_ALIVE;
- SslFd_send_message(type, master, buff, 5);
- keepalive.tv_sec = timeout;
- keepalive.tv_usec = 0;
+ SslFd_send_message(ClientRealm_get_realmType(pointer),
+ ClientRealm_get_masterSslFd(pointer), buff, 5);
+ keepAlive.tv_sec = timeout;
+ keepAlive.tv_usec = 0;
+ ClientRealm_set_keepAlive(pointer, keepAlive);
}
}
else {
@@ -593,13 +858,14 @@ main(int argc, char **argv)
aflog(LOG_T_MAIN, LOG_I_DDEBUG,
"after select...");
- for (i = 0; i < usernum; ++i) {
- if ((ConnectUser_get_state(contable[i]) == S_STATE_OPEN) ||
- (ConnectUser_get_state(contable[i]) == S_STATE_STOPPED)) {
- if (FD_ISSET(ConnectUser_get_connFd(contable[i]), &rset)) { /* FD_ISSET CONTABLE[i].CONNFD RSET */
+ usersTable = ClientRealm_get_usersTable(pointer);
+ for (i = 0; i < ClientRealm_get_usersLimit(pointer); ++i) {
+ if ((ConnectUser_get_state(usersTable[i]) == S_STATE_OPEN) ||
+ (ConnectUser_get_state(usersTable[i]) == S_STATE_STOPPED)) {
+ if (FD_ISSET(ConnectUser_get_connFd(usersTable[i]), &rset)) { /* FD_ISSET CONTABLE[i].CONNFD RSET */
aflog(LOG_T_USER, LOG_I_DDEBUG,
"user[%d]: FD_ISSET", i);
- n = read(ConnectUser_get_connFd(contable[i]), &buff[5], 8091);
+ n = read(ConnectUser_get_connFd(usersTable[i]), &buff[5], 8091);
if (n == -1) {
aflog(LOG_T_USER, LOG_I_ERR,
"error (%d): while reading from service", n);
@@ -607,14 +873,15 @@ main(int argc, char **argv)
}
#ifdef HAVE_LINUX_SOCKIOS_H
# ifdef SIOCOUTQ
- if (ioctl(SslFd_get_fd(master), SIOCOUTQ, &notsent)) {
+ if (ioctl(SslFd_get_fd(ClientRealm_get_masterSslFd(pointer)), SIOCOUTQ, &notsent)) {
aflog(LOG_T_USER, LOG_I_CRIT,
"ioctl error -> exiting...");
exit(1);
}
- if (udp) {
- len = 4;
- if (getsockopt(SslFd_get_fd(master), SOL_SOCKET, SO_SNDBUF, &temp2, &len) != -1) {
+ if (ClientRealm_get_clientMode(pointer) == CLIENTREALM_MODE_UDP) {
+ aLength = 4;
+ if (getsockopt(SslFd_get_fd(ClientRealm_get_masterSslFd(pointer)),
+ SOL_SOCKET, SO_SNDBUF, &temp2, &aLength) != -1) {
if (temp2 != buflength) {
buflength = temp2;
aflog(LOG_T_USER, LOG_I_WARNING,
@@ -630,7 +897,7 @@ main(int argc, char **argv)
"ioctl error -> exiting...");
exit(1);
}
- if (udp) {
+ if (ClientRealm_get_clientMode(pointer) == CLIENTREALM_MODE_UDP) {
len = 4;
if (getsockopt(master.commfd, SOL_SOCKET, SO_SNDBUF, &temp2, &len) != -1) {
if (temp2 != buflength) {
@@ -650,15 +917,18 @@ main(int argc, char **argv)
#endif
if (n) {
#ifdef HAVE_LIBDL
- if (ismloaded(&secmodule)) {
- switch ((temp2 = secmodule.filter(ConnectUser_get_nameBuf(contable[i]), &buff[5], &n))) {
+ if (Module_isModuleLoaded(ClientRealm_get_serviceModule(pointer))) {
+ switch ((temp2 = Module_function_filter(ClientRealm_get_serviceModule(pointer),
+ ConnectUser_get_nameBuf(usersTable[i]), &buff[5], &n))) {
case 1: case 4: {
aflog(LOG_T_USER, LOG_I_WARNING,
"user[%d] (by ser): PACKET IGNORED BY MODULE", i);
if (temp2 == 4) {
aflog(LOG_T_MAIN, LOG_I_INFO,
- "RELEASED MODULE (ser): %s INFO: %s", secmodule.name, secmodule.info());
- releasemodule(&secmodule);
+ "RELEASED MODULE (ser): %s INFO: %s",
+ Module_get_fileName(ClientRealm_get_serviceModule(pointer)),
+ Module_function_info(ClientRealm_get_serviceModule(pointer)));
+ Module_releaseModule(ClientRealm_get_serviceModule(pointer));
}
continue;
break;
@@ -666,27 +936,31 @@ main(int argc, char **argv)
case 2: case 5: {
aflog(LOG_T_USER, LOG_I_NOTICE,
"user[%d] (by ser): DROPPED BY MODULE", i);
- close(ConnectUser_get_connFd(contable[i]));
- FD_CLR(ConnectUser_get_connFd(contable[i]), &allset);
- FD_CLR(ConnectUser_get_connFd(contable[i]), &wset);
- ConnectUser_set_state(contable[i], S_STATE_CLOSING);
- BufList_clear(ConnectUser_get_bufList(contable[i]));
+ close(ConnectUser_get_connFd(usersTable[i]));
+ FD_CLR(ConnectUser_get_connFd(usersTable[i]), &allset);
+ FD_CLR(ConnectUser_get_connFd(usersTable[i]), &wset);
+ ConnectUser_set_state(usersTable[i], S_STATE_CLOSING);
+ BufList_clear(ConnectUser_get_bufList(usersTable[i]));
buff[0] = AF_S_CONCLOSED; /* closing connection */
buff[1] = i >> 8; /* high bits of user number */
buff[2] = i; /* low bits of user number */
- SslFd_send_message(type, master, buff, 5);
+ SslFd_send_message(ClientRealm_get_realmType(pointer), ClientRealm_get_masterSslFd(pointer), buff, 5);
if (temp2 == 5) {
aflog(LOG_T_MAIN, LOG_I_INFO,
- "RELEASED MODULE (ser): %s INFO: %s", secmodule.name, secmodule.info());
- releasemodule(&secmodule);
+ "RELEASED MODULE (ser): %s INFO: %s",
+ Module_get_fileName(ClientRealm_get_serviceModule(pointer)),
+ Module_function_info(ClientRealm_get_serviceModule(pointer)));
+ Module_releaseModule(ClientRealm_get_serviceModule(pointer));
}
continue;
break;
}
case 3: {
aflog(LOG_T_MAIN, LOG_I_INFO,
- "RELEASED MODULE (ser): %s INFO: %s", secmodule.name, secmodule.info());
- releasemodule(&secmodule);
+ "RELEASED MODULE (ser): %s INFO: %s",
+ Module_get_fileName(ClientRealm_get_serviceModule(pointer)),
+ Module_function_info(ClientRealm_get_serviceModule(pointer)));
+ Module_releaseModule(ClientRealm_get_serviceModule(pointer));
break;
}
}
@@ -710,76 +984,76 @@ main(int argc, char **argv)
aflog(LOG_T_USER, LOG_I_DEBUG,
"user[%d]: TO msglen: %d", i, n);
#endif
- SslFd_send_message(type, master, buff, n+5);
+ SslFd_send_message(ClientRealm_get_realmType(pointer), ClientRealm_get_masterSslFd(pointer), buff, n+5);
}
- else if (!udp) {
+ else if (ClientRealm_get_clientMode(pointer) != CLIENTREALM_MODE_UDP) {
aflog(LOG_T_USER, LOG_I_INFO,
"user[%d]: CLOSING", i);
- close(ConnectUser_get_connFd(contable[i]));
- FD_CLR(ConnectUser_get_connFd(contable[i]), &allset);
- FD_CLR(ConnectUser_get_connFd(contable[i]), &wset);
- ConnectUser_set_state(contable[i], S_STATE_CLOSING);
- BufList_clear(ConnectUser_get_bufList(contable[i]));
+ close(ConnectUser_get_connFd(usersTable[i]));
+ FD_CLR(ConnectUser_get_connFd(usersTable[i]), &allset);
+ FD_CLR(ConnectUser_get_connFd(usersTable[i]), &wset);
+ ConnectUser_set_state(usersTable[i], S_STATE_CLOSING);
+ BufList_clear(ConnectUser_get_bufList(usersTable[i]));
buff[0] = AF_S_CONCLOSED; /* closing connection */
buff[1] = i >> 8; /* high bits of user number */
buff[2] = i; /* low bits of user number */
- SslFd_send_message(type, master, buff, 5);
+ SslFd_send_message(ClientRealm_get_realmType(pointer), ClientRealm_get_masterSslFd(pointer), buff, 5);
}
} /* - FD_ISSET CONTABLE[i].CONNFD RSET */
}
}
- for (i = 0; i < usernum; ++i) {
- if (ConnectUser_get_state(contable[i]) == S_STATE_STOPPED) {
- if (FD_ISSET(ConnectUser_get_connFd(contable[i]), &tmpset)) { /* FD_ISSET CONTABLE[i].CONNFD TMPSET */
+ for (i = 0; i < ClientRealm_get_usersLimit(pointer); ++i) {
+ if (ConnectUser_get_state(usersTable[i]) == S_STATE_STOPPED) {
+ if (FD_ISSET(ConnectUser_get_connFd(usersTable[i]), &tmpset)) { /* FD_ISSET CONTABLE[i].CONNFD TMPSET */
aflog(LOG_T_USER, LOG_I_DDEBUG,
"user[%d]: FD_ISSET - WRITE", i);
- n = BufListNode_readMessageLength(BufList_get_first(ConnectUser_get_bufList(contable[i])));
- temp2 = write(ConnectUser_get_connFd(contable[i]),
- BufListNode_readMessage(BufList_get_first(ConnectUser_get_bufList(contable[i]))), n);
+ n = BufListNode_readMessageLength(BufList_get_first(ConnectUser_get_bufList(usersTable[i])));
+ temp2 = write(ConnectUser_get_connFd(usersTable[i]),
+ BufListNode_readMessage(BufList_get_first(ConnectUser_get_bufList(usersTable[i]))), n);
if ((temp2 > 0) && (temp2 != n)) {
- BufListNode_set_actPtr(BufList_get_first(ConnectUser_get_bufList(contable[i])),
- BufListNode_get_actPtr(BufList_get_first(ConnectUser_get_bufList(contable[i]))) + temp2);
+ BufListNode_set_actPtr(BufList_get_first(ConnectUser_get_bufList(usersTable[i])),
+ BufListNode_get_actPtr(BufList_get_first(ConnectUser_get_bufList(usersTable[i]))) + temp2);
}
else if ((temp2 == -1) && (errno == EAGAIN)) {
aflog(LOG_T_USER, LOG_I_DEBUG,
"user[%d]: Couldn't write?", i);
}
else if (temp2 == -1) {
- close(ConnectUser_get_connFd(contable[i]));
- FD_CLR(ConnectUser_get_connFd(contable[i]), &allset);
- FD_CLR(ConnectUser_get_connFd(contable[i]), &wset);
- ConnectUser_set_state(contable[i], S_STATE_CLOSING);
+ close(ConnectUser_get_connFd(usersTable[i]));
+ FD_CLR(ConnectUser_get_connFd(usersTable[i]), &allset);
+ FD_CLR(ConnectUser_get_connFd(usersTable[i]), &wset);
+ ConnectUser_set_state(usersTable[i], S_STATE_CLOSING);
buff[0] = AF_S_CONCLOSED; /* closing connection */
buff[1] = i >> 8; /* high bits of user number */
buff[2] = i; /* low bits of user number */
- SslFd_send_message(type, master, buff, 5);
+ SslFd_send_message(ClientRealm_get_realmType(pointer), ClientRealm_get_masterSslFd(pointer), buff, 5);
}
else {
- BufList_delete_first(ConnectUser_get_bufList(contable[i]));
- if (BufList_get_first(ConnectUser_get_bufList(contable[i])) == NULL) {
- ConnectUser_set_state(contable[i], S_STATE_OPEN);
- FD_CLR(ConnectUser_get_state(contable[i]), &wset);
+ BufList_delete_first(ConnectUser_get_bufList(usersTable[i]));
+ if (BufList_get_first(ConnectUser_get_bufList(usersTable[i])) == NULL) {
+ ConnectUser_set_state(usersTable[i], S_STATE_OPEN);
+ FD_CLR(ConnectUser_get_state(usersTable[i]), &wset);
buff[0] = AF_S_CAN_SEND; /* stopping transfer */
buff[1] = i >> 8; /* high bits of user number */
buff[2] = i; /* low bits of user number */
aflog(LOG_T_USER, LOG_I_DDEBUG,
"FROM user[%d]: BUFFERING MESSAGE ENDED", i);
- SslFd_send_message(type, master, buff, 5);
+ SslFd_send_message(ClientRealm_get_realmType(pointer), ClientRealm_get_masterSslFd(pointer), buff, 5);
}
}
} /* - FD_ISSET CONTABLE[i].CONNFD TMPSET */
}
}
- if (FD_ISSET(SslFd_get_fd(master), &rset)) { /* FD_ISSET MASTER.COMMFD RSET */
+ if (FD_ISSET(SslFd_get_fd(ClientRealm_get_masterSslFd(pointer)), &rset)) { /* FD_ISSET MASTER.COMMFD RSET */
aflog(LOG_T_CLIENT, LOG_I_DDEBUG,
"masterfd: FD_ISSET");
- n = SslFd_get_message(type, master, buff, 5);
+ n = SslFd_get_message(ClientRealm_get_realmType(pointer), ClientRealm_get_masterSslFd(pointer), buff, 5);
if (n != 5) {
aflog(LOG_T_CLIENT, LOG_I_ERR,
"FATAL ERROR! (%d)", n);
if (n == -1) {
- if (TYPE_IS_SSL(type)) {
- get_ssl_error(master, "FE", n);
+ if (TYPE_IS_SSL(ClientRealm_get_realmType(pointer))) {
+ get_ssl_error(ClientRealm_get_masterSslFd(pointer), "FE", n);
continue; /* what happened? */
}
}
@@ -787,8 +1061,8 @@ main(int argc, char **argv)
exit(1);
}
if (n == 0) { /* server quits -> we do the same... */
- i = ArOptions_get_arTries(ao);
- if (ArOptions_get_arPremature(ao) == AR_OPTION_DISABLED) {
+ i = ArOptions_get_arTries(ClientRealm_get_arOptions(pointer));
+ if (ArOptions_get_arPremature(ClientRealm_get_arOptions(pointer)) == AR_OPTION_DISABLED) {
i = 0;
}
if (i) {
@@ -796,32 +1070,27 @@ main(int argc, char **argv)
"SERVER: premature quit -> auto-reconnect enabled");
}
while (i) {
- close_connections(usernum, &contable);
- SslFd_set_ssl(master, NULL);
- mysleep(ArOptions_get_arDelay(ao));
+ ClientRealm_closeUsersConnections(pointer);
+ close(SslFd_get_fd(ClientRealm_get_masterSslFd(pointer)));
+ SslFd_set_ssl(ClientRealm_get_masterSslFd(pointer), NULL);
+ mysleep(ArOptions_get_arDelay(ClientRealm_get_arOptions(pointer)));
aflog(LOG_T_CLIENT, LOG_I_INFO,
"Trying to reconnect...");
temp2 = 0;
if (temp2 == 0) {
-#ifdef HAVE_LIBPTHREAD
- if (initialize_client_stage1(tunneltype, master, name, manage, hpo,
- ipfam, ctx, buff, pass, 0, ignorepkeys)) {
-#else
- if (initialize_client_stage1(tunneltype, master, name, manage, NULL,
- ipfam, ctx, buff, pass, 0, ignorepkeys)) {
-#endif
+ if (initialize_client_stage1(pointer, ctx, buff, 0,
+ ClientConfiguration_get_ignorePublicKeys(cconfig))) {
temp2 = 1;
}
}
if (temp2 == 0) {
- if (initialize_client_stage2(&type, master, &usernum, buff, 0)) {
+ if (initialize_client_stage2(pointer, buff, 0)) {
temp2 = 1;
}
}
if (temp2 == 0) {
- if (initialize_client_stage3(&contable, master, usernum, &buflength, &len, &allset,
- &wset, &maxfdp1, 0)) {
+ if (initialize_client_stage3(pointer, &buflength, &allset, &wset, &maxfdp1, 0)) {
temp2 = 1;
}
}
@@ -830,6 +1099,18 @@ main(int argc, char **argv)
n = 1;
aflog(LOG_T_CLIENT, LOG_I_INFO,
"Reconnected successfully...");
+ usersTable = ClientRealm_get_usersTable(pointer);
+ if (ClientRealm_get_realmId(pointer) != NULL) {
+ buff[0] = AF_S_LOGIN;
+ buff[1] = buff[2] = 0;
+ n = strlen(ClientRealm_get_realmId(pointer));
+ memcpy(&buff[5], ClientRealm_get_realmId(pointer), n);
+ buff[3] = n >> 8; /* high bits of message length */
+ buff[4] = n; /* low bits of message length */
+ SslFd_send_message(ClientRealm_get_realmType(pointer), ClientRealm_get_masterSslFd(pointer), buff, n+5);
+ aflog(LOG_T_CLIENT, LOG_I_INFO,
+ "ID SENT: %s", ClientRealm_get_realmId(pointer));
+ }
break;
}
@@ -854,26 +1135,26 @@ main(int argc, char **argv)
case AF_S_CONCLOSED : {
aflog(LOG_T_USER, LOG_I_DDEBUG,
"user[%d]: AF_S_CONCLOSED", numofcon);
- if ((numofcon>=0) && (numofcon<=usernum)) {
+ if ((numofcon>=0) && (numofcon<=ClientRealm_get_usersLimit(pointer))) {
usercon--;
- if (ConnectUser_get_state(contable[numofcon]) == S_STATE_CLOSING) {
- ConnectUser_set_state(contable[numofcon], S_STATE_CLEAR);
+ if (ConnectUser_get_state(usersTable[numofcon]) == S_STATE_CLOSING) {
+ ConnectUser_set_state(usersTable[numofcon], S_STATE_CLEAR);
aflog(LOG_T_USER, LOG_I_INFO,
"user[%d]: CLOSED", numofcon);
}
- else if ((ConnectUser_get_state(contable[numofcon]) == S_STATE_OPEN) ||
- (ConnectUser_get_state(contable[numofcon]) == S_STATE_STOPPED)) {
+ else if ((ConnectUser_get_state(usersTable[numofcon]) == S_STATE_OPEN) ||
+ (ConnectUser_get_state(usersTable[numofcon]) == S_STATE_STOPPED)) {
aflog(LOG_T_USER, LOG_I_INFO,
"user[%d]: CLOSED", numofcon);
- close(ConnectUser_get_connFd(contable[numofcon]));
- FD_CLR(ConnectUser_get_connFd(contable[numofcon]), &allset);
- FD_CLR(ConnectUser_get_connFd(contable[numofcon]), &wset);
- ConnectUser_set_state(contable[numofcon], S_STATE_CLEAR);
- BufList_clear(ConnectUser_get_bufList(contable[numofcon]));
+ close(ConnectUser_get_connFd(usersTable[numofcon]));
+ FD_CLR(ConnectUser_get_connFd(usersTable[numofcon]), &allset);
+ FD_CLR(ConnectUser_get_connFd(usersTable[numofcon]), &wset);
+ ConnectUser_set_state(usersTable[numofcon], S_STATE_CLEAR);
+ BufList_clear(ConnectUser_get_bufList(usersTable[numofcon]));
buff[0] = AF_S_CONCLOSED; /* closing connection */
buff[1] = numofcon >> 8; /* high bits of user number */
buff[2] = numofcon; /* low bits of user number */
- SslFd_send_message(type, master, buff, 5);
+ SslFd_send_message(ClientRealm_get_realmType(pointer), ClientRealm_get_masterSslFd(pointer), buff, 5);
}
}
break;
@@ -881,65 +1162,71 @@ main(int argc, char **argv)
case AF_S_CONOPEN : {
aflog(LOG_T_USER, LOG_I_DDEBUG,
"user[%d]: AF_S_CONOPEN", numofcon);
- if ((numofcon>=0) && (numofcon<=usernum)) {
+ if ((numofcon>=0) && (numofcon<=ClientRealm_get_usersLimit(pointer))) {
usercon++;
- if (ConnectUser_get_state(contable[numofcon]) == S_STATE_CLEAR) {
- n = SslFd_get_message(type, master, buff, length);
- ConnectUser_set_nameBuf(contable[numofcon], (char*) buff);
- ConnectUser_set_portBuf(contable[numofcon], (char*) &buff[128]);
+ if (ConnectUser_get_state(usersTable[numofcon]) == S_STATE_CLEAR) {
+ n = SslFd_get_message(ClientRealm_get_realmType(pointer), ClientRealm_get_masterSslFd(pointer), buff, length);
+ ConnectUser_set_nameBuf(usersTable[numofcon], (char*) buff);
+ ConnectUser_set_portBuf(usersTable[numofcon], (char*) &buff[128]);
aflog(LOG_T_USER, LOG_I_INFO,
"user[%d]: OPENING", numofcon);
aflog(LOG_T_USER, LOG_I_INFO,
"user[%d]: IP:%s PORT:%s", numofcon,
- ConnectUser_get_nameBuf(contable[numofcon]), ConnectUser_get_portBuf(contable[numofcon]));
+ ConnectUser_get_nameBuf(usersTable[numofcon]), ConnectUser_get_portBuf(usersTable[numofcon]));
#ifdef HAVE_LIBDL
- if (ismloaded(&module) && module.allow(ConnectUser_get_nameBuf(contable[numofcon]),
- ConnectUser_get_portBuf(contable[numofcon]))) {
+ if (Module_isModuleLoaded(ClientRealm_get_userModule(pointer)) &&
+ Module_function_allow(ClientRealm_get_userModule(pointer),
+ ConnectUser_get_nameBuf(usersTable[numofcon]),
+ ConnectUser_get_portBuf(usersTable[numofcon]))) {
aflog(LOG_T_USER, LOG_I_WARNING,
"user[%d]: IT'S NOT ALLOWED - DROPPING", numofcon);
buff[0] = AF_S_CANT_OPEN; /* not opening connection */
buff[1] = numofcon >> 8; /* high bits of user number */
buff[2] = numofcon; /* low bits of user number */
- SslFd_send_message(type, master, buff, 5);
+ SslFd_send_message(ClientRealm_get_realmType(pointer), ClientRealm_get_masterSslFd(pointer), buff, 5);
usercon--;
continue;
}
#endif
- if (udp) {
- ipfam = 0;
+ if (ClientRealm_get_clientMode(pointer) == CLIENTREALM_MODE_UDP) {
+ ipFamily = 0;
}
else {
- ipfam = 0x01;
+ ipFamily = 0x01;
}
#ifdef AF_INET6
- if (TYPE_IS_IPV4(type)) {
- ipfam |= 0x02;
+ if (TYPE_IS_IPV4(ClientRealm_get_realmType(pointer))) {
+ ipFamily |= 0x02;
}
- else if (TYPE_IS_IPV6(type)) {
- ipfam |= 0x04;
+ else if (TYPE_IS_IPV6(ClientRealm_get_realmType(pointer))) {
+ ipFamily |= 0x04;
}
#endif
- if (ip_connect(&temp, desnam, despor, ipfam)) {
+ if (ip_connect(&temp, ClientRealm_get_hostName(pointer),
+ ClientRealm_get_destinationPort(pointer), ipFamily,
+ ClientRealm_get_localDestinationName(pointer), NULL)) {
aflog(LOG_T_USER, LOG_I_WARNING,
- "user[%d]: CAN'T CONNECT to %s:%s - DROPPING", numofcon, desnam, despor);
+ "user[%d]: CAN'T CONNECT to %s:%s - DROPPING", numofcon,
+ ClientRealm_get_hostName(pointer),
+ ClientRealm_get_destinationPort(pointer));
buff[0] = AF_S_CANT_OPEN; /* not opening connection */
buff[1] = numofcon >> 8; /* high bits of user number */
buff[2] = numofcon; /* low bits of user number */
- SslFd_send_message(type, master, buff, 5);
+ SslFd_send_message(ClientRealm_get_realmType(pointer), ClientRealm_get_masterSslFd(pointer), buff, 5);
usercon--;
continue;
}
- ConnectUser_set_connFd(contable[numofcon], temp);
- temp2 = fcntl(ConnectUser_get_connFd(contable[numofcon]), F_GETFL, 0);
- fcntl(ConnectUser_get_connFd(contable[numofcon]), F_SETFL, temp2 | O_NONBLOCK);
- FD_SET(ConnectUser_get_connFd(contable[numofcon]), &allset);
- maxfdp1 = (maxfdp1 > (ConnectUser_get_connFd(contable[numofcon]) + 1)) ?
- maxfdp1 : (ConnectUser_get_connFd(contable[numofcon]) + 1);
+ ConnectUser_set_connFd(usersTable[numofcon], temp);
+ temp2 = fcntl(ConnectUser_get_connFd(usersTable[numofcon]), F_GETFL, 0);
+ fcntl(ConnectUser_get_connFd(usersTable[numofcon]), F_SETFL, temp2 | O_NONBLOCK);
+ FD_SET(ConnectUser_get_connFd(usersTable[numofcon]), &allset);
+ maxfdp1 = (maxfdp1 > (ConnectUser_get_connFd(usersTable[numofcon]) + 1)) ?
+ maxfdp1 : (ConnectUser_get_connFd(usersTable[numofcon]) + 1);
buff[0] = AF_S_CONOPEN; /* opening connection */
buff[1] = numofcon >> 8; /* high bits of user number */
buff[2] = numofcon; /* low bits of user number */
- SslFd_send_message(type, master, buff, 5);
- ConnectUser_set_state(contable[numofcon], S_STATE_OPEN);
+ SslFd_send_message(ClientRealm_get_realmType(pointer), ClientRealm_get_masterSslFd(pointer), buff, 5);
+ ConnectUser_set_state(usersTable[numofcon], S_STATE_OPEN);
}
}
break;
@@ -949,19 +1236,22 @@ main(int argc, char **argv)
"user[%d]: AF_S_MESSAGE", numofcon);
aflog(LOG_T_USER, LOG_I_DEBUG,
"user[%d]: FROM msglen: %d", numofcon, length);
- n = SslFd_get_message(type, master, buff, length);
- if ((numofcon>=0) && (numofcon<=usernum)) {
- if (ConnectUser_get_state(contable[numofcon]) == S_STATE_OPEN) {
+ n = SslFd_get_message(ClientRealm_get_realmType(pointer), ClientRealm_get_masterSslFd(pointer), buff, length);
+ if ((numofcon>=0) && (numofcon<=ClientRealm_get_usersLimit(pointer))) {
+ if (ConnectUser_get_state(usersTable[numofcon]) == S_STATE_OPEN) {
#ifdef HAVE_LIBDL
- if (ismloaded(&module)) {
- switch ((temp2 = module.filter(ConnectUser_get_nameBuf(contable[numofcon]), buff, &n))) {
+ if (Module_isModuleLoaded(ClientRealm_get_userModule(pointer))) {
+ switch ((temp2 = Module_function_filter(ClientRealm_get_userModule(pointer),
+ ConnectUser_get_nameBuf(usersTable[numofcon]), buff, &n))) {
case 1: case 4:{
aflog(LOG_T_USER, LOG_I_WARNING,
"user[%d]: PACKET IGNORED BY MODULE", numofcon);
if (temp2 == 4) {
aflog(LOG_T_MAIN, LOG_I_INFO,
- "RELEASED MODULE: %s INFO: %s", module.name, module.info());
- releasemodule(&module);
+ "RELEASED MODULE: %s INFO: %s",
+ Module_get_fileName(ClientRealm_get_userModule(pointer)),
+ Module_function_info(ClientRealm_get_userModule(pointer)));
+ Module_releaseModule(ClientRealm_get_userModule(pointer));
}
continue;
break;
@@ -969,27 +1259,31 @@ main(int argc, char **argv)
case 2: case 5:{
aflog(LOG_T_USER, LOG_I_NOTICE,
"user[%d]: DROPPED BY MODULE", numofcon);
- close(ConnectUser_get_connFd(contable[numofcon]));
- FD_CLR(ConnectUser_get_connFd(contable[numofcon]), &allset);
- FD_CLR(ConnectUser_get_connFd(contable[numofcon]), &wset);
- ConnectUser_set_state(contable[numofcon], S_STATE_CLOSING);
- BufList_clear(ConnectUser_get_bufList(contable[numofcon]));
+ close(ConnectUser_get_connFd(usersTable[numofcon]));
+ FD_CLR(ConnectUser_get_connFd(usersTable[numofcon]), &allset);
+ FD_CLR(ConnectUser_get_connFd(usersTable[numofcon]), &wset);
+ ConnectUser_set_state(usersTable[numofcon], S_STATE_CLOSING);
+ BufList_clear(ConnectUser_get_bufList(usersTable[numofcon]));
buff[0] = AF_S_CONCLOSED; /* closing connection */
buff[1] = numofcon >> 8; /* high bits of user number */
buff[2] = numofcon; /* low bits of user number */
- SslFd_send_message(type, master, buff, 5);
+ SslFd_send_message(ClientRealm_get_realmType(pointer), ClientRealm_get_masterSslFd(pointer), buff, 5);
if (temp2 == 5) {
aflog(LOG_T_MAIN, LOG_I_INFO,
- "RELEASED MODULE: %s INFO: %s", module.name, module.info());
- releasemodule(&module);
+ "RELEASED MODULE: %s INFO: %s",
+ Module_get_fileName(ClientRealm_get_userModule(pointer)),
+ Module_function_info(ClientRealm_get_userModule(pointer)));
+ Module_releaseModule(ClientRealm_get_userModule(pointer));
}
continue;
break;
}
case 3: {
aflog(LOG_T_MAIN, LOG_I_INFO,
- "RELEASED MODULE: %s INFO: %s", module.name, module.info());
- releasemodule(&module);
+ "RELEASED MODULE: %s INFO: %s",
+ Module_get_fileName(ClientRealm_get_userModule(pointer)),
+ Module_function_info(ClientRealm_get_userModule(pointer)));
+ Module_releaseModule(ClientRealm_get_userModule(pointer));
break;
}
}
@@ -997,47 +1291,47 @@ main(int argc, char **argv)
#endif
aflog(LOG_T_USER, LOG_I_DEBUG,
"user[%d]: FROM msglen: %d SENT", numofcon, n);
- temp2 = write(ConnectUser_get_connFd(contable[numofcon]), buff, n);
+ temp2 = write(ConnectUser_get_connFd(usersTable[numofcon]), buff, n);
if ((temp2 > 0) && (temp2 != n)) {
- BufList_insert_back(ConnectUser_get_bufList(contable[numofcon]),
+ BufList_insert_back(ConnectUser_get_bufList(usersTable[numofcon]),
BufListNode_new_message(temp2, n, buff));
- ConnectUser_set_state(contable[numofcon], S_STATE_STOPPED);
- FD_SET(ConnectUser_get_connFd(contable[numofcon]), &wset);
+ ConnectUser_set_state(usersTable[numofcon], S_STATE_STOPPED);
+ FD_SET(ConnectUser_get_connFd(usersTable[numofcon]), &wset);
buff[0] = AF_S_DONT_SEND; /* stopping transfer */
buff[1] = numofcon >> 8; /* high bits of user number */
buff[2] = numofcon; /* low bits of user number */
aflog(LOG_T_USER, LOG_I_DDEBUG,
"FROM user[%d]: BUFFERING MESSAGE STARTED", numofcon);
- SslFd_send_message(type, master, buff, 5);
+ SslFd_send_message(ClientRealm_get_realmType(pointer), ClientRealm_get_masterSslFd(pointer), buff, 5);
}
else if ((temp2 == -1) && (errno == EAGAIN)) {
- BufList_insert_back(ConnectUser_get_bufList(contable[numofcon]),
+ BufList_insert_back(ConnectUser_get_bufList(usersTable[numofcon]),
BufListNode_new_message(0, n, buff));
- ConnectUser_set_state(contable[numofcon], S_STATE_STOPPED);
- FD_SET(ConnectUser_get_connFd(contable[numofcon]), &wset);
+ ConnectUser_set_state(usersTable[numofcon], S_STATE_STOPPED);
+ FD_SET(ConnectUser_get_connFd(usersTable[numofcon]), &wset);
buff[0] = AF_S_DONT_SEND; /* stopping transfer */
buff[1] = numofcon >> 8; /* high bits of user number */
buff[2] = numofcon; /* low bits of user number */
aflog(LOG_T_USER, LOG_I_DDEBUG,
"FROM user[%d]: BUFFERING MESSAGE STARTED", numofcon);
- SslFd_send_message(type, master, buff, 5);
+ SslFd_send_message(ClientRealm_get_realmType(pointer), ClientRealm_get_masterSslFd(pointer), buff, 5);
}
else if (temp2 == -1) {
- close(ConnectUser_get_connFd(contable[numofcon]));
- FD_CLR(ConnectUser_get_connFd(contable[numofcon]), &allset);
- FD_CLR(ConnectUser_get_connFd(contable[numofcon]), &wset);
- ConnectUser_set_state(contable[numofcon], S_STATE_CLOSING);
- BufList_clear(ConnectUser_get_bufList(contable[numofcon]));
+ close(ConnectUser_get_connFd(usersTable[numofcon]));
+ FD_CLR(ConnectUser_get_connFd(usersTable[numofcon]), &allset);
+ FD_CLR(ConnectUser_get_connFd(usersTable[numofcon]), &wset);
+ ConnectUser_set_state(usersTable[numofcon], S_STATE_CLOSING);
+ BufList_clear(ConnectUser_get_bufList(usersTable[numofcon]));
buff[0] = AF_S_CONCLOSED; /* closing connection */
buff[1] = numofcon >> 8; /* high bits of user number */
buff[2] = numofcon; /* low bits of user number */
- SslFd_send_message(type, master, buff, 5);
+ SslFd_send_message(ClientRealm_get_realmType(pointer), ClientRealm_get_masterSslFd(pointer), buff, 5);
}
}
- else if (ConnectUser_get_state(contable[numofcon]) == S_STATE_STOPPED) {
+ else if (ConnectUser_get_state(usersTable[numofcon]) == S_STATE_STOPPED) {
aflog(LOG_T_USER, LOG_I_DDEBUG,
"FROM user[%d]: BUFFERING MESSAGE", numofcon);
- BufList_insert_back(ConnectUser_get_bufList(contable[numofcon]),
+ BufList_insert_back(ConnectUser_get_bufList(usersTable[numofcon]),
BufListNode_new_message(0, n, buff));
}
}
@@ -1045,8 +1339,8 @@ main(int argc, char **argv)
}
case AF_S_CLOSING : { /* server shut down */
n = 0;
- i = ArOptions_get_arTries(ao);
- if (ArOptions_get_arQuit(ao) == AR_OPTION_DISABLED) {
+ i = ArOptions_get_arTries(ClientRealm_get_arOptions(pointer));
+ if (ArOptions_get_arQuit(ClientRealm_get_arOptions(pointer)) == AR_OPTION_DISABLED) {
i = 0;
}
if (i) {
@@ -1054,32 +1348,27 @@ main(int argc, char **argv)
"SERVER: CLOSED -> auto-reconnect enabled");
}
while (i) {
- close_connections(usernum, &contable);
- SslFd_set_ssl(master, NULL);
- mysleep(ArOptions_get_arDelay(ao));
+ ClientRealm_closeUsersConnections(pointer);
+ close(SslFd_get_fd(ClientRealm_get_masterSslFd(pointer)));
+ SslFd_set_ssl(ClientRealm_get_masterSslFd(pointer), NULL);
+ mysleep(ArOptions_get_arDelay(ClientRealm_get_arOptions(pointer)));
aflog(LOG_T_CLIENT, LOG_I_INFO,
"Trying to reconnect...");
temp2 = 0;
if (temp2 == 0) {
-#ifdef HAVE_LIBPTHREAD
- if (initialize_client_stage1(tunneltype, master, name, manage, hpo,
- ipfam, ctx, buff, pass, 0, ignorepkeys)) {
-#else
- if (initialize_client_stage1(tunneltype, master, name, manage, NULL,
- ipfam, ctx, buff, pass, 0, ignorepkeys)) {
-#endif
+ if (initialize_client_stage1(pointer, ctx, buff, 0,
+ ClientConfiguration_get_ignorePublicKeys(cconfig))) {
temp2 = 1;
}
}
if (temp2 == 0) {
- if (initialize_client_stage2(&type, master, &usernum, buff, 0)) {
+ if (initialize_client_stage2(pointer, buff, 0)) {
temp2 = 1;
}
}
if (temp2 == 0) {
- if (initialize_client_stage3(&contable, master, usernum, &buflength, &len, &allset,
- &wset, &maxfdp1, 0)) {
+ if (initialize_client_stage3(pointer, &buflength, &allset, &wset, &maxfdp1, 0)) {
temp2 = 1;
}
}
@@ -1088,6 +1377,18 @@ main(int argc, char **argv)
n = 1;
aflog(LOG_T_CLIENT, LOG_I_INFO,
"Reconnected successfully...");
+ usersTable = ClientRealm_get_usersTable(pointer);
+ if (ClientRealm_get_realmId(pointer) != NULL) {
+ buff[0] = AF_S_LOGIN;
+ buff[1] = buff[2] = 0;
+ n = strlen(ClientRealm_get_realmId(pointer));
+ memcpy(&buff[5], ClientRealm_get_realmId(pointer), n);
+ buff[3] = n >> 8; /* high bits of message length */
+ buff[4] = n; /* low bits of message length */
+ SslFd_send_message(ClientRealm_get_realmType(pointer), ClientRealm_get_masterSslFd(pointer), buff, n+5);
+ aflog(LOG_T_CLIENT, LOG_I_INFO,
+ "ID SENT: %s", ClientRealm_get_realmId(pointer));
+ }
break;
}
@@ -1105,13 +1406,13 @@ main(int argc, char **argv)
case AF_S_DONT_SEND: {
aflog(LOG_T_USER, LOG_I_DEBUG,
"user[%d]: AF_S_DONT_SEND", numofcon);
- FD_CLR(ConnectUser_get_connFd(contable[numofcon]), &allset);
+ FD_CLR(ConnectUser_get_connFd(usersTable[numofcon]), &allset);
break;
}
case AF_S_CAN_SEND: {
aflog(LOG_T_USER, LOG_I_DEBUG,
"user[%d]: AF_S_CAN_SEND", numofcon);
- FD_SET(ConnectUser_get_connFd(contable[numofcon]), &allset);
+ FD_SET(ConnectUser_get_connFd(usersTable[numofcon]), &allset);
break;
}
default : { /* unrecognized type of message -> exiting... */
diff --git a/src/afclient.h b/src/afclient.h
index 57a9f7c..200af70 100644
--- a/src/afclient.h
+++ b/src/afclient.h
@@ -20,8 +20,9 @@
#include "activefor.h"
#include "network.h"
+#include "file.h"
#include "stats.h"
-#include "modules.h"
+#include "module_struct.h"
#include "client_remoteadmin.h"
#include "make_ssl_handshake.h"
#include "first_run.h"
diff --git a/src/afserver.c b/src/afserver.c
index 1066176..2d6e1eb 100644
--- a/src/afserver.c
+++ b/src/afserver.c
@@ -61,7 +61,7 @@ static struct option long_options[] = {
{0, 0, 0, 0}
};
-ConfigurationT config;
+ServerConfiguration* config;
int
main(int argc, char **argv)
@@ -96,13 +96,19 @@ main(int argc, char **argv)
char baseport = 0;
char audit = 0;
char dnslookups = 0;
- RealmT* pointer = NULL;
+ ServerRealm* pointer = NULL;
struct sigaction act;
time_t now;
+ ServerRealm** scRealmsTable;
+ UsrCli** srUsersClientsTable;
+ ConnectUser** srUsersTable;
+ ConnectClient** srClientsTable;
+ ConnectClient** srRaClientsTable;
char* certif = NULL;
char* keys = NULL;
char* dateformat = NULL;
+ char* stemp = NULL;
SSL_METHOD* method;
SSL_CTX* ctx;
@@ -115,17 +121,10 @@ main(int argc, char **argv)
sigaction(SIGPIPE, &act, NULL);
act.sa_handler = server_sig_int;
sigaction(SIGINT, &act, NULL);
+ sigaction(SIGTERM, &act, NULL);
TYPE_SET_SSL(mode);
TYPE_SET_ZLIB(mode);
-
- memset(&config, 0, sizeof(config));
-
- config.certif = NULL;
- config.keys = NULL;
- config.size = 0;
- config.realmtable = NULL;
- config.dateformat = NULL;
#ifdef HAVE_LIBPTHREAD
remember_mainthread();
@@ -322,25 +321,29 @@ main(int argc, char **argv)
}
else {
if (certif == NULL) {
- config.certif = "cacert.pem";
+ if (ServerConfiguration_get_certificateFile(config) == NULL) {
+ ServerConfiguration_set_certificateFile(config, "cacert.pem");
+ }
}
else {
- config.certif = certif;
+ ServerConfiguration_set_certificateFile(config, certif);
}
if (keys == NULL) {
- config.keys = "server.rsa";
+ if (ServerConfiguration_get_keysFile(config) == NULL) {
+ ServerConfiguration_set_keysFile(config, "server.rsa");
+ }
}
else {
- config.keys = keys;
+ ServerConfiguration_set_keysFile(config, keys);
}
if (dateformat != NULL) {
- config.dateformat = dateformat;
+ ServerConfiguration_set_dateFormat(config, dateformat);
}
- initializelogging(verbose, config.dateformat);
+ initializelogging(verbose, ServerConfiguration_get_dateFormat(config));
aflog(LOG_T_INIT, LOG_I_INFO,
- "cfg file OK! (readed realms: %d)", config.size);
+ "cfg file OK! (readed realms: %d)", ServerConfiguration_get_realmsNumber(config));
if (name != NULL)
aflog(LOG_T_INIT, LOG_I_WARNING,
"Warning: hostname=%s will be ignored", name);
@@ -358,12 +361,17 @@ main(int argc, char **argv)
"Warning: password from command line will be ignored");
}
}
- else {
- config.certif = certif;
- config.keys = keys;
- config.dateformat = dateformat;
-
- initializelogging(verbose, config.dateformat);
+ else {
+ config = ServerConfiguration_new();
+ if (config == NULL) {
+ printf("Can't allocate memory for server configuration... exiting\n");
+ exit(1);
+ }
+ ServerConfiguration_set_certificateFile(config, certif);
+ ServerConfiguration_set_keysFile(config, keys);
+ ServerConfiguration_set_dateFormat(config, dateformat);
+
+ initializelogging(verbose, ServerConfiguration_get_dateFormat(config));
if (listen == NULL) {
listencount = 1;
@@ -380,52 +388,77 @@ main(int argc, char **argv)
"Number of listen and manage options are not the same... exiting");
exit(1);
}
- if (config.certif == NULL) {
- config.certif = "cacert.pem";
- }
- if (config.keys == NULL) {
- config.keys = "server.rsa";
- }
+ if (ServerConfiguration_get_certificateFile(config) == NULL) {
+ ServerConfiguration_set_certificateFile(config, "cacert.pem");
+ }
+ if (ServerConfiguration_get_keysFile(config) == NULL) {
+ ServerConfiguration_set_keysFile(config, "server.rsa");
+ }
if (type == NULL) {
type = "tcp";
}
- config.size = 1;
- config.realmtable = calloc(config.size, sizeof(RealmT));
- config.realmtable[0].hostname = name;
- config.realmtable[0].usrclinum = managecount;
- config.realmtable[0].usrclitable = calloc(managecount, sizeof(UsrCli*));
- for (i = 0; i < config.realmtable[0].usrclinum; ++i) {
- config.realmtable[0].usrclitable[i] = UsrCli_new();
- if (config.realmtable[0].usrclitable[i] == NULL) {
+ ServerConfiguration_set_realmsNumber(config, 1);
+ scRealmsTable = calloc(1, sizeof(ServerRealm*));
+ if (scRealmsTable == NULL) {
+ aflog(LOG_T_INIT, LOG_I_CRIT,
+ "Problem with allocating memory for ServerRealm* table... exiting");
+ exit(1);
+ }
+ ServerConfiguration_set_realmsTable(config, scRealmsTable);
+ pointer = ServerRealm_new();
+ if (pointer == NULL) {
+ aflog(LOG_T_INIT, LOG_I_CRIT,
+ "Problem with allocating memory for ServerRealm structure... exiting");
+ exit(1);
+ }
+ scRealmsTable[0] = pointer;
+ ServerRealm_set_hostName(pointer, name);
+ ServerRealm_set_userClientPairs(pointer, managecount);
+ srUsersClientsTable = calloc(managecount, sizeof(UsrCli*));
+ if (srUsersClientsTable == NULL) {
+ aflog(LOG_T_INIT, LOG_I_CRIT,
+ "Problem with allocating memory for UsrCli* table... exiting");
+ exit(1);
+ }
+ ServerRealm_set_usersClientsTable(pointer, srUsersClientsTable);
+ for (i = 0; i < managecount; ++i) {
+ srUsersClientsTable[i] = UsrCli_new();
+ if (srUsersClientsTable[i] == NULL) {
aflog(LOG_T_INIT, LOG_I_CRIT,
"Problem with allocating memory for UsrCli structure... exiting");
exit(1);
}
- UsrCli_set_listenPortName(config.realmtable[0].usrclitable[i], listen[i]);
- UsrCli_set_managePortName(config.realmtable[0].usrclitable[i], manage[i]);
+ UsrCli_set_listenPortName(srUsersClientsTable[i], listen[i]);
+ UsrCli_set_managePortName(srUsersClientsTable[i], manage[i]);
}
- config.realmtable[0].users = amount;
- config.realmtable[0].clients = clients;
- config.realmtable[0].raclients = raclients;
- config.realmtable[0].timeout = timeout;
- config.realmtable[0].usrpcli = usrpcli;
- config.realmtable[0].clim = clim;
- config.realmtable[0].baseport = baseport;
- config.realmtable[0].audit = audit;
+ ServerRealm_set_sUsersLimit(pointer, amount);
+ ServerRealm_set_sClientsLimit(pointer, clients);
+ ServerRealm_set_sRaClientsLimit(pointer, raclients);
+ ServerRealm_set_sTimeout(pointer, timeout);
+ ServerRealm_set_sUsersPerClient(pointer, usrpcli);
+ ServerRealm_set_sClientMode(pointer, clim);
+ ServerRealm_set_basePortOn(pointer, baseport);
+ ServerRealm_set_auditOn(pointer, audit);
#ifdef HAVE_LIBPTHREAD
- config.realmtable[0].tunneltype = tunneltype;
+ ServerRealm_set_tunnelType(pointer, tunneltype);
#endif
- config.realmtable[0].dnslookups = dnslookups;
- config.realmtable[0].realmname = realmname;
- memcpy(config.realmtable[0].pass, pass, 4);
+ ServerRealm_set_dnsLookupsOn(pointer, dnslookups);
+ ServerRealm_set_realmName(pointer, realmname);
+ ServerRealm_set_password(pointer, pass);
if (strcmp(type, "tcp") == 0) {
- TYPE_SET_TCP(config.realmtable[0].type);
+ temp = ServerRealm_get_realmType(pointer);
+ TYPE_SET_TCP(temp);
+ ServerRealm_set_realmType(pointer, temp);
}
else if (strcmp(type, "udp") == 0) {
- TYPE_SET_UDP(config.realmtable[0].type);
+ temp = ServerRealm_get_realmType(pointer);
+ TYPE_SET_UDP(temp);
+ ServerRealm_set_realmType(pointer, temp);
}
else {
- TYPE_SET_ZERO(config.realmtable[0].type);
+ temp = ServerRealm_get_realmType(pointer);
+ TYPE_SET_ZERO(temp);
+ ServerRealm_set_realmType(pointer, temp);
}
#ifdef AF_INET6
if (ipfam == -1) {
@@ -434,13 +467,19 @@ main(int argc, char **argv)
exit(1);
}
else if (ipfam == 4) {
- TYPE_SET_IPV4(config.realmtable[0].type);
+ temp = ServerRealm_get_realmType(pointer);
+ TYPE_SET_IPV4(temp);
+ ServerRealm_set_realmType(pointer, temp);
}
else if (ipfam == 6) {
- TYPE_SET_IPV6(config.realmtable[0].type);
+ temp = ServerRealm_get_realmType(pointer);
+ TYPE_SET_IPV6(temp);
+ ServerRealm_set_realmType(pointer, temp);
}
#endif
- config.realmtable[0].type |= mode;
+ temp = ServerRealm_get_realmType(pointer);
+ temp |= mode;
+ ServerRealm_set_realmType(pointer, temp);
}
maxfdp1 = manconnecting = 0;
@@ -461,25 +500,30 @@ main(int argc, char **argv)
"Warning: Creating ./apf directory failed (%d)", flags);
}
}
- if ((flags = generate_rsa_key(&config.keys))) {
+ keys = ServerConfiguration_get_keysFile(config);
+ if ((flags = generate_rsa_key(&keys))) {
aflog(LOG_T_INIT, LOG_I_WARNING,
"Warning: Something bad happened when generating rsa keys... (%d)", flags);
}
- if (SSL_CTX_use_RSAPrivateKey_file(ctx, config.keys, SSL_FILETYPE_PEM) != 1) {
+ ServerConfiguration_set_keysFile(config, keys);
+ if (SSL_CTX_use_RSAPrivateKey_file(ctx, ServerConfiguration_get_keysFile(config), SSL_FILETYPE_PEM) != 1) {
aflog(LOG_T_INIT, LOG_I_CRIT,
- "Setting rsa key failed (%s)... exiting", config.keys);
+ "Setting rsa key failed (%s)... exiting", ServerConfiguration_get_keysFile(config));
exit(1);
}
- if ((flags = generate_certificate(&config.certif, config.keys))) {
+ certif = ServerConfiguration_get_certificateFile(config);
+ if ((flags = generate_certificate(&certif, ServerConfiguration_get_keysFile(config)))) {
aflog(LOG_T_INIT, LOG_I_WARNING,
"Warning: Something bad happened when generating certificate... (%d)", flags);
}
- if (SSL_CTX_use_certificate_file(ctx, config.certif, SSL_FILETYPE_PEM) != 1) {
+ ServerConfiguration_set_certificateFile(config, certif);
+ if (SSL_CTX_use_certificate_file(ctx,
+ ServerConfiguration_get_certificateFile(config), SSL_FILETYPE_PEM) != 1) {
aflog(LOG_T_INIT, LOG_I_CRIT,
- "Setting certificate failed (%s)... exiting", config.certif);
+ "Setting certificate failed (%s)... exiting", ServerConfiguration_get_certificateFile(config));
exit(1);
}
- if (config.size == 0) {
+ if (ServerConfiguration_get_realmsNumber(config) == 0) {
aflog(LOG_T_INIT, LOG_I_CRIT,
"Working without sense is really without sense...");
exit(1);
@@ -491,141 +535,180 @@ main(int argc, char **argv)
if (!verbose)
daemon(0, 0);
- for (i = 0; i < config.size; ++i) {
- if (config.realmtable[i].usrclinum == 0) {
+ scRealmsTable = ServerConfiguration_get_realmsTable(config);
+ for (i = 0; i < ServerConfiguration_get_realmsNumber(config); ++i) {
+ if (ServerRealm_get_userClientPairs(scRealmsTable[i]) == 0) {
aflog(LOG_T_INIT, LOG_I_CRIT,
"You have to specify at least one listen port and one manage port in each realm");
exit(1);
}
- for (j = 0; j < config.realmtable[i].usrclinum; ++j) {
- if ((UsrCli_get_listenPortName(config.realmtable[i].usrclitable[j]) == NULL) ||
- (UsrCli_get_managePortName(config.realmtable[i].usrclitable[j]) == NULL)) {
+ srUsersClientsTable = ServerRealm_get_usersClientsTable(scRealmsTable[i]);
+ for (j = 0; j < ServerRealm_get_userClientPairs(scRealmsTable[i]); ++j) {
+ if ((UsrCli_get_listenPortName(srUsersClientsTable[j]) == NULL) ||
+ (UsrCli_get_managePortName(srUsersClientsTable[j]) == NULL)) {
aflog(LOG_T_INIT, LOG_I_CRIT,
"Missing some of the variables...\nRealm: %d\nlistenport[%d]: %s\nmanageport[%d]: %s",
- i, j, UsrCli_get_listenPortName(config.realmtable[i].usrclitable[j]),
- j, UsrCli_get_managePortName(config.realmtable[i].usrclitable[j]));
+ i, j, UsrCli_get_listenPortName(srUsersClientsTable[j]),
+ j, UsrCli_get_managePortName(srUsersClientsTable[j]));
exit(1);
}
}
/* checking type of the realm */
- if (!TYPE_IS_SET(config.realmtable[i].type)) {
+ if (!TYPE_IS_SET(ServerRealm_get_realmType(scRealmsTable[i]))) {
if (type != NULL) {
if (strcmp(type, "tcp") == 0) {
- TYPE_SET_TCP(config.realmtable[i].type);
+ temp = ServerRealm_get_realmType(scRealmsTable[i]);
+ TYPE_SET_TCP(temp);
+ ServerRealm_set_realmType(scRealmsTable[i], temp);
}
else if (strcmp(type, "udp") == 0) {
- TYPE_SET_UDP(config.realmtable[i].type);
+ temp = ServerRealm_get_realmType(scRealmsTable[i]);
+ TYPE_SET_UDP(temp);
+ ServerRealm_set_realmType(scRealmsTable[i], temp);
}
else {
- TYPE_SET_TCP(config.realmtable[i].type);
+ temp = ServerRealm_get_realmType(scRealmsTable[i]);
+ TYPE_SET_TCP(temp);
+ ServerRealm_set_realmType(scRealmsTable[i], temp);
}
}
else {
- TYPE_SET_TCP(config.realmtable[i].type);
+ temp = ServerRealm_get_realmType(scRealmsTable[i]);
+ TYPE_SET_TCP(temp);
+ ServerRealm_set_realmType(scRealmsTable[i], temp);
}
}
#ifdef AF_INET6
/* using user's value for ipfam*/
- if (TYPE_IS_UNSPEC(config.realmtable[i].type)) {
+ if (TYPE_IS_UNSPEC(ServerRealm_get_realmType(scRealmsTable[i]))) {
if (ipfam == -1) {
aflog(LOG_T_INIT, LOG_I_CRIT,
"Conflicting types of ip protocol family... exiting");
exit(1);
}
else if (ipfam == 4) {
- TYPE_SET_IPV4(config.realmtable[i].type);
+ temp = ServerRealm_get_realmType(scRealmsTable[i]);
+ TYPE_SET_IPV4(temp);
+ ServerRealm_set_realmType(scRealmsTable[i], temp);
}
else if (ipfam == 6) {
- TYPE_SET_IPV6(config.realmtable[i].type);
+ temp = ServerRealm_get_realmType(scRealmsTable[i]);
+ TYPE_SET_IPV6(temp);
+ ServerRealm_set_realmType(scRealmsTable[i], temp);
}
}
#endif
/* using user's values for zlib and ssl mode*/
if (!TYPE_IS_SSL(mode)) {
- TYPE_UNSET_SSL(config.realmtable[i].type);
+ temp = ServerRealm_get_realmType(scRealmsTable[i]);
+ TYPE_UNSET_SSL(temp);
+ ServerRealm_set_realmType(scRealmsTable[i], temp);
}
if (!TYPE_IS_ZLIB(mode)) {
- TYPE_UNSET_ZLIB(config.realmtable[i].type);
+ temp = ServerRealm_get_realmType(scRealmsTable[i]);
+ TYPE_UNSET_ZLIB(temp);
+ ServerRealm_set_realmType(scRealmsTable[i], temp);
}
/* using user's baseport value*/
- if (config.realmtable[i].baseport == 0) {
- config.realmtable[i].baseport = baseport;
+ if (ServerRealm_get_basePortOn(scRealmsTable[i]) == 0) {
+ ServerRealm_set_basePortOn(scRealmsTable[i], baseport);
}
/* using user's audit value*/
- if (config.realmtable[i].audit == 0) {
- config.realmtable[i].audit = audit;
+ if (ServerRealm_get_auditOn(scRealmsTable[i]) == 0) {
+ ServerRealm_set_auditOn(scRealmsTable[i], audit);
}
#ifdef HAVE_LIBPTHREAD
/* using user's tunneltype value*/
- if (config.realmtable[i].tunneltype == 0) {
+ if (ServerRealm_get_tunnelType(scRealmsTable[i]) == 0) {
if (tunneltype == -1) {
aflog(LOG_T_INIT, LOG_I_CRIT,
"Conflicting types of tunnel type... exiting");
exit(1);
}
- config.realmtable[i].tunneltype = tunneltype;
+ ServerRealm_set_tunnelType(scRealmsTable[i], tunneltype);
}
#endif
/* using user's dnslookups value*/
- if (config.realmtable[i].dnslookups == 0) {
- config.realmtable[i].dnslookups = dnslookups;
+ if (ServerRealm_get_dnsLookupsOn(scRealmsTable[i]) == 0) {
+ ServerRealm_set_dnsLookupsOn(scRealmsTable[i], dnslookups);
}
/* checking users amount */
- set_value(&(config.realmtable[i].users), amount, "5");
- check_value(&(config.realmtable[i].usernum), config.realmtable[i].users, "Invalid users amount");
+ stemp = ServerRealm_get_sUsersLimit(scRealmsTable[i]);
+ set_value(&stemp, amount, "5");
+ ServerRealm_set_sUsersLimit(scRealmsTable[i], stemp);
+ ServerRealm_set_usersLimit(scRealmsTable[i],
+ check_value(ServerRealm_get_sUsersLimit(scRealmsTable[i]), "Invalid users amount"));
/* checking clients amount */
- set_value(&(config.realmtable[i].clients), clients, "1");
- check_value(&(config.realmtable[i].clinum), config.realmtable[i].clients, "Invalid clients amount");
+ stemp = ServerRealm_get_sClientsLimit(scRealmsTable[i]);
+ set_value(&stemp, clients, "1");
+ ServerRealm_set_sClientsLimit(scRealmsTable[i], stemp);
+ ServerRealm_set_clientsLimit(scRealmsTable[i],
+ check_value(ServerRealm_get_sClientsLimit(scRealmsTable[i]), "Invalid clients amount"));
/* checking raclients amount */
- set_value(&(config.realmtable[i].raclients), raclients, "1");
- check_value(&(config.realmtable[i].raclinum), config.realmtable[i].raclients, "Invalid raclients amount");
+ stemp = ServerRealm_get_sRaClientsLimit(scRealmsTable[i]);
+ set_value(&stemp, raclients, "1");
+ ServerRealm_set_sRaClientsLimit(scRealmsTable[i], stemp);
+ ServerRealm_set_raClientsLimit(scRealmsTable[i],
+ check_value(ServerRealm_get_sRaClientsLimit(scRealmsTable[i]), "Invalid raclients amount"));
/* checking usrpcli value */
- set_value(&(config.realmtable[i].usrpcli), usrpcli, config.realmtable[i].users);
- check_value(&(config.realmtable[i].upcnum), config.realmtable[i].usrpcli, "Invalid usrpcli value");
+ stemp = ServerRealm_get_sUsersPerClient(scRealmsTable[i]);
+ set_value(&stemp, usrpcli, ServerRealm_get_sUsersLimit(scRealmsTable[i]));
+ ServerRealm_set_sUsersPerClient(scRealmsTable[i], stemp);
+ ServerRealm_set_usersPerClient(scRealmsTable[i],
+ check_value(ServerRealm_get_sUsersPerClient(scRealmsTable[i]), "Invalid usrpcli value"));
/* checking timeout value */
- set_value(&(config.realmtable[i].timeout), timeout, "5");
- check_value(&(config.realmtable[i].tmout), config.realmtable[i].timeout, "Invalid timeout value");
+ stemp = ServerRealm_get_sTimeout(scRealmsTable[i]);
+ set_value(&stemp, timeout, "5");
+ ServerRealm_set_sTimeout(scRealmsTable[i], stemp);
+ ServerRealm_set_timeout(scRealmsTable[i],
+ check_value(ServerRealm_get_sTimeout(scRealmsTable[i]), "Invalid timeout value"));
/* checking climode value */
- set_value(&(config.realmtable[i].clim), clim, "1");
- check_value(&(config.realmtable[i].climode), config.realmtable[i].clim, "Invalid climode value");
+ stemp = ServerRealm_get_sClientMode(scRealmsTable[i]);
+ set_value(&stemp, clim, "1");
+ ServerRealm_set_sClientMode(scRealmsTable[i], stemp);
+ ServerRealm_set_clientMode(scRealmsTable[i],
+ check_value(ServerRealm_get_sClientMode(scRealmsTable[i]), "Invalid climode value"));
/* allocating memory*/
- config.realmtable[i].contable = calloc(config.realmtable[i].usernum, sizeof(ConnectUser));
- if (config.realmtable[i].contable == NULL) {
+ srUsersTable = calloc(ServerRealm_get_usersLimit(scRealmsTable[i]), sizeof(ConnectUser*));
+ if (srUsersTable == NULL) {
aflog(LOG_T_INIT, LOG_I_CRIT,
"Calloc error - try define smaller amount of users");
exit(1);
}
- for (j = 0; j < config.realmtable[i].usernum; ++j) {
- config.realmtable[i].contable[j] = ConnectUser_new();
- if (config.realmtable[i].contable[j] == NULL) {
+ ServerRealm_set_usersTable(scRealmsTable[i], srUsersTable);
+ for (j = 0; j < ServerRealm_get_usersLimit(scRealmsTable[i]); ++j) {
+ srUsersTable[j] = ConnectUser_new();
+ if (srUsersTable[j] == NULL) {
aflog(LOG_T_INIT, LOG_I_CRIT,
"Calloc error - try define smaller amount of users");
exit(1);
}
}
- config.realmtable[i].clitable = calloc( config.realmtable[i].clinum, sizeof(ConnectClient));
- if (config.realmtable[i].clitable == NULL) {
+ srClientsTable = calloc(ServerRealm_get_clientsLimit(scRealmsTable[i]), sizeof(ConnectClient*));
+ if (srClientsTable == NULL) {
aflog(LOG_T_INIT, LOG_I_CRIT,
"Calloc error - try define smaller amount of clients");
exit(1);
}
- for (j = 0; j < config.realmtable[i].clinum; ++j) {
- config.realmtable[i].clitable[j] = ConnectClient_new();
- if (config.realmtable[i].clitable[j] == NULL) {
+ ServerRealm_set_clientsTable(scRealmsTable[i], srClientsTable);
+ for (j = 0; j < ServerRealm_get_clientsLimit(scRealmsTable[i]); ++j) {
+ srClientsTable[j] = ConnectClient_new();
+ if (srClientsTable[j] == NULL) {
aflog(LOG_T_INIT, LOG_I_CRIT,
"Calloc error - try define smaller amount of clients");
exit(1);
}
}
- config.realmtable[i].raclitable = calloc( config.realmtable[i].raclinum, sizeof(ConnectClient));
- if (config.realmtable[i].raclitable == NULL) {
+ srRaClientsTable = calloc(ServerRealm_get_raClientsLimit(scRealmsTable[i]), sizeof(ConnectClient*));
+ if (srRaClientsTable == NULL) {
aflog(LOG_T_INIT, LOG_I_CRIT,
"Calloc error - try define smaller amount of raclients");
exit(1);
}
- for (j = 0; j < config.realmtable[i].raclinum; ++j) {
- config.realmtable[i].raclitable[j] = ConnectClient_new();
- if (config.realmtable[i].raclitable[j] == NULL) {
+ ServerRealm_set_raClientsTable(scRealmsTable[i], srRaClientsTable);
+ for (j = 0; j < ServerRealm_get_raClientsLimit(scRealmsTable[i]); ++j) {
+ srRaClientsTable[j] = ConnectClient_new();
+ if (srRaClientsTable[j] == NULL) {
aflog(LOG_T_INIT, LOG_I_CRIT,
"Calloc error - try define smaller amount of raclients");
exit(1);
@@ -633,20 +716,20 @@ main(int argc, char **argv)
}
ipfam = 0x01;
#ifdef AF_INET6
- if (TYPE_IS_IPV4(config.realmtable[i].type)) {
+ if (TYPE_IS_IPV4(ServerRealm_get_realmType(scRealmsTable[i]))) {
ipfam |= 0x02;
}
- else if (TYPE_IS_IPV6(config.realmtable[i].type)) {
+ else if (TYPE_IS_IPV6(ServerRealm_get_realmType(scRealmsTable[i]))) {
ipfam |= 0x04;
}
#endif
- if (config.realmtable[i].baseport == 0) {
- for (j = 0; j < config.realmtable[i].usrclinum; ++j) {
- if (ip_listen(&temp, UsrCli_get_listenHostName(config.realmtable[i].usrclitable[j]) ?
- UsrCli_get_listenHostName(config.realmtable[i].usrclitable[j]) :
- config.realmtable[i].hostname,
- UsrCli_get_listenPortName(config.realmtable[i].usrclitable[j]),
- (&(config.realmtable[i].addrlen)), ipfam)) {
+ if (ServerRealm_get_basePortOn(scRealmsTable[i]) == 0) {
+ for (j = 0; j < ServerRealm_get_userClientPairs(scRealmsTable[i]); ++j) {
+ if (ip_listen(&temp, UsrCli_get_listenHostName(srUsersClientsTable[j]) ?
+ UsrCli_get_listenHostName(srUsersClientsTable[j]) :
+ ServerRealm_get_hostName(scRealmsTable[i]),
+ UsrCli_get_listenPortName(srUsersClientsTable[j]),
+ (&len), ipfam)) {
aflog(LOG_T_INIT, LOG_I_CRIT,
#ifdef AF_INET6
"tcp_listen_%s error for %s, %s",
@@ -654,25 +737,27 @@ main(int argc, char **argv)
#else
"tcp_listen error for %s, %s",
#endif
- UsrCli_get_listenHostName(config.realmtable[i].usrclitable[j]) ?
- UsrCli_get_listenHostName(config.realmtable[i].usrclitable[j]) :
- config.realmtable[i].hostname,
- UsrCli_get_listenPortName(config.realmtable[i].usrclitable[j]));
+ UsrCli_get_listenHostName(srUsersClientsTable[j]) ?
+ UsrCli_get_listenHostName(srUsersClientsTable[j]) :
+ ServerRealm_get_hostName(scRealmsTable[i]),
+ UsrCli_get_listenPortName(srUsersClientsTable[j]));
exit(1);
}
- UsrCli_set_listenFd(config.realmtable[i].usrclitable[j], temp);
- flags = fcntl(UsrCli_get_listenFd(config.realmtable[i].usrclitable[j]), F_GETFL, 0);
- fcntl(UsrCli_get_listenFd(config.realmtable[i].usrclitable[j]), F_SETFL, flags | O_NONBLOCK);
+ ServerRealm_set_addressLength(scRealmsTable[i], len);
+ UsrCli_set_listenFd(srUsersClientsTable[j], temp);
+ flags = fcntl(UsrCli_get_listenFd(srUsersClientsTable[j]), F_GETFL, 0);
+ fcntl(UsrCli_get_listenFd(srUsersClientsTable[j]), F_SETFL, flags | O_NONBLOCK);
}
}
- for (j = 0; j < config.realmtable[i].usrclinum; ++j) {
- switch (config.realmtable[i].tunneltype) {
+
+ for (j = 0; j < ServerRealm_get_userClientPairs(scRealmsTable[i]); ++j) {
+ switch (ServerRealm_get_tunnelType(scRealmsTable[i])) {
case 0: {
- if (ip_listen(&temp, UsrCli_get_manageHostName(config.realmtable[i].usrclitable[j]) ?
- UsrCli_get_manageHostName(config.realmtable[i].usrclitable[j]) :
- config.realmtable[i].hostname,
- UsrCli_get_managePortName(config.realmtable[i].usrclitable[j]),
- (&(config.realmtable[i].addrlen)), ipfam)) {
+ if (ip_listen(&temp, UsrCli_get_manageHostName(srUsersClientsTable[j]) ?
+ UsrCli_get_manageHostName(srUsersClientsTable[j]) :
+ ServerRealm_get_hostName(scRealmsTable[i]),
+ UsrCli_get_managePortName(srUsersClientsTable[j]),
+ (&len), ipfam)) {
aflog(LOG_T_INIT, LOG_I_CRIT,
#ifdef AF_INET6
"tcp_listen_%s error for %s, %s",
@@ -680,46 +765,49 @@ main(int argc, char **argv)
#else
"tcp_listen error for %s, %s",
#endif
- UsrCli_get_manageHostName(config.realmtable[i].usrclitable[j]) ?
- UsrCli_get_manageHostName(config.realmtable[i].usrclitable[j]) :
- config.realmtable[i].hostname,
- UsrCli_get_managePortName(config.realmtable[i].usrclitable[j]));
+ UsrCli_get_manageHostName(srUsersClientsTable[j]) ?
+ UsrCli_get_manageHostName(srUsersClientsTable[j]) :
+ ServerRealm_get_hostName(scRealmsTable[i]),
+ UsrCli_get_managePortName(srUsersClientsTable[j]));
exit(1);
}
- UsrCli_set_manageFd(config.realmtable[i].usrclitable[j], temp);
- flags = fcntl(UsrCli_get_manageFd(config.realmtable[i].usrclitable[j]), F_GETFL, 0);
- fcntl(UsrCli_get_manageFd(config.realmtable[i].usrclitable[j]), F_SETFL, flags | O_NONBLOCK);
+ ServerRealm_set_addressLength(scRealmsTable[i], len);
+ UsrCli_set_manageFd(srUsersClientsTable[j], temp);
+ flags = fcntl(UsrCli_get_manageFd(srUsersClientsTable[j]), F_GETFL, 0);
+ fcntl(UsrCli_get_manageFd(srUsersClientsTable[j]), F_SETFL, flags | O_NONBLOCK);
break;
}
#ifdef HAVE_LIBPTHREAD
case 1: case 2: {
if (initialize_http_proxy_server(&temp,
- UsrCli_get_manageHostName(config.realmtable[i].usrclitable[j]) ?
- UsrCli_get_manageHostName(config.realmtable[i].usrclitable[j]) :
- config.realmtable[i].hostname,
- UsrCli_get_managePortName(config.realmtable[i].usrclitable[j]),
- (&(config.realmtable[i].addrlen)), ipfam,
- config.realmtable[i].clinum + config.realmtable[i].raclinum,
- (config.realmtable[i].tunneltype - 1),
+ UsrCli_get_manageHostName(srUsersClientsTable[j]) ?
+ UsrCli_get_manageHostName(srUsersClientsTable[j]) :
+ ServerRealm_get_hostName(scRealmsTable[i]),
+ UsrCli_get_managePortName(srUsersClientsTable[j]),
+ (&len), ipfam,
+ ServerRealm_get_clientsLimit(scRealmsTable[i]) +
+ ServerRealm_get_raClientsLimit(scRealmsTable[i]),
+ (ServerRealm_get_tunnelType(scRealmsTable[i]) - 1),
ctx)) {
aflog(LOG_T_INIT, LOG_I_CRIT,
#ifdef AF_INET6
"http%s_proxy_listen_%s error for %s, %s",
- (config.realmtable[i].tunneltype == 2) ? "s" : "",
+ (ServerRealm_get_tunnelType(scRealmsTable[i]) == 2) ? "s" : "",
(ipfam & 0x02)?"ipv4":(ipfam & 0x04)?"ipv6":"unspec",
#else
"http%s_proxy_listen error for %s, %s",
- (config.realmtable[i].tunneltype == 2) ? "s" : "",
+ (ServerRealm_get_tunnelType(scRealmsTable[i]) == 2) ? "s" : "",
#endif
- UsrCli_get_manageHostName(config.realmtable[i].usrclitable[j]) ?
- UsrCli_get_manageHostName(config.realmtable[i].usrclitable[j]) :
- config.realmtable[i].hostname,
- UsrCli_get_managePortName(config.realmtable[i].usrclitable[j]));
+ UsrCli_get_manageHostName(srUsersClientsTable[j]) ?
+ UsrCli_get_manageHostName(srUsersClientsTable[j]) :
+ ServerRealm_get_hostName(scRealmsTable[i]),
+ UsrCli_get_managePortName(srUsersClientsTable[j]));
exit(1);
}
- UsrCli_set_manageFd(config.realmtable[i].usrclitable[j], temp);
- flags = fcntl(UsrCli_get_manageFd(config.realmtable[i].usrclitable[j]), F_GETFL, 0);
- fcntl(UsrCli_get_manageFd(config.realmtable[i].usrclitable[j]), F_SETFL, flags | O_NONBLOCK);
+ ServerRealm_set_addressLength(scRealmsTable[i], len);
+ UsrCli_set_manageFd(srUsersClientsTable[j], temp);
+ flags = fcntl(UsrCli_get_manageFd(srUsersClientsTable[j]), F_GETFL, 0);
+ fcntl(UsrCli_get_manageFd(srUsersClientsTable[j]), F_SETFL, flags | O_NONBLOCK);
break;
}
#endif
@@ -731,58 +819,66 @@ main(int argc, char **argv)
}
}
}
- config.realmtable[i].cliaddr = malloc(config.realmtable[i].addrlen);
+
+ ServerRealm_set_clientAddress(scRealmsTable[i], malloc(ServerRealm_get_addressLength(scRealmsTable[i])));
+ if (ServerRealm_get_clientAddress(scRealmsTable[i]) == NULL) {
+ aflog(LOG_T_INIT, LOG_I_CRIT,
+ "Allocating memory for client addresses failed... exiting");
+ exit(1);
+ }
- for (j=0; j<config.realmtable[i].clinum; ++j) {
- SslFd_set_ssl(ConnectClient_get_sslFd(config.realmtable[i].clitable[j]), SSL_new(ctx));
- if (SslFd_get_ssl(ConnectClient_get_sslFd(config.realmtable[i].clitable[j])) == NULL) {
+ for (j = 0; j < ServerRealm_get_clientsLimit(scRealmsTable[i]); ++j) {
+ SslFd_set_ssl(ConnectClient_get_sslFd(srClientsTable[j]), SSL_new(ctx));
+ if (SslFd_get_ssl(ConnectClient_get_sslFd(srClientsTable[j])) == NULL) {
aflog(LOG_T_INIT, LOG_I_CRIT,
- "Creating of ssl object failed... exiting");
+ "Creation of ssl object failed... exiting");
exit(1);
}
}
- for (j=0; j<config.realmtable[i].raclinum; ++j) {
- SslFd_set_ssl(ConnectClient_get_sslFd(config.realmtable[i].raclitable[j]), SSL_new(ctx));
- if (SslFd_get_ssl(ConnectClient_get_sslFd(config.realmtable[i].raclitable[j])) == NULL) {
+ for (j = 0; j < ServerRealm_get_raClientsLimit(scRealmsTable[i]); ++j) {
+ SslFd_set_ssl(ConnectClient_get_sslFd(srRaClientsTable[j]), SSL_new(ctx));
+ if (SslFd_get_ssl(ConnectClient_get_sslFd(srRaClientsTable[j])) == NULL) {
aflog(LOG_T_INIT, LOG_I_CRIT,
- "Creating of ssl object failed... exiting");
+ "Creation of ssl object failed... exiting");
exit(1);
}
}
- for (j = 0; j < config.realmtable[i].usrclinum; ++j) {
- FD_SET(UsrCli_get_manageFd(config.realmtable[i].usrclitable[j]), &allset);
- maxfdp1 = (maxfdp1 > (UsrCli_get_manageFd(config.realmtable[i].usrclitable[j]) + 1)) ?
- maxfdp1 : (UsrCli_get_manageFd(config.realmtable[i].usrclitable[j]) + 1);
+ for (j = 0; j < ServerRealm_get_userClientPairs(scRealmsTable[i]); ++j) {
+ FD_SET(UsrCli_get_manageFd(srUsersClientsTable[j]), &allset);
+ maxfdp1 = (maxfdp1 > (UsrCli_get_manageFd(srUsersClientsTable[j]) + 1)) ?
+ maxfdp1 : (UsrCli_get_manageFd(srUsersClientsTable[j]) + 1);
}
- if (config.realmtable[i].baseport == 0) {
- for (j = 0; j < config.realmtable[i].usrclinum; ++j) {
- FD_SET(UsrCli_get_listenFd(config.realmtable[i].usrclitable[j]), &allset);
- maxfdp1 = (maxfdp1 > (UsrCli_get_listenFd(config.realmtable[i].usrclitable[j]) + 1)) ?
- maxfdp1 : (UsrCli_get_listenFd(config.realmtable[i].usrclitable[j]) + 1);
+ if (ServerRealm_get_basePortOn(scRealmsTable[i]) == 0) {
+ for (j = 0; j < ServerRealm_get_userClientPairs(scRealmsTable[i]); ++j) {
+ FD_SET(UsrCli_get_listenFd(srUsersClientsTable[j]), &allset);
+ maxfdp1 = (maxfdp1 > (UsrCli_get_listenFd(srUsersClientsTable[j]) + 1)) ?
+ maxfdp1 : (UsrCli_get_listenFd(srUsersClientsTable[j]) + 1);
}
}
- config.realmtable[i].usercon = 0;
- config.realmtable[i].clicon = 0;
- config.realmtable[i].raclicon = 0;
- for (j=0; j<config.realmtable[i].clinum; ++j) {
- ConnectClient_set_timer(config.realmtable[i].clitable[j], timeval_create(config.realmtable[i].tmout, 0));
- ConnectClient_set_limit(config.realmtable[i].clitable[j], config.realmtable[i].upcnum);
- if (ConnectClient_create_users(config.realmtable[i].clitable[j])) {
+ ServerRealm_set_connectedUsers(scRealmsTable[i], 0);
+ ServerRealm_set_connectedClients(scRealmsTable[i], 0);
+ ServerRealm_set_connectedRaClients(scRealmsTable[i], 0);
+ for (j = 0; j < ServerRealm_get_clientsLimit(scRealmsTable[i]); ++j) {
+ ConnectClient_set_timer(srClientsTable[j], timeval_create(ServerRealm_get_timeout(scRealmsTable[i]), 0));
+ ConnectClient_set_limit(srClientsTable[j], ServerRealm_get_usersPerClient(scRealmsTable[i]));
+ if (ConnectClient_create_users(srClientsTable[j])) {
aflog(LOG_T_INIT, LOG_I_CRIT,
"Calloc error - try define smaller amount of usrpcli (or users)");
exit(1);
}
}
- for (j=0; j<config.realmtable[i].raclinum; ++j) {
- ConnectClient_set_timer(config.realmtable[i].raclitable[j], timeval_create(config.realmtable[i].tmout,0));
+ for (j = 0; j < ServerRealm_get_raClientsLimit(scRealmsTable[i]); ++j) {
+ ConnectClient_set_timer(srRaClientsTable[j],
+ timeval_create(ServerRealm_get_timeout(scRealmsTable[i]), 0));
}
}
aflog(LOG_T_MAIN, LOG_I_INFO,
- "SERVER STARTED realms: %d", config.size);
- time(&config.starttime);
+ "SERVER STARTED realms: %d", ServerConfiguration_get_realmsNumber(config));
+ time(&now);
+ ServerConfiguration_set_startTime(config, now);
for ( ; ; ) {
rset = allset;
@@ -792,22 +888,24 @@ main(int argc, char **argv)
if (manconnecting) {
/* find out, in what realm client is trying to connect */
l = -1;
- for (k = 0; k < config.size; ++k) {
- for (j=0; j < config.realmtable[k].clinum; ++j) {
- if ((ConnectClient_get_state(config.realmtable[k].clitable[j]) == CONNECTCLIENT_STATE_CONNECTING) ||
- (ConnectClient_get_state(config.realmtable[k].clitable[j]) == CONNECTCLIENT_STATE_AUTHORIZING)) {
+ for (k = 0; k < ServerConfiguration_get_realmsNumber(config); ++k) {
+ srClientsTable = ServerRealm_get_clientsTable(scRealmsTable[k]);
+ for (j=0; j < ServerRealm_get_clientsLimit(scRealmsTable[k]); ++j) {
+ if ((ConnectClient_get_state(srClientsTable[j]) == CONNECTCLIENT_STATE_CONNECTING) ||
+ (ConnectClient_get_state(srClientsTable[j]) == CONNECTCLIENT_STATE_AUTHORIZING)) {
i = k;
- k = config.size;
+ k = ServerConfiguration_get_realmsNumber(config);
l = 0;
break; /* so i points to first good realm and j to good client */
}
}
if (l == -1) {
- for (j=0; j < config.realmtable[k].raclinum; ++j) {
- if ((ConnectClient_get_state(config.realmtable[k].raclitable[j])==CONNECTCLIENT_STATE_CONNECTING) ||
- (ConnectClient_get_state(config.realmtable[k].raclitable[j])==CONNECTCLIENT_STATE_AUTHORIZING)) {
+ srRaClientsTable = ServerRealm_get_raClientsTable(scRealmsTable[k]);
+ for (j=0; j < ServerRealm_get_raClientsLimit(scRealmsTable[k]); ++j) {
+ if ((ConnectClient_get_state(srRaClientsTable[j])==CONNECTCLIENT_STATE_CONNECTING) ||
+ (ConnectClient_get_state(srRaClientsTable[j])==CONNECTCLIENT_STATE_AUTHORIZING)) {
i = k;
- k = config.size;
+ k = ServerConfiguration_get_realmsNumber(config);
l = 1;
break; /* so i points to first good realm and j to good client */
}
@@ -815,29 +913,31 @@ main(int argc, char **argv)
}
}
if (!l) {
- if (select(maxfdp1,&rset,&tmpset,NULL,ConnectClient_get_timerp(config.realmtable[i].clitable[j])) == 0) {
- close(SslFd_get_fd(ConnectClient_get_sslFd(config.realmtable[i].clitable[j])));
- FD_CLR(SslFd_get_fd(ConnectClient_get_sslFd(config.realmtable[i].clitable[j])), &allset);
- SSL_clear(SslFd_get_ssl(ConnectClient_get_sslFd(config.realmtable[i].clitable[j])));
- ConnectClient_set_state(config.realmtable[i].clitable[j], CONNECTCLIENT_STATE_FREE);
+ srClientsTable = ServerRealm_get_clientsTable(scRealmsTable[i]);
+ if (select(maxfdp1,&rset,&tmpset,NULL,ConnectClient_get_timerp(srClientsTable[j])) == 0) {
+ close(SslFd_get_fd(ConnectClient_get_sslFd(srClientsTable[j])));
+ FD_CLR(SslFd_get_fd(ConnectClient_get_sslFd(srClientsTable[j])), &allset);
+ SSL_clear(SslFd_get_ssl(ConnectClient_get_sslFd(srClientsTable[j])));
+ ConnectClient_set_state(srClientsTable[j], CONNECTCLIENT_STATE_FREE);
manconnecting--;
- config.realmtable[i].clicon--;
+ ServerRealm_decrease_connectedClients(scRealmsTable[i]);
aflog(LOG_T_CLIENT, LOG_I_WARNING,
"realm[%s]: Client[%s]: SSL_accept failed (timeout)",
- get_realmname(&config, i), get_clientname(pointer, j));
+ get_realmname(config, i), get_clientname(scRealmsTable[i], j));
}
}
else {
- if (select(maxfdp1,&rset,&tmpset,NULL,ConnectClient_get_timerp(config.realmtable[i].raclitable[j]))==0) {
- close(SslFd_get_fd(ConnectClient_get_sslFd(config.realmtable[i].raclitable[j])));
- FD_CLR(SslFd_get_fd(ConnectClient_get_sslFd(config.realmtable[i].raclitable[j])), &allset);
- SSL_clear(SslFd_get_ssl(ConnectClient_get_sslFd(config.realmtable[i].raclitable[j])));
- ConnectClient_set_state(config.realmtable[i].raclitable[j], CONNECTCLIENT_STATE_FREE);
+ srRaClientsTable = ServerRealm_get_raClientsTable(scRealmsTable[i]);
+ if (select(maxfdp1,&rset,&tmpset,NULL,ConnectClient_get_timerp(srRaClientsTable[j]))==0) {
+ close(SslFd_get_fd(ConnectClient_get_sslFd(srRaClientsTable[j])));
+ FD_CLR(SslFd_get_fd(ConnectClient_get_sslFd(srRaClientsTable[j])), &allset);
+ SSL_clear(SslFd_get_ssl(ConnectClient_get_sslFd(srRaClientsTable[j])));
+ ConnectClient_set_state(srRaClientsTable[j], CONNECTCLIENT_STATE_FREE);
manconnecting--;
- config.realmtable[i].clicon--;
+ ServerRealm_decrease_connectedClients(scRealmsTable[i]);
aflog(LOG_T_CLIENT, LOG_I_WARNING,
"realm[%s]: Client[%s] (ra): SSL_accept failed (timeout)",
- get_realmname(&config, i), get_raclientname(pointer, j));
+ get_realmname(config, i), get_raclientname(scRealmsTable[i], j));
}
}
}
@@ -847,35 +947,39 @@ main(int argc, char **argv)
aflog(LOG_T_MAIN, LOG_I_DDEBUG,
"after select...");
- for (j = 0; j < config.size; ++j) {
- pointer = (&(config.realmtable[j]));
- for (i = 0; i <pointer->usernum; ++i) {
- if ((ConnectUser_get_state(pointer->contable[i]) == S_STATE_OPEN) ||
- (ConnectUser_get_state(pointer->contable[i]) == S_STATE_STOPPED))
- if (FD_ISSET(ConnectUser_get_connFd(pointer->contable[i]), &rset)) {
- k = eval_usernum(pointer->clitable[ConnectUser_get_whatClient(pointer->contable[i])], i);
+ for (j = 0; j < ServerConfiguration_get_realmsNumber(config); ++j) {
+ pointer = scRealmsTable[j];
+ srUsersTable = ServerRealm_get_usersTable(pointer);
+ srClientsTable = ServerRealm_get_clientsTable(pointer);
+ srRaClientsTable = ServerRealm_get_raClientsTable(pointer);
+ srUsersClientsTable = ServerRealm_get_usersClientsTable(pointer);
+ for (i = 0; i < ServerRealm_get_usersLimit(pointer); ++i) {
+ if ((ConnectUser_get_state(srUsersTable[i]) == S_STATE_OPEN) ||
+ (ConnectUser_get_state(srUsersTable[i]) == S_STATE_STOPPED))
+ if (FD_ISSET(ConnectUser_get_connFd(srUsersTable[i]), &rset)) {
+ k = eval_usernum(srClientsTable[ConnectUser_get_whatClient(srUsersTable[i])], i);
aflog(LOG_T_USER, LOG_I_DDEBUG,
- "realm[%s]: Client[%s]: user[%d]: FD_ISSET", get_realmname(&config, j),
- get_clientname(pointer, ConnectUser_get_whatClient(pointer->contable[i])),
+ "realm[%s]: Client[%s]: user[%d]: FD_ISSET", get_realmname(config, j),
+ get_clientname(pointer, ConnectUser_get_whatClient(srUsersTable[i])),
get_username(pointer,i));
- if (TYPE_IS_TCP(pointer->type)) { /* forwarding tcp packets */
- n = read(ConnectUser_get_connFd(pointer->contable[i]), &buff[5], 8091);
+ if (TYPE_IS_TCP(ServerRealm_get_realmType(pointer))) { /* forwarding tcp packets */
+ n = read(ConnectUser_get_connFd(srUsersTable[i]), &buff[5], 8091);
if (n == -1) {
if (errno == EAGAIN) {
continue;
}
aflog(LOG_T_USER, LOG_I_ERR,
- "realm[%s]: Client[%s]: user[%d]: READ ERROR (%d)", get_realmname(&config, j),
- get_clientname(pointer, ConnectUser_get_whatClient(pointer->contable[i])),
+ "realm[%s]: Client[%s]: user[%d]: READ ERROR (%d)", get_realmname(config, j),
+ get_clientname(pointer, ConnectUser_get_whatClient(srUsersTable[i])),
get_username(pointer, i), errno);
n = 0;
}
if (n) {
aflog(LOG_T_USER, LOG_I_DEBUG,
- "realm[%s]: Client[%s]: FROM user[%d]: MESSAGE length=%d", get_realmname(&config, j),
- get_clientname(pointer, ConnectUser_get_whatClient(pointer->contable[i])),
+ "realm[%s]: Client[%s]: FROM user[%d]: MESSAGE length=%d", get_realmname(config, j),
+ get_clientname(pointer, ConnectUser_get_whatClient(srUsersTable[i])),
get_username(pointer, i), n);
- UserStats_add_upload(ConnectUser_get_stats(pointer->contable[i]), n);
+ UserStats_add_upload(ConnectUser_get_stats(srUsersTable[i]), n);
if ((buff[5] == AF_S_MESSAGE) && (buff[6] == AF_S_LOGIN) && (buff[7] == AF_S_MESSAGE)) {
aflog(LOG_T_USER, LOG_I_WARNING,
"WARNING: got packet similiar to udp");
@@ -885,53 +989,53 @@ main(int argc, char **argv)
buff[2] = k; /* low bits of user number */
buff[3] = n >> 8; /* high bits of message length */
buff[4] = n; /* low bits of message length */
- SslFd_send_message(pointer->type,
+ SslFd_send_message(ServerRealm_get_realmType(pointer),
ConnectClient_get_sslFd(
- pointer->clitable[ConnectUser_get_whatClient(pointer->contable[i])]),
+ srClientsTable[ConnectUser_get_whatClient(srUsersTable[i])]),
buff, n+5);
}
else {
aflog(LOG_T_USER, LOG_I_INFO,
- "realm[%s]: Client[%s]: user[%d]: CLOSED", get_realmname(&config, j),
- get_clientname(pointer, ConnectUser_get_whatClient(pointer->contable[i])),
+ "realm[%s]: Client[%s]: user[%d]: CLOSED", get_realmname(config, j),
+ get_clientname(pointer, ConnectUser_get_whatClient(srUsersTable[i])),
get_username(pointer, i));
time(&now);
aflog(LOG_T_USER, LOG_I_NOTICE,
"REALM: %s CLIENT: %s USER: %d IP: %s PORT: %s DURATION: %s",
- get_realmname(&config, j),
- get_clientname(pointer, ConnectUser_get_whatClient(pointer->contable[i])),
+ get_realmname(config, j),
+ get_clientname(pointer, ConnectUser_get_whatClient(srUsersTable[i])),
get_username(pointer, i),
- ConnectUser_get_nameBuf(pointer->contable[i]),
- ConnectUser_get_portBuf(pointer->contable[i]),
- timeperiod(now - ConnectUser_get_connectTime(pointer->contable[i])));
- if (pointer->audit) {
+ ConnectUser_get_nameBuf(srUsersTable[i]),
+ ConnectUser_get_portBuf(srUsersTable[i]),
+ timeperiod(now - ConnectUser_get_connectTime(srUsersTable[i])));
+ if (ServerRealm_get_auditOn(pointer)) {
AuditList_insert_back(
ConnectClient_get_auditList(
- pointer->clitable[ConnectUser_get_whatClient(pointer->contable[i])]),
+ srClientsTable[ConnectUser_get_whatClient(srUsersTable[i])]),
AuditListNode_new_entry(
get_username(pointer, i),
- ConnectUser_get_nameBuf(pointer->contable[i]),
- ConnectUser_get_portBuf(pointer->contable[i]),
- ConnectUser_get_connectTime(pointer->contable[i]),
- now - ConnectUser_get_connectTime(pointer->contable[i]))
+ ConnectUser_get_nameBuf(srUsersTable[i]),
+ ConnectUser_get_portBuf(srUsersTable[i]),
+ ConnectUser_get_connectTime(srUsersTable[i]),
+ now - ConnectUser_get_connectTime(srUsersTable[i]))
);
}
- close(ConnectUser_get_connFd(pointer->contable[i]));
- FD_CLR(ConnectUser_get_connFd(pointer->contable[i]), &allset);
- FD_CLR(ConnectUser_get_connFd(pointer->contable[i]), &wset);
- ConnectUser_set_state(pointer->contable[i], S_STATE_CLOSING);
- BufList_clear(ConnectUser_get_bufList(pointer->contable[i]));
+ close(ConnectUser_get_connFd(srUsersTable[i]));
+ FD_CLR(ConnectUser_get_connFd(srUsersTable[i]), &allset);
+ FD_CLR(ConnectUser_get_connFd(srUsersTable[i]), &wset);
+ ConnectUser_set_state(srUsersTable[i], S_STATE_CLOSING);
+ BufList_clear(ConnectUser_get_bufList(srUsersTable[i]));
buff[0] = AF_S_CONCLOSED; /* closing connection */
buff[1] = k >> 8; /* high bits of user number */
buff[2] = k; /* low bits of user number */
- SslFd_send_message(pointer->type,
+ SslFd_send_message(ServerRealm_get_realmType(pointer),
ConnectClient_get_sslFd(
- pointer->clitable[ConnectUser_get_whatClient(pointer->contable[i])]),
+ srClientsTable[ConnectUser_get_whatClient(srUsersTable[i])]),
buff, 5);
}
}
else { /* when forwarding udp packets */
- n = readn(ConnectUser_get_connFd(pointer->contable[i]), buff, 5 );
+ n = readn(ConnectUser_get_connFd(srUsersTable[i]), buff, 5 );
if (n != 5) {
n = 0;
}
@@ -940,17 +1044,17 @@ main(int argc, char **argv)
length = buff[3];
length = length << 8;
length += buff[4]; /* this is length of message */
- if ((n = readn(ConnectUser_get_connFd(pointer->contable[i]), &buff[5], length)) != 0) {
+ if ((n = readn(ConnectUser_get_connFd(srUsersTable[i]), &buff[5], length)) != 0) {
aflog(LOG_T_USER, LOG_I_DEBUG,
"realm[%s]: Client[%s]: FROM user[%d]: MESSAGE length=%d",
- get_realmname(&config, j),
- get_clientname(pointer, ConnectUser_get_whatClient(pointer->contable[i])),
+ get_realmname(config, j),
+ get_clientname(pointer, ConnectUser_get_whatClient(srUsersTable[i])),
get_username(pointer, i), n);
buff[1] = k >> 8; /* high bits of user number */
buff[2] = k; /* low bits of user number */
- SslFd_send_message(pointer->type,
+ SslFd_send_message(ServerRealm_get_realmType(pointer),
ConnectClient_get_sslFd(
- pointer->clitable[ConnectUser_get_whatClient(pointer->contable[i])]),
+ srClientsTable[ConnectUser_get_whatClient(srUsersTable[i])]),
buff, n+5);
}
}
@@ -961,29 +1065,29 @@ main(int argc, char **argv)
if (n == 0) {
aflog(LOG_T_USER, LOG_I_INFO,
- "realm[%s]: Client[%s]: user[%d]: CLOSED (udp mode)", get_realmname(&config, j),
+ "realm[%s]: Client[%s]: user[%d]: CLOSED (udp mode)", get_realmname(config, j),
get_clientname(pointer,
- ConnectUser_get_whatClient(pointer->contable[i])), get_username(pointer, i));
+ ConnectUser_get_whatClient(srUsersTable[i])), get_username(pointer, i));
time(&now);
aflog(LOG_T_USER, LOG_I_NOTICE,
"REALM: %s CLIENT: %s USER: %d IP: %s PORT: %s DURATION: %s",
- get_realmname(&config, j),
- get_clientname(pointer, ConnectUser_get_whatClient(pointer->contable[i])),
+ get_realmname(config, j),
+ get_clientname(pointer, ConnectUser_get_whatClient(srUsersTable[i])),
get_username(pointer, i),
- ConnectUser_get_nameBuf(pointer->contable[i]),
- ConnectUser_get_portBuf(pointer->contable[i]),
- timeperiod(now - ConnectUser_get_connectTime(pointer->contable[i])));
- close(ConnectUser_get_connFd(pointer->contable[i]));
- FD_CLR(ConnectUser_get_connFd(pointer->contable[i]), &allset);
- FD_CLR(ConnectUser_get_connFd(pointer->contable[i]), &wset);
- ConnectUser_set_state(pointer->contable[i], S_STATE_CLOSING);
- BufList_clear(ConnectUser_get_bufList(pointer->contable[i]));
+ ConnectUser_get_nameBuf(srUsersTable[i]),
+ ConnectUser_get_portBuf(srUsersTable[i]),
+ timeperiod(now - ConnectUser_get_connectTime(srUsersTable[i])));
+ close(ConnectUser_get_connFd(srUsersTable[i]));
+ FD_CLR(ConnectUser_get_connFd(srUsersTable[i]), &allset);
+ FD_CLR(ConnectUser_get_connFd(srUsersTable[i]), &wset);
+ ConnectUser_set_state(srUsersTable[i], S_STATE_CLOSING);
+ BufList_clear(ConnectUser_get_bufList(srUsersTable[i]));
buff[0] = AF_S_CONCLOSED; /* closing connection */
buff[1] = k >> 8; /* high bits of user number */
buff[2] = k; /* low bits of user number */
- SslFd_send_message(pointer->type,
+ SslFd_send_message(ServerRealm_get_realmType(pointer),
ConnectClient_get_sslFd(
- pointer->clitable[ConnectUser_get_whatClient(pointer->contable[i])]),
+ srClientsTable[ConnectUser_get_whatClient(srUsersTable[i])]),
buff, 5);
}
@@ -991,149 +1095,149 @@ main(int argc, char **argv)
}
}
/* ------------------------------------ */
- for (i = 0; i <pointer->usernum; ++i) {
- if (ConnectUser_get_state(pointer->contable[i]) == S_STATE_STOPPED)
- if (FD_ISSET(ConnectUser_get_connFd(pointer->contable[i]), &tmpset)) {
- k = eval_usernum(pointer->clitable[ConnectUser_get_whatClient(pointer->contable[i])], i);
+ for (i = 0; i < ServerRealm_get_usersLimit(pointer); ++i) {
+ if (ConnectUser_get_state(srUsersTable[i]) == S_STATE_STOPPED)
+ if (FD_ISSET(ConnectUser_get_connFd(srUsersTable[i]), &tmpset)) {
+ k = eval_usernum(srClientsTable[ConnectUser_get_whatClient(srUsersTable[i])], i);
aflog(LOG_T_USER, LOG_I_DDEBUG,
- "realm[%s]: Client[%s]: user[%d]: FD_ISSET - WRITE", get_realmname(&config, j),
- get_clientname(pointer, ConnectUser_get_whatClient(pointer->contable[i])),
+ "realm[%s]: Client[%s]: user[%d]: FD_ISSET - WRITE", get_realmname(config, j),
+ get_clientname(pointer, ConnectUser_get_whatClient(srUsersTable[i])),
get_username(pointer, i));
- n = BufListNode_readMessageLength(BufList_get_first(ConnectUser_get_bufList(pointer->contable[i])));
- sent = write(ConnectUser_get_connFd(pointer->contable[i]),
- BufListNode_readMessage(BufList_get_first(ConnectUser_get_bufList(pointer->contable[i]))), n);
+ n = BufListNode_readMessageLength(BufList_get_first(ConnectUser_get_bufList(srUsersTable[i])));
+ sent = write(ConnectUser_get_connFd(srUsersTable[i]),
+ BufListNode_readMessage(BufList_get_first(ConnectUser_get_bufList(srUsersTable[i]))), n);
if ((sent > 0) && (sent != n)) {
- BufListNode_set_actPtr(BufList_get_first(ConnectUser_get_bufList(pointer->contable[i])),
- BufListNode_get_actPtr(BufList_get_first(ConnectUser_get_bufList(pointer->contable[i]))) + sent);
+ BufListNode_set_actPtr(BufList_get_first(ConnectUser_get_bufList(srUsersTable[i])),
+ BufListNode_get_actPtr(BufList_get_first(ConnectUser_get_bufList(srUsersTable[i]))) + sent);
aflog(LOG_T_USER, LOG_I_DDEBUG,
- "realm[%s]: Client[%s]: user[%d]: (%d/%d)", get_realmname(&config, j),
- get_clientname(pointer, ConnectUser_get_whatClient(pointer->contable[i])),
+ "realm[%s]: Client[%s]: user[%d]: (%d/%d)", get_realmname(config, j),
+ get_clientname(pointer, ConnectUser_get_whatClient(srUsersTable[i])),
get_username(pointer, i), sent, n);
}
else if ((sent == -1) && (errno == EAGAIN)) {
aflog(LOG_T_USER, LOG_I_DDEBUG,
- "realm[%s]: Client[%s]: user[%d]: EAGAIN", get_realmname(&config, j),
- get_clientname(pointer, ConnectUser_get_whatClient(pointer->contable[i])),
+ "realm[%s]: Client[%s]: user[%d]: EAGAIN", get_realmname(config, j),
+ get_clientname(pointer, ConnectUser_get_whatClient(srUsersTable[i])),
get_username(pointer, i));
}
else if (sent == -1) {
aflog(LOG_T_USER, LOG_I_INFO,
- "realm[%s]: Client[%s]: user[%d]: CLOSED", get_realmname(&config, j),
- get_clientname(pointer, ConnectUser_get_whatClient(pointer->contable[i])),
+ "realm[%s]: Client[%s]: user[%d]: CLOSED", get_realmname(config, j),
+ get_clientname(pointer, ConnectUser_get_whatClient(srUsersTable[i])),
get_username(pointer, i));
time(&now);
aflog(LOG_T_USER, LOG_I_NOTICE,
"REALM: %s CLIENT: %s USER: %d IP: %s PORT: %s DURATION: %s",
- get_realmname(&config, j),
- get_clientname(pointer, ConnectUser_get_whatClient(pointer->contable[i])),
+ get_realmname(config, j),
+ get_clientname(pointer, ConnectUser_get_whatClient(srUsersTable[i])),
get_username(pointer, i),
- ConnectUser_get_nameBuf(pointer->contable[i]),
- ConnectUser_get_portBuf(pointer->contable[i]),
- timeperiod(now - ConnectUser_get_connectTime(pointer->contable[i])));
- close(ConnectUser_get_connFd(pointer->contable[i]));
- FD_CLR(ConnectUser_get_connFd(pointer->contable[i]), &allset);
- FD_CLR(ConnectUser_get_connFd(pointer->contable[i]), &wset);
- ConnectUser_set_state(pointer->contable[i], S_STATE_CLOSING);
- BufList_clear(ConnectUser_get_bufList(pointer->contable[i]));
+ ConnectUser_get_nameBuf(srUsersTable[i]),
+ ConnectUser_get_portBuf(srUsersTable[i]),
+ timeperiod(now - ConnectUser_get_connectTime(srUsersTable[i])));
+ close(ConnectUser_get_connFd(srUsersTable[i]));
+ FD_CLR(ConnectUser_get_connFd(srUsersTable[i]), &allset);
+ FD_CLR(ConnectUser_get_connFd(srUsersTable[i]), &wset);
+ ConnectUser_set_state(srUsersTable[i], S_STATE_CLOSING);
+ BufList_clear(ConnectUser_get_bufList(srUsersTable[i]));
buff[0] = AF_S_CONCLOSED; /* closing connection */
buff[1] = k >> 8; /* high bits of user number */
buff[2] = k; /* low bits of user number */
- SslFd_send_message(pointer->type,
+ SslFd_send_message(ServerRealm_get_realmType(pointer),
ConnectClient_get_sslFd(
- pointer->clitable[ConnectUser_get_whatClient(pointer->contable[i])]),
+ srClientsTable[ConnectUser_get_whatClient(srUsersTable[i])]),
buff, 5);
}
else {
aflog(LOG_T_USER, LOG_I_DDEBUG,
- "realm[%s]: Client[%s]: user[%d]: (%d/%d)", get_realmname(&config, j),
- get_clientname(pointer, ConnectUser_get_whatClient(pointer->contable[i])),
+ "realm[%s]: Client[%s]: user[%d]: (%d/%d)", get_realmname(config, j),
+ get_clientname(pointer, ConnectUser_get_whatClient(srUsersTable[i])),
get_username(pointer, i), sent, n);
- BufList_delete_first(ConnectUser_get_bufList(pointer->contable[i]));
- if (BufList_get_first(ConnectUser_get_bufList(pointer->contable[i])) == NULL) {
- ConnectUser_set_state(pointer->contable[i], S_STATE_OPEN);
- FD_CLR(ConnectUser_get_connFd(pointer->contable[i]), &wset);
+ BufList_delete_first(ConnectUser_get_bufList(srUsersTable[i]));
+ if (BufList_get_first(ConnectUser_get_bufList(srUsersTable[i])) == NULL) {
+ ConnectUser_set_state(srUsersTable[i], S_STATE_OPEN);
+ FD_CLR(ConnectUser_get_connFd(srUsersTable[i]), &wset);
buff[0] = AF_S_CAN_SEND; /* stopping transfer */
buff[1] = k >> 8; /* high bits of user number */
buff[2] = k; /* low bits of user number */
aflog(LOG_T_USER, LOG_I_DDEBUG,
"realm[%s]: Client[%s]: TO user[%d]: BUFFERING MESSAGE ENDED",
- get_realmname(&config, j),
- get_clientname(pointer, ConnectUser_get_whatClient(pointer->contable[i])),
+ get_realmname(config, j),
+ get_clientname(pointer, ConnectUser_get_whatClient(srUsersTable[i])),
get_username(pointer, i));
- SslFd_send_message(pointer->type,
+ SslFd_send_message(ServerRealm_get_realmType(pointer),
ConnectClient_get_sslFd(
- pointer->clitable[ConnectUser_get_whatClient(pointer->contable[i])]),
+ srClientsTable[ConnectUser_get_whatClient(srUsersTable[i])]),
buff, 5);
}
}
}
}
/* ------------------------------------ */
- if (pointer->baseport == 0) {
- for (l = 0; l < pointer->usrclinum; ++l) {
- if (FD_ISSET(UsrCli_get_listenFd(pointer->usrclitable[l]), &rset)) {
- len = pointer->addrlen;
- sent = accept(UsrCli_get_listenFd(pointer->usrclitable[l]), pointer->cliaddr, &len);
+ if (ServerRealm_get_basePortOn(pointer) == 0) {
+ for (l = 0; l < ServerRealm_get_userClientPairs(pointer); ++l) {
+ if (FD_ISSET(UsrCli_get_listenFd(srUsersClientsTable[l]), &rset)) {
+ len = ServerRealm_get_addressLength(pointer);
+ sent = accept(UsrCli_get_listenFd(srUsersClientsTable[l]), ServerRealm_get_clientAddress(pointer), &len);
if (sent == -1) {
if (errno == EAGAIN) {
aflog(LOG_T_USER, LOG_I_DDEBUG,
- "realm[%s]: listenfd: FD_ISSET --> EAGAIN", get_realmname(&config, j));
+ "realm[%s]: listenfd: FD_ISSET --> EAGAIN", get_realmname(config, j));
}
else {
aflog(LOG_T_USER, LOG_I_DDEBUG,
- "realm[%s]: listenfd: FD_ISSET --> errno=%d", get_realmname(&config, j), errno);
+ "realm[%s]: listenfd: FD_ISSET --> errno=%d", get_realmname(config, j), errno);
}
continue;
}
flags = fcntl(sent, F_GETFL, 0);
fcntl(sent, F_SETFL, flags | O_NONBLOCK);
aflog(LOG_T_USER, LOG_I_DDEBUG,
- "realm[%s]: listenfd: FD_ISSET", get_realmname(&config, j));
- k = find_client(pointer, pointer->climode, l);
- if (ConnectClient_get_state(pointer->clitable[k]) == CONNECTCLIENT_STATE_ACCEPTED) {
- if (pointer->usercon == pointer->usernum) {
+ "realm[%s]: listenfd: FD_ISSET", get_realmname(config, j));
+ k = find_client(pointer, ServerRealm_get_clientMode(pointer), l);
+ if (ConnectClient_get_state(srClientsTable[k]) == CONNECTCLIENT_STATE_ACCEPTED) {
+ if (ServerRealm_get_connectedUsers(pointer) == ServerRealm_get_usersLimit(pointer)) {
close(sent);
aflog(LOG_T_USER, LOG_I_WARNING,
- "realm[%s]: user limit EXCEEDED", get_realmname(&config, j));
+ "realm[%s]: user limit EXCEEDED", get_realmname(config, j));
}
- else if (ConnectClient_get_connected(pointer->clitable[k]) ==
- ConnectClient_get_limit(pointer->clitable[k])) {
+ else if (ConnectClient_get_connected(srClientsTable[k]) ==
+ ConnectClient_get_limit(srClientsTable[k])) {
close(sent);
aflog(LOG_T_USER, LOG_I_WARNING,
"realm[%s]: Client[%s]: usrpcli limit EXCEEDED",
- get_realmname(&config, j), get_clientname(pointer, k));
+ get_realmname(config, j), get_clientname(pointer, k));
}
else {
- for (i = 0; i < pointer->usernum; ++i) {
- if (ConnectUser_get_state(pointer->contable[i]) == S_STATE_CLEAR) {
- ConnectUser_set_userId(pointer->contable[i], pointer->usercounter);
- ++(pointer->usercounter);
+ for (i = 0; i < ServerRealm_get_usersLimit(pointer); ++i) {
+ if (ConnectUser_get_state(srUsersTable[i]) == S_STATE_CLEAR) {
+ ConnectUser_set_userId(srUsersTable[i], ServerRealm_get_usersCounter(pointer));
+ ServerRealm_increase_usersCounter(pointer);
aflog(LOG_T_USER, LOG_I_INFO,
"realm[%s]: Client[%s]: new user: CONNECTING from IP: %s",
- get_realmname(&config, j), get_clientname(pointer, k),
- sock_ntop(pointer->cliaddr, len, ConnectUser_get_nameBuf(pointer->contable[i]),
- ConnectUser_get_portBuf(pointer->contable[i]), pointer->dnslookups));
- ConnectUser_set_connFd(pointer->contable[i], sent);
- ConnectUser_set_state(pointer->contable[i], S_STATE_OPENING);
- ConnectUser_set_whatClient(pointer->contable[i], k);
+ get_realmname(config, j), get_clientname(pointer, k),
+ sock_ntop(ServerRealm_get_clientAddress(pointer), len, ConnectUser_get_nameBuf(srUsersTable[i]),
+ ConnectUser_get_portBuf(srUsersTable[i]), ServerRealm_get_dnsLookupsOn(pointer)));
+ ConnectUser_set_connFd(srUsersTable[i], sent);
+ ConnectUser_set_state(srUsersTable[i], S_STATE_OPENING);
+ ConnectUser_set_whatClient(srUsersTable[i], k);
time(&now);
- ConnectUser_set_connectTime(pointer->contable[i], now);
- UserStats_clear(ConnectUser_get_stats(pointer->contable[i]));
- UserStats_set_lastActivity(ConnectUser_get_stats(pointer->contable[i]), now);
- pointer->usercon++;
- ConnectClient_increase_connected(pointer->clitable[k]);
- memcpy(&buff[5], ConnectUser_get_nameBuf(pointer->contable[i]), 128);
- memcpy(&buff[133], ConnectUser_get_portBuf(pointer->contable[i]), 7);
+ ConnectUser_set_connectTime(srUsersTable[i], now);
+ UserStats_clear(ConnectUser_get_stats(srUsersTable[i]));
+ UserStats_set_lastActivity(ConnectUser_get_stats(srUsersTable[i]), now);
+ ServerRealm_increase_connectedUsers(pointer);
+ ConnectClient_increase_connected(srClientsTable[k]);
+ memcpy(&buff[5], ConnectUser_get_nameBuf(srUsersTable[i]), 128);
+ memcpy(&buff[133], ConnectUser_get_portBuf(srUsersTable[i]), 7);
n = 135;
- i = find_usernum(pointer->clitable[k], i);
+ i = find_usernum(srClientsTable[k], i);
buff[0] = AF_S_CONOPEN; /* opening connection */
buff[1] = i >> 8; /* high bits of user number */
buff[2] = i; /* low bits of user number */
buff[3] = n >> 8; /* high bits of message length */
buff[4] = n; /* low bits of message length */
- SslFd_send_message(pointer->type,
+ SslFd_send_message(ServerRealm_get_realmType(pointer),
ConnectClient_get_sslFd(
- pointer->clitable[k]),
+ srClientsTable[k]),
buff, n+5);
break;
}
@@ -1144,26 +1248,26 @@ main(int argc, char **argv)
close(sent);
aflog(LOG_T_USER, LOG_I_ERR,
"realm[%s]: Client(%d) is NOT CONNECTED",
- get_realmname(&config, j), k);
+ get_realmname(config, j), k);
}
}
}
}
/* ------------------------------------ */
- if (pointer->baseport == 1) {
- for (k = 0; k < pointer->clinum; ++k) {
- if (ConnectClient_get_state(pointer->clitable[k]) == CONNECTCLIENT_STATE_ACCEPTED) {
- if (FD_ISSET(ConnectClient_get_listenFd(pointer->clitable[k]), &rset)) {
- len = pointer->addrlen;
- sent = accept(ConnectClient_get_listenFd(pointer->clitable[k]), pointer->cliaddr, &len);
+ if (ServerRealm_get_basePortOn(pointer) == 1) {
+ for (k = 0; k < ServerRealm_get_clientsLimit(pointer); ++k) {
+ if (ConnectClient_get_state(srClientsTable[k]) == CONNECTCLIENT_STATE_ACCEPTED) {
+ if (FD_ISSET(ConnectClient_get_listenFd(srClientsTable[k]), &rset)) {
+ len = ServerRealm_get_addressLength(pointer);
+ sent = accept(ConnectClient_get_listenFd(srClientsTable[k]), ServerRealm_get_clientAddress(pointer), &len);
if (sent == -1) {
if (errno == EAGAIN) {
aflog(LOG_T_USER, LOG_I_DDEBUG,
- "realm[%s]: listenfd: FD_ISSET --> EAGAIN", get_realmname(&config, j));
+ "realm[%s]: listenfd: FD_ISSET --> EAGAIN", get_realmname(config, j));
}
else {
aflog(LOG_T_USER, LOG_I_DDEBUG,
- "realm[%s]: listenfd: FD_ISSET --> errno=%d", get_realmname(&config, j), errno);
+ "realm[%s]: listenfd: FD_ISSET --> errno=%d", get_realmname(config, j), errno);
}
continue;
}
@@ -1171,51 +1275,51 @@ main(int argc, char **argv)
fcntl(sent, F_SETFL, flags | O_NONBLOCK);
aflog(LOG_T_USER, LOG_I_DDEBUG,
"realm[%s]: Client[%s]: listenfd: FD_ISSET",
- get_realmname(&config, j), get_clientname(pointer, k));
- if (pointer->usercon == pointer->usernum) {
+ get_realmname(config, j), get_clientname(pointer, k));
+ if (ServerRealm_get_connectedUsers(pointer) == ServerRealm_get_usersLimit(pointer)) {
close(sent);
aflog(LOG_T_USER, LOG_I_WARNING,
- "realm[%s]: user limit EXCEEDED", get_realmname(&config, j));
+ "realm[%s]: user limit EXCEEDED", get_realmname(config, j));
}
- else if(ConnectClient_get_connected(pointer->clitable[k]) ==
- ConnectClient_get_limit(pointer->clitable[k])) {
+ else if(ConnectClient_get_connected(srClientsTable[k]) ==
+ ConnectClient_get_limit(srClientsTable[k])) {
close(sent);
aflog(LOG_T_USER, LOG_I_WARNING,
"realm[%s]: Client[%s]: usrpcli limit EXCEEDED",
- get_realmname(&config, j), get_clientname(pointer, k));
+ get_realmname(config, j), get_clientname(pointer, k));
}
else {
- for (i = 0; i < pointer->usernum; ++i) {
- if (ConnectUser_get_state(pointer->contable[i]) == S_STATE_CLEAR) {
- ConnectUser_set_userId(pointer->contable[i], pointer->usercounter);
- ++(pointer->usercounter);
+ for (i = 0; i < ServerRealm_get_usersLimit(pointer); ++i) {
+ if (ConnectUser_get_state(srUsersTable[i]) == S_STATE_CLEAR) {
+ ConnectUser_set_userId(srUsersTable[i], ServerRealm_get_usersCounter(pointer));
+ ServerRealm_increase_usersCounter(pointer);
aflog(LOG_T_USER, LOG_I_INFO,
"realm[%s]: Client[%s]: new user: CONNECTING from IP: %s",
- get_realmname(&config, j), get_clientname(pointer, k),
- sock_ntop(pointer->cliaddr, len,
- ConnectUser_get_nameBuf(pointer->contable[i]),
- ConnectUser_get_portBuf(pointer->contable[i]), pointer->dnslookups));
- ConnectUser_set_connFd(pointer->contable[i], sent);
- ConnectUser_set_state(pointer->contable[i], S_STATE_OPENING);
- ConnectUser_set_whatClient(pointer->contable[i], k);
+ get_realmname(config, j), get_clientname(pointer, k),
+ sock_ntop(ServerRealm_get_clientAddress(pointer), len,
+ ConnectUser_get_nameBuf(srUsersTable[i]),
+ ConnectUser_get_portBuf(srUsersTable[i]), ServerRealm_get_dnsLookupsOn(pointer)));
+ ConnectUser_set_connFd(srUsersTable[i], sent);
+ ConnectUser_set_state(srUsersTable[i], S_STATE_OPENING);
+ ConnectUser_set_whatClient(srUsersTable[i], k);
time(&now);
- ConnectUser_set_connectTime(pointer->contable[i], now);
- UserStats_clear(ConnectUser_get_stats(pointer->contable[i]));
- UserStats_set_lastActivity(ConnectUser_get_stats(pointer->contable[i]), now);
- pointer->usercon++;
- ConnectClient_increase_connected(pointer->clitable[k]);
- memcpy(&buff[5], ConnectUser_get_nameBuf(pointer->contable[i]), 128);
- memcpy(&buff[133], ConnectUser_get_portBuf(pointer->contable[i]), 7);
+ ConnectUser_set_connectTime(srUsersTable[i], now);
+ UserStats_clear(ConnectUser_get_stats(srUsersTable[i]));
+ UserStats_set_lastActivity(ConnectUser_get_stats(srUsersTable[i]), now);
+ ServerRealm_increase_connectedUsers(pointer);
+ ConnectClient_increase_connected(srClientsTable[k]);
+ memcpy(&buff[5], ConnectUser_get_nameBuf(srUsersTable[i]), 128);
+ memcpy(&buff[133], ConnectUser_get_portBuf(srUsersTable[i]), 7);
n = 135;
- i = find_usernum(pointer->clitable[k], i);
+ i = find_usernum(srClientsTable[k], i);
buff[0] = AF_S_CONOPEN; /* opening connection */
buff[1] = i >> 8; /* high bits of user number */
buff[2] = i; /* low bits of user number */
buff[3] = n >> 8; /* high bits of message length */
buff[4] = n; /* low bits of message length */
- SslFd_send_message(pointer->type,
+ SslFd_send_message(ServerRealm_get_realmType(pointer),
ConnectClient_get_sslFd(
- pointer->clitable[k]),
+ srClientsTable[k]),
buff, n+5);
break;
}
@@ -1226,25 +1330,25 @@ main(int argc, char **argv)
}
}
/* ------------------------------------ */
- for (k = 0; k < pointer->clinum; ++k)
- if ((ConnectClient_get_state(pointer->clitable[k]) > CONNECTCLIENT_STATE_FREE) &&
- (FD_ISSET(SslFd_get_fd(ConnectClient_get_sslFd(pointer->clitable[k])), &rset))) {
- if (ConnectClient_get_state(pointer->clitable[k]) == CONNECTCLIENT_STATE_CONNECTING) {
- make_ssl_initialize(ConnectClient_get_sslFd(pointer->clitable[k]));
+ for (k = 0; k < ServerRealm_get_clientsLimit(pointer); ++k)
+ if ((ConnectClient_get_state(srClientsTable[k]) > CONNECTCLIENT_STATE_FREE) &&
+ (FD_ISSET(SslFd_get_fd(ConnectClient_get_sslFd(srClientsTable[k])), &rset))) {
+ if (ConnectClient_get_state(srClientsTable[k]) == CONNECTCLIENT_STATE_CONNECTING) {
+ make_ssl_initialize(ConnectClient_get_sslFd(srClientsTable[k]));
aflog(LOG_T_CLIENT, LOG_I_DDEBUG,
"realm[%s]: new Client[%s]: SSL_accept",
- get_realmname(&config, j), get_clientname(pointer, k));
- switch (make_ssl_accept(ConnectClient_get_sslFd(pointer->clitable[k]))) {
+ get_realmname(config, j), get_clientname(pointer, k));
+ switch (make_ssl_accept(ConnectClient_get_sslFd(srClientsTable[k]))) {
case 2: {
- close(SslFd_get_fd(ConnectClient_get_sslFd(pointer->clitable[k])));
- FD_CLR(SslFd_get_fd(ConnectClient_get_sslFd(pointer->clitable[k])), &allset);
- SSL_clear(SslFd_get_ssl(ConnectClient_get_sslFd(pointer->clitable[k])));
- ConnectClient_set_state(pointer->clitable[k], CONNECTCLIENT_STATE_FREE);
+ close(SslFd_get_fd(ConnectClient_get_sslFd(srClientsTable[k])));
+ FD_CLR(SslFd_get_fd(ConnectClient_get_sslFd(srClientsTable[k])), &allset);
+ SSL_clear(SslFd_get_ssl(ConnectClient_get_sslFd(srClientsTable[k])));
+ ConnectClient_set_state(srClientsTable[k], CONNECTCLIENT_STATE_FREE);
manconnecting--;
- pointer->clicon--;
+ ServerRealm_decrease_connectedClients(pointer);
aflog(LOG_T_CLIENT, LOG_I_ERR,
"realm[%s]: new Client[%s]: DENIED by SSL_accept",
- get_realmname(&config, j), get_clientname(pointer, k));
+ get_realmname(config, j), get_clientname(pointer, k));
}
case 1: {
continue;
@@ -1252,38 +1356,38 @@ main(int argc, char **argv)
default: {
aflog(LOG_T_CLIENT, LOG_I_DEBUG,
"realm[%s]: new Client[%s]: ACCEPTED by SSL_accept",
- get_realmname(&config, j), get_clientname(pointer, k));
- ConnectClient_set_state(pointer->clitable[k], CONNECTCLIENT_STATE_AUTHORIZING);
+ get_realmname(config, j), get_clientname(pointer, k));
+ ConnectClient_set_state(srClientsTable[k], CONNECTCLIENT_STATE_AUTHORIZING);
continue;
}
}
}
aflog(LOG_T_CLIENT, LOG_I_DDEBUG,
"realm[%s]: Client[%s]: commfd: FD_ISSET",
- get_realmname(&config, j), get_clientname(pointer, k));
- if (ConnectClient_get_state(pointer->clitable[k]) == CONNECTCLIENT_STATE_AUTHORIZING) {
- n = SslFd_get_message(pointer->type | TYPE_SSL | TYPE_ZLIB,
+ get_realmname(config, j), get_clientname(pointer, k));
+ if (ConnectClient_get_state(srClientsTable[k]) == CONNECTCLIENT_STATE_AUTHORIZING) {
+ n = SslFd_get_message(ServerRealm_get_realmType(pointer) | TYPE_SSL | TYPE_ZLIB,
ConnectClient_get_sslFd(
- pointer->clitable[k]),
- buff, (-1) * HeaderBuffer_to_read(ConnectClient_get_header(pointer->clitable[k])));
+ srClientsTable[k]),
+ buff, (-1) * HeaderBuffer_to_read(ConnectClient_get_header(srClientsTable[k])));
}
else {
- n = SslFd_get_message(pointer->type,
+ n = SslFd_get_message(ServerRealm_get_realmType(pointer),
ConnectClient_get_sslFd(
- pointer->clitable[k]),
- buff, (-1) * HeaderBuffer_to_read(ConnectClient_get_header(pointer->clitable[k])));
+ srClientsTable[k]),
+ buff, (-1) * HeaderBuffer_to_read(ConnectClient_get_header(srClientsTable[k])));
}
if (n == -1) {
if (errno == EAGAIN) {
aflog(LOG_T_CLIENT, LOG_I_DDEBUG,
"realm[%s]: Client[%s]: commfd: EAGAIN",
- get_realmname(&config, j), get_clientname(pointer, k));
+ get_realmname(config, j), get_clientname(pointer, k));
continue;
}
else {
aflog(LOG_T_CLIENT, LOG_I_ERR,
"realm[%s]: Client[%s]: commfd: ERROR: %d",
- get_realmname(&config, j), get_clientname(pointer, k), errno);
+ get_realmname(config, j), get_clientname(pointer, k), errno);
n = 0;
}
}
@@ -1291,10 +1395,10 @@ main(int argc, char **argv)
if (n != 0) {
aflog(LOG_T_CLIENT, LOG_I_DEBUG,
"realm[%s]: Client[%s]: header length = %d --> buffering",
- get_realmname(&config, j), get_clientname(pointer, k), n);
- HeaderBuffer_store(ConnectClient_get_header(pointer->clitable[k]), buff, n);
- if (HeaderBuffer_to_read(ConnectClient_get_header(pointer->clitable[k])) == 0) {
- HeaderBuffer_restore(ConnectClient_get_header(pointer->clitable[k]), buff);
+ get_realmname(config, j), get_clientname(pointer, k), n);
+ HeaderBuffer_store(ConnectClient_get_header(srClientsTable[k]), buff, n);
+ if (HeaderBuffer_to_read(ConnectClient_get_header(srClientsTable[k])) == 0) {
+ HeaderBuffer_restore(ConnectClient_get_header(srClientsTable[k]), buff);
n = 5;
}
else {
@@ -1305,35 +1409,35 @@ main(int argc, char **argv)
if (n==0) {
aflog(LOG_T_CLIENT, LOG_I_INFO,
"realm[%s]: Client[%s]: commfd: CLOSED",
- get_realmname(&config, j), get_clientname(pointer, k));
+ get_realmname(config, j), get_clientname(pointer, k));
time(&now);
aflog(LOG_T_CLIENT, LOG_I_NOTICE,
"REALM: %s CLIENT: %s IP: %s PORT: %s DURATION: %s",
- get_realmname(&config, j),
+ get_realmname(config, j),
get_clientname(pointer, k),
- ConnectClient_get_nameBuf(pointer->clitable[k]),
- ConnectClient_get_portBuf(pointer->clitable[k]),
- timeperiod(now - ConnectClient_get_connectTime(pointer->clitable[k])));
- if (pointer->audit) {
- while (AuditList_get_first(ConnectClient_get_auditList(pointer->clitable[k]))) {
+ ConnectClient_get_nameBuf(srClientsTable[k]),
+ ConnectClient_get_portBuf(srClientsTable[k]),
+ timeperiod(now - ConnectClient_get_connectTime(srClientsTable[k])));
+ if (ServerRealm_get_auditOn(pointer)) {
+ while (AuditList_get_first(ConnectClient_get_auditList(srClientsTable[k]))) {
aflog(LOG_T_CLIENT, LOG_I_NOTICE,
"USERID: %d IP: %s PORT: %s CONNECTED: %s DURATION: %s",
AuditListNode_get_userId(
AuditList_get_first(
- ConnectClient_get_auditList(pointer->clitable[k]))),
+ ConnectClient_get_auditList(srClientsTable[k]))),
AuditListNode_get_nameBuf(
AuditList_get_first(
- ConnectClient_get_auditList(pointer->clitable[k]))),
+ ConnectClient_get_auditList(srClientsTable[k]))),
AuditListNode_get_portBuf(
AuditList_get_first(
- ConnectClient_get_auditList(pointer->clitable[k]))),
+ ConnectClient_get_auditList(srClientsTable[k]))),
localdate(AuditListNode_get_connectTimep(
AuditList_get_first(
- ConnectClient_get_auditList(pointer->clitable[k])))),
+ ConnectClient_get_auditList(srClientsTable[k])))),
timeperiod(AuditListNode_get_duration(
AuditList_get_first(
- ConnectClient_get_auditList(pointer->clitable[k])))));
- AuditList_delete_first(ConnectClient_get_auditList(pointer->clitable[k]));
+ ConnectClient_get_auditList(srClientsTable[k])))));
+ AuditList_delete_first(ConnectClient_get_auditList(srClientsTable[k]));
}
}
remove_client(pointer, k, &allset, &wset, &manconnecting);
@@ -1347,17 +1451,17 @@ main(int argc, char **argv)
length = length << 8;
length += buff[4]; /* this is length of message */
- if ((k == pointer->clinum) && (buff[0] != AF_S_LOGIN) &&
+ if ((k == ServerRealm_get_clientsLimit(pointer)) && (buff[0] != AF_S_LOGIN) &&
(buff[0] != AF_S_ADMIN_LOGIN) && (buff[0] != AF_S_ADMIN_CMD)) {
buff[0] = AF_S_WRONG;
}
- if (ConnectClient_get_state(pointer->clitable[k]) < CONNECTCLIENT_STATE_AUTHORIZING) {
+ if (ConnectClient_get_state(srClientsTable[k]) < CONNECTCLIENT_STATE_AUTHORIZING) {
aflog(LOG_T_CLIENT, LOG_I_WARNING,
"realm[%s]: Client[%s]: Impossible behaviour --> ignoring",
- get_realmname(&config, j), get_clientname(pointer, k));
+ get_realmname(config, j), get_clientname(pointer, k));
continue;
}
- if ((ConnectClient_get_state(pointer->clitable[k]) == CONNECTCLIENT_STATE_AUTHORIZING) &&
+ if ((ConnectClient_get_state(srClientsTable[k]) == CONNECTCLIENT_STATE_AUTHORIZING) &&
(buff[0] != AF_S_LOGIN) && (buff[0] != AF_S_ADMIN_LOGIN)) {
buff[0] = AF_S_WRONG;
}
@@ -1366,42 +1470,42 @@ main(int argc, char **argv)
case AF_S_CONCLOSED : {
n = numofcon;
numofcon = eval_numofcon(pointer, k, numofcon);
- if ((numofcon>=0) && (numofcon<(pointer->usernum)) &&
- (ConnectClient_get_state(pointer->clitable[k]) ==
+ if ((numofcon>=0) && (numofcon<(ServerRealm_get_usersLimit(pointer))) &&
+ (ConnectClient_get_state(srClientsTable[k]) ==
CONNECTCLIENT_STATE_ACCEPTED)) {
- pointer->usercon--;
- ConnectClient_decrease_connected(pointer->clitable[k]);
- ConnectClient_get_users(pointer->clitable[k])[n] = -1;
- if (ConnectUser_get_state(pointer->contable[numofcon]) == S_STATE_CLOSING) {
- ConnectUser_set_state(pointer->contable[numofcon], S_STATE_CLEAR);
+ ServerRealm_decrease_connectedUsers(pointer);
+ ConnectClient_decrease_connected(srClientsTable[k]);
+ ConnectClient_get_users(srClientsTable[k])[n] = -1;
+ if (ConnectUser_get_state(srUsersTable[numofcon]) == S_STATE_CLOSING) {
+ ConnectUser_set_state(srUsersTable[numofcon], S_STATE_CLEAR);
aflog(LOG_T_USER, LOG_I_DEBUG,
"realm[%s]: user[%d]: CLOSE CONFIRMED",
- get_realmname(&config, j), get_username(pointer, numofcon));
+ get_realmname(config, j), get_username(pointer, numofcon));
}
- else if ((ConnectUser_get_state(pointer->contable[numofcon]) == S_STATE_OPEN) ||
- (ConnectUser_get_state(pointer->contable[numofcon]) == S_STATE_STOPPED)) {
+ else if ((ConnectUser_get_state(srUsersTable[numofcon]) == S_STATE_OPEN) ||
+ (ConnectUser_get_state(srUsersTable[numofcon]) == S_STATE_STOPPED)) {
aflog(LOG_T_USER, LOG_I_INFO,
"realm[%s]: user[%d]: KICKED",
- get_realmname(&config, j), get_username(pointer, numofcon));
+ get_realmname(config, j), get_username(pointer, numofcon));
time(&now);
aflog(LOG_T_USER, LOG_I_NOTICE,
"REALM: %s USER: %d IP: %s PORT: %s DURATION: %s",
- get_realmname(&config, j),
+ get_realmname(config, j),
get_username(pointer, numofcon),
- ConnectUser_get_nameBuf(pointer->contable[numofcon]),
- ConnectUser_get_portBuf(pointer->contable[numofcon]),
- timeperiod(now - ConnectUser_get_connectTime(pointer->contable[numofcon])));
- close(ConnectUser_get_connFd(pointer->contable[numofcon]));
- FD_CLR(ConnectUser_get_connFd(pointer->contable[numofcon]), &allset);
- FD_CLR(ConnectUser_get_connFd(pointer->contable[numofcon]), &wset);
- ConnectUser_set_state(pointer->contable[numofcon], S_STATE_CLEAR);
- BufList_clear(ConnectUser_get_bufList(pointer->contable[numofcon]));
+ ConnectUser_get_nameBuf(srUsersTable[numofcon]),
+ ConnectUser_get_portBuf(srUsersTable[numofcon]),
+ timeperiod(now - ConnectUser_get_connectTime(srUsersTable[numofcon])));
+ close(ConnectUser_get_connFd(srUsersTable[numofcon]));
+ FD_CLR(ConnectUser_get_connFd(srUsersTable[numofcon]), &allset);
+ FD_CLR(ConnectUser_get_connFd(srUsersTable[numofcon]), &wset);
+ ConnectUser_set_state(srUsersTable[numofcon], S_STATE_CLEAR);
+ BufList_clear(ConnectUser_get_bufList(srUsersTable[numofcon]));
buff[0] = AF_S_CONCLOSED; /* closing connection */
buff[1] = numofcon >> 8; /* high bits of user number */
buff[2] = numofcon; /* low bits of user number */
- SslFd_send_message(pointer->type,
+ SslFd_send_message(ServerRealm_get_realmType(pointer),
ConnectClient_get_sslFd(
- pointer->clitable[k]),
+ srClientsTable[k]),
buff, 5);
}
}
@@ -1412,17 +1516,32 @@ main(int argc, char **argv)
}
case AF_S_CONOPEN : {
numofcon = eval_numofcon(pointer, k, numofcon);
- if ((numofcon>=0) && (numofcon<(pointer->usernum)) &&
- (ConnectClient_get_state(pointer->clitable[k]) ==
+ if ((numofcon>=0) && (numofcon<(ServerRealm_get_usersLimit(pointer))) &&
+ (ConnectClient_get_state(srClientsTable[k]) ==
CONNECTCLIENT_STATE_ACCEPTED)) {
- if (ConnectUser_get_state(pointer->contable[numofcon]) == S_STATE_OPENING) {
+ if (ConnectUser_get_state(srUsersTable[numofcon]) ==
+ S_STATE_OPENING) {
aflog(LOG_T_USER, LOG_I_INFO,
"realm[%s]: user[%d]: NEW",
- get_realmname(&config, j), get_username(pointer, numofcon));
- FD_SET(ConnectUser_get_connFd(pointer->contable[numofcon]), &allset);
- maxfdp1 = (maxfdp1 > (ConnectUser_get_connFd(pointer->contable[numofcon]) + 1)) ?
- maxfdp1 : (ConnectUser_get_connFd(pointer->contable[numofcon]) + 1);
- ConnectUser_set_state(pointer->contable[numofcon], S_STATE_OPEN);
+ get_realmname(config, j), get_username(pointer, numofcon));
+ FD_SET(ConnectUser_get_connFd(srUsersTable[numofcon]), &allset);
+ maxfdp1 = (maxfdp1 > (ConnectUser_get_connFd(srUsersTable[numofcon]) + 1)) ?
+ maxfdp1 : (ConnectUser_get_connFd(srUsersTable[numofcon]) + 1);
+ ConnectUser_set_state(srUsersTable[numofcon], S_STATE_OPEN);
+ }
+ if (ConnectUser_get_state(srUsersTable[numofcon]) ==
+ S_STATE_OPENING_CLOSED) {
+ aflog(LOG_T_USER, LOG_I_INFO,
+ "realm[%s]: user[%d]: delayed CLOSING",
+ get_realmname(config, j), get_username(pointer, numofcon));
+ ConnectUser_set_state(srUsersTable[numofcon], S_STATE_CLOSING);
+ buff[0] = AF_S_CONCLOSED; /* closing connection */
+ buff[1] = numofcon >> 8; /* high bits of user number */
+ buff[2] = numofcon; /* low bits of user number */
+ SslFd_send_message(ServerRealm_get_realmType(pointer),
+ ConnectClient_get_sslFd(
+ srClientsTable[k]),
+ buff, 5);
}
}
else {
@@ -1433,18 +1552,24 @@ main(int argc, char **argv)
case AF_S_CANT_OPEN : {
n = numofcon;
numofcon = eval_numofcon(pointer, k, numofcon);
- if ((numofcon>=0) && (numofcon<(pointer->usernum)) &&
- (ConnectClient_get_state(pointer->clitable[k]) ==
+ if ((numofcon>=0) && (numofcon<(ServerRealm_get_usersLimit(pointer))) &&
+ (ConnectClient_get_state(srClientsTable[k]) ==
CONNECTCLIENT_STATE_ACCEPTED)) {
- if (ConnectUser_get_state(pointer->contable[numofcon]) == S_STATE_OPENING) {
+ if ((ConnectUser_get_state(srUsersTable[numofcon]) ==
+ S_STATE_OPENING) ||
+ (ConnectUser_get_state(srUsersTable[numofcon]) ==
+ S_STATE_OPENING_CLOSED)) {
aflog(LOG_T_USER, LOG_I_INFO,
"realm[%s]: user[%d]: DROPPED",
- get_realmname(&config, j), get_username(pointer, numofcon));
- pointer->usercon--;
- ConnectClient_decrease_connected(pointer->clitable[k]);
- ConnectClient_get_users(pointer->clitable[k])[n] = -1;
- close(ConnectUser_get_connFd(pointer->contable[numofcon]));
- ConnectUser_set_state(pointer->contable[numofcon], S_STATE_CLEAR);
+ get_realmname(config, j), get_username(pointer, numofcon));
+ ServerRealm_decrease_connectedUsers(pointer);
+ ConnectClient_decrease_connected(srClientsTable[k]);
+ ConnectClient_get_users(srClientsTable[k])[n] = -1;
+ if (ConnectUser_get_state(srUsersTable[numofcon]) ==
+ S_STATE_OPENING) {
+ close(ConnectUser_get_connFd(srUsersTable[numofcon]));
+ }
+ ConnectUser_set_state(srUsersTable[numofcon], S_STATE_CLEAR);
}
}
else {
@@ -1453,190 +1578,190 @@ main(int argc, char **argv)
break;
}
case AF_S_MESSAGE : {
- if (ConnectClient_get_state(pointer->clitable[k]) !=
+ if (ConnectClient_get_state(srClientsTable[k]) !=
CONNECTCLIENT_STATE_ACCEPTED) {
remove_client(pointer, k, &allset, &wset, &manconnecting);
break;
}
- if (TYPE_IS_UDP(pointer->type)) { /* udp */
- n = SslFd_get_message(pointer->type,
+ if (TYPE_IS_UDP(ServerRealm_get_realmType(pointer))) { /* udp */
+ n = SslFd_get_message(ServerRealm_get_realmType(pointer),
ConnectClient_get_sslFd(
- pointer->clitable[k]),
+ srClientsTable[k]),
&buff[5], length);
}
else {
- n = SslFd_get_message(pointer->type,
+ n = SslFd_get_message(ServerRealm_get_realmType(pointer),
ConnectClient_get_sslFd(
- pointer->clitable[k]),
+ srClientsTable[k]),
buff, length);
}
numofcon = eval_numofcon(pointer, k, numofcon);
- if ((numofcon>=0) && (numofcon<(pointer->usernum))) {
- if (ConnectUser_get_state(pointer->contable[numofcon]) == S_STATE_OPEN) {
+ if ((numofcon>=0) && (numofcon<(ServerRealm_get_usersLimit(pointer)))) {
+ if (ConnectUser_get_state(srUsersTable[numofcon]) == S_STATE_OPEN) {
aflog(LOG_T_USER, LOG_I_DEBUG,
"realm[%s]: TO user[%d]: MESSAGE length=%d",
- get_realmname(&config, j), get_username(pointer, numofcon), n);
- UserStats_add_download(ConnectUser_get_stats(pointer->contable[numofcon]), n);
- if (TYPE_IS_UDP(pointer->type)) { /* udp */
+ get_realmname(config, j), get_username(pointer, numofcon), n);
+ UserStats_add_download(ConnectUser_get_stats(srUsersTable[numofcon]), n);
+ if (TYPE_IS_UDP(ServerRealm_get_realmType(pointer))) { /* udp */
buff[1] = AF_S_LOGIN;
buff[2] = AF_S_MESSAGE;
buff[3] = n >> 8; /* high bits of message length */
buff[4] = n; /* low bits of message length */
- sent = write(ConnectUser_get_connFd(pointer->contable[numofcon]), buff, n+5);
+ sent = write(ConnectUser_get_connFd(srUsersTable[numofcon]), buff, n+5);
if (sent == -1) {
aflog(LOG_T_USER, LOG_I_INFO,
"realm[%s]: user[%d]: CLOSED (write-udp)",
- get_realmname(&config, j), get_username(pointer, numofcon));
+ get_realmname(config, j), get_username(pointer, numofcon));
time(&now);
aflog(LOG_T_USER, LOG_I_NOTICE,
"REALM: %s USER: %d IP: %s PORT: %s DURATION: %s",
- get_realmname(&config, j),
+ get_realmname(config, j),
get_username(pointer, numofcon),
- ConnectUser_get_nameBuf(pointer->contable[numofcon]),
- ConnectUser_get_portBuf(pointer->contable[numofcon]),
- timeperiod(now - ConnectUser_get_connectTime(pointer->contable[numofcon])));
- close(ConnectUser_get_connFd(pointer->contable[numofcon]));
- FD_CLR(ConnectUser_get_connFd(pointer->contable[numofcon]), &allset);
- FD_CLR(ConnectUser_get_connFd(pointer->contable[numofcon]), &wset);
- ConnectUser_set_state(pointer->contable[numofcon], S_STATE_CLOSING);
- BufList_clear(ConnectUser_get_bufList(pointer->contable[numofcon]));
+ ConnectUser_get_nameBuf(srUsersTable[numofcon]),
+ ConnectUser_get_portBuf(srUsersTable[numofcon]),
+ timeperiod(now - ConnectUser_get_connectTime(srUsersTable[numofcon])));
+ close(ConnectUser_get_connFd(srUsersTable[numofcon]));
+ FD_CLR(ConnectUser_get_connFd(srUsersTable[numofcon]), &allset);
+ FD_CLR(ConnectUser_get_connFd(srUsersTable[numofcon]), &wset);
+ ConnectUser_set_state(srUsersTable[numofcon], S_STATE_CLOSING);
+ BufList_clear(ConnectUser_get_bufList(srUsersTable[numofcon]));
buff[0] = AF_S_CONCLOSED; /* closing connection */
buff[1] = numofcon >> 8; /* high bits of user number */
buff[2] = numofcon; /* low bits of user number */
- SslFd_send_message(pointer->type,
+ SslFd_send_message(ServerRealm_get_realmType(pointer),
ConnectClient_get_sslFd(
- pointer->clitable[k]),
+ srClientsTable[k]),
buff, 5);
}
}
else { /* tcp */
- sent = write(ConnectUser_get_connFd(pointer->contable[numofcon]), buff, n);
+ sent = write(ConnectUser_get_connFd(srUsersTable[numofcon]), buff, n);
if ((sent > 0) && (sent != n)) {
- BufList_insert_back(ConnectUser_get_bufList(pointer->contable[numofcon]),
+ BufList_insert_back(ConnectUser_get_bufList(srUsersTable[numofcon]),
BufListNode_new_message(sent, n, buff));
- ConnectUser_set_state(pointer->contable[numofcon], S_STATE_STOPPED);
- FD_SET(ConnectUser_get_connFd(pointer->contable[numofcon]), &wset);
+ ConnectUser_set_state(srUsersTable[numofcon], S_STATE_STOPPED);
+ FD_SET(ConnectUser_get_connFd(srUsersTable[numofcon]), &wset);
buff[0] = AF_S_DONT_SEND; /* stopping transfer */
buff[1] = numofcon >> 8; /* high bits of user number */
buff[2] = numofcon; /* low bits of user number */
aflog(LOG_T_USER, LOG_I_DDEBUG,
"realm[%s]: TO user[%d]: BUFFERING MESSAGE STARTED (%d/%d)",
- get_realmname(&config, j), get_username(pointer, numofcon), sent, n);
- SslFd_send_message(pointer->type,
+ get_realmname(config, j), get_username(pointer, numofcon), sent, n);
+ SslFd_send_message(ServerRealm_get_realmType(pointer),
ConnectClient_get_sslFd(
- pointer->clitable[k]),
+ srClientsTable[k]),
buff, 5);
}
else if ((sent == -1) && (errno == EAGAIN)) {
- BufList_insert_back(ConnectUser_get_bufList(pointer->contable[numofcon]),
+ BufList_insert_back(ConnectUser_get_bufList(srUsersTable[numofcon]),
BufListNode_new_message(0, n, buff));
- ConnectUser_set_state(pointer->contable[numofcon], S_STATE_STOPPED);
- FD_SET(ConnectUser_get_connFd(pointer->contable[numofcon]), &wset);
+ ConnectUser_set_state(srUsersTable[numofcon], S_STATE_STOPPED);
+ FD_SET(ConnectUser_get_connFd(srUsersTable[numofcon]), &wset);
buff[0] = AF_S_DONT_SEND; /* stopping transfer */
buff[1] = numofcon >> 8; /* high bits of user number */
buff[2] = numofcon; /* low bits of user number */
aflog(LOG_T_USER, LOG_I_DDEBUG,
"realm[%s]: TO user[%d]: BUFFERING MESSAGE STARTED (%d/%d)",
- get_realmname(&config, j), get_username(pointer, numofcon), sent, n);
- SslFd_send_message(pointer->type,
+ get_realmname(config, j), get_username(pointer, numofcon), sent, n);
+ SslFd_send_message(ServerRealm_get_realmType(pointer),
ConnectClient_get_sslFd(
- pointer->clitable[k]),
+ srClientsTable[k]),
buff, 5);
}
else if (sent == -1) {
aflog(LOG_T_USER, LOG_I_INFO,
"realm[%s]: user[%d]: CLOSED (write-tcp)",
- get_realmname(&config, j), get_username(pointer, numofcon));
+ get_realmname(config, j), get_username(pointer, numofcon));
time(&now);
aflog(LOG_T_USER, LOG_I_NOTICE,
"REALM: %s USER: %d IP: %s PORT: %s DURATION: %s",
- get_realmname(&config, j),
+ get_realmname(config, j),
get_username(pointer, numofcon),
- ConnectUser_get_nameBuf(pointer->contable[numofcon]),
- ConnectUser_get_portBuf(pointer->contable[numofcon]),
- timeperiod(now - ConnectUser_get_connectTime(pointer->contable[numofcon])));
- close(ConnectUser_get_connFd(pointer->contable[numofcon]));
- FD_CLR(ConnectUser_get_connFd(pointer->contable[numofcon]), &allset);
- FD_CLR(ConnectUser_get_connFd(pointer->contable[numofcon]), &wset);
- ConnectUser_set_state(pointer->contable[numofcon], S_STATE_CLOSING);
- BufList_clear(ConnectUser_get_bufList(pointer->contable[numofcon]));
+ ConnectUser_get_nameBuf(srUsersTable[numofcon]),
+ ConnectUser_get_portBuf(srUsersTable[numofcon]),
+ timeperiod(now - ConnectUser_get_connectTime(srUsersTable[numofcon])));
+ close(ConnectUser_get_connFd(srUsersTable[numofcon]));
+ FD_CLR(ConnectUser_get_connFd(srUsersTable[numofcon]), &allset);
+ FD_CLR(ConnectUser_get_connFd(srUsersTable[numofcon]), &wset);
+ ConnectUser_set_state(srUsersTable[numofcon], S_STATE_CLOSING);
+ BufList_clear(ConnectUser_get_bufList(srUsersTable[numofcon]));
buff[0] = AF_S_CONCLOSED; /* closing connection */
buff[1] = numofcon >> 8; /* high bits of user number */
buff[2] = numofcon; /* low bits of user number */
- SslFd_send_message(pointer->type,
+ SslFd_send_message(ServerRealm_get_realmType(pointer),
ConnectClient_get_sslFd(
- pointer->clitable[k]),
+ srClientsTable[k]),
buff, 5);
}
}
}
- else if (ConnectUser_get_state(pointer->contable[numofcon]) == S_STATE_STOPPED) {
+ else if (ConnectUser_get_state(srUsersTable[numofcon]) == S_STATE_STOPPED) {
aflog(LOG_T_USER, LOG_I_DDEBUG,
"realm[%s]: TO user[%d]: BUFFERING MESSAGE (%d)",
- get_realmname(&config, j), get_username(pointer, numofcon), n);
- if (TYPE_IS_UDP(pointer->type)) { /* udp */
+ get_realmname(config, j), get_username(pointer, numofcon), n);
+ if (TYPE_IS_UDP(ServerRealm_get_realmType(pointer))) { /* udp */
buff[1] = AF_S_LOGIN;
buff[2] = AF_S_MESSAGE;
buff[3] = n >> 8; /* high bits of message length */
buff[4] = n; /* low bits of message length */
- BufList_insert_back(ConnectUser_get_bufList(pointer->contable[numofcon]),
+ BufList_insert_back(ConnectUser_get_bufList(srUsersTable[numofcon]),
BufListNode_new_message(0, n+5, buff));
}
else {
- BufList_insert_back(ConnectUser_get_bufList(pointer->contable[numofcon]),
+ BufList_insert_back(ConnectUser_get_bufList(srUsersTable[numofcon]),
BufListNode_new_message(0, n, buff));
}
}
- else if (ConnectUser_get_state(pointer->contable[numofcon]) == S_STATE_CLOSING) {
+ else if (ConnectUser_get_state(srUsersTable[numofcon]) == S_STATE_CLOSING) {
aflog(LOG_T_USER, LOG_I_WARNING,
"realm[%s]: TO user[%d]: IGNORED message length=%d",
- get_realmname(&config, j), get_username(pointer, numofcon), n);
+ get_realmname(config, j), get_username(pointer, numofcon), n);
}
else {
aflog(LOG_T_USER, LOG_I_WARNING,
"realm[%s]: TO user[%d]: user in wrong state - IGNORED",
- get_realmname(&config, j), get_username(pointer, numofcon));
+ get_realmname(config, j), get_username(pointer, numofcon));
}
}
else {
aflog(LOG_T_USER, LOG_I_WARNING,
"realm[%s]: message to non-existing user - IGNORED",
- get_realmname(&config, j));
+ get_realmname(config, j));
}
break;
}
case AF_S_LOGIN : {
- if ((ConnectClient_get_state(pointer->clitable[k]) ==
+ if ((ConnectClient_get_state(srClientsTable[k]) ==
CONNECTCLIENT_STATE_AUTHORIZING) &&
- (numofcon==(pointer->pass[0]*256+pointer->pass[1])) &&
- (length==(pointer->pass[2]*256+pointer->pass[3]))) {
- if (k != pointer->clinum) {
- ConnectClient_set_state(pointer->clitable[k], CONNECTCLIENT_STATE_ACCEPTED);
+ (numofcon==(ServerRealm_get_password(pointer)[0]*256+ServerRealm_get_password(pointer)[1])) &&
+ (length==(ServerRealm_get_password(pointer)[2]*256+ServerRealm_get_password(pointer)[3]))) {
+ if (k != ServerRealm_get_clientsLimit(pointer)) {
+ ConnectClient_set_state(srClientsTable[k], CONNECTCLIENT_STATE_ACCEPTED);
aflog(LOG_T_CLIENT, LOG_I_INFO,
"realm[%s]: Client[%s]: pass ok - ACCESS GRANTED",
- get_realmname(&config, j), get_clientname(pointer, k));
+ get_realmname(config, j), get_clientname(pointer, k));
buff[0] = AF_S_LOGIN; /* sending message */
buff[1] = ConnectClient_get_limit(
- pointer->clitable[k]) >> 8;/* high bits of user number */
+ srClientsTable[k]) >> 8;/* high bits of user number */
buff[2] = ConnectClient_get_limit(
- pointer->clitable[k]); /* low bits of user number */
- buff[3] = pointer->type; /* type of connection */
- SslFd_send_message(pointer->type | TYPE_SSL | TYPE_ZLIB,
+ srClientsTable[k]); /* low bits of user number */
+ buff[3] = ServerRealm_get_realmType(pointer); /* type of connection */
+ SslFd_send_message(ServerRealm_get_realmType(pointer) | TYPE_SSL | TYPE_ZLIB,
ConnectClient_get_sslFd(
- pointer->clitable[k]),
+ srClientsTable[k]),
buff, 5);
manconnecting--;
- if (pointer->baseport == 1) {
+ if (ServerRealm_get_basePortOn(pointer) == 1) {
long tmp_val;
char tmp_tab[6];
if (check_long(
UsrCli_get_listenPortName(
- pointer->usrclitable[
- ConnectClient_get_usrCliPair(pointer->clitable[k])]),
+ srUsersClientsTable[
+ ConnectClient_get_usrCliPair(srClientsTable[k])]),
&tmp_val)) {
aflog(LOG_T_CLIENT, LOG_I_ERR,
"realm[%s]: INVALID listenport - removing Client[%s]",
- get_realmname(&config, j), get_clientname(pointer, k));
+ get_realmname(config, j), get_clientname(pointer, k));
remove_client(pointer, k, &allset, &wset, &manconnecting);
break;
}
@@ -1645,63 +1770,64 @@ main(int argc, char **argv)
sprintf(tmp_tab, "%d", (int)tmp_val);
ipfam = 0x01;
#ifdef AF_INET6
- if (TYPE_IS_IPV4(pointer->type)) {
+ if (TYPE_IS_IPV4(ServerRealm_get_realmType(pointer))) {
ipfam |= 0x02;
}
- else if (TYPE_IS_IPV6(pointer->type)) {
+ else if (TYPE_IS_IPV6(ServerRealm_get_realmType(pointer))) {
ipfam |= 0x04;
}
#endif
- while (ip_listen(ConnectClient_get_listenFdp(pointer->clitable[k]),
- UsrCli_get_listenHostName(pointer->usrclitable[
- ConnectClient_get_usrCliPair(pointer->clitable[k])]) ?
- UsrCli_get_listenHostName(pointer->usrclitable[
- ConnectClient_get_usrCliPair(pointer->clitable[k])]) :
- pointer->hostname,
- tmp_tab, (&(pointer->addrlen)), ipfam)) {
+ while (ip_listen(ConnectClient_get_listenFdp(srClientsTable[k]),
+ UsrCli_get_listenHostName(srUsersClientsTable[
+ ConnectClient_get_usrCliPair(srClientsTable[k])]) ?
+ UsrCli_get_listenHostName(srUsersClientsTable[
+ ConnectClient_get_usrCliPair(srClientsTable[k])]) :
+ ServerRealm_get_hostName(pointer),
+ tmp_tab, (&len), ipfam)) {
tmp_val = (tmp_val+1)%65536;
memset(tmp_tab, 0, 6);
sprintf(tmp_tab, "%d", (int)tmp_val);
}
- FD_SET(ConnectClient_get_listenFd(pointer->clitable[k]), &allset);
- maxfdp1 = (maxfdp1>(ConnectClient_get_listenFd(pointer->clitable[k])+1)) ?
- maxfdp1 : (ConnectClient_get_listenFd(pointer->clitable[k]) + 1);
+ ServerRealm_set_addressLength(pointer, len);
+ FD_SET(ConnectClient_get_listenFd(srClientsTable[k]), &allset);
+ maxfdp1 = (maxfdp1>(ConnectClient_get_listenFd(srClientsTable[k])+1)) ?
+ maxfdp1 : (ConnectClient_get_listenFd(srClientsTable[k]) + 1);
aflog(LOG_T_CLIENT, LOG_I_INFO,
"realm[%s]: Client[%s]: listenport=%s",
- get_realmname(&config, j), get_clientname(pointer, k), tmp_tab);
+ get_realmname(config, j), get_clientname(pointer, k), tmp_tab);
}
}
else {
aflog(LOG_T_CLIENT, LOG_I_WARNING,
- "realm[%s]: client limit EXCEEDED", get_realmname(&config, j));
+ "realm[%s]: client limit EXCEEDED", get_realmname(config, j));
buff[0] = AF_S_CANT_OPEN; /* sending message */
- SslFd_send_message(pointer->type | TYPE_SSL,
+ SslFd_send_message(ServerRealm_get_realmType(pointer) | TYPE_SSL,
ConnectClient_get_sslFd(
- pointer->clitable[k]),
+ srClientsTable[k]),
buff, 5);
remove_client(pointer, k, &allset, &wset, &manconnecting);
}
}
- else if ((ConnectClient_get_state(pointer->clitable[k]) ==
+ else if ((ConnectClient_get_state(srClientsTable[k]) ==
CONNECTCLIENT_STATE_ACCEPTED) && (numofcon == 0)) {
- n = SslFd_get_message(pointer->type,
+ n = SslFd_get_message(ServerRealm_get_realmType(pointer),
ConnectClient_get_sslFd(
- pointer->clitable[k]),
+ srClientsTable[k]),
buff, length);
buff[n] = 0;
aflog(LOG_T_CLIENT, LOG_I_INFO,
"realm[%s]: Client[%s]: ID received: %s",
- get_realmname(&config, j), get_clientname(pointer, k), buff);
- ConnectClient_set_sClientId(pointer->clitable[k], (char*) buff);
+ get_realmname(config, j), get_clientname(pointer, k), buff);
+ ConnectClient_set_sClientId(srClientsTable[k], (char*) buff);
}
else {
aflog(LOG_T_CLIENT, LOG_I_ERR,
"realm[%s]: Client[%s]: Wrong password - CLOSING",
- get_realmname(&config, j), get_clientname(pointer, k));
+ get_realmname(config, j), get_clientname(pointer, k));
buff[0] = AF_S_WRONG; /* sending message */
- SslFd_send_message(pointer->type | TYPE_SSL,
+ SslFd_send_message(ServerRealm_get_realmType(pointer) | TYPE_SSL,
ConnectClient_get_sslFd(
- pointer->clitable[k]),
+ srClientsTable[k]),
buff, 5);
remove_client(pointer, k, &allset, &wset, &manconnecting);
}
@@ -1710,97 +1836,97 @@ main(int argc, char **argv)
case AF_S_DONT_SEND: {
aflog(LOG_T_CLIENT, LOG_I_DEBUG,
"realm[%s]: user[%d]: STOP READING",
- get_realmname(&config, j), get_username(pointer, numofcon));
- FD_CLR(ConnectUser_get_connFd(pointer->contable[numofcon]), &allset);
+ get_realmname(config, j), get_username(pointer, numofcon));
+ FD_CLR(ConnectUser_get_connFd(srUsersTable[numofcon]), &allset);
break;
}
case AF_S_CAN_SEND: {
aflog(LOG_T_CLIENT, LOG_I_DEBUG,
"realm[%s]: user[%d]: START READING",
- get_realmname(&config, j), get_username(pointer, numofcon));
- FD_SET(ConnectUser_get_connFd(pointer->contable[numofcon]), &allset);
+ get_realmname(config, j), get_username(pointer, numofcon));
+ FD_SET(ConnectUser_get_connFd(srUsersTable[numofcon]), &allset);
break;
}
case AF_S_WRONG: {
aflog(LOG_T_CLIENT, LOG_I_ERR,
"realm[%s]: Client[%s]: Wrong message - CLOSING",
- get_realmname(&config, j), get_clientname(pointer, k));
+ get_realmname(config, j), get_clientname(pointer, k));
remove_client(pointer, k, &allset, &wset, &manconnecting);
break;
}
case AF_S_ADMIN_LOGIN: {
- if ((ConnectClient_get_state(pointer->clitable[k]) ==
+ if ((ConnectClient_get_state(srClientsTable[k]) ==
CONNECTCLIENT_STATE_AUTHORIZING) &&
- (numofcon == (pointer->pass[0]*256 + pointer->pass[1])) &&
- (length == (pointer->pass[2]*256 + pointer->pass[3]))) {
+ (numofcon == (ServerRealm_get_password(pointer)[0]*256 + ServerRealm_get_password(pointer)[1])) &&
+ (length == (ServerRealm_get_password(pointer)[2]*256 + ServerRealm_get_password(pointer)[3]))) {
aflog(LOG_T_MANAGE, LOG_I_INFO,
"realm[%s]: Client[%s]: NEW remote admin -- pass OK",
- get_realmname(&config, j), get_clientname(pointer, k));
- for (l = 0; l < pointer->raclinum; ++l) {
- if (ConnectClient_get_state(pointer->raclitable[l]) ==
+ get_realmname(config, j), get_clientname(pointer, k));
+ for (l = 0; l < ServerRealm_get_raClientsLimit(pointer); ++l) {
+ if (ConnectClient_get_state(srRaClientsTable[l]) ==
CONNECTCLIENT_STATE_FREE) {
SslFd_set_fd(
- ConnectClient_get_sslFd(pointer->raclitable[l]),
+ ConnectClient_get_sslFd(srRaClientsTable[l]),
SslFd_get_fd(
- ConnectClient_get_sslFd(pointer->clitable[k])));
+ ConnectClient_get_sslFd(srClientsTable[k])));
ConnectClient_set_connectTime(
- pointer->raclitable[l],
- ConnectClient_get_connectTime(pointer->clitable[k]));
+ srRaClientsTable[l],
+ ConnectClient_get_connectTime(srClientsTable[k]));
#ifdef HAVE_LIBPTHREAD
ConnectClient_set_tunnelType(
- pointer->raclitable[l],
- ConnectClient_get_tunnelType(pointer->clitable[k]));
+ srRaClientsTable[l],
+ ConnectClient_get_tunnelType(srClientsTable[k]));
#endif
ConnectClient_set_clientId(
- pointer->raclitable[l],
- ConnectClient_get_clientId(pointer->clitable[k]));
+ srRaClientsTable[l],
+ ConnectClient_get_clientId(srClientsTable[k]));
ConnectClient_set_nameBuf(
- pointer->raclitable[l],
- ConnectClient_get_nameBuf(pointer->clitable[k]));
+ srRaClientsTable[l],
+ ConnectClient_get_nameBuf(srClientsTable[k]));
ConnectClient_set_portBuf(
- pointer->raclitable[l],
- ConnectClient_get_portBuf(pointer->clitable[k]));
+ srRaClientsTable[l],
+ ConnectClient_get_portBuf(srClientsTable[k]));
tmp_ssl = SslFd_get_ssl(
- ConnectClient_get_sslFd(pointer->raclitable[l]));
+ ConnectClient_get_sslFd(srRaClientsTable[l]));
SslFd_set_ssl_nf(
- ConnectClient_get_sslFd(pointer->raclitable[l]),
+ ConnectClient_get_sslFd(srRaClientsTable[l]),
SslFd_get_ssl(
- ConnectClient_get_sslFd(pointer->clitable[k])));
+ ConnectClient_get_sslFd(srClientsTable[k])));
SslFd_set_ssl_nf(
- ConnectClient_get_sslFd(pointer->clitable[k]),
+ ConnectClient_get_sslFd(srClientsTable[k]),
tmp_ssl);
ConnectClient_set_state(
- pointer->clitable[k],
+ srClientsTable[k],
CONNECTCLIENT_STATE_FREE);
break;
}
}
- if (l != pointer->raclinum) {
+ if (l != ServerRealm_get_raClientsLimit(pointer)) {
ConnectClient_set_state(
- pointer->raclitable[l],
+ srRaClientsTable[l],
CONNECTCLIENT_STATE_ACCEPTED);
- pointer->raclicon++;
+ ServerRealm_increase_connectedRaClients(pointer);
manconnecting--;
sprintf((char*) &buff[5], AF_VER("AFSERVER"));
n = strlen((char*) &buff[5]);
buff[0] = AF_S_ADMIN_LOGIN; /* sending message */
- buff[1] = pointer->type; /* type of connection */
+ buff[1] = ServerRealm_get_realmType(pointer); /* type of connection */
buff[2] = AF_RA_UNDEFINED;
buff[3] = n >> 8; /* high bits of message length */
buff[4] = n; /* low bits of message length */
- SslFd_send_message(pointer->type | TYPE_SSL,
+ SslFd_send_message(ServerRealm_get_realmType(pointer) | TYPE_SSL,
ConnectClient_get_sslFd(
- pointer->raclitable[l]),
+ srRaClientsTable[l]),
buff, n+5);
}
else {
aflog(LOG_T_MANAGE, LOG_I_WARNING,
"realm[%s]: Client[%s]: remote admin -- limit EXCEEDED",
- get_realmname(&config, j), get_clientname(pointer, k));
+ get_realmname(config, j), get_clientname(pointer, k));
buff[0] = AF_S_CANT_OPEN; /* sending message */
- SslFd_send_message(pointer->type | TYPE_SSL | TYPE_ZLIB,
+ SslFd_send_message(ServerRealm_get_realmType(pointer) | TYPE_SSL | TYPE_ZLIB,
ConnectClient_get_sslFd(
- pointer->clitable[k]),
+ srClientsTable[k]),
buff, 5);
remove_client(pointer, k, &allset, &wset, &manconnecting);
}
@@ -1810,37 +1936,37 @@ main(int argc, char **argv)
case AF_S_KEEP_ALIVE: {
aflog(LOG_T_CLIENT, LOG_I_DEBUG,
"realm[%s]: Client[%s]: Keep alive packet",
- get_realmname(&config, j), get_clientname(pointer, k));
+ get_realmname(config, j), get_clientname(pointer, k));
break;
}
default : {
aflog(LOG_T_CLIENT, LOG_I_ERR,
"realm[%s]: Client[%s]: Unrecognized message - CLOSING",
- get_realmname(&config, j), get_clientname(pointer, k));
+ get_realmname(config, j), get_clientname(pointer, k));
remove_client(pointer, k, &allset, &wset, &manconnecting);
}
}
}
/* ------------------------------------ */
- for (k = 0; k < pointer->raclinum; ++k)
- if ((ConnectClient_get_state(pointer->raclitable[k]) > CONNECTCLIENT_STATE_FREE) &&
- (FD_ISSET(SslFd_get_fd(ConnectClient_get_sslFd(pointer->raclitable[k])), &rset))) {
- if (ConnectClient_get_state(pointer->raclitable[k]) == CONNECTCLIENT_STATE_CONNECTING) {
- make_ssl_initialize(ConnectClient_get_sslFd(pointer->raclitable[k]));
+ for (k = 0; k < ServerRealm_get_raClientsLimit(pointer); ++k)
+ if ((ConnectClient_get_state(srRaClientsTable[k]) > CONNECTCLIENT_STATE_FREE) &&
+ (FD_ISSET(SslFd_get_fd(ConnectClient_get_sslFd(srRaClientsTable[k])), &rset))) {
+ if (ConnectClient_get_state(srRaClientsTable[k]) == CONNECTCLIENT_STATE_CONNECTING) {
+ make_ssl_initialize(ConnectClient_get_sslFd(srRaClientsTable[k]));
aflog(LOG_T_MANAGE, LOG_I_DDEBUG,
"realm[%s]: new Client[%s] (ra): SSL_accept",
- get_realmname(&config, j), get_raclientname(pointer, k));
- switch (make_ssl_accept(ConnectClient_get_sslFd(pointer->raclitable[k]))) {
+ get_realmname(config, j), get_raclientname(pointer, k));
+ switch (make_ssl_accept(ConnectClient_get_sslFd(srRaClientsTable[k]))) {
case 2: {
- close (SslFd_get_fd(ConnectClient_get_sslFd(pointer->raclitable[k])));
- FD_CLR(SslFd_get_fd(ConnectClient_get_sslFd(pointer->raclitable[k])), &allset);
- SSL_clear(SslFd_get_ssl(ConnectClient_get_sslFd(pointer->raclitable[k])));
- ConnectClient_set_state(pointer->raclitable[k], CONNECTCLIENT_STATE_FREE);
+ close (SslFd_get_fd(ConnectClient_get_sslFd(srRaClientsTable[k])));
+ FD_CLR(SslFd_get_fd(ConnectClient_get_sslFd(srRaClientsTable[k])), &allset);
+ SSL_clear(SslFd_get_ssl(ConnectClient_get_sslFd(srRaClientsTable[k])));
+ ConnectClient_set_state(srRaClientsTable[k], CONNECTCLIENT_STATE_FREE);
manconnecting--;
- pointer->clicon--;
+ ServerRealm_decrease_connectedClients(pointer);
aflog(LOG_T_MANAGE, LOG_I_ERR,
"realm[%s]: new Client[%s] (ra): DENIED by SSL_accept",
- get_realmname(&config, j), get_raclientname(pointer, k));
+ get_realmname(config, j), get_raclientname(pointer, k));
}
case 1: {
continue;
@@ -1848,30 +1974,30 @@ main(int argc, char **argv)
default: {
aflog(LOG_T_MANAGE, LOG_I_DEBUG,
"realm[%s]: new Client[%s] (ra): ACCEPTED by SSL_accept",
- get_realmname(&config, j), get_raclientname(pointer, k));
- ConnectClient_set_state(pointer->raclitable[k], CONNECTCLIENT_STATE_AUTHORIZING);
+ get_realmname(config, j), get_raclientname(pointer, k));
+ ConnectClient_set_state(srRaClientsTable[k], CONNECTCLIENT_STATE_AUTHORIZING);
continue;
}
}
}
aflog(LOG_T_MANAGE, LOG_I_DDEBUG,
"realm[%s]: Client[%s] (ra): commfd: FD_ISSET",
- get_realmname(&config, j), get_raclientname(pointer, k));
- n = SslFd_get_message(pointer->type | TYPE_SSL | TYPE_ZLIB,
+ get_realmname(config, j), get_raclientname(pointer, k));
+ n = SslFd_get_message(ServerRealm_get_realmType(pointer) | TYPE_SSL | TYPE_ZLIB,
ConnectClient_get_sslFd(
- pointer->raclitable[k]),
- buff, (-1) * HeaderBuffer_to_read(ConnectClient_get_header(pointer->raclitable[k])));
+ srRaClientsTable[k]),
+ buff, (-1) * HeaderBuffer_to_read(ConnectClient_get_header(srRaClientsTable[k])));
if (n == -1) {
if (errno == EAGAIN) {
aflog(LOG_T_MANAGE, LOG_I_DDEBUG,
"realm[%s]: Client[%s] (ra): commfd: EAGAIN",
- get_realmname(&config, j), get_raclientname(pointer, k));
+ get_realmname(config, j), get_raclientname(pointer, k));
continue;
}
else {
aflog(LOG_T_MANAGE, LOG_I_ERR,
"realm[%s]: Client[%s] (ra): commfd: ERROR: %d",
- get_realmname(&config, j), get_raclientname(pointer, k), errno);
+ get_realmname(config, j), get_raclientname(pointer, k), errno);
n = 0;
}
}
@@ -1879,10 +2005,10 @@ main(int argc, char **argv)
if (n != 0) {
aflog(LOG_T_MANAGE, LOG_I_WARNING,
"realm[%s]: Client[%s] (ra): header length = %d --> buffering",
- get_realmname(&config, j), get_raclientname(pointer, k), n);
- HeaderBuffer_store(ConnectClient_get_header(pointer->raclitable[k]), buff, n);
- if (HeaderBuffer_to_read(ConnectClient_get_header(pointer->raclitable[k])) == 0) {
- HeaderBuffer_restore(ConnectClient_get_header(pointer->raclitable[k]), buff);
+ get_realmname(config, j), get_raclientname(pointer, k), n);
+ HeaderBuffer_store(ConnectClient_get_header(srRaClientsTable[k]), buff, n);
+ if (HeaderBuffer_to_read(ConnectClient_get_header(srRaClientsTable[k])) == 0) {
+ HeaderBuffer_restore(ConnectClient_get_header(srRaClientsTable[k]), buff);
n = 5;
}
else {
@@ -1894,7 +2020,7 @@ main(int argc, char **argv)
remove_raclient(pointer, k, &allset, &wset, &manconnecting);
aflog(LOG_T_MANAGE, LOG_I_INFO,
"realm[%s]: Client[%s] (ra): commfd: CLOSED",
- get_realmname(&config, j), get_raclientname(pointer, k));
+ get_realmname(config, j), get_raclientname(pointer, k));
continue;
}
@@ -1905,94 +2031,94 @@ main(int argc, char **argv)
length = length << 8;
length += buff[4]; /* this is length of message */
- if (ConnectClient_get_state(pointer->raclitable[k]) < CONNECTCLIENT_STATE_AUTHORIZING) {
+ if (ConnectClient_get_state(srRaClientsTable[k]) < CONNECTCLIENT_STATE_AUTHORIZING) {
aflog(LOG_T_MANAGE, LOG_I_WARNING,
"realm[%s]: Client[%s] (ra): Impossible behaviour --> ignoring",
- get_realmname(&config, j), get_raclientname(pointer, k));
+ get_realmname(config, j), get_raclientname(pointer, k));
continue;
}
- if ((ConnectClient_get_state(pointer->raclitable[k]) == CONNECTCLIENT_STATE_AUTHORIZING) &&
+ if ((ConnectClient_get_state(srRaClientsTable[k]) == CONNECTCLIENT_STATE_AUTHORIZING) &&
(buff[0] != AF_S_LOGIN) && (buff[0] != AF_S_ADMIN_LOGIN)) {
buff[0] = AF_S_WRONG;
}
switch (buff[0]) {
case AF_S_LOGIN : {
- if ((ConnectClient_get_state(pointer->raclitable[k]) ==
+ if ((ConnectClient_get_state(srRaClientsTable[k]) ==
CONNECTCLIENT_STATE_AUTHORIZING) &&
- (numofcon==(pointer->pass[0]*256+pointer->pass[1])) &&
- (length==(pointer->pass[2]*256+pointer->pass[3]))) {
- for (l = 0; l < pointer->clinum; ++l) {
- if (ConnectClient_get_state(pointer->clitable[l]) ==
+ (numofcon==(ServerRealm_get_password(pointer)[0]*256+ServerRealm_get_password(pointer)[1])) &&
+ (length==(ServerRealm_get_password(pointer)[2]*256+ServerRealm_get_password(pointer)[3]))) {
+ for (l = 0; l < ServerRealm_get_clientsLimit(pointer); ++l) {
+ if (ConnectClient_get_state(srClientsTable[l]) ==
CONNECTCLIENT_STATE_FREE) {
aflog(LOG_T_MANAGE | LOG_T_CLIENT, LOG_I_INFO,
"realm[%s]: Client[%s] (ra) --> Client[%s]",
- get_realmname(&config, j),
+ get_realmname(config, j),
get_raclientname(pointer, k), get_clientname(pointer, l));
SslFd_set_fd(
- ConnectClient_get_sslFd(pointer->clitable[l]),
+ ConnectClient_get_sslFd(srClientsTable[l]),
SslFd_get_fd(
- ConnectClient_get_sslFd(pointer->raclitable[k])));
+ ConnectClient_get_sslFd(srRaClientsTable[k])));
ConnectClient_set_connectTime(
- pointer->clitable[l],
- ConnectClient_get_connectTime(pointer->raclitable[k]));
+ srClientsTable[l],
+ ConnectClient_get_connectTime(srRaClientsTable[k]));
#ifdef HAVE_LIBPTHREAD
ConnectClient_set_tunnelType(
- pointer->clitable[l],
- ConnectClient_get_tunnelType(pointer->raclitable[k]));
+ srClientsTable[l],
+ ConnectClient_get_tunnelType(srRaClientsTable[k]));
#endif
ConnectClient_set_clientId(
- pointer->clitable[l],
- ConnectClient_get_clientId(pointer->raclitable[k]));
+ srClientsTable[l],
+ ConnectClient_get_clientId(srRaClientsTable[k]));
ConnectClient_set_nameBuf(
- pointer->clitable[l],
- ConnectClient_get_nameBuf(pointer->raclitable[k]));
+ srClientsTable[l],
+ ConnectClient_get_nameBuf(srRaClientsTable[k]));
ConnectClient_set_portBuf(
- pointer->clitable[l],
- ConnectClient_get_portBuf(pointer->raclitable[k]));
+ srClientsTable[l],
+ ConnectClient_get_portBuf(srRaClientsTable[k]));
tmp_ssl = SslFd_get_ssl(
- ConnectClient_get_sslFd(pointer->clitable[l]));
+ ConnectClient_get_sslFd(srClientsTable[l]));
SslFd_set_ssl_nf(
- ConnectClient_get_sslFd(pointer->clitable[l]),
+ ConnectClient_get_sslFd(srClientsTable[l]),
SslFd_get_ssl(
- ConnectClient_get_sslFd(pointer->raclitable[k])));
+ ConnectClient_get_sslFd(srRaClientsTable[k])));
SslFd_set_ssl_nf(
- ConnectClient_get_sslFd(pointer->raclitable[k]),
+ ConnectClient_get_sslFd(srRaClientsTable[k]),
tmp_ssl);
ConnectClient_set_usrCliPair(
- pointer->clitable[l],
- ConnectClient_get_usrCliPair(pointer->raclitable[k]));
- ConnectClient_set_state(pointer->raclitable[k], CONNECTCLIENT_STATE_FREE);
+ srClientsTable[l],
+ ConnectClient_get_usrCliPair(srRaClientsTable[k]));
+ ConnectClient_set_state(srRaClientsTable[k], CONNECTCLIENT_STATE_FREE);
break;
}
}
- if (l != pointer->clinum) {
- ConnectClient_set_state(pointer->clitable[l], CONNECTCLIENT_STATE_ACCEPTED);
+ if (l != ServerRealm_get_clientsLimit(pointer)) {
+ ConnectClient_set_state(srClientsTable[l], CONNECTCLIENT_STATE_ACCEPTED);
aflog(LOG_T_CLIENT, LOG_I_INFO,
"realm[%s]: Client[%s]: pass ok - ACCESS GRANTED",
- get_realmname(&config, j), get_clientname(pointer, l));
+ get_realmname(config, j), get_clientname(pointer, l));
buff[0] = AF_S_LOGIN; /* sending message */
buff[1] = ConnectClient_get_limit(
- pointer->clitable[l]) >> 8;/* high bits of user number */
+ srClientsTable[l]) >> 8;/* high bits of user number */
buff[2] = ConnectClient_get_limit(
- pointer->clitable[l]); /* low bits of user number */
- buff[3] = pointer->type; /* type of connection */
- SslFd_send_message(pointer->type | TYPE_SSL | TYPE_ZLIB,
+ srClientsTable[l]); /* low bits of user number */
+ buff[3] = ServerRealm_get_realmType(pointer); /* type of connection */
+ SslFd_send_message(ServerRealm_get_realmType(pointer) | TYPE_SSL | TYPE_ZLIB,
ConnectClient_get_sslFd(
- pointer->clitable[l]),
+ srClientsTable[l]),
buff, 5);
manconnecting--;
- if (pointer->baseport == 1) {
+ if (ServerRealm_get_basePortOn(pointer) == 1) {
long tmp_val;
char tmp_tab[6];
if (check_long(
UsrCli_get_listenPortName(
- pointer->usrclitable[
- ConnectClient_get_usrCliPair(pointer->clitable[l])]),
+ srUsersClientsTable[
+ ConnectClient_get_usrCliPair(srClientsTable[l])]),
&tmp_val)) {
aflog(LOG_T_CLIENT, LOG_I_ERR,
"realm[%s]: INVALID listenport - removing Client[%s]",
- get_realmname(&config, j), get_clientname(pointer, l));
+ get_realmname(config, j), get_clientname(pointer, l));
remove_client(pointer, l, &allset, &wset, &manconnecting);
break;
}
@@ -2001,59 +2127,60 @@ main(int argc, char **argv)
sprintf(tmp_tab, "%d", (int)tmp_val);
ipfam = 0x01;
#ifdef AF_INET6
- if (TYPE_IS_IPV4(pointer->type)) {
+ if (TYPE_IS_IPV4(ServerRealm_get_realmType(pointer))) {
ipfam |= 0x02;
}
- else if (TYPE_IS_IPV6(pointer->type)) {
+ else if (TYPE_IS_IPV6(ServerRealm_get_realmType(pointer))) {
ipfam |= 0x04;
}
#endif
- while (ip_listen(ConnectClient_get_listenFdp(pointer->clitable[l]),
- UsrCli_get_listenHostName(pointer->usrclitable[
- ConnectClient_get_usrCliPair(pointer->clitable[l])]) ?
- UsrCli_get_listenHostName(pointer->usrclitable[
- ConnectClient_get_usrCliPair(pointer->clitable[l])]) :
- pointer->hostname,
- tmp_tab, (&(pointer->addrlen)), ipfam)) {
+ while (ip_listen(ConnectClient_get_listenFdp(srClientsTable[l]),
+ UsrCli_get_listenHostName(srUsersClientsTable[
+ ConnectClient_get_usrCliPair(srClientsTable[l])]) ?
+ UsrCli_get_listenHostName(srUsersClientsTable[
+ ConnectClient_get_usrCliPair(srClientsTable[l])]) :
+ ServerRealm_get_hostName(pointer),
+ tmp_tab, (&len), ipfam)) {
tmp_val = (tmp_val+1)%65536;
memset(tmp_tab, 0, 6);
sprintf(tmp_tab, "%d", (int)tmp_val);
}
- FD_SET(ConnectClient_get_listenFd(pointer->clitable[l]), &allset);
- maxfdp1 = (maxfdp1>(ConnectClient_get_listenFd(pointer->clitable[l])+1)) ?
- maxfdp1 : (ConnectClient_get_listenFd(pointer->clitable[l])+1);
+ ServerRealm_set_addressLength(pointer, len);
+ FD_SET(ConnectClient_get_listenFd(srClientsTable[l]), &allset);
+ maxfdp1 = (maxfdp1>(ConnectClient_get_listenFd(srClientsTable[l])+1)) ?
+ maxfdp1 : (ConnectClient_get_listenFd(srClientsTable[l])+1);
aflog(LOG_T_CLIENT, LOG_I_INFO,
"realm[%s]: Client[%s]: listenport=%s",
- get_realmname(&config, j), get_clientname(pointer, l), tmp_tab);
+ get_realmname(config, j), get_clientname(pointer, l), tmp_tab);
}
}
else {
aflog(LOG_T_CLIENT, LOG_I_WARNING,
- "realm[%s]: client limit EXCEEDED", get_realmname(&config, j));
+ "realm[%s]: client limit EXCEEDED", get_realmname(config, j));
buff[0] = AF_S_CANT_OPEN; /* sending message */
- SslFd_send_message(pointer->type | TYPE_SSL | TYPE_ZLIB,
+ SslFd_send_message(ServerRealm_get_realmType(pointer) | TYPE_SSL | TYPE_ZLIB,
ConnectClient_get_sslFd(
- pointer->raclitable[k]),
+ srRaClientsTable[k]),
buff, 5);
remove_raclient(pointer, k, &allset, &wset, &manconnecting);
}
}
- else if ((ConnectClient_get_state(pointer->raclitable[k]) ==
+ else if ((ConnectClient_get_state(srRaClientsTable[k]) ==
CONNECTCLIENT_STATE_ACCEPTED) && (numofcon == 0)) {
- n = SslFd_get_message(pointer->type,
+ n = SslFd_get_message(ServerRealm_get_realmType(pointer),
ConnectClient_get_sslFd(
- pointer->raclitable[k]),
+ srRaClientsTable[k]),
buff, length);
buff[n] = 0;
aflog(LOG_T_MANAGE, LOG_I_INFO,
"realm[%s]: Client[%s] (ra): ID received: %s",
- get_realmname(&config, j), get_raclientname(pointer, k), buff);
- ConnectClient_set_sClientId(pointer->raclitable[k], (char*) buff);
+ get_realmname(config, j), get_raclientname(pointer, k), buff);
+ ConnectClient_set_sClientId(srRaClientsTable[k], (char*) buff);
}
else {
aflog(LOG_T_MANAGE, LOG_I_ERR,
"realm[%s]: Client[%s] (ra): Wrong password - CLOSING",
- get_realmname(&config, j), get_raclientname(pointer, k));
+ get_realmname(config, j), get_raclientname(pointer, k));
remove_raclient(pointer, k, &allset, &wset, &manconnecting);
}
break;
@@ -2061,104 +2188,105 @@ main(int argc, char **argv)
case AF_S_WRONG: {
aflog(LOG_T_MANAGE, LOG_I_ERR,
"realm[%s]: Client[%s] (ra): Wrong message - CLOSING",
- get_realmname(&config, j), get_raclientname(pointer, k));
+ get_realmname(config, j), get_raclientname(pointer, k));
remove_raclient(pointer, k, &allset, &wset, &manconnecting);
break;
}
case AF_S_ADMIN_LOGIN: {
- if ((ConnectClient_get_state(pointer->raclitable[k]) ==
+ if ((ConnectClient_get_state(srRaClientsTable[k]) ==
CONNECTCLIENT_STATE_AUTHORIZING) &&
- (numofcon==(pointer->pass[0]*256+pointer->pass[1])) &&
- (length==(pointer->pass[2]*256+pointer->pass[3]))) {
+ (numofcon==(ServerRealm_get_password(pointer)[0]*256+ServerRealm_get_password(pointer)[1])) &&
+ (length==(ServerRealm_get_password(pointer)[2]*256+ServerRealm_get_password(pointer)[3]))) {
aflog(LOG_T_MANAGE, LOG_I_INFO,
"realm[%s]: Client[%s] (ra): NEW remote admin -- pass OK",
- get_realmname(&config, j), get_raclientname(pointer, k));
+ get_realmname(config, j), get_raclientname(pointer, k));
ConnectClient_set_state(
- pointer->raclitable[k],
+ srRaClientsTable[k],
CONNECTCLIENT_STATE_ACCEPTED);
- pointer->raclicon++;
+ ServerRealm_increase_connectedRaClients(pointer);
manconnecting--;
sprintf((char*) &buff[5], AF_VER("AFSERVER"));
n = strlen((char*) &buff[5]);
buff[0] = AF_S_ADMIN_LOGIN; /* sending message */
- buff[1] = pointer->type; /* type of connection */
+ buff[1] = ServerRealm_get_realmType(pointer); /* type of connection */
buff[2] = AF_RA_UNDEFINED;
buff[3] = n >> 8; /* high bits of message length */
buff[4] = n; /* low bits of message length */
- SslFd_send_message(pointer->type | TYPE_SSL | TYPE_ZLIB,
+ SslFd_send_message(ServerRealm_get_realmType(pointer) | TYPE_SSL | TYPE_ZLIB,
ConnectClient_get_sslFd(
- pointer->raclitable[k]),
+ srRaClientsTable[k]),
buff, n+5);
}
break;
}
case AF_S_ADMIN_CMD: {
- if (ConnectClient_get_state(pointer->raclitable[k]) ==
+ if (ConnectClient_get_state(srRaClientsTable[k]) ==
CONNECTCLIENT_STATE_ACCEPTED) {
- if ((n = serve_admin(&config, j, k, buff))) {
+ if ((n = serve_admin(config, j, k, buff))) {
if (n == 1) {
aflog(LOG_T_MANAGE, LOG_I_NOTICE,
"realm[%s]: Client[%s] (ra): remote admin -- closing",
- get_realmname(&config, j), get_raclientname(pointer, k));
+ get_realmname(config, j), get_raclientname(pointer, k));
remove_raclient(pointer, k, &allset, &wset, &manconnecting);
}
else {
- for (i = 0; i < config.size; ++i) {
- l = get_clientnumber(&(config.realmtable[i]), n-2);
+ for (i = 0; i < ServerConfiguration_get_realmsNumber(config); ++i) {
+ srClientsTable = ServerRealm_get_clientsTable(scRealmsTable[i]);
+ l = get_clientnumber(scRealmsTable[i], n-2);
if (l != -1) {
aflog(LOG_T_MANAGE, LOG_I_NOTICE,
"realm[%s]: Client[%s] (ra): remote admin: KICKING realm[%s]: Client[%s]",
- get_realmname(&config, j), get_raclientname(pointer, k),
- get_realmname(&config, i),
- get_clientname(&(config.realmtable[i]), l));
+ get_realmname(config, j), get_raclientname(pointer, k),
+ get_realmname(config, i),
+ get_clientname(scRealmsTable[i], l));
buff[0] = AF_S_CLOSING; /* closing */
- SslFd_send_message(config.realmtable[i].type,
+ SslFd_send_message(ServerRealm_get_realmType(scRealmsTable[i]),
ConnectClient_get_sslFd(
- config.realmtable[i].clitable[l]),
+ srClientsTable[l]),
buff, 5);
time(&now);
aflog(LOG_T_CLIENT, LOG_I_NOTICE,
"REALM: %s CLIENT: %s IP: %s PORT: %s DURATION: %s",
- get_realmname(&config, j),
- get_clientname(&(config.realmtable[i]), l),
- ConnectClient_get_nameBuf(config.realmtable[i].clitable[l]),
- ConnectClient_get_portBuf(config.realmtable[i].clitable[l]),
+ get_realmname(config, j),
+ get_clientname(scRealmsTable[i], l),
+ ConnectClient_get_nameBuf(srClientsTable[l]),
+ ConnectClient_get_portBuf(srClientsTable[l]),
timeperiod(now - ConnectClient_get_connectTime(
- config.realmtable[i].clitable[l])));
- if (config.realmtable[i].audit) {
+ srClientsTable[l])));
+ if (ServerRealm_get_auditOn(scRealmsTable[i])) {
while (AuditList_get_first(
ConnectClient_get_auditList(
- config.realmtable[i].clitable[l]))) {
+ srClientsTable[l]))) {
aflog(LOG_T_CLIENT, LOG_I_NOTICE,
"USERID: %d IP: %s PORT: %s CONNECTED: %s DURATION: %s",
AuditListNode_get_userId(
AuditList_get_first(
ConnectClient_get_auditList(
- config.realmtable[i].clitable[l]))),
+ srClientsTable[l]))),
AuditListNode_get_nameBuf(
AuditList_get_first(
ConnectClient_get_auditList(
- config.realmtable[i].clitable[l]))),
+ srClientsTable[l]))),
AuditListNode_get_portBuf(
AuditList_get_first(
ConnectClient_get_auditList(
- config.realmtable[i].clitable[l]))),
+ srClientsTable[l]))),
localdate(
AuditListNode_get_connectTimep(
AuditList_get_first(
ConnectClient_get_auditList(
- config.realmtable[i].clitable[l])))),
+ srClientsTable[l])))),
timeperiod(
AuditListNode_get_duration(
AuditList_get_first(
ConnectClient_get_auditList(
- config.realmtable[i].clitable[l])))));
+ srClientsTable[l])))));
AuditList_delete_first(
ConnectClient_get_auditList(
- config.realmtable[i].clitable[l]));
+ srClientsTable[l]));
}
}
- remove_client(&(config.realmtable[i]), l,
+ remove_client(scRealmsTable[i], l,
&allset, &wset, &manconnecting);
break;
}
@@ -2169,7 +2297,7 @@ main(int argc, char **argv)
else {
aflog(LOG_T_MANAGE, LOG_I_ERR,
"realm[%s]: Client[%s] (ra): remote admin -- security VIOLATION",
- get_realmname(&config, j), get_raclientname(pointer, k));
+ get_realmname(config, j), get_raclientname(pointer, k));
remove_raclient(pointer, k, &allset, &wset, &manconnecting);
}
break;
@@ -2177,104 +2305,105 @@ main(int argc, char **argv)
case AF_S_KEEP_ALIVE: {
aflog(LOG_T_MANAGE, LOG_I_DEBUG,
"realm[%s]: Client[%s] (ra): Keep alive packet",
- get_realmname(&config, j), get_raclientname(pointer, k));
+ get_realmname(config, j), get_raclientname(pointer, k));
break;
}
default : {
aflog(LOG_T_MANAGE, LOG_I_ERR,
"realm[%s]: Client[%s] (ra): Unrecognized message - CLOSING",
- get_realmname(&config, j), get_raclientname(pointer, k));
+ get_realmname(config, j), get_raclientname(pointer, k));
remove_raclient(pointer, k, &allset, &wset, &manconnecting);
}
}
}
/* ------------------------------------ */
- for (l = 0; l < pointer->usrclinum; ++l) {
- if (FD_ISSET(UsrCli_get_manageFd(pointer->usrclitable[l]), &rset)) {
+ for (l = 0; l < ServerRealm_get_userClientPairs(pointer); ++l) {
+ if (FD_ISSET(UsrCli_get_manageFd(srUsersClientsTable[l]), &rset)) {
aflog(LOG_T_CLIENT, LOG_I_DDEBUG,
- "realm[%s]: managefd: FD_ISSET", get_realmname(&config, j));
- len = pointer->addrlen;
+ "realm[%s]: managefd: FD_ISSET", get_realmname(config, j));
+ len = ServerRealm_get_addressLength(pointer);
#ifdef HAVE_LIBPTHREAD
- sent = get_new_socket(UsrCli_get_manageFd(pointer->usrclitable[l]),
- pointer->tunneltype,pointer->cliaddr, &len, &tunneltype);
+ sent = get_new_socket(UsrCli_get_manageFd(srUsersClientsTable[l]),
+ ServerRealm_get_tunnelType(pointer),ServerRealm_get_clientAddress(pointer), &len, &tunneltype);
#else
- sent = accept(UsrCli_get_manageFd(pointer->usrclitable[l]), pointer->cliaddr, &len);
+ sent = accept(UsrCli_get_manageFd(srUsersClientsTable[l]), ServerRealm_get_clientAddress(pointer), &len);
#endif
if (sent == -1) {
if (errno == EAGAIN) {
aflog(LOG_T_USER, LOG_I_DDEBUG,
- "realm[%s]: managefd: FD_ISSET --> EAGAIN", get_realmname(&config, j));
+ "realm[%s]: managefd: FD_ISSET --> EAGAIN", get_realmname(config, j));
}
else {
aflog(LOG_T_USER, LOG_I_DDEBUG,
- "realm[%s]: managefd: FD_ISSET --> errno=%d", get_realmname(&config, j), errno);
+ "realm[%s]: managefd: FD_ISSET --> errno=%d", get_realmname(config, j), errno);
}
continue;
}
flags = fcntl(sent, F_GETFL, 0);
fcntl(sent, F_SETFL, flags | O_NONBLOCK);
- for (k = 0; k < pointer->clinum; ++k) {
- if (ConnectClient_get_state(pointer->clitable[k]) == CONNECTCLIENT_STATE_FREE) {
- ConnectClient_set_clientId(pointer->clitable[k], pointer->clientcounter);
- ++(pointer->clientcounter);
+ for (k = 0; k < ServerRealm_get_clientsLimit(pointer); ++k) {
+ if (ConnectClient_get_state(srClientsTable[k]) == CONNECTCLIENT_STATE_FREE) {
+ ConnectClient_set_clientId(srClientsTable[k], ServerRealm_get_clientsCounter(pointer));
+ ServerRealm_increase_clientsCounter(pointer);
aflog(LOG_T_CLIENT, LOG_I_INFO,
"realm[%s]: new Client[%s]: CONNECTING",
- get_realmname(&config, j), get_clientname(pointer, k));
- SslFd_set_fd(ConnectClient_get_sslFd(pointer->clitable[k]), sent);
- ConnectClient_set_usrCliPair(pointer->clitable[k], l);
+ get_realmname(config, j), get_clientname(pointer, k));
+ SslFd_set_fd(ConnectClient_get_sslFd(srClientsTable[k]), sent);
+ ConnectClient_set_usrCliPair(srClientsTable[k], l);
time(&now);
- ConnectClient_set_connectTime(pointer->clitable[k], now);
+ ConnectClient_set_connectTime(srClientsTable[k], now);
#ifdef HAVE_LIBPTHREAD
- ConnectClient_set_tunnelType(pointer->clitable[k], tunneltype);
+ ConnectClient_set_tunnelType(srClientsTable[k], tunneltype);
#endif
aflog(LOG_T_CLIENT, LOG_I_INFO,
- "realm[%s]: new Client[%s] IP:%s", get_realmname(&config, j), get_clientname(pointer, k),
- sock_ntop(pointer->cliaddr, len, ConnectClient_get_nameBuf(pointer->clitable[k]),
- ConnectClient_get_portBuf(pointer->clitable[k]), pointer->dnslookups));
- FD_SET(SslFd_get_fd(ConnectClient_get_sslFd(pointer->clitable[k])), &allset);
- maxfdp1 = (maxfdp1 > (SslFd_get_fd(ConnectClient_get_sslFd(pointer->clitable[k])) + 1)) ?
- maxfdp1 : (SslFd_get_fd(ConnectClient_get_sslFd(pointer->clitable[k])) + 1);
- pointer->clicon++;
- ConnectClient_set_timer(pointer->clitable[k], timeval_create(pointer->tmout, 0));
+ "realm[%s]: new Client[%s] IP:%s", get_realmname(config, j), get_clientname(pointer, k),
+ sock_ntop(ServerRealm_get_clientAddress(pointer), len, ConnectClient_get_nameBuf(srClientsTable[k]),
+ ConnectClient_get_portBuf(srClientsTable[k]), ServerRealm_get_dnsLookupsOn(pointer)));
+ FD_SET(SslFd_get_fd(ConnectClient_get_sslFd(srClientsTable[k])), &allset);
+ maxfdp1 = (maxfdp1 > (SslFd_get_fd(ConnectClient_get_sslFd(srClientsTable[k])) + 1)) ?
+ maxfdp1 : (SslFd_get_fd(ConnectClient_get_sslFd(srClientsTable[k])) + 1);
+ ServerRealm_increase_connectedClients(pointer);
+ ConnectClient_set_timer(srClientsTable[k], timeval_create(ServerRealm_get_timeout(pointer), 0));
manconnecting++;
- ConnectClient_set_state(pointer->clitable[k], CONNECTCLIENT_STATE_CONNECTING);
+ ConnectClient_set_state(srClientsTable[k], CONNECTCLIENT_STATE_CONNECTING);
break;
}
}
- if (k == pointer->clinum) {
- for (k = 0; k < pointer->raclinum; ++k) {
- if (ConnectClient_get_state(pointer->raclitable[k]) ==
+ if (k == ServerRealm_get_clientsLimit(pointer)) {
+ for (k = 0; k < ServerRealm_get_raClientsLimit(pointer); ++k) {
+ if (ConnectClient_get_state(srRaClientsTable[k]) ==
CONNECTCLIENT_STATE_FREE) {
- ConnectClient_set_clientId(pointer->raclitable[k], pointer->clientcounter);
- ++(pointer->clientcounter);
+ ConnectClient_set_clientId(srRaClientsTable[k], ServerRealm_get_clientsCounter(pointer));
+ ServerRealm_increase_clientsCounter(pointer);
aflog(LOG_T_MANAGE, LOG_I_INFO,
"realm[%s]: new Client[%s] (ra): CONNECTING",
- get_realmname(&config, j), get_raclientname(pointer, k));
- SslFd_set_fd(ConnectClient_get_sslFd(pointer->raclitable[k]), sent);
- ConnectClient_set_usrCliPair(pointer->raclitable[k], l);
+ get_realmname(config, j), get_raclientname(pointer, k));
+ SslFd_set_fd(ConnectClient_get_sslFd(srRaClientsTable[k]), sent);
+ ConnectClient_set_usrCliPair(srRaClientsTable[k], l);
time(&now);
- ConnectClient_set_connectTime(pointer->raclitable[k], now);
+ ConnectClient_set_connectTime(srRaClientsTable[k], now);
#ifdef HAVE_LIBPTHREAD
- ConnectClient_set_tunnelType(pointer->raclitable[k], tunneltype);
+ ConnectClient_set_tunnelType(srRaClientsTable[k], tunneltype);
#endif
aflog(LOG_T_MANAGE, LOG_I_INFO,
"realm[%s]: new Client[%s] (ra) IP:%s",
- get_realmname(&config, j), get_raclientname(pointer, k),
- sock_ntop(pointer->cliaddr, len, ConnectClient_get_nameBuf(pointer->raclitable[k]),
- ConnectClient_get_portBuf(pointer->raclitable[k]), pointer->dnslookups));
- FD_SET(SslFd_get_fd(ConnectClient_get_sslFd(pointer->raclitable[k])), &allset);
- maxfdp1 = (maxfdp1 > (SslFd_get_fd(ConnectClient_get_sslFd(pointer->raclitable[k])) + 1)) ?
- maxfdp1 : (SslFd_get_fd(ConnectClient_get_sslFd(pointer->raclitable[k])) + 1);
- pointer->clicon++;
- ConnectClient_set_timer(pointer->raclitable[k], timeval_create(pointer->tmout, 0));
+ get_realmname(config, j), get_raclientname(pointer, k),
+ sock_ntop(ServerRealm_get_clientAddress(pointer), len, ConnectClient_get_nameBuf(srRaClientsTable[k]),
+ ConnectClient_get_portBuf(srRaClientsTable[k]), ServerRealm_get_dnsLookupsOn(pointer)));
+ FD_SET(SslFd_get_fd(ConnectClient_get_sslFd(srRaClientsTable[k])), &allset);
+ maxfdp1 = (maxfdp1 > (SslFd_get_fd(ConnectClient_get_sslFd(srRaClientsTable[k])) + 1)) ?
+ maxfdp1 : (SslFd_get_fd(ConnectClient_get_sslFd(srRaClientsTable[k])) + 1);
+ ServerRealm_increase_connectedClients(pointer);
+ ConnectClient_set_timer(srRaClientsTable[k],
+ timeval_create(ServerRealm_get_timeout(pointer), 0));
manconnecting++;
- ConnectClient_set_state(pointer->raclitable[k], CONNECTCLIENT_STATE_CONNECTING);
+ ConnectClient_set_state(srRaClientsTable[k], CONNECTCLIENT_STATE_CONNECTING);
break;
}
}
- if (k == pointer->raclinum) {
+ if (k == ServerRealm_get_raClientsLimit(pointer)) {
aflog(LOG_T_CLIENT | LOG_T_MANAGE, LOG_I_WARNING,
- "realm[%s]: client limit EXCEEDED", get_realmname(&config, j));
+ "realm[%s]: client limit EXCEEDED", get_realmname(config, j));
close(sent);
}
}
diff --git a/src/ar_options_struct.c b/src/ar_options_struct.c
index 0d95dfc..acbfb74 100644
--- a/src/ar_options_struct.c
+++ b/src/ar_options_struct.c
@@ -291,6 +291,6 @@ ArOptions_evaluate_values(ArOptions* ao)
ao->tries = check_value_liberal(ao->artries, "Invalid ar-tries value");
}
if (ao->ardelay) {
- check_value(&(ao->delay), ao->ardelay, "Invalid ar-delay value");
+ ao->delay = check_value(ao->ardelay, "Invalid ar-delay value");
}
}
diff --git a/src/client_configuration_struct.c b/src/client_configuration_struct.c
new file mode 100644
index 0000000..6de1b5b
--- /dev/null
+++ b/src/client_configuration_struct.c
@@ -0,0 +1,282 @@
+/*
+ * active port forwarder - software for secure forwarding
+ * Copyright (C) 2003,2004,2005 jeremian <jeremian [at] poczta.fm>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ */
+
+#include <config.h>
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "string_functions.h"
+#include "client_configuration_struct.h"
+
+/*
+ * Function name: ClientConfiguration_new
+ * Description: Create and initialize new ClientConfiguration structure.
+ * Returns: Pointer to newly created ClientConfiguration structure.
+ */
+
+ClientConfiguration*
+ClientConfiguration_new()
+{
+ ClientConfiguration* tmp = calloc(1, sizeof(ClientConfiguration));
+ if (tmp == NULL) {
+ return NULL;
+ }
+ return tmp;
+}
+
+/*
+ * Function name: ClientConfiguration_free
+ * Description: Free the memory allocated for ClientConfiguration structure.
+ * Arguments: cc - pointer to pointer to ClientConfiguration structure
+ */
+
+void
+ClientConfiguration_free(ClientConfiguration** cc)
+{
+ int i;
+ if (cc == NULL) {
+ return;
+ }
+ if ((*cc) == NULL) {
+ return;
+ }
+ if ((*cc)->keysFile) {
+ free((*cc)->keysFile);
+ (*cc)->keysFile = NULL;
+ }
+ if ((*cc)->storeFile) {
+ free((*cc)->storeFile);
+ (*cc)->storeFile = NULL;
+ }
+ if ((*cc)->realmsTable) {
+ for (i = 0; i < (*cc)->realmsNumber; ++i) {
+ if ((*cc)->realmsTable[i]) {
+ ClientRealm_free(&((*cc)->realmsTable[i]));
+ }
+ }
+ free((*cc)->realmsTable);
+ (*cc)->realmsTable = NULL;
+ }
+ free((*cc));
+ (*cc) = NULL;
+}
+
+/*
+ * Function name: ClientConfiguration_set_keysFile
+ * Description: Set keys filename.
+ * Arguments: cc - pointer to ClientConfiguration structure
+ * keysFile - keys filename
+ */
+
+void
+ClientConfiguration_set_keysFile(ClientConfiguration* cc, char* keysFile)
+{
+ if (cc == NULL) {
+ return;
+ }
+ string_cp(&(cc->keysFile), keysFile);
+}
+
+/*
+ * Function name: ClientConfiguration_set_storeFile
+ * Description: Set store filename.
+ * Arguments: cc - pointer to ClientConfiguration structure
+ * storeFile - store filename
+ */
+
+void
+ClientConfiguration_set_storeFile(ClientConfiguration* cc, char* storeFile)
+{
+ if (cc == NULL) {
+ return;
+ }
+ string_cp(&(cc->storeFile), storeFile);
+}
+
+/*
+ * Function name: ClientConfiguration_set_dateFormat
+ * Description: Set format of the date string.
+ * Arguments: cc - pointer to ClientConfiguration structure
+ * dateFormat - format of the date string
+ */
+
+void
+ClientConfiguration_set_dateFormat(ClientConfiguration* cc, char* dateFormat)
+{
+ if (cc == NULL) {
+ return;
+ }
+ string_cp(&(cc->dateFormat), dateFormat);
+}
+
+/*
+ * Function name: ClientConfiguration_set_realmsNumber
+ * Description: Set number of realms.
+ * Arguments: cc - pointer to ClientConfiguration structure
+ * realmsNumber - number of realms
+ */
+
+void
+ClientConfiguration_set_realmsNumber(ClientConfiguration* cc, int realmsNumber)
+{
+ if (cc == NULL) {
+ return;
+ }
+ cc->realmsNumber = realmsNumber;
+}
+
+/*
+ * Function name: ClientConfiguration_set_realmsTable
+ * Description: Set table of realms.
+ * Arguments: cc - pointer to ClientConfiguration structure
+ * realmsTable - table of realms
+ */
+
+void
+ClientConfiguration_set_realmsTable(ClientConfiguration* cc, ClientRealm** realmsTable)
+{
+ int i;
+ if (cc == NULL) {
+ return;
+ }
+ if (cc->realmsTable) {
+ for (i = 0; i < cc->realmsNumber; ++i) {
+ if (cc->realmsTable[i]) {
+ ClientRealm_free(&(cc->realmsTable[i]));
+ }
+ }
+ free(cc->realmsTable);
+ cc->realmsTable = NULL;
+ }
+ cc->realmsTable = realmsTable;
+}
+
+/*
+ * Function name: ClientConfiguration_set_ignorePublicKeys
+ * Description: Enable/disable the public keys checking.
+ * Arguments: cc - pointer to ClientConfiguration structure
+ * ignorePublicKeys - if the public keys checking is enabled/disabled
+ */
+
+void
+ClientConfiguration_set_ignorePublicKeys(ClientConfiguration* cc, char ignorePublicKeys)
+{
+ if (cc == NULL) {
+ return;
+ }
+ cc->ignorePublicKeys = ignorePublicKeys;
+}
+
+/*
+ * Function name: ClientConfiguration_get_keysFile
+ * Description: Get keys filename.
+ * Arguments: cc - pointer to ClientConfiguration structure
+ * Returns: Keys filename.
+ */
+
+char*
+ClientConfiguration_get_keysFile(ClientConfiguration* cc)
+{
+ if (cc == NULL) {
+ return NULL;
+ }
+ return cc->keysFile;
+}
+
+/*
+ * Function name: ClientConfiguration_get_storeFile
+ * Description: Get store filename.
+ * Arguments: cc - pointer to ClientConfiguration structure
+ * Returns: Store filename.
+ */
+
+char*
+ClientConfiguration_get_storeFile(ClientConfiguration* cc)
+{
+ if (cc == NULL) {
+ return NULL;
+ }
+ return cc->storeFile;
+}
+
+/*
+ * Function name: ClientConfiguration_get_dateFormat
+ * Description: Get format of the date string.
+ * Arguments: cc - pointer to ClientConfiguration structure
+ * Returns: Format of the date string.
+ */
+
+char*
+ClientConfiguration_get_dateFormat(ClientConfiguration* cc)
+{
+ if (cc == NULL) {
+ return NULL;
+ }
+ return cc->dateFormat;
+}
+
+/*
+ * Function name: ClientConfiguration_get_realmsNumber
+ * Description: Get number of realms.
+ * Arguments: cc - pointer to ClientConfiguration structure
+ * Returns: Number of realms.
+ */
+
+int
+ClientConfiguration_get_realmsNumber(ClientConfiguration* cc)
+{
+ if (cc == NULL) {
+ return -1;
+ }
+ return cc->realmsNumber;
+}
+
+/*
+ * Function name: ClientConfiguration_get_realmsTable
+ * Description: Get table of realms.
+ * Arguments: cc - pointer to ClientConfiguration structure
+ * Returns: Table of realms.
+ */
+
+ClientRealm**
+ClientConfiguration_get_realmsTable(ClientConfiguration* cc)
+{
+ if (cc == NULL) {
+ return NULL;
+ }
+ return cc->realmsTable;
+}
+
+/*
+ * Function name: ClientConfiguration_get_ignorePublicKeys
+ * Description: Check if the public keys checking is enabled/disabled
+ * Arguments: cc - pointer to ClientConfiguration structure
+ * Returns: If the public keys checking is enabled/disabled.
+ */
+
+char
+ClientConfiguration_get_ignorePublicKeys(ClientConfiguration* cc)
+{
+ if (cc == NULL) {
+ return 0;
+ }
+ return cc->ignorePublicKeys;
+}
diff --git a/src/client_configuration_struct.h b/src/client_configuration_struct.h
new file mode 100644
index 0000000..a1292e4
--- /dev/null
+++ b/src/client_configuration_struct.h
@@ -0,0 +1,55 @@
+/*
+ * active port forwarder - software for secure forwarding
+ * Copyright (C) 2003,2004,2005 jeremian <jeremian [at] poczta.fm>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ */
+
+
+#ifndef _JS_CLIENT_CONFIGURATION_STRUCT_H
+#define _JS_CLIENT_CONFIGURATION_STRUCT_H
+
+#include "client_realm_struct.h"
+
+typedef struct {
+ char* keysFile;
+ char* storeFile;
+ char* dateFormat;
+ int realmsNumber;
+ char ignorePublicKeys;
+ ClientRealm** realmsTable;
+} ClientConfiguration;
+
+/* 'constructor' */
+ClientConfiguration* ClientConfiguration_new();
+/* 'destructor' */
+void ClientConfiguration_free(ClientConfiguration** cc);
+/* setters */
+void ClientConfiguration_set_keysFile(ClientConfiguration* cc, char* keysFile);
+void ClientConfiguration_set_storeFile(ClientConfiguration* cc, char* storeFile);
+void ClientConfiguration_set_dateFormat(ClientConfiguration* cc, char* dateFormat);
+void ClientConfiguration_set_realmsNumber(ClientConfiguration* cc, int realmsNumber);
+void ClientConfiguration_set_realmsTable(ClientConfiguration* cc, ClientRealm** realmsTable);
+void ClientConfiguration_set_ignorePublicKeys(ClientConfiguration* cc, char ignorePublicKeys);
+/* getters */
+char* ClientConfiguration_get_keysFile(ClientConfiguration* cc);
+char* ClientConfiguration_get_storeFile(ClientConfiguration* cc);
+char* ClientConfiguration_get_dateFormat(ClientConfiguration* cc);
+int ClientConfiguration_get_realmsNumber(ClientConfiguration* cc);
+ClientRealm** ClientConfiguration_get_realmsTable(ClientConfiguration* cc);
+char ClientConfiguration_get_ignorePublicKeys(ClientConfiguration* cc);
+
+#endif
diff --git a/src/client_initialization.c b/src/client_initialization.c
index 82ac632..0b5bc14 100644
--- a/src/client_initialization.c
+++ b/src/client_initialization.c
@@ -25,11 +25,11 @@
#include "network.h"
#include "base64.h"
#include "ssl_routines.h"
+#include "client_configuration_struct.h"
int
-initialize_client_stage1(char tunneltype, SslFd* master, char* name, char* manage,
- HttpProxyOptions* hpo, char ipfam, SSL_CTX* ctx, unsigned char* buff, unsigned char* pass,
- char wanttoexit, char ignorepkeys)
+initialize_client_stage1(ClientRealm* cr, SSL_CTX* ctx, unsigned char* buff, char wanttoexit,
+ char ignorePublicKeys)
{
int n, nlen, elen, len, tmp;
unsigned int olen;
@@ -40,16 +40,22 @@ initialize_client_stage1(char tunneltype, SslFd* master, char* name, char* manag
unsigned char *encoded = NULL;
char b64_encoded[100];
unsigned char *key_buf = NULL;
- switch (tunneltype) {
+ switch (ClientRealm_get_tunnelType(cr)) {
case 0: {
- if (ip_connect(&tmp, name, manage, ipfam)) {
+ if (ip_connect(&tmp, ClientRealm_get_serverName(cr),
+ ClientRealm_get_managePort(cr),
+ ClientRealm_get_ipFamily(cr),
+ ClientRealm_get_localName(cr),
+ ClientRealm_get_localPort(cr))) {
#ifdef AF_INET6
aflog(LOG_T_INIT, LOG_I_CRIT,
"tcp_connect_%s error for %s, %s",
- (ipfam & 0x02)?"ipv4":(ipfam & 0x04)?"ipv6":"unspec", name, manage);
+ (ClientRealm_get_ipFamily(cr) & 0x02) ?
+ "ipv4":(ClientRealm_get_ipFamily(cr) & 0x04) ?
+ "ipv6":"unspec", ClientRealm_get_serverName(cr), ClientRealm_get_managePort(cr));
#else
aflog(LOG_T_INIT, LOG_I_CRIT,
- "tcp_connect error for %s, %s", name, manage);
+ "tcp_connect error for %s, %s", ClientRealm_get_serverName(cr), ClientRealm_get_managePort(cr));
#endif
if (wanttoexit) {
exit(1);
@@ -58,21 +64,27 @@ initialize_client_stage1(char tunneltype, SslFd* master, char* name, char* manag
return 1;
}
}
- SslFd_set_fd(master, tmp);
+ SslFd_set_fd(ClientRealm_get_masterSslFd(cr), tmp);
break;
}
#ifdef HAVE_LIBPTHREAD
case 1: {
- if (initialize_http_proxy_client(&tmp, name, manage, hpo, ipfam, ctx)) {
+ if (initialize_http_proxy_client(&tmp, cr, ctx)) {
#ifdef AF_INET6
aflog(LOG_T_INIT, LOG_I_CRIT,
"http_proxy_connect_%s error for %s, %s (proxy: %s, %s)",
- (ipfam & 0x02)?"ipv4":(ipfam & 0x04)?"ipv6":"unspec", name, manage,
- HttpProxyOptions_get_proxyname(hpo), HttpProxyOptions_get_proxyport(hpo));
+ (ClientRealm_get_ipFamily(cr) & 0x02) ?
+ "ipv4":(ClientRealm_get_ipFamily(cr) & 0x04) ?
+ "ipv6":"unspec", ClientRealm_get_serverName(cr),
+ ClientRealm_get_managePort(cr),
+ HttpProxyOptions_get_proxyname(ClientRealm_get_httpProxyOptions(cr)),
+ HttpProxyOptions_get_proxyport(ClientRealm_get_httpProxyOptions(cr)));
#else
aflog(LOG_T_INIT, LOG_I_CRIT,
- "http_proxy_connect error for %s, %s (proxy: %s, %s)", name, manage,
- HttpProxyOptions_get_proxyname(hpo), HttpProxyOptions_get_proxyport(hpo));
+ "http_proxy_connect error for %s, %s (proxy: %s, %s)", ClientRealm_get_serverName(cr),
+ ClientRealm_get_managePort(cr),
+ HttpProxyOptions_get_proxyname(ClientRealm_get_httpProxyOptions(cr)),
+ HttpProxyOptions_get_proxyport(ClientRealm_get_httpProxyOptions(cr)));
#endif
if (wanttoexit) {
exit(1);
@@ -81,7 +93,7 @@ initialize_client_stage1(char tunneltype, SslFd* master, char* name, char* manag
return 1;
}
}
- SslFd_set_fd(master, tmp);
+ SslFd_set_fd(ClientRealm_get_masterSslFd(cr), tmp);
break;
}
#endif
@@ -98,22 +110,24 @@ initialize_client_stage1(char tunneltype, SslFd* master, char* name, char* manag
}
}
- master->ssl = SSL_new(ctx);
- if (SSL_set_fd(SslFd_get_ssl(master), SslFd_get_fd(master)) != 1) {
+ SslFd_set_ssl(ClientRealm_get_masterSslFd(cr), SSL_new(ctx));
+ if (SSL_set_fd(SslFd_get_ssl(ClientRealm_get_masterSslFd(cr)),
+ SslFd_get_fd(ClientRealm_get_masterSslFd(cr))) != 1) {
aflog(LOG_T_INIT, LOG_I_CRIT,
"Problem with initializing ssl... exiting");
if (wanttoexit) {
exit(1);
}
else {
+ close(SslFd_get_fd(ClientRealm_get_masterSslFd(cr)));
return 2;
}
}
aflog(LOG_T_INIT, LOG_I_INFO,
"Trying SSL_connect");
- if ((n = SSL_connect(master->ssl)) == 1) {
- if ((server_cert = SSL_get_peer_certificate(master->ssl)) == NULL) {
+ if ((n = SSL_connect(SslFd_get_ssl(ClientRealm_get_masterSslFd(cr)))) == 1) {
+ if ((server_cert = SSL_get_peer_certificate(SslFd_get_ssl(ClientRealm_get_masterSslFd(cr)))) == NULL) {
aflog(LOG_T_MAIN, LOG_I_CRIT,
"Server did not present a certificate... exiting");
exit(1);
@@ -153,17 +167,17 @@ initialize_client_stage1(char tunneltype, SslFd* master, char* name, char* manag
exit(1);
}
- switch (check_public_key(get_store_filename(), name, b64_encoded)) {
+ switch (check_public_key(get_store_filename(), ClientRealm_get_serverName(cr), b64_encoded)) {
case SSL_PUBLIC_KEY_VALID:
/* public key is ok - do nothing */
break;
case SSL_PUBLIC_KEY_NOT_KNOWN:
aflog(LOG_T_MAIN, LOG_I_WARNING,
"WARNING: implicitly added new server's public key to the list of known hosts");
- add_public_key(get_store_filename(), name, b64_encoded);
+ add_public_key(get_store_filename(), ClientRealm_get_serverName(cr), b64_encoded);
break;
default:
- if (ignorepkeys) {
+ if (ignorePublicKeys) {
aflog(LOG_T_MAIN, LOG_I_WARNING,
"WARNING: Invalid server's public key... ignoring");
}
@@ -186,30 +200,34 @@ initialize_client_stage1(char tunneltype, SslFd* master, char* name, char* manag
}
else {
aflog(LOG_T_INIT, LOG_I_CRIT,
- "SSL_connect has failed (%d | %d)... exiting", n, SSL_get_error(master->ssl, n));
+ "SSL_connect has failed (%d | %d)... exiting", n,
+ SSL_get_error(SslFd_get_ssl(ClientRealm_get_masterSslFd(cr)), n));
if (wanttoexit) {
exit(1);
}
else {
+ close(SslFd_get_fd(ClientRealm_get_masterSslFd(cr)));
return 3;
}
}
buff[0] = AF_S_LOGIN;
- buff[1] = pass[0];
- buff[2] = pass[1];
- buff[3] = pass[2];
- buff[4] = pass[3];
+ buff[1] = ClientRealm_get_password(cr)[0];
+ buff[2] = ClientRealm_get_password(cr)[1];
+ buff[3] = ClientRealm_get_password(cr)[2];
+ buff[4] = ClientRealm_get_password(cr)[3];
return 0;
}
int
-initialize_client_stage2(char *type, SslFd* master, int* usernum, unsigned char* buff, char wanttoexit)
+initialize_client_stage2(ClientRealm* cr, unsigned char* buff, char wanttoexit)
{
- SslFd_send_message(*type | TYPE_SSL | TYPE_ZLIB, master, buff, 5);
+ SslFd_send_message(ClientRealm_get_realmType(cr) | TYPE_SSL | TYPE_ZLIB,
+ ClientRealm_get_masterSslFd(cr), buff, 5);
buff[0] = 0;
- SslFd_get_message(*type | TYPE_SSL | TYPE_ZLIB, master, buff, -5);
+ SslFd_get_message(ClientRealm_get_realmType(cr) | TYPE_SSL | TYPE_ZLIB,
+ ClientRealm_get_masterSslFd(cr), buff, -5);
if ( buff[0] == 0 ) {
aflog(LOG_T_INIT, LOG_I_CRIT,
@@ -218,6 +236,7 @@ initialize_client_stage2(char *type, SslFd* master, int* usernum, unsigned char*
exit(1);
}
else {
+ close(SslFd_get_fd(ClientRealm_get_masterSslFd(cr)));
return 1;
}
}
@@ -228,6 +247,7 @@ initialize_client_stage2(char *type, SslFd* master, int* usernum, unsigned char*
exit(1);
}
else {
+ close(SslFd_get_fd(ClientRealm_get_masterSslFd(cr)));
return 1;
}
}
@@ -238,6 +258,7 @@ initialize_client_stage2(char *type, SslFd* master, int* usernum, unsigned char*
exit(1);
}
else {
+ close(SslFd_get_fd(ClientRealm_get_masterSslFd(cr)));
return 1;
}
}
@@ -248,55 +269,60 @@ initialize_client_stage2(char *type, SslFd* master, int* usernum, unsigned char*
exit(1);
}
else {
+ close(SslFd_get_fd(ClientRealm_get_masterSslFd(cr)));
return 1;
}
}
- *type = buff[3];
- (*usernum) = buff[1];
- (*usernum) = (*usernum) << 8;
- (*usernum) += buff[2];
+ ClientRealm_set_realmType(cr, buff[3]);
+ ClientRealm_set_usersLimit(cr, buff[1] * 256 + buff[2]);
return 0;
}
int
-initialize_client_stage3(ConnectUser*** contable, SslFd* master, int usernum, int* buflength, socklen_t* len,
- fd_set* allset, fd_set* wset, int* maxfdp1, char wanttoexit)
+initialize_client_stage3(ClientRealm* cr, int* buflength, fd_set* allset, fd_set* wset, int* maxfdp1,
+ char wanttoexit)
{
int i;
- (*contable) = calloc(usernum, sizeof(ConnectUser*));
- if ((*contable) == NULL) {
+ socklen_t len;
+ ConnectUser** usersTable;
+ usersTable = calloc(ClientRealm_get_usersLimit(cr), sizeof(ConnectUser*));
+ if (usersTable == NULL) {
aflog(LOG_T_INIT, LOG_I_CRIT,
"Calloc error - unable to successfully communicate with server");
if (wanttoexit) {
exit(1);
}
else {
+ close(SslFd_get_fd(ClientRealm_get_masterSslFd(cr)));
return 1;
}
}
- for (i = 0; i < usernum; ++i) {
- (*contable)[i] = ConnectUser_new();
- if ((*contable)[i] == NULL) {
+ ClientRealm_set_usersTable(cr, usersTable);
+ for (i = 0; i < ClientRealm_get_usersLimit(cr); ++i) {
+ usersTable[i] = ConnectUser_new();
+ if (usersTable[i] == NULL) {
aflog(LOG_T_INIT, LOG_I_CRIT,
"Calloc error - unable to successfully communicate with server");
if (wanttoexit) {
exit(1);
}
else {
+ close(SslFd_get_fd(ClientRealm_get_masterSslFd(cr)));
return 1;
}
}
}
- (*len) = 4;
- if (getsockopt(SslFd_get_fd(master), SOL_SOCKET, SO_SNDBUF, buflength, len) == -1) {
+ len = 4;
+ if (getsockopt(SslFd_get_fd(ClientRealm_get_masterSslFd(cr)), SOL_SOCKET, SO_SNDBUF, buflength, &len) == -1) {
aflog(LOG_T_INIT, LOG_I_CRIT,
"Can't get socket send buffer size - exiting...");
if (wanttoexit) {
exit(1);
}
else {
+ close(SslFd_get_fd(ClientRealm_get_masterSslFd(cr)));
return 2;
}
}
@@ -304,7 +330,7 @@ initialize_client_stage3(ConnectUser*** contable, SslFd* master, int usernum, in
FD_ZERO(allset);
FD_ZERO(wset);
- FD_SET(SslFd_get_fd(master), allset);
- (*maxfdp1) = SslFd_get_fd(master) + 1;
+ FD_SET(SslFd_get_fd(ClientRealm_get_masterSslFd(cr)), allset);
+ (*maxfdp1) = SslFd_get_fd(ClientRealm_get_masterSslFd(cr)) + 1;
return 0;
}
diff --git a/src/client_initialization.h b/src/client_initialization.h
index 5c8c719..ec2360a 100644
--- a/src/client_initialization.h
+++ b/src/client_initialization.h
@@ -26,17 +26,17 @@
#include "http_proxy_client.h"
#include "http_proxy_options_struct.h"
#include "ssl_fd_struct.h"
+#include "client_realm_struct.h"
#include <openssl/ssl.h>
#ifndef _JS_CLIENT_INITIALIZATION_H
#define _JS_CLIENT_INITIALIZATION_H
-int initialize_client_stage1(char tunneltype, SslFd* master, char* name, char* manage,
- HttpProxyOptions* hpo, char ipfam, SSL_CTX* ctx, unsigned char* buff, unsigned char* pass,
- char wanttoexit, char ignorepkeys);
-int initialize_client_stage2(char *type, SslFd* master, int* usernum, unsigned char* buff, char wanttoexit);
-int initialize_client_stage3(ConnectUser*** contable, SslFd* master, int usernum, int* buflength,
- socklen_t* len, fd_set* allset, fd_set* wset, int* maxfdp1, char wanttoexit);
+int initialize_client_stage1(ClientRealm* cr, SSL_CTX* ctx, unsigned char* buff, char wanttoexit,
+ char ignorePublicKeys);
+int initialize_client_stage2(ClientRealm* cr, unsigned char* buff, char wanttoexit);
+int initialize_client_stage3(ClientRealm* cr, int* buflength, fd_set* allset, fd_set* wset, int* maxfdp1,
+ char wanttoexit);
#endif
diff --git a/src/client_realm_struct.c b/src/client_realm_struct.c
new file mode 100644
index 0000000..d02b508
--- /dev/null
+++ b/src/client_realm_struct.c
@@ -0,0 +1,1094 @@
+/*
+ * active port forwarder - software for secure forwarding
+ * Copyright (C) 2003,2004,2005 jeremian <jeremian [at] poczta.fm>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ */
+
+#include <config.h>
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "string_functions.h"
+#include "client_realm_struct.h"
+#include "client_shutdown.h"
+
+/*
+ * Function name: ClientRealm_new
+ * Description: Create and initialize new ClientRealm structure.
+ * Returns: Pointer to newly created ClientRealm structure.
+ */
+
+ClientRealm*
+ClientRealm_new()
+{
+ ClientRealm* tmp = calloc(1, sizeof(ClientRealm));
+ if (tmp == NULL) {
+ return NULL;
+ }
+ tmp->password[0] = 1;
+ tmp->password[1] = 2;
+ tmp->password[2] = 3;
+ tmp->password[3] = 4;
+ tmp->masterSslFd = SslFd_new();
+ if (tmp->masterSslFd == NULL) {
+ ClientRealm_free(&tmp);
+ return NULL;
+ }
+ tmp->arOptions = ArOptions_new();
+ if (tmp->arOptions == NULL) {
+ ClientRealm_free(&tmp);
+ return NULL;
+ }
+ tmp->httpProxyOptions = HttpProxyOptions_new();
+ if (tmp->httpProxyOptions == NULL) {
+ ClientRealm_free(&tmp);
+ return NULL;
+ }
+#ifdef HAVE_LIBDL
+ tmp->userModule = Module_new();
+ if (tmp->userModule == NULL) {
+ ClientRealm_free(&tmp);
+ return NULL;
+ }
+ tmp->serviceModule = Module_new();
+ if (tmp->serviceModule == NULL) {
+ ClientRealm_free(&tmp);
+ return NULL;
+ }
+#endif
+ return tmp;
+}
+
+/*
+ * Function name: ClientRealm_free
+ * Description: Free the memory allocated for ClientRealm structure.
+ * Arguments: cr - pointer to pointer to ClientRealm structure
+ */
+
+void
+ClientRealm_free(ClientRealm** cr)
+{
+ int i;
+ if (cr == NULL) {
+ return;
+ }
+ if ((*cr) == NULL) {
+ return;
+ }
+ if ((*cr)->serverName) {
+ free((*cr)->serverName);
+ (*cr)->serverName = NULL;
+ }
+ if ((*cr)->managePort) {
+ free((*cr)->managePort);
+ (*cr)->managePort = NULL;
+ }
+ if ((*cr)->hostName) {
+ free((*cr)->hostName);
+ (*cr)->hostName = NULL;
+ }
+ if ((*cr)->destinationPort) {
+ free((*cr)->destinationPort);
+ (*cr)->destinationPort = NULL;
+ }
+ if ((*cr)->sKeepAliveTimeout) {
+ free((*cr)->sKeepAliveTimeout);
+ (*cr)->sKeepAliveTimeout = NULL;
+ }
+ if ((*cr)->realmName) {
+ free((*cr)->realmName);
+ (*cr)->realmName = NULL;
+ }
+ if ((*cr)->clientAddress) {
+ free((*cr)->clientAddress);
+ (*cr)->clientAddress = NULL;
+ }
+ if ((*cr)->usersTable) {
+ for (i = 0; i < (*cr)->usersLimit; ++i) {
+ if ((*cr)->usersTable[i]) {
+ ConnectUser_free(&((*cr)->usersTable[i]));
+ }
+ }
+ free((*cr)->usersTable);
+ (*cr)->usersTable = NULL;
+ }
+ free((*cr));
+ (*cr) = NULL;
+}
+
+/*
+ * Function name: ClientRealm_set_serverName
+ * Description: Set realm's server name.
+ * Arguments: cr - pointer to ClientRealm structure
+ * serverName - realm's host name
+ */
+
+void
+ClientRealm_set_serverName(ClientRealm* cr, char* serverName)
+{
+ if (cr == NULL) {
+ return;
+ }
+ string_cp(&(cr->serverName), serverName);
+}
+
+/*
+ * Function name: ClientRealm_set_managePort
+ * Description: Set realm's manage port description.
+ * Arguments: cr - pointer to ClientRealm structure
+ * managePort - realm's manage port description
+ */
+
+void
+ClientRealm_set_managePort(ClientRealm* cr, char* managePort)
+{
+ if (cr == NULL) {
+ return;
+ }
+ string_cp(&(cr->managePort), managePort);
+}
+
+/*
+ * Function name: ClientRealm_set_hostName
+ * Description: Set realm's host name.
+ * Arguments: cr - pointer to ClientRealm structure
+ * hostName - realm's host name
+ */
+
+void
+ClientRealm_set_hostName(ClientRealm* cr, char* hostName)
+{
+ if (cr == NULL) {
+ return;
+ }
+ string_cp(&(cr->hostName), hostName);
+}
+
+/*
+ * Function name: ClientRealm_set_destinationPort
+ * Description: Set realm's destination port description.
+ * Arguments: cr - pointer to ClientRealm structure
+ * destinationPort - realm's destination port description
+ */
+
+void
+ClientRealm_set_destinationPort(ClientRealm* cr, char* destinationPort)
+{
+ if (cr == NULL) {
+ return;
+ }
+ string_cp(&(cr->destinationPort), destinationPort);
+}
+
+/*
+ * Function name: ClientRealm_set_sKeepAliveTimeout
+ * Description: Set keep-alive timeout value description.
+ * Arguments: cr - pointer to ClientRealm structure
+ * sKeepAliveTimeout - keep-alive timeout value description
+ */
+
+void
+ClientRealm_set_sKeepAliveTimeout(ClientRealm* cr, char* sKeepAliveTimeout)
+{
+ if (cr == NULL) {
+ return;
+ }
+ string_cp(&(cr->sKeepAliveTimeout), sKeepAliveTimeout);
+}
+
+/*
+ * Function name: ClientRealm_set_realmName
+ * Description: Set realm's name.
+ * Arguments: cr - pointer to ClientRealm structure
+ * realmName - realm's name
+ */
+
+void
+ClientRealm_set_realmName(ClientRealm* cr, char* realmName)
+{
+ if (cr == NULL) {
+ return;
+ }
+ string_cp(&(cr->realmName), realmName);
+}
+
+/*
+ * Function name: ClientRealm_set_realmId
+ * Description: Set realm's id.
+ * Arguments: cr - pointer to ClientRealm structure
+ * realmId - realm's id
+ */
+
+void
+ClientRealm_set_realmId(ClientRealm* cr, char* realmId)
+{
+ if (cr == NULL) {
+ return;
+ }
+ string_cp(&(cr->realmId), realmId);
+}
+
+/*
+ * Function name: ClientRealm_set_localName
+ * Description: Set realm's local name.
+ * Arguments: cr - pointer to ClientRealm structure
+ * localName - realm's local name
+ */
+
+void
+ClientRealm_set_localName(ClientRealm* cr, char* localName)
+{
+ if (cr == NULL) {
+ return;
+ }
+ string_cp(&(cr->localName), localName);
+}
+
+/*
+ * Function name: ClientRealm_set_localPort
+ * Description: Set realm's local port description.
+ * Arguments: cr - pointer to ClientRealm structure
+ * localPort - realm's local port description
+ */
+
+void
+ClientRealm_set_localPort(ClientRealm* cr, char* localPort)
+{
+ if (cr == NULL) {
+ return;
+ }
+ string_cp(&(cr->localPort), localPort);
+}
+
+/*
+ * Function name: ClientRealm_set_localDestinationName
+ * Description: Set realm's local destination name.
+ * Arguments: cr - pointer to ClientRealm structure
+ * localDestinationName - realm's local destination name
+ */
+
+void
+ClientRealm_set_localDestinationName(ClientRealm* cr, char* localDestinationName)
+{
+ if (cr == NULL) {
+ return;
+ }
+ string_cp(&(cr->localDestinationName), localDestinationName);
+}
+
+/*
+ * Function name: ClientRealm_set_password
+ * Description: Set realm's password.
+ * Arguments: cr - pointer to ClientRealm structure
+ * password - realm's password
+ */
+
+void
+ClientRealm_set_password(ClientRealm* cr, unsigned char* password)
+{
+ if (cr == NULL) {
+ return;
+ }
+ memcpy(cr->password, password, 4);
+}
+
+/*
+ * Function name: ClientRealm_set_connectedUsers
+ * Description: Set number of connected users.
+ * Arguments: cr - pointer to ClientRealm structure
+ * connectedUsers - number of connected users
+ */
+
+void
+ClientRealm_set_connectedUsers(ClientRealm* cr, int connectedUsers)
+{
+ if (cr == NULL) {
+ return;
+ }
+ cr->connectedUsers = connectedUsers;
+}
+
+/*
+ * Function name: ClientRealm_set_usersLimit
+ * Description: Set limit of connected users.
+ * Arguments: cr - pointer to ClientRealm structure
+ * usersLimit - limit of connected users
+ */
+
+void
+ClientRealm_set_usersLimit(ClientRealm* cr, int usersLimit)
+{
+ if (cr == NULL) {
+ return;
+ }
+ cr->usersLimit = usersLimit;
+}
+
+/*
+ * Function name: ClientRealm_set_keepAliveTimeout
+ * Description: Set keep-alive timeout value.
+ * Arguments: cr - pointer to ClientRealm structure
+ * keepAliveTimeout - keep-alive timeout value
+ */
+
+void
+ClientRealm_set_keepAliveTimeout(ClientRealm* cr, int keepAliveTimeout)
+{
+ if (cr == NULL) {
+ return;
+ }
+ cr->keepAliveTimeout = keepAliveTimeout;
+}
+
+/*
+ * Function name: ClientRealm_set_clientMode
+ * Description: Set client mode.
+ * Arguments: cr - pointer to ClientRealm structure
+ * clientMode - client mode
+ */
+
+void
+ClientRealm_set_clientMode(ClientRealm* cr, int clientMode)
+{
+ if (cr == NULL) {
+ return;
+ }
+ cr->clientMode = clientMode;
+}
+
+/*
+ * Function name: ClientRealm_set_ipFamily
+ * Description: Set IP family.
+ * Arguments: cr - pointer to ClientRealm structure
+ * ipFamily - IP family
+ */
+
+void
+ClientRealm_set_ipFamily(ClientRealm* cr, char ipFamily)
+{
+ if (cr == NULL) {
+ return;
+ }
+ cr->ipFamily = ipFamily;
+}
+
+/*
+ * Function name: ClientRealm_set_realmType
+ * Description: Set type of the realm.
+ * Arguments: cr - pointer to ClientRealm structure
+ * realmType - type of the realm
+ */
+
+void
+ClientRealm_set_realmType(ClientRealm* cr, char realmType)
+{
+ if (cr == NULL) {
+ return;
+ }
+ cr->realmType = realmType;
+}
+
+/*
+ * Function name: ClientRealm_set_tunnelType
+ * Description: Set type of the tunnel.
+ * Arguments: cr - pointer to ClientRealm structure
+ * tunnelType - type of the tunnel
+ */
+
+void
+ClientRealm_set_tunnelType(ClientRealm* cr, char tunnelType)
+{
+ if (cr == NULL) {
+ return;
+ }
+ cr->tunnelType = tunnelType;
+}
+
+/*
+ * Function name: ClientRealm_set_keepAlive
+ * Description: Set keep-alive timeval struct.
+ * Arguments: cr - pointer to ClientRealm structure
+ * keepAlive - keep-alive timeval struct
+ */
+
+void
+ClientRealm_set_keepAlive(ClientRealm* cr, struct timeval keepAlive)
+{
+ if (cr == NULL) {
+ return;
+ }
+ cr->keepAlive = keepAlive;
+}
+
+/*
+ * Function name: ClientRealm_set_addressLength
+ * Description: Set client's address length.
+ * Arguments: cr - pointer to ClientRealm structure
+ * addressLength - client's address length
+ */
+
+void
+ClientRealm_set_addressLength(ClientRealm* cr, socklen_t addressLength)
+{
+ if (cr == NULL) {
+ return;
+ }
+ cr->addressLength = addressLength;
+}
+
+/*
+ * Function name: ClientRealm_set_clientAddress
+ * Description: Set client's network address.
+ * Arguments: cr - pointer to ClientRealm structure
+ * clientAddress - client's network address
+ */
+
+void
+ClientRealm_set_clientAddress(ClientRealm* cr, struct sockaddr* clientAddress)
+{
+ if (cr == NULL) {
+ return;
+ }
+ if (cr->clientAddress) {
+ free(cr->clientAddress);
+ cr->clientAddress = NULL;
+ }
+ cr->clientAddress = clientAddress;
+}
+
+/*
+ * Function name: ClientRealm_set_masterSslFd
+ * Description: Set client realm's master sslfd.
+ * Arguments: cr - pointer to ClientRealm structure
+ * masterSslFd - client realm's master sslfd
+ */
+
+void
+ClientRealm_set_masterSslFd(ClientRealm* cr, SslFd* masterSslFd)
+{
+ if (cr == NULL) {
+ return;
+ }
+ if (cr->masterSslFd) {
+ SslFd_free(&(cr->masterSslFd));
+ }
+ cr->masterSslFd = masterSslFd;
+}
+
+/*
+ * Function name: ClientRealm_set_httpProxyOptions
+ * Description: Set client realm's http proxy options.
+ * Arguments: cr - pointer to ClientRealm structure
+ * httpProxyOptions - client realm's http proxy options
+ */
+
+void
+ClientRealm_set_httpProxyOptions(ClientRealm* cr, HttpProxyOptions* httpProxyOptions)
+{
+ if (cr == NULL) {
+ return;
+ }
+ if (cr->httpProxyOptions) {
+ HttpProxyOptions_free(&(cr->httpProxyOptions));
+ }
+ cr->httpProxyOptions = httpProxyOptions;
+}
+
+/*
+ * Function name: ClientRealm_set_arOptions
+ * Description: Set client realm's auto-reconnect options.
+ * Arguments: cr - pointer to ClientRealm structure
+ * arOptions - client realm's auto-reconnect options
+ */
+
+void
+ClientRealm_set_arOptions(ClientRealm* cr, ArOptions* arOptions)
+{
+ if (cr == NULL) {
+ return;
+ }
+ if (cr->arOptions) {
+ ArOptions_free(&(cr->arOptions));
+ }
+ cr->arOptions = arOptions;
+}
+
+/*
+ * Function name: ClientRealm_set_usersTable
+ * Description: Set table of users.
+ * Arguments: cr - pointer to ClientRealm structure
+ * usersTable - table of users
+ */
+
+void
+ClientRealm_set_usersTable(ClientRealm* cr, ConnectUser** usersTable)
+{
+ int i;
+ if (cr == NULL) {
+ return;
+ }
+ if (cr->usersTable) {
+ for (i = 0; i < cr->usersLimit; ++i) {
+ if (cr->usersTable[i]) {
+ ConnectUser_free(&(cr->usersTable[i]));
+ }
+ }
+ free(cr->usersTable);
+ cr->usersTable = NULL;
+ }
+ cr->usersTable = usersTable;
+}
+
+#ifdef HAVE_LIBDL
+/*
+ * Function name: ClientRealm_set_userModule
+ * Description: Set a module for user's packets filtering.
+ * Arguments: cr - pointer to ClientRealm structure
+ * userModule - module for user's packets filtering
+ */
+
+void
+ClientRealm_set_userModule(ClientRealm* cr, Module* userModule)
+{
+ if (cr == NULL) {
+ return;
+ }
+ if (cr->userModule) {
+ Module_free(&(cr->userModule));
+ }
+ cr->userModule = userModule;
+}
+
+/*
+ * Function name: ClientRealm_set_serviceModule
+ * Description: Set a module for service's packets filtering.
+ * Arguments: cr - pointer to ClientRealm structure
+ * serviceModule - module for service's packets filtering
+ */
+
+void
+ClientRealm_set_serviceModule(ClientRealm* cr, Module* serviceModule)
+{
+ if (cr == NULL) {
+ return;
+ }
+ if (cr->serviceModule) {
+ Module_free(&(cr->serviceModule));
+ }
+ cr->serviceModule = serviceModule;
+}
+#endif
+
+/*
+ * Function name: ClientRealm_get_serverName
+ * Description: Get realm's server name.
+ * Arguments: cr - pointer to ClientRealm structure
+ * Returns: Realm's server name.
+ */
+
+char*
+ClientRealm_get_serverName(ClientRealm* cr)
+{
+ if (cr == NULL) {
+ return NULL;
+ }
+ return cr->serverName;
+}
+
+/*
+ * Function name: ClientRealm_get_managePort
+ * Description: Get realm's manage port description.
+ * Arguments: cr - pointer to ClientRealm structure
+ * Returns: Realm's manage port description.
+ */
+
+char*
+ClientRealm_get_managePort(ClientRealm* cr)
+{
+ if (cr == NULL) {
+ return NULL;
+ }
+ return cr->managePort;
+}
+
+/*
+ * Function name: ClientRealm_get_hostName
+ * Description: Get realm's host name.
+ * Arguments: cr - pointer to ClientRealm structure
+ * Returns: Realm's host name.
+ */
+
+char*
+ClientRealm_get_hostName(ClientRealm* cr)
+{
+ if (cr == NULL) {
+ return NULL;
+ }
+ return cr->hostName;
+}
+
+/*
+ * Function name: ClientRealm_get_destinationPort
+ * Description: Get realm's destination port description.
+ * Arguments: cr - pointer to ClientRealm structure
+ * Returns: Realm's destination port description.
+ */
+
+char*
+ClientRealm_get_destinationPort(ClientRealm* cr)
+{
+ if (cr == NULL) {
+ return NULL;
+ }
+ return cr->destinationPort;
+}
+
+/*
+ * Function name: ClientRealm_get_sKeepAliveTimeout
+ * Description: Get keep-alive timeout value description.
+ * Arguments: cr - pointer to ClientRealm structure
+ * Returns: Keep-alive timeout value description.
+ */
+
+char*
+ClientRealm_get_sKeepAliveTimeout(ClientRealm* cr)
+{
+ if (cr == NULL) {
+ return NULL;
+ }
+ return cr->sKeepAliveTimeout;
+}
+
+/*
+ * Function name: ClientRealm_get_realmName
+ * Description: Get realm's name.
+ * Arguments: cr - pointer to ClientRealm structure
+ * Returns: Realm's name.
+ */
+
+char*
+ClientRealm_get_realmName(ClientRealm* cr)
+{
+ if (cr == NULL) {
+ return NULL;
+ }
+ return cr->realmName;
+}
+
+/*
+ * Function name: ClientRealm_get_realmId
+ * Description: Get realm's id.
+ * Arguments: cr - pointer to ClientRealm structure
+ * Returns: Realm's id.
+ */
+
+char*
+ClientRealm_get_realmId(ClientRealm* cr)
+{
+ if (cr == NULL) {
+ return NULL;
+ }
+ return cr->realmId;
+}
+
+
+/*
+ * Function name: ClientRealm_get_localName
+ * Description: Get realm's local name.
+ * Arguments: cr - pointer to ClientRealm structure
+ * Returns: Realm's local name.
+ */
+
+char*
+ClientRealm_get_localName(ClientRealm* cr)
+{
+ if (cr == NULL) {
+ return NULL;
+ }
+ return cr->localName;
+}
+
+
+/*
+ * Function name: ClientRealm_get_localPort
+ * Description: Get realm's local port description.
+ * Arguments: cr - pointer to ClientRealm structure
+ * Returns: Realm's local port description.
+ */
+
+char*
+ClientRealm_get_localPort(ClientRealm* cr)
+{
+ if (cr == NULL) {
+ return NULL;
+ }
+ return cr->localPort;
+}
+
+
+/*
+ * Function name: ClientRealm_get_localDestinationName
+ * Description: Get realm's local destination name.
+ * Arguments: cr - pointer to ClientRealm structure
+ * Returns: Realm's local destination name.
+ */
+
+char*
+ClientRealm_get_localDestinationName(ClientRealm* cr)
+{
+ if (cr == NULL) {
+ return NULL;
+ }
+ return cr->localDestinationName;
+}
+
+/*
+ * Function name: ClientRealm_get_password
+ * Description: Get realm's password.
+ * Arguments: sr - pointer to ClientRealm structure
+ * Returns: Realm's password.
+ */
+
+unsigned char*
+ClientRealm_get_password(ClientRealm* cr)
+{
+ if (cr == NULL) {
+ return NULL;
+ }
+ return cr->password;
+}
+
+/*
+ * Function name: ClientRealm_get_connectedUsers
+ * Description: Get number of connected users.
+ * Arguments: cr - pointer to ClientRealm structure
+ * Returns: Number of connected users.
+ */
+
+int
+ClientRealm_get_connectedUsers(ClientRealm* cr)
+{
+ if (cr == NULL) {
+ return -1;
+ }
+ return cr->connectedUsers;
+}
+
+/*
+ * Function name: ClientRealm_get_usersLimit
+ * Description: Get limit of connected users.
+ * Arguments: cr - pointer to ClientRealm structure
+ * Returns: Limit of connected users.
+ */
+
+int
+ClientRealm_get_usersLimit(ClientRealm* cr)
+{
+ if (cr == NULL) {
+ return -1;
+ }
+ return cr->usersLimit;
+}
+
+/*
+ * Function name: ClientRealm_get_keepAliveTimeout
+ * Description: Get keep-alive timeout value.
+ * Arguments: cr - pointer to ClientRealm structure
+ * Returns: Keep-alive timeout value.
+ */
+
+int
+ClientRealm_get_keepAliveTimeout(ClientRealm* cr)
+{
+ if (cr == NULL) {
+ return 0;
+ }
+ return cr->keepAliveTimeout;
+}
+
+/*
+ * Function name: ClientRealm_get_clientMode
+ * Description: Get client mode.
+ * Arguments: cr - pointer to ClientRealm structure
+ * Returns: Client mode.
+ */
+
+int
+ClientRealm_get_clientMode(ClientRealm* cr)
+{
+ if (cr == NULL) {
+ return 0;
+ }
+ return cr->clientMode;
+}
+
+/*
+ * Function name: ClientRealm_get_ipFamily
+ * Description: Get IP family.
+ * Arguments: cr - pointer to ClientRealm structure
+ * Returns: IP family.
+ */
+
+char
+ClientRealm_get_ipFamily(ClientRealm* cr)
+{
+ if (cr == NULL) {
+ return 0;
+ }
+ return cr->ipFamily;
+}
+
+/*
+ * Function name: ClientRealm_get_realmType
+ * Description: Get type of the realm.
+ * Arguments: cr - pointer to ClientRealm structure
+ * Returns: Type of the realm.
+ */
+
+char
+ClientRealm_get_realmType(ClientRealm* cr)
+{
+ if (cr == NULL) {
+ return 0;
+ }
+ return cr->realmType;
+}
+
+/*
+ * Function name: ClientRealm_get_tunnelType
+ * Description: Get type of the tunnel.
+ * Arguments: cr - pointer to ClientRealm structure
+ * Returns: Type of the tunnel.
+ */
+
+char
+ClientRealm_get_tunnelType(ClientRealm* cr)
+{
+ if (cr == NULL) {
+ return 0;
+ }
+ return cr->tunnelType;
+}
+
+/*
+ * Function name: ClientRealm_get_keepAlive
+ * Description: Get keep-alive timeval struct.
+ * Arguments: cr - pointer to ClientRealm structure
+ * Returns: Keep-alive timeval struct.
+ */
+
+struct timeval
+ClientRealm_get_keepAlive(ClientRealm* cr)
+{
+ struct timeval tmp = {0, 0};
+ if (cr == NULL) {
+ return tmp;
+ }
+ return cr->keepAlive;
+}
+
+/*
+ * Function name: ClientRealm_get_addressLength
+ * Description: Get client's address length.
+ * Arguments: cr - pointer to ClientRealm structure
+ * Returns: Client's address length.
+ */
+
+socklen_t
+ClientRealm_get_addressLength(ClientRealm* cr)
+{
+ if (cr == NULL) {
+ return 0;
+ }
+ return cr->addressLength;
+}
+
+/*
+ * Function name: ClientRealm_get_clientAddress
+ * Description: Get client's network address.
+ * Arguments: cr - pointer to ClientRealm structure
+ * Returns: Client's network address.
+ */
+
+struct sockaddr*
+ClientRealm_get_clientAddress(ClientRealm* cr)
+{
+ if (cr == NULL) {
+ return NULL;
+ }
+ return cr->clientAddress;
+}
+
+/*
+ * Function name: ClientRealm_get_masterSslFd
+ * Description: Get client realm's master sslfd.
+ * Arguments: cr - pointer to ClientRealm structure
+ * Returns: Client realm's master sslfd.
+ */
+
+SslFd*
+ClientRealm_get_masterSslFd(ClientRealm* cr)
+{
+ if (cr == NULL) {
+ return NULL;
+ }
+ return cr->masterSslFd;
+}
+
+/*
+ * Function name: ClientRealm_get_httpProxyOptions
+ * Description: Get client realm's http proxy options.
+ * Arguments: cr - pointer to ClientRealm structure
+ * Returns: Client realm's http proxy options.
+ */
+
+HttpProxyOptions*
+ClientRealm_get_httpProxyOptions(ClientRealm* cr)
+{
+ if (cr == NULL) {
+ return NULL;
+ }
+ return cr->httpProxyOptions;
+}
+
+/*
+ * Function name: ClientRealm_get_arOptions
+ * Description: Get client realm's auto-reconnect options.
+ * Arguments: cr - pointer to ClientRealm structure
+ * Returns: Client realm's auto-reconnect options.
+ */
+
+ArOptions*
+ClientRealm_get_arOptions(ClientRealm* cr)
+{
+ if (cr == NULL) {
+ return NULL;
+ }
+ return cr->arOptions;
+}
+
+/*
+ * Function name: ClientRealm_get_usersTable
+ * Description: Get table of users.
+ * Arguments: cr - pointer to ClientRealm structure
+ * Returns: Table of users.
+ */
+
+ConnectUser**
+ClientRealm_get_usersTable(ClientRealm* cr)
+{
+ if (cr == NULL) {
+ return NULL;
+ }
+ return cr->usersTable;
+}
+
+#ifdef HAVE_LIBDL
+/*
+ * Function name: ClientRealm_get_userModule
+ * Description: Get a module for user's packets filtering.
+ * Arguments: cr - pointer to ClientRealm structure
+ * Returns: A module for user's packets filtering.
+ */
+
+Module*
+ClientRealm_get_userModule(ClientRealm* cr)
+{
+ if (cr == NULL) {
+ return NULL;
+ }
+ return cr->userModule;
+}
+
+/*
+ * Function name: ClientRealm_get_serviceModule
+ * Description: Get a module for service's packets filtering.
+ * Arguments: cr - pointer to ClientRealm structure
+ * Returns: A module for service's packets filtering.
+ */
+
+Module*
+ClientRealm_get_serviceModule(ClientRealm* cr)
+{
+ if (cr == NULL) {
+ return NULL;
+ }
+ return cr->serviceModule;
+}
+#endif
+
+/*
+ * Function name: ClientRealm_increase_connectedUsers
+ * Description: Increase number of connected users.
+ * Arguments: cr - pointer to ClientRealm structure
+ */
+
+void
+ClientRealm_increase_connectedUsers(ClientRealm* cr)
+{
+ if (cr == NULL) {
+ return;
+ }
+ ClientRealm_set_connectedUsers(cr, ClientRealm_get_connectedUsers(cr) + 1);
+}
+
+/*
+ * Function name: ClientRealm_decrease_connectedUsers
+ * Description: Decrease number of connected users.
+ * Arguments: cr - pointer to ClientRealm structure
+ */
+
+void
+ClientRealm_decrease_connectedUsers(ClientRealm* cr)
+{
+ if (cr == NULL) {
+ return;
+ }
+ ClientRealm_set_connectedUsers(cr, ClientRealm_get_connectedUsers(cr) - 1);
+}
+
+/*
+ * Function name: ClientRealm_closeUsersConnections
+ * Description: Close all users' connections and free usersTable
+ * Arguments: cr - pointer to ClientRealm structure
+ */
+
+void
+ClientRealm_closeUsersConnections(ClientRealm* cr)
+{
+ if (cr == NULL) {
+ return;
+ }
+ close_connections(ClientRealm_get_usersLimit(cr), &(cr->usersTable));
+}
+
+/*
+ * Function name: ClientRealm_get_keepAlivePointer
+ * Description: Get pointer to keep-alive structure
+ * Arguments: cr - pointer to ClientRealm structure
+ * Returns: Pointer to keep-alive structure
+ */
+
+struct timeval*
+ClientRealm_get_keepAlivePointer(ClientRealm* cr)
+{
+ if (cr == NULL) {
+ return NULL;
+ }
+ return (&(cr->keepAlive));
+}
diff --git a/src/client_realm_struct.h b/src/client_realm_struct.h
new file mode 100644
index 0000000..01459d9
--- /dev/null
+++ b/src/client_realm_struct.h
@@ -0,0 +1,143 @@
+/*
+ * active port forwarder - software for secure forwarding
+ * Copyright (C) 2003,2004,2005 jeremian <jeremian [at] poczta.fm>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ */
+
+#include "activefor.h"
+#include "ssl_fd_struct.h"
+#include "http_proxy_options_struct.h"
+#include "ar_options_struct.h"
+#include "module_struct.h"
+
+#ifndef _JS_CLIENT_REALM_STRUCT_H
+#define _JS_CLIENT_REALM_STRUCT_H
+
+#define CLIENTREALM_MODE_UNKNOWN -1
+#define CLIENTREALM_MODE_TCP 0
+#define CLIENTREALM_MODE_UDP 1
+#define CLIENTREALM_MODE_REMOTE 2
+#define CLIENTREALM_MODE_REVERSE 3
+
+#define CLIENTREALM_TUNNELTYPE_UNKNOWN -1
+#define CLIENTREALM_TUNNELTYPE_DIRECT 0
+#define CLIENTREALM_TUNNELTYPE_HTTPPROXY 1
+#define CLIENTREALM_TUNNELTYPE_HTTPSPROXY 2
+
+typedef struct {
+ char* serverName;
+ char* managePort;
+ char* hostName;
+ char* destinationPort;
+ char* realmName;
+ char* sKeepAliveTimeout;
+ char* realmId;
+ char* localName;
+ char* localPort;
+ char* localDestinationName;
+ unsigned char password[4];
+ int connectedUsers;
+ int usersLimit;
+ int clientMode;
+ int keepAliveTimeout;
+ char ipFamily;
+ char realmType;
+ char tunnelType;
+ struct timeval keepAlive;
+ socklen_t addressLength;
+ struct sockaddr* clientAddress;
+ SslFd* masterSslFd;
+ HttpProxyOptions* httpProxyOptions;
+ ArOptions* arOptions;
+ ConnectUser** usersTable;
+#ifdef HAVE_LIBDL
+ Module* userModule;
+ Module* serviceModule;
+#endif
+} ClientRealm;
+
+/* 'constructor' */
+ClientRealm* ClientRealm_new();
+/* 'destructor' */
+void ClientRealm_free(ClientRealm** cr);
+/* setters */
+void ClientRealm_set_serverName(ClientRealm* cr, char* serverName);
+void ClientRealm_set_managePort(ClientRealm* cr, char* managePort);
+void ClientRealm_set_hostName(ClientRealm* cr, char* hostName);
+void ClientRealm_set_destinationPort(ClientRealm* cr, char* destinationPort);
+void ClientRealm_set_realmName(ClientRealm* cr, char* realmName);
+void ClientRealm_set_sKeepAliveTimeout(ClientRealm* cr, char* sKeepAliveTimeout);
+void ClientRealm_set_realmId(ClientRealm* cr, char* realmId);
+void ClientRealm_set_localName(ClientRealm* cr, char* localName);
+void ClientRealm_set_localPort(ClientRealm* cr, char* localPort);
+void ClientRealm_set_localDestinationName(ClientRealm* cr, char* localDestinationName);
+void ClientRealm_set_password(ClientRealm* cr, unsigned char* password);
+void ClientRealm_set_connectedUsers(ClientRealm* cr, int connectedUsers);
+void ClientRealm_set_usersLimit(ClientRealm* cr, int usersLimit);
+void ClientRealm_set_keepAliveTimeout(ClientRealm* cr, int keepAliveTimeout);
+void ClientRealm_set_clientMode(ClientRealm* cr, int clientMode);
+void ClientRealm_set_ipFamily(ClientRealm* cr, char ipFamily);
+void ClientRealm_set_realmType(ClientRealm* cr, char realmType);
+void ClientRealm_set_tunnelType(ClientRealm* cr, char tunnelType);
+void ClientRealm_set_keepAlive(ClientRealm* cr, struct timeval keepAlive);
+void ClientRealm_set_addressLength(ClientRealm* cr, socklen_t addressLength);
+void ClientRealm_set_clientAddress(ClientRealm* cr, struct sockaddr* clientAddress);
+void ClientRealm_set_masterSslFd(ClientRealm* cr, SslFd* masterSslFd);
+void ClientRealm_set_httpProxyOptions(ClientRealm* cr, HttpProxyOptions* httpProxyOptions);
+void ClientRealm_set_arOptions(ClientRealm* cr, ArOptions* arOptions);
+void ClientRealm_set_usersTable(ClientRealm* cr, ConnectUser** usersTable);
+#ifdef HAVE_LIBDL
+void ClientRealm_set_userModule(ClientRealm* cr, Module* userModule);
+void ClientRealm_set_serviceModule(ClientRealm* cr, Module* serviceModule);
+#endif
+/* getters */
+char* ClientRealm_get_serverName(ClientRealm* cr);
+char* ClientRealm_get_managePort(ClientRealm* cr);
+char* ClientRealm_get_hostName(ClientRealm* cr);
+char* ClientRealm_get_destinationPort(ClientRealm* cr);
+char* ClientRealm_get_realmName(ClientRealm* cr);
+char* ClientRealm_get_sKeepAliveTimeout(ClientRealm* cr);
+char* ClientRealm_get_realmId(ClientRealm* cr);
+char* ClientRealm_get_localName(ClientRealm* cr);
+char* ClientRealm_get_localPort(ClientRealm* cr);
+char* ClientRealm_get_localDestinationName(ClientRealm* cr);
+unsigned char* ClientRealm_get_password(ClientRealm* cr);
+int ClientRealm_get_connectedUsers(ClientRealm* cr);
+int ClientRealm_get_usersLimit(ClientRealm* cr);
+int ClientRealm_get_keepAliveTimeout(ClientRealm* cr);
+int ClientRealm_get_clientMode(ClientRealm* cr);
+char ClientRealm_get_ipFamily(ClientRealm* cr);
+char ClientRealm_get_realmType(ClientRealm* cr);
+char ClientRealm_get_tunnelType(ClientRealm* cr);
+struct timeval ClientRealm_get_keepAlive(ClientRealm* cr);
+socklen_t ClientRealm_get_addressLength(ClientRealm* cr);
+struct sockaddr* ClientRealm_get_clientAddress(ClientRealm* cr);
+SslFd* ClientRealm_get_masterSslFd(ClientRealm* cr);
+HttpProxyOptions* ClientRealm_get_httpProxyOptions(ClientRealm* cr);
+ArOptions* ClientRealm_get_arOptions(ClientRealm* cr);
+ConnectUser** ClientRealm_get_usersTable(ClientRealm* cr);
+#ifdef HAVE_LIBDL
+Module* ClientRealm_get_userModule(ClientRealm* cr);
+Module* ClientRealm_get_serviceModule(ClientRealm* cr);
+#endif
+/* other */
+void ClientRealm_increase_connectedUsers(ClientRealm* cr);
+void ClientRealm_decrease_connectedUsers(ClientRealm* cr);
+void ClientRealm_closeUsersConnections(ClientRealm* cr);
+struct timeval* ClientRealm_get_keepAlivePointer(ClientRealm* cr);
+
+#endif
diff --git a/src/client_reverse_udp.c b/src/client_reverse_udp.c
index c0a1ef4..d8cf971 100644
--- a/src/client_reverse_udp.c
+++ b/src/client_reverse_udp.c
@@ -25,19 +25,23 @@
#include <stdlib.h>
int
-initialize_client_reverse_udp(int* usernum, SslFd* master, char* name, char* manage, char ipfam,
- char wanttoexit)
+initialize_client_reverse_udp(ClientRealm* cr)
{
int tmp;
- (*usernum) = 1;
- if (ip_connect(&tmp, name, manage, ipfam)) {
+ int wanttoexit = (ArOptions_get_arStart(ClientRealm_get_arOptions(cr)) == AR_OPTION_ENABLED) ? 0 : 1;
+ ClientRealm_set_usersLimit(cr, 1);
+ if (ip_connect(&tmp, ClientRealm_get_serverName(cr),
+ ClientRealm_get_managePort(cr),
+ ClientRealm_get_ipFamily(cr), NULL, NULL)) {
#ifdef AF_INET6
aflog(LOG_T_INIT, LOG_I_CRIT,
"tcp_connect_%s error for %s, %s",
- (ipfam & 0x02)?"ipv4":(ipfam & 0x04)?"ipv6":"unspec", name, manage);
+ (ClientRealm_get_ipFamily(cr) & 0x02) ?
+ "ipv4" : (ClientRealm_get_ipFamily(cr) & 0x04) ?
+ "ipv6":"unspec", ClientRealm_get_serverName(cr), ClientRealm_get_managePort(cr));
#else
aflog(LOG_T_INIT, LOG_I_CRIT,
- "tcp_connect error for %s, %s", name, manage);
+ "tcp_connect error for %s, %s", ClientRealm_get_serverName(cr), ClientRealm_get_managePort(cr));
#endif
if (wanttoexit) {
exit(1);
@@ -47,55 +51,48 @@ initialize_client_reverse_udp(int* usernum, SslFd* master, char* name, char* man
}
}
- SslFd_set_fd(master, tmp);
- SslFd_set_ssl(master, NULL);
+ SslFd_set_fd(ClientRealm_get_masterSslFd(cr), tmp);
+ SslFd_set_ssl(ClientRealm_get_masterSslFd(cr), NULL);
return 0;
}
void
-client_reverse_udp(ConnectUser** contable, SslFd* master, char* desnam, char* despor, char type,
- unsigned char* buff, int buflength)
+client_reverse_udp(ClientRealm* cr, unsigned char* buff, int buflength)
{
- char ipfam;
socklen_t len, addrlen;
int maxfdp1, temp, notsent, n, length;
struct sockaddr* cliaddr;
fd_set rset, allset;
-
- ipfam = 0;
-#ifdef AF_INET6
- if (TYPE_IS_IPV4(type)) {
- ipfam |= 0x02;
- }
- else if (TYPE_IS_IPV6(type)) {
- ipfam |= 0x04;
- }
-#endif
- if (ip_listen(&temp, desnam, despor, &addrlen, ipfam)) {
+
+ if (ip_listen(&temp, ClientRealm_get_hostName(cr),
+ ClientRealm_get_destinationPort(cr), &addrlen,
+ ClientRealm_get_ipFamily(cr) & 0xfe)) {
#ifdef AF_INET6
aflog(LOG_T_INIT, LOG_I_DEBUG,
"udp_listen_%s error for %s, %s",
- (ipfam & 0x02)?"ipv4":(ipfam & 0x04)?"ipv6":"unspec", desnam, despor);
+ (ClientRealm_get_ipFamily(cr) & 0x02) ?
+ "ipv4":(ClientRealm_get_ipFamily(cr) & 0x04) ?
+ "ipv6":"unspec", ClientRealm_get_hostName(cr), ClientRealm_get_destinationPort(cr));
#else
aflog(LOG_T_INIT, LOG_I_DEBUG,
- "udp_listen error for %s, %s", desnam, despor);
+ "udp_listen error for %s, %s", ClientRealm_get_hostName(cr), ClientRealm_get_destinationPort(cr));
#endif
exit(1);
}
- ConnectUser_set_connFd(contable[0], temp);
+ ConnectUser_set_connFd(ClientRealm_get_usersTable(cr)[0], temp);
cliaddr = malloc(addrlen);
FD_ZERO(&allset);
- FD_SET(SslFd_get_fd(master), &allset);
- maxfdp1 = SslFd_get_fd(master) + 1;
- maxfdp1 = (maxfdp1 > (ConnectUser_get_connFd(contable[0]) + 1)) ?
- maxfdp1 : (ConnectUser_get_connFd(contable[0]) + 1);
- FD_SET(ConnectUser_get_connFd(contable[0]), &allset);
+ FD_SET(SslFd_get_fd(ClientRealm_get_masterSslFd(cr)), &allset);
+ maxfdp1 = SslFd_get_fd(ClientRealm_get_masterSslFd(cr)) + 1;
+ maxfdp1 = (maxfdp1 > (ConnectUser_get_connFd(ClientRealm_get_usersTable(cr)[0]) + 1)) ?
+ maxfdp1 : (ConnectUser_get_connFd(ClientRealm_get_usersTable(cr)[0]) + 1);
+ FD_SET(ConnectUser_get_connFd(ClientRealm_get_usersTable(cr)[0]), &allset);
aflog(LOG_T_CLIENT, LOG_I_INFO,
"CLIENT STARTED mode: udp reverse");
for ( ; ; ) {
len = 4;
- if (getsockopt(SslFd_get_fd(master), SOL_SOCKET, SO_SNDBUF, &temp, &len) != -1) {
+ if (getsockopt(SslFd_get_fd(ClientRealm_get_masterSslFd(cr)), SOL_SOCKET, SO_SNDBUF, &temp, &len) != -1) {
if (temp != buflength) {
buflength = temp;
aflog(LOG_T_CLIENT, LOG_I_WARNING,
@@ -110,13 +107,13 @@ client_reverse_udp(ConnectUser** contable, SslFd* master, char* desnam, char* de
aflog(LOG_T_MAIN, LOG_I_DEBUG,
"after select...");
- if (FD_ISSET(ConnectUser_get_connFd(contable[0]), &rset)) { /* FD_ISSET CONTABLE[0].CONNFD RSET*/
- n = recvfrom(ConnectUser_get_connFd(contable[0]), &buff[5], 8091, 0, cliaddr, &len);
+ if (FD_ISSET(ConnectUser_get_connFd(ClientRealm_get_usersTable(cr)[0]), &rset)) { /* FD_ISSET CONTABLE[0].CONNFD RSET*/
+ n = recvfrom(ConnectUser_get_connFd(ClientRealm_get_usersTable(cr)[0]), &buff[5], 8091, 0, cliaddr, &len);
#ifdef HAVE_LINUX_SOCKIOS_H
# ifdef SIOCOUTQ
aflog(LOG_T_MAIN, LOG_I_DDEBUG,
"SIOCOUTQ is defined");
- if (ioctl(SslFd_get_fd(master), SIOCOUTQ, &notsent)) {
+ if (ioctl(SslFd_get_fd(ClientRealm_get_masterSslFd(cr)), SIOCOUTQ, &notsent)) {
aflog(LOG_T_CLIENT, LOG_I_CRIT,
"ioctl error -> exiting...");
exit(1);
@@ -127,7 +124,7 @@ client_reverse_udp(ConnectUser** contable, SslFd* master, char* desnam, char* de
# else
aflog(LOG_T_MAIN< LOG_I_DDEBUG,
"TIOCOUTQ is defined");
- if (ioctl(SslFd_get_fd(master), TIOCOUTQ, &notsent)) {
+ if (ioctl(SslFd_get_fd(ClientRealm_get_masterSslFd(cr)), TIOCOUTQ, &notsent)) {
aflog(LOG_T_CLIENT, LOG_I_CRIT,
"ioctl error -> exiting...");
exit(1);
@@ -158,15 +155,15 @@ client_reverse_udp(ConnectUser** contable, SslFd* master, char* desnam, char* de
buff[2] = AF_S_MESSAGE;
buff[3] = n >> 8;
buff[4] = n;
- writen(SslFd_get_fd(master), buff, n + 5);
+ writen(SslFd_get_fd(ClientRealm_get_masterSslFd(cr)), buff, n + 5);
}
#ifdef HAVE_LINUX_SOCKIOS_H
}
#endif
} /* - FD_ISSET CONTABLE[0].CONNFD RSET */
- if (FD_ISSET(SslFd_get_fd(master), &rset)) { /* FD_ISSET MASTER.COMMFD RSET */
- n = readn(SslFd_get_fd(master), buff, 5);
+ if (FD_ISSET(SslFd_get_fd(ClientRealm_get_masterSslFd(cr)), &rset)) { /* FD_ISSET MASTER.COMMFD RSET */
+ n = readn(SslFd_get_fd(ClientRealm_get_masterSslFd(cr)), buff, 5);
if (n == 5) {
if ((buff[0] != AF_S_MESSAGE) || (buff[1] != AF_S_LOGIN) || (buff[2] != AF_S_MESSAGE)) {
aflog(LOG_T_CLIENT, LOG_I_CRIT,
@@ -176,7 +173,7 @@ client_reverse_udp(ConnectUser** contable, SslFd* master, char* desnam, char* de
length = buff[3];
length = length << 8;
length += buff[4]; /* this is length of message */
- n = readn(SslFd_get_fd(master), buff, length);
+ n = readn(SslFd_get_fd(ClientRealm_get_masterSslFd(cr)), buff, length);
}
else {
n = 0;
@@ -188,7 +185,7 @@ client_reverse_udp(ConnectUser** contable, SslFd* master, char* desnam, char* de
}
aflog(LOG_T_CLIENT, LOG_I_INFO,
"Sending %d bytes to user (TO:%s)", n, sock_ntop(cliaddr, addrlen, NULL, NULL, 0));
- sendto(ConnectUser_get_connFd(contable[0]), buff, n, 0, cliaddr, addrlen);
+ sendto(ConnectUser_get_connFd(ClientRealm_get_usersTable(cr)[0]), buff, n, 0, cliaddr, addrlen);
} /* - FD_ISSET MASTER.COMMFD RSET */
}
exit(0); /* we shouldn't get here */
diff --git a/src/client_reverse_udp.h b/src/client_reverse_udp.h
index 031dd8f..ecf48ba 100644
--- a/src/client_reverse_udp.h
+++ b/src/client_reverse_udp.h
@@ -33,10 +33,9 @@
#include "stats.h"
#include "logging.h"
#include "ssl_fd_struct.h"
+#include "client_realm_struct.h"
-int initialize_client_reverse_udp(int* usernum, SslFd* master, char* name, char* manage, char ipfam,
- char wanttoexit);
-void client_reverse_udp(ConnectUser** contable, SslFd* master, char* desnam, char* despor, char type,
- unsigned char* buff, int buflength);
+int initialize_client_reverse_udp(ClientRealm* cr);
+void client_reverse_udp(ClientRealm* cr, unsigned char* buff, int buflength);
#endif
diff --git a/src/clientnames.c b/src/clientnames.c
index 4fee9a8..3640ae9 100644
--- a/src/clientnames.c
+++ b/src/clientnames.c
@@ -25,37 +25,37 @@
#include "clientnames.h"
char*
-get_clientname(RealmT* pointer, int client)
+get_clientname(ServerRealm* pointer, int client)
{
static char clientname[10];
- if (ConnectClient_get_sClientId(pointer->clitable[client]) == NULL) {
+ if (ConnectClient_get_sClientId(ServerRealm_get_clientsTable(pointer)[client]) == NULL) {
memset(clientname, 0, 10);
- sprintf(clientname, "%d", ConnectClient_get_clientId(pointer->clitable[client]));
+ sprintf(clientname, "%d", ConnectClient_get_clientId(ServerRealm_get_clientsTable(pointer)[client]));
return clientname;
}
- return ConnectClient_get_sClientId(pointer->clitable[client]);
+ return ConnectClient_get_sClientId(ServerRealm_get_clientsTable(pointer)[client]);
}
int
-get_clientid(RealmT* pointer, char* clientname)
+get_clientid(ServerRealm* pointer, char* clientname)
{
int i, n;
char guard;
- for (i = 0; i < pointer->clinum; ++i) {
- if (ConnectClient_get_sClientId(pointer->clitable[i]) != NULL) {
- if (strcmp(clientname, ConnectClient_get_sClientId(pointer->clitable[i])) == 0) {
- return ConnectClient_get_clientId(pointer->clitable[i]);
+ for (i = 0; i < ServerRealm_get_clientsLimit(pointer); ++i) {
+ if (ConnectClient_get_sClientId(ServerRealm_get_clientsTable(pointer)[i]) != NULL) {
+ if (strcmp(clientname, ConnectClient_get_sClientId(ServerRealm_get_clientsTable(pointer)[i])) == 0) {
+ return ConnectClient_get_clientId(ServerRealm_get_clientsTable(pointer)[i]);
}
}
}
if (sscanf(clientname, "%d%c", &i, &guard) == 1) {
n = get_clientnumber(pointer, i);
- if ((n >= 0) && (n < pointer->clinum)) {
- if (ConnectClient_get_sClientId(pointer->clitable[n]) == NULL) {
+ if ((n >= 0) && (n < ServerRealm_get_clientsLimit(pointer))) {
+ if (ConnectClient_get_sClientId(ServerRealm_get_clientsTable(pointer)[n]) == NULL) {
return i;
}
}
@@ -64,11 +64,11 @@ get_clientid(RealmT* pointer, char* clientname)
}
int
-get_clientnumber(RealmT* pointer, int clientid)
+get_clientnumber(ServerRealm* pointer, int clientid)
{
int i;
- for (i = 0; i < pointer->clinum; ++i) {
- if (ConnectClient_get_clientId(pointer->clitable[i]) == clientid) {
+ for (i = 0; i < ServerRealm_get_clientsLimit(pointer); ++i) {
+ if (ConnectClient_get_clientId(ServerRealm_get_clientsTable(pointer)[i]) == clientid) {
return i;
}
}
@@ -77,37 +77,37 @@ get_clientnumber(RealmT* pointer, int clientid)
}
char*
-get_raclientname(RealmT* pointer, int client)
+get_raclientname(ServerRealm* pointer, int client)
{
static char clientname[10];
- if (ConnectClient_get_sClientId(pointer->raclitable[client]) == NULL) {
+ if (ConnectClient_get_sClientId(ServerRealm_get_raClientsTable(pointer)[client]) == NULL) {
memset(clientname, 0, 10);
- sprintf(clientname, "%d", ConnectClient_get_clientId(pointer->raclitable[client]));
+ sprintf(clientname, "%d", ConnectClient_get_clientId(ServerRealm_get_raClientsTable(pointer)[client]));
return clientname;
}
- return ConnectClient_get_sClientId(pointer->raclitable[client]);
+ return ConnectClient_get_sClientId(ServerRealm_get_raClientsTable(pointer)[client]);
}
int
-get_raclientid(RealmT* pointer, char* clientname)
+get_raclientid(ServerRealm* pointer, char* clientname)
{
int i, n;
char guard;
- for (i = 0; i < pointer->raclinum; ++i) {
- if (ConnectClient_get_sClientId(pointer->raclitable[i]) != NULL) {
- if (strcmp(clientname, ConnectClient_get_sClientId(pointer->raclitable[i])) == 0) {
- return ConnectClient_get_clientId(pointer->raclitable[i]);
+ for (i = 0; i < ServerRealm_get_raClientsLimit(pointer); ++i) {
+ if (ConnectClient_get_sClientId(ServerRealm_get_raClientsTable(pointer)[i]) != NULL) {
+ if (strcmp(clientname, ConnectClient_get_sClientId(ServerRealm_get_raClientsTable(pointer)[i])) == 0) {
+ return ConnectClient_get_clientId(ServerRealm_get_raClientsTable(pointer)[i]);
}
}
}
if (sscanf(clientname, "%d%c", &i, &guard) == 1) {
n = get_raclientnumber(pointer, i);
- if ((n >= 0) && (n < pointer->raclinum)) {
- if (ConnectClient_get_sClientId(pointer->raclitable[n]) == NULL) {
+ if ((n >= 0) && (n < ServerRealm_get_raClientsLimit(pointer))) {
+ if (ConnectClient_get_sClientId(ServerRealm_get_raClientsTable(pointer)[n]) == NULL) {
return i;
}
}
@@ -117,11 +117,11 @@ get_raclientid(RealmT* pointer, char* clientname)
}
int
-get_raclientnumber(RealmT* pointer, int clientid)
+get_raclientnumber(ServerRealm* pointer, int clientid)
{
int i;
- for (i = 0; i < pointer->raclinum; ++i) {
- if (ConnectClient_get_clientId(pointer->raclitable[i]) == clientid) {
+ for (i = 0; i < ServerRealm_get_raClientsLimit(pointer); ++i) {
+ if (ConnectClient_get_clientId(ServerRealm_get_raClientsTable(pointer)[i]) == clientid) {
return i;
}
}
diff --git a/src/clientnames.h b/src/clientnames.h
index c93a2dc..9925c25 100644
--- a/src/clientnames.h
+++ b/src/clientnames.h
@@ -19,17 +19,18 @@
*/
#include "activefor.h"
+#include "server_realm_struct.h"
#ifndef _JS_CLIENTNAMES_H
#define _JS_CLIENTNAMES_H
-char* get_clientname(RealmT*, int);
-int get_clientid(RealmT*, char*);
-int get_clientnumber(RealmT*, int);
+char* get_clientname(ServerRealm*, int);
+int get_clientid(ServerRealm*, char*);
+int get_clientnumber(ServerRealm*, int);
-char* get_raclientname(RealmT*, int);
-int get_raclientid(RealmT*, char*);
-int get_raclientnumber(RealmT*, int);
+char* get_raclientname(ServerRealm*, int);
+int get_raclientid(ServerRealm*, char*);
+int get_raclientnumber(ServerRealm*, int);
#endif
diff --git a/src/file.c b/src/file.c
index 297503b..f7eeee1 100644
--- a/src/file.c
+++ b/src/file.c
@@ -104,265 +104,3 @@ parse_line(char* buff, char* tab1, char* tab2)
}
return 1;
}
-
-ConfigurationT
-parsefile(char* name, int* status)
-{
- static ConfigurationT cfg;
- FILE* file = NULL;
- int state, i, j, n, listencount, managecount;
- char buff[256];
- char helpbuf1[256];
- char helpbuf2[256];
- char* tmpbuf;
-
- *status = 1;
-
- memset(buff, 0, 256);
-
- cfg.certif = NULL;
- cfg.keys = NULL;
- cfg.size = 0;
- cfg.realmtable = NULL;
- cfg.dateformat = NULL;
-
- state = F_UNKNOWN;
-
- file = fopen(name, "r");
- if (file == NULL) {
- return cfg;
- }
-
- while (fgets(buff, 256, file) != NULL) { /* first loop - counting realm */
- helpbuf1[0] = 0;
- parse_line(buff, helpbuf1, helpbuf2);
- if (strcmp(helpbuf1, "realm")==0) {
- ++cfg.size;
- }
- }
- rewind(file);
-
- cfg.realmtable = calloc(cfg.size, sizeof(RealmT));
- for (i=0; i<cfg.size; ++i) {
- cfg.realmtable[i].pass[0] = 1;
- cfg.realmtable[i].pass[1] = 2;
- cfg.realmtable[i].pass[2] = 3;
- cfg.realmtable[i].pass[3] = 4;
- }
- cfg.size = 0;
- *status = 0;
-
- listencount = managecount = 0;
-
-
- while (fgets(buff, 256, file) != NULL) { /* second loop - counting listen */
- (*status)++;
- state = parse_line(buff, helpbuf1, helpbuf2);
- if (state) {
- if (strcmp(helpbuf1, "realm")==0) {
- ++cfg.size;
- if (listencount != managecount) {
- return cfg;
- }
- listencount = managecount = 0;
- }
- else if (strcmp(helpbuf1, "listen")==0) {
- if (cfg.size == 0) {
- return cfg;
- }
- ++cfg.realmtable[cfg.size-1].usrclinum;
- ++listencount;
- }
- else if (strcmp(helpbuf1, "manage")==0) {
- if (cfg.size == 0) {
- return cfg;
- }
- ++managecount;
- }
- }
- }
- rewind(file);
-
- if (listencount != managecount) {
- return cfg;
- }
-
- for (i = 0; i < cfg.size; ++i) {
- cfg.realmtable[i].usrclitable = calloc(cfg.realmtable[i].usrclinum, sizeof(UsrCli*));
- for (j = 0; j < cfg.realmtable[i].usrclinum; ++j) {
- cfg.realmtable[i].usrclitable[j] = UsrCli_new();
- if (cfg.realmtable[i].usrclitable[j] == NULL) {
- aflog(LOG_T_INIT, LOG_I_CRIT,
- "Problem with allocating memory for UsrCli structure... exiting");
- return cfg;
- }
- }
- }
-
- cfg.size = 0;
- *status = 0;
-
-
- while (fgets(buff, 256, file) != NULL) { /* third loop - parsing file */
- (*status)++;
- state = parse_line(buff, helpbuf1, helpbuf2);
- if (helpbuf1[0] == '#') {
- memset(buff, 0, 256);
- continue;
- }
- if (state == 1) {
- if (strcmp(helpbuf1, "realm")==0) {
- ++cfg.size;
- TYPE_SET_SSL(cfg.realmtable[cfg.size-1].type);
- TYPE_SET_ZLIB(cfg.realmtable[cfg.size-1].type);
- listencount = managecount = 0;
- }
- else if (cfg.size == 0) {
- return cfg;
- }
- else if (strcmp(helpbuf1, "nossl")==0) {
- TYPE_UNSET_SSL(cfg.realmtable[cfg.size-1].type);
- }
- else if (strcmp(helpbuf1, "nozlib")==0) {
- TYPE_UNSET_ZLIB(cfg.realmtable[cfg.size-1].type);
- }
- else if (strcmp(helpbuf1, "baseport")==0) {
- cfg.realmtable[cfg.size-1].baseport = 1;
- }
- else if (strcmp(helpbuf1, "audit")==0) {
- cfg.realmtable[cfg.size-1].audit = 1;
- }
- else if (strcmp(helpbuf1, "dnslookups")==0) {
- cfg.realmtable[cfg.size-1].dnslookups = 1;
- }
-#ifdef HAVE_LIBPTHREAD
- else if (strcmp(helpbuf1, "enableproxy")==0) {
- if (cfg.realmtable[cfg.size-1].tunneltype == 0) {
- cfg.realmtable[cfg.size-1].tunneltype = 1;
- }
- else {
- return cfg;
- }
- }
-#endif
-#ifdef AF_INET6
- else if (strcmp(helpbuf1, "ipv4")==0) {
- if (TYPE_IS_UNSPEC(cfg.realmtable[cfg.size-1].type)) {
- TYPE_SET_IPV4(cfg.realmtable[cfg.size-1].type);
- }
- else {
- return cfg;
- }
- }
- else if (strcmp(helpbuf1, "ipv6")==0) {
- if (TYPE_IS_UNSPEC(cfg.realmtable[cfg.size-1].type)) {
- TYPE_SET_IPV6(cfg.realmtable[cfg.size-1].type);
- }
- else {
- return cfg;
- }
- }
-#endif
- else {
- return cfg;
- }
- }
- else if (state == 2) {
- if (strcmp(helpbuf1, "realm")==0) {
- ++cfg.size;
- TYPE_SET_SSL(cfg.realmtable[cfg.size-1].type);
- TYPE_SET_ZLIB(cfg.realmtable[cfg.size-1].type);
- listencount = managecount = 0;
- cfg.realmtable[cfg.size-1].realmname = calloc(strlen(helpbuf2)+1, sizeof(char));
- strcpy(cfg.realmtable[cfg.size-1].realmname, helpbuf2);
- }
- else if (strcmp(helpbuf1, "certificate")==0) {
- cfg.certif = calloc(strlen(helpbuf2)+1, sizeof(char));
- strcpy(cfg.certif, helpbuf2);
- }
- else if (strcmp(helpbuf1, "key")==0) {
- cfg.keys = calloc(strlen(helpbuf2)+1, sizeof(char));
- strcpy(cfg.keys, helpbuf2);
- }
- else if (strcmp(helpbuf1, "log")==0) {
- tmpbuf = calloc(strlen(helpbuf2)+1, sizeof(char));
- strcpy(tmpbuf, helpbuf2);
- addlogtarget(tmpbuf);
- }
- else if (strcmp(helpbuf1, "dateformat")==0) {
- cfg.dateformat = calloc(strlen(helpbuf2)+1, sizeof(char));
- strcpy(cfg.dateformat, helpbuf2);
- }
- else if (cfg.size == 0) {
- return cfg;
- }
- else if (strcmp(helpbuf1, "hostname")==0) {
- cfg.realmtable[cfg.size-1].hostname = calloc(strlen(helpbuf2)+1, sizeof(char));
- strcpy(cfg.realmtable[cfg.size-1].hostname, helpbuf2);
- }
- else if (strcmp(helpbuf1, "listen")==0) {
- UsrCli_set_listenPortName(cfg.realmtable[cfg.size-1].usrclitable[listencount], helpbuf2);
- ++listencount;
- }
- else if (strcmp(helpbuf1, "pass")==0) {
- n = strlen(helpbuf2);
- memset(cfg.realmtable[cfg.size-1].pass, 0, 4);
- for (i = 0; i < n; ++i) {
- cfg.realmtable[cfg.size-1].pass[i%4] += helpbuf2[i];
- }
- }
- else if (strcmp(helpbuf1, "manage")==0) {
- UsrCli_set_managePortName(cfg.realmtable[cfg.size-1].usrclitable[managecount], helpbuf2);
- ++managecount;
- }
- else if (strcmp(helpbuf1, "users")==0) {
- cfg.realmtable[cfg.size-1].users = calloc(strlen(helpbuf2)+1, sizeof(char));
- strcpy(cfg.realmtable[cfg.size-1].users, helpbuf2);
- }
- else if (strcmp(helpbuf1, "timeout")==0) {
- cfg.realmtable[cfg.size-1].timeout = calloc(strlen(helpbuf2)+1, sizeof(char));
- strcpy(cfg.realmtable[cfg.size-1].timeout, helpbuf2);
- }
- else if (strcmp(helpbuf1, "clients")==0) {
- cfg.realmtable[cfg.size-1].clients = calloc(strlen(helpbuf2)+1, sizeof(char));
- strcpy(cfg.realmtable[cfg.size-1].clients, helpbuf2);
- }
- else if (strcmp(helpbuf1, "raclients")==0) {
- cfg.realmtable[cfg.size-1].raclients = calloc(strlen(helpbuf2)+1, sizeof(char));
- strcpy(cfg.realmtable[cfg.size-1].raclients, helpbuf2);
- }
- else if (strcmp(helpbuf1, "usrpcli")==0) {
- cfg.realmtable[cfg.size-1].usrpcli = calloc(strlen(helpbuf2)+1, sizeof(char));
- strcpy(cfg.realmtable[cfg.size-1].usrpcli, helpbuf2);
- }
- else if (strcmp(helpbuf1, "climode")==0) {
- cfg.realmtable[cfg.size-1].clim = calloc(strlen(helpbuf2)+1, sizeof(char));
- strcpy(cfg.realmtable[cfg.size-1].clim, helpbuf2);
- }
- else if (strcmp(helpbuf1, "proto")==0) {
- if (TYPE_IS_SET(cfg.realmtable[cfg.size-1].type)) {
- return cfg;
- }
- if (strcmp(helpbuf2, "tcp")==0) {
- TYPE_SET_TCP(cfg.realmtable[cfg.size-1].type);
- }
- else if (strcmp(helpbuf2, "udp")==0) {
- TYPE_SET_UDP(cfg.realmtable[cfg.size-1].type);
- }
- else {
- return cfg;
- }
- }
- else {
- return cfg;
- }
- }
- memset(buff, 0, 256);
- }
-
- fclose(file);
-
- *status = 0;
- return cfg;
-}
-
diff --git a/src/file.h b/src/file.h
index 7738df6..7165936 100644
--- a/src/file.h
+++ b/src/file.h
@@ -20,6 +20,8 @@
#include "activefor.h"
#include "network.h"
+#include "server_configuration_struct.h"
+#include "client_configuration_struct.h"
#include <openssl/ssl.h>
#ifndef _JS_FILE_H
@@ -31,7 +33,9 @@
#define F_RVALUE 4
#define F_MIDDLE 5
-ConfigurationT parsefile(char*, int*); /* parse the cfg file */
+int parse_line(char* buff, char* tab1, char* tab2); /* parse one line of the file */
+ServerConfiguration* parsefile(char*, int*); /* parse the cfg file */
+ClientConfiguration* cparsefile(char*, int*); /* parse the client's cfg file */
#endif
diff --git a/src/file_client.c b/src/file_client.c
new file mode 100644
index 0000000..68ece7a
--- /dev/null
+++ b/src/file_client.c
@@ -0,0 +1,261 @@
+/*
+ * active port forwarder - software for secure forwarding
+ * Copyright (C) 2003,2004,2005 jeremian <jeremian [at] poczta.fm>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ */
+
+#include <config.h>
+
+#include "file.h"
+#include "activefor.h"
+#include "logging.h"
+#include "network.h"
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <limits.h>
+#include <ctype.h>
+
+ClientConfiguration*
+cparsefile(char* name, int* status)
+{
+ ClientConfiguration* cfg;
+ FILE* file = NULL;
+ int state, i, n;
+#ifdef AF_INET6
+ int temp;
+#endif
+ char buff[256];
+ char helpbuf1[256];
+ char helpbuf2[256];
+ char* tmpbuf;
+ unsigned char pass[4] = {1, 2, 3, 4};
+
+ *status = 1;
+
+ memset(buff, 0, 256);
+
+ cfg = ClientConfiguration_new();
+
+ if (cfg == NULL) {
+ printf("Can't allocate memory for client configuration... exiting\n");
+ exit(1);
+ }
+
+ state = F_UNKNOWN;
+
+ file = fopen(name, "r");
+ if (file == NULL) {
+ return cfg;
+ }
+
+ ClientConfiguration_set_realmsNumber(cfg, 1);
+
+ ClientConfiguration_set_realmsTable(cfg,
+ calloc(ClientConfiguration_get_realmsNumber(cfg), sizeof(ClientRealm*)));
+ if (ClientConfiguration_get_realmsTable(cfg) == NULL) {
+ printf("Can't allocate memory for ClientRealm* table... exiting\n");
+ exit(1);
+ }
+ for (i = 0; i < ClientConfiguration_get_realmsNumber(cfg); ++i) {
+ ClientConfiguration_get_realmsTable(cfg)[i] = ClientRealm_new();
+ if (ClientConfiguration_get_realmsTable(cfg)[i] == NULL) {
+ printf("Problem with allocating memory for ClientRealm structure... exiting");
+ exit(1);
+ }
+ ClientRealm_set_password(ClientConfiguration_get_realmsTable(cfg)[i], pass);
+ }
+ *status = 0;
+
+ while (fgets(buff, 256, file) != NULL) { /* second loop - parsing file */
+ (*status)++;
+ state = parse_line(buff, helpbuf1, helpbuf2);
+ if (helpbuf1[0] == '#') {
+ memset(buff, 0, 256);
+ continue;
+ }
+ if (state == 1) {
+ if (strcmp(helpbuf1, "ignorepkeys") == 0) {
+ ClientConfiguration_set_ignorePublicKeys(cfg, 1);
+ }
+ else if (strcmp(helpbuf1, "ar-start") == 0) {
+ ArOptions_set_arStart(ClientRealm_get_arOptions(ClientConfiguration_get_realmsTable(cfg)[0]),
+ AR_OPTION_ENABLED);
+ }
+ else if (strcmp(helpbuf1, "ar-quit") == 0) {
+ ArOptions_set_arQuit(ClientRealm_get_arOptions(ClientConfiguration_get_realmsTable(cfg)[0]),
+ AR_OPTION_ENABLED);
+ }
+ else if (strcmp(helpbuf1, "noar") == 0) {
+ ArOptions_set_arPremature(ClientRealm_get_arOptions(ClientConfiguration_get_realmsTable(cfg)[0]),
+ AR_OPTION_DISABLED);
+ }
+ else if ((strcmp(helpbuf1, "u") == 0) || (strcmp(helpbuf1, "udpmode") == 0)) {
+ if (ClientRealm_get_clientMode(ClientConfiguration_get_realmsTable(cfg)[0]) == CLIENTREALM_MODE_TCP) {
+ ClientRealm_set_clientMode(ClientConfiguration_get_realmsTable(cfg)[0], CLIENTREALM_MODE_UDP);
+ }
+ else {
+ ClientRealm_set_clientMode(ClientConfiguration_get_realmsTable(cfg)[0], CLIENTREALM_MODE_UNKNOWN);
+ }
+ }
+ else if ((strcmp(helpbuf1, "U") == 0) || (strcmp(helpbuf1, "reverseudp") == 0)) {
+ if (ClientRealm_get_clientMode(ClientConfiguration_get_realmsTable(cfg)[0]) == CLIENTREALM_MODE_TCP) {
+ ClientRealm_set_clientMode(ClientConfiguration_get_realmsTable(cfg)[0], CLIENTREALM_MODE_REVERSE);
+ }
+ else {
+ ClientRealm_set_clientMode(ClientConfiguration_get_realmsTable(cfg)[0], CLIENTREALM_MODE_UNKNOWN);
+ }
+ }
+ else if ((strcmp(helpbuf1, "r") == 0) || (strcmp(helpbuf1, "remoteadmin") == 0)) {
+ if (ClientRealm_get_clientMode(ClientConfiguration_get_realmsTable(cfg)[0]) == CLIENTREALM_MODE_TCP) {
+ ClientRealm_set_clientMode(ClientConfiguration_get_realmsTable(cfg)[0], CLIENTREALM_MODE_REMOTE);
+ }
+ else {
+ ClientRealm_set_clientMode(ClientConfiguration_get_realmsTable(cfg)[0], CLIENTREALM_MODE_UNKNOWN);
+ }
+ }
+ else if ((strcmp(helpbuf1, "S") == 0) || (strcmp(helpbuf1, "use-https") == 0)) {
+ HttpProxyOptions_use_https(ClientRealm_get_httpProxyOptions(
+ ClientConfiguration_get_realmsTable(cfg)[0]));
+ }
+ else if ((strcmp(helpbuf1, "B") == 0) || (strcmp(helpbuf1, "pa-t-basic") == 0)) {
+ HttpProxyOptions_set_proxyauth_type(ClientRealm_get_httpProxyOptions(
+ ClientConfiguration_get_realmsTable(cfg)[0]), PROXYAUTH_TYPE_BASIC);
+ }
+#ifdef HAVE_LIBPTHREAD
+ else if (strcmp(helpbuf1, "enableproxy")==0) {
+ if (ClientRealm_get_tunnelType(
+ ClientConfiguration_get_realmsTable(cfg)[0]) == 0) {
+ ClientRealm_set_tunnelType(
+ ClientConfiguration_get_realmsTable(cfg)[0],
+ 1);
+ }
+ else {
+ return cfg;
+ }
+ }
+#endif
+#ifdef AF_INET6
+ else if (strcmp(helpbuf1, "ipv4")==0) {
+ if (TYPE_IS_UNSPEC(ClientRealm_get_realmType(
+ ClientConfiguration_get_realmsTable(cfg)[0]))) {
+ temp = ClientRealm_get_realmType(ClientConfiguration_get_realmsTable(cfg)[0]);
+ TYPE_SET_IPV4(temp);
+ ClientRealm_set_realmType(ClientConfiguration_get_realmsTable(cfg)[0], temp);
+ }
+ else {
+ return cfg;
+ }
+ }
+ else if (strcmp(helpbuf1, "ipv6")==0) {
+ if (TYPE_IS_UNSPEC(ClientRealm_get_realmType(
+ ClientConfiguration_get_realmsTable(cfg)[0]))) {
+ temp = ClientRealm_get_realmType(ClientConfiguration_get_realmsTable(cfg)[0]);
+ TYPE_SET_IPV6(temp);
+ ClientRealm_set_realmType(ClientConfiguration_get_realmsTable(cfg)[0], temp);
+ }
+ else {
+ return cfg;
+ }
+ }
+#endif
+ else {
+ return cfg;
+ }
+ }
+ else if (state == 2) {
+ if ((strcmp(helpbuf1, "k") == 0) || (strcmp(helpbuf1, "keyfile") == 0)) {
+ ClientConfiguration_set_keysFile(cfg, helpbuf2);
+ }
+ else if ((strcmp(helpbuf1, "s") == 0) || (strcmp(helpbuf1, "storefile") == 0)) {
+ ClientConfiguration_set_storeFile(cfg, helpbuf2);
+ }
+ else if ((strcmp(helpbuf1, "o") == 0) || (strcmp(helpbuf1, "log") == 0)) {
+ tmpbuf = calloc(strlen(helpbuf2)+1, sizeof(char));
+ strcpy(tmpbuf, helpbuf2);
+ addlogtarget(tmpbuf);
+ }
+ else if ((strcmp(helpbuf1, "D") == 0) || (strcmp(helpbuf1, "dateformat") == 0)) {
+ ClientConfiguration_set_dateFormat(cfg, helpbuf2);
+ }
+ else if ((strcmp(helpbuf1, "n") == 0) || (strcmp(helpbuf1, "servername") == 0)) {
+ ClientRealm_set_serverName(ClientConfiguration_get_realmsTable(cfg)[0], helpbuf2);
+ }
+ else if ((strcmp(helpbuf1, "m") == 0) || (strcmp(helpbuf1, "manageport") == 0)) {
+ ClientRealm_set_hostName(ClientConfiguration_get_realmsTable(cfg)[0], helpbuf2);
+ }
+ else if ((strcmp(helpbuf1, "d") == 0) || (strcmp(helpbuf1, "hostname") == 0)) {
+ ClientRealm_set_hostName(ClientConfiguration_get_realmsTable(cfg)[0], helpbuf2);
+ }
+ else if ((strcmp(helpbuf1, "p") == 0) || (strcmp(helpbuf1, "portnum") == 0)) {
+ ClientRealm_set_destinationPort(ClientConfiguration_get_realmsTable(cfg)[0], helpbuf2);
+ }
+ else if (strcmp(helpbuf1, "localname") == 0) {
+ ClientRealm_set_localName(ClientConfiguration_get_realmsTable(cfg)[0], helpbuf2);
+ }
+ else if (strcmp(helpbuf1, "localport") == 0) {
+ ClientRealm_set_localPort(ClientConfiguration_get_realmsTable(cfg)[0], helpbuf2);
+ }
+ else if (strcmp(helpbuf1, "localdesname") == 0) {
+ ClientRealm_set_localDestinationName(ClientConfiguration_get_realmsTable(cfg)[0], helpbuf2);
+ }
+ else if ((strcmp(helpbuf1, "i") == 0) || (strcmp(helpbuf1, "id") == 0)) {
+ ClientRealm_set_realmId(ClientConfiguration_get_realmsTable(cfg)[0], helpbuf2);
+ }
+ else if (strcmp(helpbuf1, "pass") == 0) {
+ n = strlen(helpbuf2);
+ memset(pass, 0, 4);
+ for (i = 0; i < n; ++i) {
+ pass[i%4] += helpbuf2[i];
+ }
+ ClientRealm_set_password(ClientConfiguration_get_realmsTable(cfg)[0], pass);
+ }
+ else if ((strcmp(helpbuf1, "K") == 0) || (strcmp(helpbuf1, "keep-alive") == 0)) {
+ ClientRealm_set_sKeepAliveTimeout(ClientConfiguration_get_realmsTable(cfg)[0], helpbuf2);
+ }
+ else if ((strcmp(helpbuf1, "A") == 0) || (strcmp(helpbuf1, "ar-tries") == 0)) {
+ ArOptions_set_s_arTries(ClientRealm_get_arOptions(ClientConfiguration_get_realmsTable(cfg)[0]),
+ helpbuf2);
+ }
+ else if ((strcmp(helpbuf1, "T") == 0) || (strcmp(helpbuf1, "ar-delay") == 0)) {
+ ArOptions_set_s_arDelay(ClientRealm_get_arOptions(ClientConfiguration_get_realmsTable(cfg)[0]),
+ helpbuf2);
+ }
+ else if ((strcmp(helpbuf1, "P") == 0) || (strcmp(helpbuf1, "proxyname") == 0)) {
+ HttpProxyOptions_set_proxyname(ClientRealm_get_httpProxyOptions(
+ ClientConfiguration_get_realmsTable(cfg)[0]), helpbuf2);
+ }
+ else if ((strcmp(helpbuf1, "X") == 0) || (strcmp(helpbuf1, "proxyport") == 0)) {
+ HttpProxyOptions_set_proxyport(ClientRealm_get_httpProxyOptions(
+ ClientConfiguration_get_realmsTable(cfg)[0]), helpbuf2);
+ }
+ else if ((strcmp(helpbuf1, "C") == 0) || (strcmp(helpbuf1, "pa-cred") == 0)) {
+ HttpProxyOptions_set_proxyauth_cred(ClientRealm_get_httpProxyOptions(
+ ClientConfiguration_get_realmsTable(cfg)[0]), helpbuf2);
+ }
+ else {
+ return cfg;
+ }
+ }
+ memset(buff, 0, 256);
+ }
+
+ fclose(file);
+
+ *status = 0;
+ return cfg;
+}
diff --git a/src/file_server.c b/src/file_server.c
new file mode 100644
index 0000000..3db91a6
--- /dev/null
+++ b/src/file_server.c
@@ -0,0 +1,367 @@
+/*
+ * active port forwarder - software for secure forwarding
+ * Copyright (C) 2003,2004,2005 jeremian <jeremian [at] poczta.fm>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ */
+
+#include <config.h>
+
+#include "file.h"
+#include "activefor.h"
+#include "logging.h"
+#include "network.h"
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <limits.h>
+#include <ctype.h>
+
+ServerConfiguration*
+parsefile(char* name, int* status)
+{
+ ServerConfiguration* cfg;
+ FILE* file = NULL;
+ int state, i, j, n, listencount, managecount, temp;
+ char buff[256];
+ char helpbuf1[256];
+ char helpbuf2[256];
+ char* tmpbuf;
+ unsigned char pass[4] = {1, 2, 3, 4};
+
+ *status = 1;
+
+ memset(buff, 0, 256);
+
+ cfg = ServerConfiguration_new();
+
+ if (cfg == NULL) {
+ printf("Can't allocate memory for server configuration... exiting\n");
+ exit(1);
+ }
+
+ state = F_UNKNOWN;
+
+ file = fopen(name, "r");
+ if (file == NULL) {
+ return cfg;
+ }
+
+ while (fgets(buff, 256, file) != NULL) { /* first loop - counting realm */
+ helpbuf1[0] = 0;
+ parse_line(buff, helpbuf1, helpbuf2);
+ if (strcmp(helpbuf1, "realm")==0) {
+ ServerConfiguration_set_realmsNumber(cfg, ServerConfiguration_get_realmsNumber(cfg) + 1);
+ }
+ }
+ rewind(file);
+
+ ServerConfiguration_set_realmsTable(cfg,
+ calloc(ServerConfiguration_get_realmsNumber(cfg), sizeof(ServerRealm*)));
+ if (ServerConfiguration_get_realmsTable(cfg) == NULL) {
+ printf("Can't allocate memory for ServerRealm* table... exiting\n");
+ exit(1);
+ }
+ for (i = 0; i < ServerConfiguration_get_realmsNumber(cfg); ++i) {
+ ServerConfiguration_get_realmsTable(cfg)[i] = ServerRealm_new();
+ if (ServerConfiguration_get_realmsTable(cfg)[i] == NULL) {
+ printf("Problem with allocating memory for ServerRealm structure... exiting");
+ exit(1);
+ }
+ ServerRealm_set_password(ServerConfiguration_get_realmsTable(cfg)[i], pass);
+ }
+ ServerConfiguration_set_realmsNumber(cfg, 0);
+ *status = 0;
+
+ listencount = managecount = 0;
+
+
+ while (fgets(buff, 256, file) != NULL) { /* second loop - counting listen */
+ (*status)++;
+ state = parse_line(buff, helpbuf1, helpbuf2);
+ if (state) {
+ if (strcmp(helpbuf1, "realm") == 0) {
+ ServerConfiguration_set_realmsNumber(cfg, ServerConfiguration_get_realmsNumber(cfg) + 1);
+ if (listencount != managecount) {
+ return cfg;
+ }
+ listencount = managecount = 0;
+ }
+ else if ((strcmp(helpbuf1, "listen") == 0) || (strcmp(helpbuf1, "listenport") == 0)) {
+ if (ServerConfiguration_get_realmsNumber(cfg) == 0) {
+ return cfg;
+ }
+ ServerRealm_set_userClientPairs(
+ ServerConfiguration_get_realmsTable(cfg)[ServerConfiguration_get_realmsNumber(cfg) - 1],
+ ServerRealm_get_userClientPairs(ServerConfiguration_get_realmsTable(cfg)[
+ ServerConfiguration_get_realmsNumber(cfg) - 1]) +
+ 1);
+ ++listencount;
+ }
+ else if ((strcmp(helpbuf1, "manage") == 0) || (strcmp(helpbuf1, "manageport") == 0)) {
+ if (ServerConfiguration_get_realmsNumber(cfg) == 0) {
+ return cfg;
+ }
+ ++managecount;
+ }
+ }
+ }
+ rewind(file);
+
+ if (listencount != managecount) {
+ return cfg;
+ }
+
+ for (i = 0; i < ServerConfiguration_get_realmsNumber(cfg); ++i) {
+ ServerRealm_set_usersClientsTable(ServerConfiguration_get_realmsTable(cfg)[i],
+ calloc(ServerRealm_get_userClientPairs(ServerConfiguration_get_realmsTable(cfg)[i]), sizeof(UsrCli*)));
+ if (ServerRealm_get_usersClientsTable(ServerConfiguration_get_realmsTable(cfg)[i]) == NULL) {
+ printf("Problem with allocating memory for UsrCli* table... exiting");
+ return cfg;
+ }
+ for (j = 0; j < ServerRealm_get_userClientPairs(ServerConfiguration_get_realmsTable(cfg)[i]); ++j) {
+ ServerRealm_get_usersClientsTable(ServerConfiguration_get_realmsTable(cfg)[i])[j] = UsrCli_new();
+ if (ServerRealm_get_usersClientsTable(ServerConfiguration_get_realmsTable(cfg)[i])[j] == NULL) {
+ printf("Problem with allocating memory for UsrCli structure... exiting");
+ return cfg;
+ }
+ }
+ }
+
+ ServerConfiguration_set_realmsNumber(cfg, 0);
+ *status = 0;
+
+
+ while (fgets(buff, 256, file) != NULL) { /* third loop - parsing file */
+ (*status)++;
+ state = parse_line(buff, helpbuf1, helpbuf2);
+ if (helpbuf1[0] == '#') {
+ memset(buff, 0, 256);
+ continue;
+ }
+ if (state == 1) {
+ if (strcmp(helpbuf1, "realm")==0) {
+ ServerConfiguration_set_realmsNumber(cfg, ServerConfiguration_get_realmsNumber(cfg) + 1);
+ temp = ServerRealm_get_realmType(ServerConfiguration_get_realmsTable(cfg)[
+ ServerConfiguration_get_realmsNumber(cfg) - 1]);
+ TYPE_SET_SSL(temp);
+ TYPE_SET_ZLIB(temp);
+ ServerRealm_set_realmType(ServerConfiguration_get_realmsTable(cfg)[
+ ServerConfiguration_get_realmsNumber(cfg) - 1], temp);
+ listencount = managecount = 0;
+ }
+ else if (ServerConfiguration_get_realmsNumber(cfg) == 0) {
+ return cfg;
+ }
+ else if (strcmp(helpbuf1, "nossl")==0) {
+ temp = ServerRealm_get_realmType(ServerConfiguration_get_realmsTable(cfg)[
+ ServerConfiguration_get_realmsNumber(cfg) - 1]);
+ TYPE_UNSET_SSL(temp);
+ ServerRealm_set_realmType(ServerConfiguration_get_realmsTable(cfg)[
+ ServerConfiguration_get_realmsNumber(cfg) - 1], temp);
+ }
+ else if (strcmp(helpbuf1, "nozlib")==0) {
+ temp = ServerRealm_get_realmType(ServerConfiguration_get_realmsTable(cfg)[
+ ServerConfiguration_get_realmsNumber(cfg) - 1]);
+ TYPE_UNSET_ZLIB(temp);
+ ServerRealm_set_realmType(ServerConfiguration_get_realmsTable(cfg)[
+ ServerConfiguration_get_realmsNumber(cfg) - 1], temp);
+ }
+ else if (strcmp(helpbuf1, "baseport")==0) {
+ ServerRealm_set_basePortOn(
+ ServerConfiguration_get_realmsTable(cfg)[ServerConfiguration_get_realmsNumber(cfg) - 1],
+ 1);
+ }
+ else if (strcmp(helpbuf1, "audit")==0) {
+ ServerRealm_set_auditOn(
+ ServerConfiguration_get_realmsTable(cfg)[ServerConfiguration_get_realmsNumber(cfg) - 1],
+ 1);
+ }
+ else if (strcmp(helpbuf1, "dnslookups")==0) {
+ ServerRealm_set_dnsLookupsOn(
+ ServerConfiguration_get_realmsTable(cfg)[ServerConfiguration_get_realmsNumber(cfg) - 1],
+ 1);
+ }
+#ifdef HAVE_LIBPTHREAD
+ else if (strcmp(helpbuf1, "enableproxy")==0) {
+ if (ServerRealm_get_tunnelType(
+ ServerConfiguration_get_realmsTable(cfg)[ServerConfiguration_get_realmsNumber(cfg) - 1]) == 0) {
+ ServerRealm_set_tunnelType(
+ ServerConfiguration_get_realmsTable(cfg)[ServerConfiguration_get_realmsNumber(cfg) - 1],
+ 1);
+ }
+ else {
+ return cfg;
+ }
+ }
+#endif
+#ifdef AF_INET6
+ else if (strcmp(helpbuf1, "ipv4")==0) {
+ if (TYPE_IS_UNSPEC(ServerRealm_get_realmType(
+ ServerConfiguration_get_realmsTable(cfg)[ServerConfiguration_get_realmsNumber(cfg) - 1]))) {
+ temp = ServerRealm_get_realmType(ServerConfiguration_get_realmsTable(cfg)[
+ ServerConfiguration_get_realmsNumber(cfg) - 1]);
+ TYPE_SET_IPV4(temp);
+ ServerRealm_set_realmType(ServerConfiguration_get_realmsTable(cfg)[
+ ServerConfiguration_get_realmsNumber(cfg) - 1], temp);
+ }
+ else {
+ return cfg;
+ }
+ }
+ else if (strcmp(helpbuf1, "ipv6")==0) {
+ if (TYPE_IS_UNSPEC(ServerRealm_get_realmType(
+ ServerConfiguration_get_realmsTable(cfg)[ServerConfiguration_get_realmsNumber(cfg) - 1]))) {
+ temp = ServerRealm_get_realmType(ServerConfiguration_get_realmsTable(cfg)[
+ ServerConfiguration_get_realmsNumber(cfg) - 1]);
+ TYPE_SET_IPV6(temp);
+ ServerRealm_set_realmType(ServerConfiguration_get_realmsTable(cfg)[
+ ServerConfiguration_get_realmsNumber(cfg) - 1], temp);
+ }
+ else {
+ return cfg;
+ }
+ }
+#endif
+ else {
+ return cfg;
+ }
+ }
+ else if (state == 2) {
+ if (strcmp(helpbuf1, "realm")==0) {
+ ServerConfiguration_set_realmsNumber(cfg, ServerConfiguration_get_realmsNumber(cfg) + 1);
+ temp = ServerRealm_get_realmType(ServerConfiguration_get_realmsTable(cfg)[
+ ServerConfiguration_get_realmsNumber(cfg) - 1]);
+ TYPE_SET_SSL(temp);
+ TYPE_SET_ZLIB(temp);
+ ServerRealm_set_realmType(ServerConfiguration_get_realmsTable(cfg)[
+ ServerConfiguration_get_realmsNumber(cfg) - 1], temp);
+ listencount = managecount = 0;
+ ServerRealm_set_realmName(
+ ServerConfiguration_get_realmsTable(cfg)[ServerConfiguration_get_realmsNumber(cfg) - 1],
+ helpbuf2);
+ }
+ else if ((strcmp(helpbuf1, "certificate") == 0) || (strcmp(helpbuf1, "cerfile") == 0)) {
+ ServerConfiguration_set_certificateFile(cfg, helpbuf2);
+ }
+ else if ((strcmp(helpbuf1, "key") == 0) || (strcmp(helpbuf1, "keyfile") == 0)) {
+ ServerConfiguration_set_keysFile(cfg, helpbuf2);
+ }
+ else if (strcmp(helpbuf1, "log")==0) {
+ tmpbuf = calloc(strlen(helpbuf2)+1, sizeof(char));
+ strcpy(tmpbuf, helpbuf2);
+ addlogtarget(tmpbuf);
+ }
+ else if (strcmp(helpbuf1, "dateformat")==0) {
+ ServerConfiguration_set_dateFormat(cfg, helpbuf2);
+ }
+ else if (ServerConfiguration_get_realmsNumber(cfg) == 0) {
+ return cfg;
+ }
+ else if (strcmp(helpbuf1, "hostname")==0) {
+ ServerRealm_set_hostName(
+ ServerConfiguration_get_realmsTable(cfg)[ServerConfiguration_get_realmsNumber(cfg) - 1],
+ helpbuf2);
+ }
+ else if ((strcmp(helpbuf1, "listen") == 0) || (strcmp(helpbuf1, "listenport") == 0)) {
+ UsrCli_set_listenPortName(
+ ServerRealm_get_usersClientsTable(
+ ServerConfiguration_get_realmsTable(cfg)[
+ ServerConfiguration_get_realmsNumber(cfg) - 1])[listencount], helpbuf2);
+ ++listencount;
+ }
+ else if (strcmp(helpbuf1, "pass")==0) {
+ n = strlen(helpbuf2);
+ memset(pass, 0, 4);
+ for (i = 0; i < n; ++i) {
+ pass[i%4] += helpbuf2[i];
+ }
+ ServerRealm_set_password(
+ ServerConfiguration_get_realmsTable(cfg)[ServerConfiguration_get_realmsNumber(cfg) - 1],
+ pass);
+ }
+ else if ((strcmp(helpbuf1, "manage") == 0) || (strcmp(helpbuf1, "manageport") == 0)) {
+ UsrCli_set_managePortName(
+ ServerRealm_get_usersClientsTable(
+ ServerConfiguration_get_realmsTable(cfg)[
+ ServerConfiguration_get_realmsNumber(cfg) - 1])[managecount], helpbuf2);
+ ++managecount;
+ }
+ else if (strcmp(helpbuf1, "users")==0) {
+ ServerRealm_set_sUsersLimit(
+ ServerConfiguration_get_realmsTable(cfg)[ServerConfiguration_get_realmsNumber(cfg) - 1],
+ helpbuf2);
+ }
+ else if (strcmp(helpbuf1, "timeout")==0) {
+ ServerRealm_set_sTimeout(
+ ServerConfiguration_get_realmsTable(cfg)[ServerConfiguration_get_realmsNumber(cfg) - 1],
+ helpbuf2);
+ }
+ else if (strcmp(helpbuf1, "clients")==0) {
+ ServerRealm_set_sClientsLimit(
+ ServerConfiguration_get_realmsTable(cfg)[ServerConfiguration_get_realmsNumber(cfg) - 1],
+ helpbuf2);
+ }
+ else if (strcmp(helpbuf1, "raclients")==0) {
+ ServerRealm_set_sRaClientsLimit(
+ ServerConfiguration_get_realmsTable(cfg)[ServerConfiguration_get_realmsNumber(cfg) - 1],
+ helpbuf2);
+ }
+ else if (strcmp(helpbuf1, "usrpcli")==0) {
+ ServerRealm_set_sUsersPerClient(
+ ServerConfiguration_get_realmsTable(cfg)[ServerConfiguration_get_realmsNumber(cfg) - 1],
+ helpbuf2);
+ }
+ else if (strcmp(helpbuf1, "climode")==0) {
+ ServerRealm_set_sClientMode(
+ ServerConfiguration_get_realmsTable(cfg)[ServerConfiguration_get_realmsNumber(cfg) - 1],
+ helpbuf2);
+ }
+ else if (strcmp(helpbuf1, "proto")==0) {
+ if (TYPE_IS_SET(ServerRealm_get_realmType(
+ ServerConfiguration_get_realmsTable(cfg)[ServerConfiguration_get_realmsNumber(cfg) - 1]))) {
+ return cfg;
+ }
+ if (strcmp(helpbuf2, "tcp")==0) {
+ temp = ServerRealm_get_realmType(ServerConfiguration_get_realmsTable(cfg)[
+ ServerConfiguration_get_realmsNumber(cfg) - 1]);
+ TYPE_SET_TCP(temp);
+ ServerRealm_set_realmType(ServerConfiguration_get_realmsTable(cfg)[
+ ServerConfiguration_get_realmsNumber(cfg) - 1], temp);
+ }
+ else if (strcmp(helpbuf2, "udp")==0) {
+ temp = ServerRealm_get_realmType(ServerConfiguration_get_realmsTable(cfg)[
+ ServerConfiguration_get_realmsNumber(cfg) - 1]);
+ TYPE_SET_UDP(temp);
+ ServerRealm_set_realmType(ServerConfiguration_get_realmsTable(cfg)[
+ ServerConfiguration_get_realmsNumber(cfg) - 1], temp);
+ }
+ else {
+ return cfg;
+ }
+ }
+ else {
+ return cfg;
+ }
+ }
+ memset(buff, 0, 256);
+ }
+
+ fclose(file);
+
+ *status = 0;
+ return cfg;
+}
diff --git a/src/http_proxy_client.c b/src/http_proxy_client.c
index 9f0cc7c..6880d73 100644
--- a/src/http_proxy_client.c
+++ b/src/http_proxy_client.c
@@ -136,7 +136,7 @@ http_proxy_client(void *vptr)
/* postfd */
aflog(LOG_T_MAIN, LOG_I_DEBUG,
"http%s proxy: connecting (postfd)...", name);
- if (ip_connect(&tmp, proxyname, proxyport, type)) {
+ if (ip_connect(&tmp, proxyname, proxyport, type, NULL, NULL)) {
clean_return(conn.sockfd);
}
SslFd_set_fd(conn.postFd, tmp);
@@ -180,7 +180,7 @@ http_proxy_client(void *vptr)
/* getfd */
aflog(LOG_T_MAIN, LOG_I_DEBUG,
"http%s proxy: connecting (getfd)...", name);
- if (ip_connect(&tmp, proxyname, proxyport, type)) {
+ if (ip_connect(&tmp, proxyname, proxyport, type, NULL, NULL)) {
clean_return(conn.sockfd);
}
SslFd_set_fd(conn.getFd, tmp);
@@ -264,7 +264,7 @@ http_proxy_client(void *vptr)
/* postfd */
aflog(LOG_T_MAIN, LOG_I_DEBUG,
"http%s proxy: connecting (postfd)...", name);
- if (ip_connect(&tmp, proxyname, proxyport, type)) {
+ if (ip_connect(&tmp, proxyname, proxyport, type, NULL, NULL)) {
clean_return(conn.sockfd);
}
SslFd_set_fd(conn.postFd, tmp);
@@ -327,7 +327,7 @@ http_proxy_client(void *vptr)
/* postfd */
aflog(LOG_T_MAIN, LOG_I_DEBUG,
"http%s proxy: connecting (postfd)...", name);
- if (ip_connect(&tmp, proxyname, proxyport, type)) {
+ if (ip_connect(&tmp, proxyname, proxyport, type, NULL, NULL)) {
clean_return(conn.sockfd);
}
SslFd_set_fd(conn.postFd, tmp);
@@ -367,7 +367,7 @@ http_proxy_client(void *vptr)
/* postfd */
aflog(LOG_T_MAIN, LOG_I_DEBUG,
"http%s proxy: connecting (postfd)...", name);
- if (ip_connect(&tmp, proxyname, proxyport, type)) {
+ if (ip_connect(&tmp, proxyname, proxyport, type, NULL, NULL)) {
clean_return(conn.sockfd);
}
SslFd_set_fd(conn.postFd, tmp);
@@ -441,7 +441,7 @@ http_proxy_client(void *vptr)
/* getfd */
aflog(LOG_T_MAIN, LOG_I_DEBUG,
"http%s proxy: connecting (getfd)...", name);
- if (ip_connect(&tmp, proxyname, proxyport, type)) {
+ if (ip_connect(&tmp, proxyname, proxyport, type, NULL, NULL)) {
clean_return(conn.sockfd);
}
SslFd_set_fd(conn.getFd, tmp);
@@ -520,8 +520,7 @@ http_proxy_client(void *vptr)
}
int
-initialize_http_proxy_client(int* sockfd, const char *host, const char *serv,
- HttpProxyOptions* hpo, const char type, SSL_CTX* ctx)
+initialize_http_proxy_client(int* sockfd, ClientRealm* cr, SSL_CTX* ctx)
{
int retval;
int sockets[2];
@@ -533,16 +532,16 @@ initialize_http_proxy_client(int* sockfd, const char *host, const char *serv,
}
(*sockfd) = sockets[0];
- if (HttpProxyOptions_get_proxyname(hpo) == NULL) {
+ if (HttpProxyOptions_get_proxyname(ClientRealm_get_httpProxyOptions(cr)) == NULL) {
return 1;
}
start_critical_section();
- arg.host = (char*) host;
- arg.serv = (char*) serv;
- arg.hpo = hpo;
- arg.type = (char) type;
+ arg.host = ClientRealm_get_serverName(cr);
+ arg.serv = ClientRealm_get_managePort(cr);
+ arg.hpo = ClientRealm_get_httpProxyOptions(cr);
+ arg.type = ClientRealm_get_ipFamily(cr);
arg.sockfd = sockets[1];
arg.ctx = ctx;
diff --git a/src/http_proxy_client.h b/src/http_proxy_client.h
index 31044f3..3ca3459 100644
--- a/src/http_proxy_client.h
+++ b/src/http_proxy_client.h
@@ -19,11 +19,11 @@
*/
#include "http_proxy_options_struct.h"
+#include "client_realm_struct.h"
#ifndef _JS_HTTP_PROXY_CLIENT_H
#define _JS_HTTP_PROXY_CLIENT_H
-int initialize_http_proxy_client(int* sockfd, const char *host, const char *serv,
- HttpProxyOptions* hpo, const char type, SSL_CTX* ctx);
+int initialize_http_proxy_client(int* sockfd, ClientRealm* cr, SSL_CTX* ctx);
#endif
diff --git a/src/logging.c b/src/logging.c
index 650ce9e..4683fd7 100644
--- a/src/logging.c
+++ b/src/logging.c
@@ -204,7 +204,7 @@ checklogtarget(llnodeT* target)
case 2: {
if ((*ptr) == ',') {
tab[i] = 0;
- if (ip_connect(&tmpfd, desc, tab, 1)) {
+ if (ip_connect(&tmpfd, desc, tab, 1, NULL, NULL)) {
return 5; /* can't connect to host:port */
}
target->logfd = fdopen(tmpfd, "a");
diff --git a/src/module_struct.c b/src/module_struct.c
new file mode 100644
index 0000000..66d760f
--- /dev/null
+++ b/src/module_struct.c
@@ -0,0 +1,217 @@
+/*
+ * active port forwarder - software for secure forwarding
+ * Copyright (C) 2003,2004,2005 jeremian <jeremian [at] poczta.fm>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ */
+
+#include <config.h>
+
+#ifdef HAVE_LIBDL
+
+#include "string_functions.h"
+#include "module_struct.h"
+
+#include <stdlib.h>
+#include <dlfcn.h>
+
+/*
+ * Function name: Module_new
+ * Description: Create and initialize new Module structure.
+ * Returns: Pointer to newly created Module structure.
+ */
+
+Module*
+Module_new()
+{
+ Module* tmp = calloc(1, sizeof(Module));
+ if (tmp == NULL) {
+ return NULL;
+ }
+ return tmp;
+}
+
+/*
+ * Function name: Module_free
+ * Description: Free the memory allocated for Module structure.
+ * Arguments: m - pointer to pointer to Module structure
+ */
+
+void
+Module_free(Module** m)
+{
+ if (m == NULL) {
+ return;
+ }
+ if ((*m) == NULL) {
+ return;
+ }
+ Module_releaseModule(*m);
+ if ((*m)->fileName) {
+ free((*m)->fileName);
+ (*m)->fileName = NULL;
+ }
+ free((*m));
+ (*m) = NULL;
+}
+
+/*
+ * Function name: Module_set_fileName
+ * Description: Set the filename of the module.
+ * Arguments: m - pointer to Module structure
+ * fileName - the filename of the module
+ */
+
+void
+Module_set_fileName(Module* m, char* fileName)
+{
+ if (m == NULL) {
+ return;
+ }
+ string_cp(&(m->fileName), fileName);
+}
+
+/*
+ * Function name: Module_get_fileName
+ * Description: Get the filename of the module.
+ * Arguments: m - pointer to Module structure
+ * Returns: The filename of the module.
+ */
+
+char*
+Module_get_fileName(Module* m)
+{
+ if (m == NULL) {
+ return NULL;
+ }
+ return m->fileName;
+}
+
+/*
+ * Function name: Module_loadModule
+ * Description: Load the module into the memory.
+ * Arguments: m - pointer to Module structure
+ * Returns: 0 - successful/filename not set
+ * 1/2 - some errors occured.
+ */
+
+int
+Module_loadModule(Module* m)
+{
+ if (Module_get_fileName(m)) {
+ m->handle = dlopen(Module_get_fileName(m), RTLD_NOW);
+ if (!m->handle) {
+ return 1;
+ }
+ dlerror();
+ *(void**) (&m->info) = dlsym(m->handle, "info");
+ *(void**) (&m->allow) = dlsym(m->handle, "allow");
+ *(void**) (&m->filter) = dlsym(m->handle, "filter");
+ if (dlerror() != NULL) {
+ return 2;
+ }
+ m->loaded = 1;
+ }
+ return 0;
+}
+
+/*
+ * Function name: Module_releaseModule
+ * Description: Unload the module from the memory.
+ * Arguments: m - pointer to Module structure
+ * Returns: 0 - successful/module was not loaded
+ * !0 - some errors occured.
+ */
+
+int
+Module_releaseModule(Module* m)
+{
+ if (Module_isModuleLoaded(m)) {
+ m->loaded = 0;
+ m->info = NULL;
+ m->allow = NULL;
+ m->filter = NULL;
+ return dlclose(m->handle);
+ }
+ return 0;
+}
+
+/*
+ * Function name: Module_isModuleLoaded
+ * Description: Check if the module is loaded into the memory.
+ * Arguments: m - pointer to Module structure
+ * Returns: 0 - module is not loaded
+ * 1 - module is loaded.
+ */
+
+int
+Module_isModuleLoaded(Module* m)
+{
+ if (m == NULL) {
+ return 0;
+ }
+ return m->loaded;
+}
+
+/*
+ * Function name: Module_function_info
+ * Description: Exec the info function of the module.
+ * Arguments: m - pointer to Module structure
+ * Returns: Result of the info function of the module.
+ */
+
+char*
+Module_function_info(Module* m)
+{
+ if (!Module_isModuleLoaded(m)) {
+ return NULL;
+ }
+ return m->info();
+}
+
+/*
+ * Function name: Module_function_allow
+ * Description: Exec the allow function of the module.
+ * Arguments: m - pointer to Module structure
+ * Returns: Result of the allow function of the module.
+ */
+
+int
+Module_function_allow(Module* m, char* host, char* port)
+{
+ if (!Module_isModuleLoaded(m)) {
+ return 0;
+ }
+ return m->allow(host, port);
+}
+
+/*
+ * Function name: Module_function_filter
+ * Description: Exec the filter function of the module.
+ * Arguments: m - pointer to Module structure
+ * Returns: Result of the filter function of the module.
+ */
+
+int
+Module_function_filter(Module* m, char* host, unsigned char* message, int* messageLength)
+{
+ if (!Module_isModuleLoaded(m)) {
+ return 0;
+ }
+ return m->filter(host, message, messageLength);
+}
+
+#endif
diff --git a/src/modules.h b/src/module_struct.h
index f6f8ea9..cd2c6e8 100644
--- a/src/modules.h
+++ b/src/module_struct.h
@@ -22,21 +22,33 @@
#ifdef HAVE_LIBDL
-# ifndef _JS_MODULES_H
-# define _JS_MODULES_H
+# ifndef _JS_MODULE_STRUCT_H
+# define _JS_MODULE_STRUCT_H
typedef struct {
char loaded;
- char* name;
+ char* fileName;
void* handle;
char* (*info)(void);
int (*allow)(char*, char*);
int (*filter)(char*, unsigned char*, int*);
-} moduleT;
+} Module;
-int loadmodule(moduleT* module);
-int releasemodule(moduleT* module);
-int ismloaded(moduleT* module);
+/* 'constructor' */
+Module* Module_new();
+/* 'destructor' */
+void Module_free(Module** m);
+/* setters */
+void Module_set_fileName(Module* m, char* fileName);
+/* getters */
+char* Module_get_fileName(Module* m);
+/* other */
+int Module_loadModule(Module* m);
+int Module_releaseModule(Module* m);
+int Module_isModuleLoaded(Module* m);
+char* Module_function_info(Module* m);
+int Module_function_allow(Module* m, char* host, char* port);
+int Module_function_filter(Module* m, char* host, unsigned char* message, int* messageLength);
# endif
diff --git a/src/modules.c b/src/modules.c
deleted file mode 100644
index 0d153be..0000000
--- a/src/modules.c
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * active port forwarder - software for secure forwarding
- * Copyright (C) 2003,2004,2005 jeremian <jeremian [at] poczta.fm>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
- */
-
-#include <config.h>
-
-#ifdef HAVE_LIBDL
-
-#include "modules.h"
-
-#include <stdlib.h>
-#include <dlfcn.h>
-
-int
-loadmodule(moduleT* module)
-{
- if (module->name) {
- module->handle = dlopen(module->name, RTLD_NOW);
- if (!module->handle) {
- return 1;
- }
- dlerror();
- *(void**) (&module->info) = dlsym(module->handle, "info");
- *(void**) (&module->allow) = dlsym(module->handle, "allow");
- *(void**) (&module->filter) = dlsym(module->handle, "filter");
- if (dlerror() != NULL) {
- return 2;
- }
- module->loaded = 1;
- }
- return 0;
-}
-
-int
-releasemodule(moduleT* module)
-{
- if (ismloaded(module)) {
- module->loaded = 0;
- module->info = NULL;
- module->allow = NULL;
- module->filter = NULL;
- return dlclose(module->handle);
- }
- return 0;
-}
-
-int
-ismloaded(moduleT* module)
-{
- return module->loaded;
-}
-
-#endif
diff --git a/src/network.c b/src/network.c
index 38569cc..60c17e9 100644
--- a/src/network.c
+++ b/src/network.c
@@ -125,6 +125,7 @@ ip_listen(int* sockfd, const char *host, const char *serv, socklen_t *addrlenp,
servaddr.sin_port = htons(port);
if (bind((*sockfd), (struct sockaddr*) &servaddr, sizeof(servaddr))){
+ printf("bind failed\n");
return 4;
}
@@ -137,11 +138,14 @@ ip_listen(int* sockfd, const char *host, const char *serv, socklen_t *addrlenp,
}
int
-ip_connect(int* sockfd, const char *host, const char *serv, const char type)
+ip_connect(int* sockfd, const char *host, const char *serv, const char type,
+ const char *lhost, const char *lserv)
{
#if defined(HAVE_GETADDRINFO) && defined(AF_INET6)
int n;
+ int bindFailed;
struct addrinfo hints, *res, *ressave;
+ struct addrinfo lhints, *lres, *lressave = NULL;
bzero(&hints, sizeof(struct addrinfo));
if (type & 0x02) {
@@ -160,6 +164,15 @@ ip_connect(int* sockfd, const char *host, const char *serv, const char type)
hints.ai_socktype = SOCK_DGRAM;
}
+ lhints = hints;
+
+ if (lhost || lserv) {
+ if ( (n = getaddrinfo(lhost, lserv, &lhints, &lres)) != 0) {
+ return n;
+ }
+ lressave = lres;
+ }
+
if ( (n = getaddrinfo(host, serv, &hints, &res)) != 0) {
return n;
}
@@ -171,7 +184,24 @@ ip_connect(int* sockfd, const char *host, const char *serv, const char type)
continue; /* ignore this one */
}
- if (connect((*sockfd), res->ai_addr, res->ai_addrlen) == 0) {
+ bindFailed = 0;
+ if (lhost || lserv) {
+ bindFailed = 1;
+ lres = lressave;
+ do {
+ if (bind((*sockfd), lres->ai_addr, lres->ai_addrlen) == 0) {
+ bindFailed = 0;
+ break; /* success */
+ }
+ } while ( (lres = lres->ai_next) != NULL);
+ }
+
+ if (bindFailed == 1) {
+ close((*sockfd)); /* ignore this one */
+ continue;
+ }
+
+ if (connect((*sockfd), res->ai_addr, res->ai_addrlen) == 0) {
break; /* success */
}
@@ -182,11 +212,15 @@ ip_connect(int* sockfd, const char *host, const char *serv, const char type)
return 1;
}
+ if (lhost || lserv) {
+ freeaddrinfo(lressave);
+ }
freeaddrinfo(ressave);
#else
- struct sockaddr_in servaddr;
+ struct sockaddr_in servaddr, lservaddr;
struct hostent* hostaddr;
- int port;
+ struct hostent* lhostaddr;
+ int port, lport;
if (type & 0x01) {
(*sockfd) = socket(AF_INET, SOCK_STREAM, 0);
@@ -210,8 +244,30 @@ ip_connect(int* sockfd, const char *host, const char *serv, const char type)
servaddr.sin_port = htons(port);
memcpy(&servaddr.sin_addr.s_addr, hostaddr->h_addr_list[0], hostaddr->h_length);
+ if (lhost || lserv) {
+ memset(&lservaddr, 0, sizeof(lservaddr));
+ lservaddr.sin_family = AF_INET;
+ if (lserv) {
+ lport = atoi(lserv);
+ lservaddr.sin_port = htons(lport);
+ }
+ if (lhost) {
+ lhostaddr = gethostbyname(lhost);
+ if (lhostaddr == NULL) {
+ return 3;
+ }
+ memcpy(&lservaddr.sin_addr.s_addr, lhostaddr->h_addr_list[0], lhostaddr->h_length);
+ }
+ else {
+ lservaddr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
+ }
+ if (bind((*sockfd), (struct sockaddr*) &lservaddr, sizeof(lservaddr))){
+ return 4;
+ }
+ }
+
if (connect((*sockfd), (struct sockaddr*) &servaddr, sizeof(servaddr))){
- return 3;
+ return 5;
}
#endif
diff --git a/src/network.h b/src/network.h
index 6c7e640..4702d1f 100644
--- a/src/network.h
+++ b/src/network.h
@@ -37,7 +37,8 @@
#include <openssl/ssl.h>
int ip_listen(int* sockfd, const char *host, const char *serv, socklen_t *addrlenp, const char type); /* socket, bind, listen... */
-int ip_connect(int* sockfd, const char *host, const char *serv, const char type); /* socket, connect... */
+int ip_connect(int* sockfd, const char *host, const char *serv, const char type,
+ const char *lhost, const char *lserv); /* socket[, bind], connect... */
char* sock_ntop(const struct sockaddr* sa, socklen_t salen, char* namebuf, char* portbuf, char type); /* return the IP of connected user */
int SSL_writen(SSL* fd, unsigned char* buf, int amount);
diff --git a/src/realmnames.c b/src/realmnames.c
index 77065bf..be57f8e 100644
--- a/src/realmnames.c
+++ b/src/realmnames.c
@@ -25,36 +25,36 @@
#include "realmnames.h"
char*
-get_realmname(ConfigurationT* config, int realm)
+get_realmname(ServerConfiguration* config, int realm)
{
static char realmname[10];
- if (config->realmtable[realm].realmname == NULL) {
+ if (ServerRealm_get_realmName(ServerConfiguration_get_realmsTable(config)[realm]) == NULL) {
memset(realmname, 0, 10);
sprintf(realmname, "%d", realm);
return realmname;
}
- return config->realmtable[realm].realmname;
+ return ServerRealm_get_realmName(ServerConfiguration_get_realmsTable(config)[realm]);
}
int
-get_realmnumber(ConfigurationT* config, char* realmname)
+get_realmnumber(ServerConfiguration* config, char* realmname)
{
int i;
char guard;
- for (i = 0; i < config->size; ++i) {
- if (config->realmtable[i].realmname != NULL) {
- if (strcmp(realmname, config->realmtable[i].realmname) == 0) {
+ for (i = 0; i < ServerConfiguration_get_realmsNumber(config); ++i) {
+ if (ServerRealm_get_realmName(ServerConfiguration_get_realmsTable(config)[i]) != NULL) {
+ if (strcmp(realmname, ServerRealm_get_realmName(ServerConfiguration_get_realmsTable(config)[i])) == 0) {
return i;
}
}
}
if (sscanf(realmname, "%d%c", &i, &guard) == 1) {
- if ((i >= 0) && (i < config->size)) {
- if (config->realmtable[i].realmname == NULL) {
+ if ((i >= 0) && (i < ServerConfiguration_get_realmsNumber(config))) {
+ if (ServerRealm_get_realmName(ServerConfiguration_get_realmsTable(config)[i]) == NULL) {
return i;
}
}
diff --git a/src/realmnames.h b/src/realmnames.h
index 70ad46f..6b153d6 100644
--- a/src/realmnames.h
+++ b/src/realmnames.h
@@ -19,12 +19,13 @@
*/
#include "activefor.h"
+#include "server_configuration_struct.h"
#ifndef _JS_REALMNAMES_H
#define _JS_REALMNAMES_H
-char* get_realmname(ConfigurationT*, int);
-int get_realmnumber(ConfigurationT*, char*);
+char* get_realmname(ServerConfiguration*, int);
+int get_realmnumber(ServerConfiguration*, char*);
#endif
diff --git a/src/server_check.c b/src/server_check.c
index 3fd1091..eb65d97 100644
--- a/src/server_check.c
+++ b/src/server_check.c
@@ -28,8 +28,8 @@
#include "stats.h"
#include "logging.h"
-void
-check_value(int* where, char* what, char* info)
+int
+check_value(char* what, char* info)
{
long tmp = check_value_liberal(what, info);
@@ -38,7 +38,7 @@ check_value(int* where, char* what, char* info)
"%s: %d\n", info, tmp);
exit(1);
}
- (*where) = tmp;
+ return tmp;
}
int
diff --git a/src/server_check.h b/src/server_check.h
index 0b4ddbf..5428a4a 100644
--- a/src/server_check.h
+++ b/src/server_check.h
@@ -21,7 +21,7 @@
#ifndef _JS_SERVER_CHECK_H
#define _JS_SERVER_CHECK_H
-void check_value(int* where, char* what, char* info);
+int check_value(char* what, char* info);
int check_value_liberal(char* what, char* info);
int check_long(char* text, long* number);
diff --git a/src/server_configuration_struct.c b/src/server_configuration_struct.c
new file mode 100644
index 0000000..58cac07
--- /dev/null
+++ b/src/server_configuration_struct.c
@@ -0,0 +1,286 @@
+/*
+ * active port forwarder - software for secure forwarding
+ * Copyright (C) 2003,2004,2005 jeremian <jeremian [at] poczta.fm>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ */
+
+#include <config.h>
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "string_functions.h"
+#include "server_configuration_struct.h"
+
+/*
+ * Function name: ServerConfiguration_new
+ * Description: Create and initialize new ServerConfiguration structure.
+ * Returns: Pointer to newly created ServerConfiguration structure.
+ */
+
+ServerConfiguration*
+ServerConfiguration_new()
+{
+ ServerConfiguration* tmp = calloc(1, sizeof(ServerConfiguration));
+ if (tmp == NULL) {
+ return NULL;
+ }
+ return tmp;
+}
+
+/*
+ * Function name: ServerConfiguration_free
+ * Description: Free the memory allocated for ServerConfiguration structure.
+ * Arguments: sc - pointer to pointer to ServerConfiguration structure
+ */
+
+void
+ServerConfiguration_free(ServerConfiguration** sc)
+{
+ int i;
+ if (sc == NULL) {
+ return;
+ }
+ if ((*sc) == NULL) {
+ return;
+ }
+ if ((*sc)->certificateFile) {
+ free((*sc)->certificateFile);
+ (*sc)->certificateFile = NULL;
+ }
+ if ((*sc)->keysFile) {
+ free((*sc)->keysFile);
+ (*sc)->keysFile = NULL;
+ }
+ if ((*sc)->dateFormat) {
+ free((*sc)->dateFormat);
+ (*sc)->dateFormat = NULL;
+ }
+ if ((*sc)->realmsTable) {
+ for (i = 0; i < (*sc)->realmsNumber; ++i) {
+ if ((*sc)->realmsTable[i]) {
+ ServerRealm_free(&((*sc)->realmsTable[i]));
+ }
+ }
+ free((*sc)->realmsTable);
+ (*sc)->realmsTable = NULL;
+ }
+ free((*sc));
+ (*sc) = NULL;
+}
+
+/*
+ * Function name: ServerConfiguration_set_certificateFile
+ * Description: Set certificate filename.
+ * Arguments: sc - pointer to ServerConfiguration structure
+ * certificateFile - certificate filename
+ */
+
+void
+ServerConfiguration_set_certificateFile(ServerConfiguration* sc, char* certificateFile)
+{
+ if (sc == NULL) {
+ return;
+ }
+ string_cp(&(sc->certificateFile), certificateFile);
+}
+
+/*
+ * Function name: ServerConfiguration_set_keysFile
+ * Description: Set keys filename.
+ * Arguments: sc - pointer to ServerConfiguration structure
+ * keysFile - keys filename
+ */
+
+void
+ServerConfiguration_set_keysFile(ServerConfiguration* sc, char* keysFile)
+{
+ if (sc == NULL) {
+ return;
+ }
+ string_cp(&(sc->keysFile), keysFile);
+}
+
+/*
+ * Function name: ServerConfiguration_set_dateFormat
+ * Description: Set format of the date string.
+ * Arguments: sc - pointer to ServerConfiguration structure
+ * dateFormat - format of the date string
+ */
+
+void
+ServerConfiguration_set_dateFormat(ServerConfiguration* sc, char* dateFormat)
+{
+ if (sc == NULL) {
+ return;
+ }
+ string_cp(&(sc->dateFormat), dateFormat);
+}
+
+/*
+ * Function name: ServerConfiguration_set_realmsNumber
+ * Description: Set number of realms.
+ * Arguments: sc - pointer to ServerConfiguration structure
+ * realmsNumber - number of realms
+ */
+
+void
+ServerConfiguration_set_realmsNumber(ServerConfiguration* sc, int realmsNumber)
+{
+ if (sc == NULL) {
+ return;
+ }
+ sc->realmsNumber = realmsNumber;
+}
+
+/*
+ * Function name: ServerConfiguration_set_startTime
+ * Description: Set start time of the server.
+ * Arguments: sc - pointer to ServerConfiguration structure
+ * startTime - start time of the server
+ */
+
+void
+ServerConfiguration_set_startTime(ServerConfiguration* sc, time_t startTime)
+{
+ if (sc == NULL) {
+ return;
+ }
+ sc->startTime = startTime;
+}
+
+/*
+ * Function name: ServerConfiguration_set_realmsTable
+ * Description: Set table of realms.
+ * Arguments: sc - pointer to ServerConfiguration structure
+ * realmsTable - table of realms
+ */
+
+void
+ServerConfiguration_set_realmsTable(ServerConfiguration* sc, ServerRealm** realmsTable)
+{
+ int i;
+ if (sc == NULL) {
+ return;
+ }
+ if (sc->realmsTable) {
+ for (i = 0; i < sc->realmsNumber; ++i) {
+ if (sc->realmsTable[i]) {
+ ServerRealm_free(&(sc->realmsTable[i]));
+ }
+ }
+ free(sc->realmsTable);
+ sc->realmsTable = NULL;
+ }
+ sc->realmsTable = realmsTable;
+}
+
+/*
+ * Function name: ServerConfiguration_get_certificateFile
+ * Description: Get certificate filename.
+ * Arguments: sc - pointer to ServerConfiguration structure
+ * Returns: Certificate filename.
+ */
+
+char*
+ServerConfiguration_get_certificateFile(ServerConfiguration* sc)
+{
+ if (sc == NULL) {
+ return NULL;
+ }
+ return sc->certificateFile;
+}
+
+/*
+ * Function name: ServerConfiguration_get_keysFile
+ * Description: Get keys filename.
+ * Arguments: sc - pointer to ServerConfiguration structure
+ * Returns: Keys filename.
+ */
+
+char*
+ServerConfiguration_get_keysFile(ServerConfiguration* sc)
+{
+ if (sc == NULL) {
+ return NULL;
+ }
+ return sc->keysFile;
+}
+
+/*
+ * Function name: ServerConfiguration_get_dateFormat
+ * Description: Get format of the date string.
+ * Arguments: sc - pointer to ServerConfiguration structure
+ * Returns: Format of the date string.
+ */
+
+char*
+ServerConfiguration_get_dateFormat(ServerConfiguration* sc)
+{
+ if (sc == NULL) {
+ return NULL;
+ }
+ return sc->dateFormat;
+}
+
+/*
+ * Function name: ServerConfiguration_get_realmsNumber
+ * Description: Get number of realms.
+ * Arguments: sc - pointer to ServerConfiguration structure
+ * Returns: Number of realms.
+ */
+
+int
+ServerConfiguration_get_realmsNumber(ServerConfiguration* sc)
+{
+ if (sc == NULL) {
+ return -1;
+ }
+ return sc->realmsNumber;
+}
+
+/*
+ * Function name: ServerConfiguration_get_startTime
+ * Description: Get start time of the server.
+ * Arguments: sc - pointer to ServerConfiguration structure
+ * Returns: Start time of the server.
+ */
+
+time_t
+ServerConfiguration_get_startTime(ServerConfiguration* sc)
+{
+ if (sc == NULL) {
+ return 0;
+ }
+ return sc->startTime;
+}
+
+/*
+ * Function name: ServerConfiguration_get_realmsTable
+ * Description: Get table of realms.
+ * Arguments: sc - pointer to ServerConfiguration structure
+ * Returns: Table of realms.
+ */
+
+ServerRealm**
+ServerConfiguration_get_realmsTable(ServerConfiguration* sc)
+{
+ if (sc == NULL) {
+ return NULL;
+ }
+ return sc->realmsTable;
+}
diff --git a/src/server_configuration_struct.h b/src/server_configuration_struct.h
new file mode 100644
index 0000000..16ebead
--- /dev/null
+++ b/src/server_configuration_struct.h
@@ -0,0 +1,55 @@
+/*
+ * active port forwarder - software for secure forwarding
+ * Copyright (C) 2003,2004,2005 jeremian <jeremian [at] poczta.fm>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ */
+
+
+#ifndef _JS_SERVER_CONFIGURATION_STRUCT_H
+#define _JS_SERVER_CONFIGURATION_STRUCT_H
+
+#include "server_realm_struct.h"
+
+typedef struct {
+ char* certificateFile;
+ char* keysFile;
+ char* dateFormat;
+ int realmsNumber;
+ time_t startTime;
+ ServerRealm** realmsTable;
+} ServerConfiguration;
+
+/* 'constructor' */
+ServerConfiguration* ServerConfiguration_new();
+/* 'destructor' */
+void ServerConfiguration_free(ServerConfiguration** sc);
+/* setters */
+void ServerConfiguration_set_certificateFile(ServerConfiguration* sc, char* certificateFile);
+void ServerConfiguration_set_keysFile(ServerConfiguration* sc, char* keysFile);
+void ServerConfiguration_set_dateFormat(ServerConfiguration* sc, char* dateFormat);
+void ServerConfiguration_set_realmsNumber(ServerConfiguration* sc, int realmsNumber);
+void ServerConfiguration_set_startTime(ServerConfiguration* sc, time_t startTime);
+void ServerConfiguration_set_realmsTable(ServerConfiguration* sc, ServerRealm** realmsTable);
+/* getters */
+char* ServerConfiguration_get_certificateFile(ServerConfiguration* sc);
+char* ServerConfiguration_get_keysFile(ServerConfiguration* sc);
+char* ServerConfiguration_get_dateFormat(ServerConfiguration* sc);
+int ServerConfiguration_get_realmsNumber(ServerConfiguration* sc);
+time_t ServerConfiguration_get_startTime(ServerConfiguration* sc);
+ServerRealm** ServerConfiguration_get_realmsTable(ServerConfiguration* sc);
+
+#endif
diff --git a/src/server_eval.c b/src/server_eval.c
index 4996621..99bd962 100644
--- a/src/server_eval.c
+++ b/src/server_eval.c
@@ -23,10 +23,10 @@
#include "server_eval.h"
int
-eval_numofcon(RealmT* ptr, int client, int numofcon)
+eval_numofcon(ServerRealm* ptr, int client, int numofcon)
{
- if ((numofcon >= 0) && (numofcon < ConnectClient_get_limit(ptr->clitable[client]))) {
- numofcon = ConnectClient_get_users(ptr->clitable[client])[numofcon];
+ if ((numofcon >= 0) && (numofcon < ConnectClient_get_limit(ServerRealm_get_clientsTable(ptr)[client]))) {
+ numofcon = ConnectClient_get_users(ServerRealm_get_clientsTable(ptr)[client])[numofcon];
}
else {
numofcon = -1;
diff --git a/src/server_eval.h b/src/server_eval.h
index 297e6ec..2de5636 100644
--- a/src/server_eval.h
+++ b/src/server_eval.h
@@ -24,7 +24,7 @@
#ifndef _JS_SERVER_EVAL_H
#define _JS_SERVER_EVAL_H
-int eval_numofcon(RealmT*, int, int);
+int eval_numofcon(ServerRealm*, int, int);
int eval_usernum(ConnectClient*, int);
#endif
diff --git a/src/server_find.c b/src/server_find.c
index 73cb9ba..ca4e143 100644
--- a/src/server_find.c
+++ b/src/server_find.c
@@ -23,17 +23,17 @@
#include "server_find.h"
int
-find_client(RealmT* ptr, char mode, int usrclipair)
+find_client(ServerRealm* ptr, char mode, int usrclipair)
{
int i;
switch(mode) {
case 1: { /* fill first client before go to next */
- for (i = 0; i < ptr->clinum; ++i) {
- if ((ConnectClient_get_state(ptr->clitable[i]) ==
+ for (i = 0; i < ServerRealm_get_clientsLimit(ptr); ++i) {
+ if ((ConnectClient_get_state(ServerRealm_get_clientsTable(ptr)[i]) ==
CONNECTCLIENT_STATE_ACCEPTED) &&
- (ConnectClient_get_usrCliPair(ptr->clitable[i]) == usrclipair)) {
- if (ConnectClient_get_connected(ptr->clitable[i]) <
- ConnectClient_get_limit(ptr->clitable[i])) {
+ (ConnectClient_get_usrCliPair(ServerRealm_get_clientsTable(ptr)[i]) == usrclipair)) {
+ if (ConnectClient_get_connected(ServerRealm_get_clientsTable(ptr)[i]) <
+ ConnectClient_get_limit(ServerRealm_get_clientsTable(ptr)[i])) {
return i;
}
}
diff --git a/src/server_find.h b/src/server_find.h
index dcfe5b5..1460b5d 100644
--- a/src/server_find.h
+++ b/src/server_find.h
@@ -24,7 +24,7 @@
#ifndef _JS_SERVER_FIND_H
#define _JS_SERVER_FIND_H
-int find_client(RealmT*, char, int);
+int find_client(ServerRealm*, char, int);
int find_usernum(ConnectClient*, int);
#endif
diff --git a/src/server_realm_struct.c b/src/server_realm_struct.c
new file mode 100644
index 0000000..a6cfbfd
--- /dev/null
+++ b/src/server_realm_struct.c
@@ -0,0 +1,1327 @@
+/*
+ * active port forwarder - software for secure forwarding
+ * Copyright (C) 2003,2004,2005 jeremian <jeremian [at] poczta.fm>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ */
+
+#include <config.h>
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "string_functions.h"
+#include "server_realm_struct.h"
+
+/*
+ * Function name: ServerRealm_new
+ * Description: Create and initialize new ServerRealm structure.
+ * Returns: Pointer to newly created ServerRealm structure.
+ */
+
+ServerRealm*
+ServerRealm_new()
+{
+ ServerRealm* tmp = calloc(1, sizeof(ServerRealm));
+ if (tmp == NULL) {
+ return NULL;
+ }
+ tmp->password[0] = 1;
+ tmp->password[1] = 2;
+ tmp->password[2] = 3;
+ tmp->password[3] = 4;
+ return tmp;
+}
+
+/*
+ * Function name: ServerRealm_free
+ * Description: Free the memory allocated for ServerRealm structure.
+ * Arguments: sr - pointer to pointer to ServerRealm structure
+ */
+
+void
+ServerRealm_free(ServerRealm** sr)
+{
+ int i;
+ if (sr == NULL) {
+ return;
+ }
+ if ((*sr) == NULL) {
+ return;
+ }
+ if ((*sr)->hostName) {
+ free((*sr)->hostName);
+ (*sr)->hostName = NULL;
+ }
+ if ((*sr)->sUsersLimit) {
+ free((*sr)->sUsersLimit);
+ (*sr)->sUsersLimit = NULL;
+ }
+ if ((*sr)->sClientsLimit) {
+ free((*sr)->sClientsLimit);
+ (*sr)->sClientsLimit = NULL;
+ }
+ if ((*sr)->sRaClientsLimit) {
+ free((*sr)->sRaClientsLimit);
+ (*sr)->sRaClientsLimit = NULL;
+ }
+ if ((*sr)->sUsersPerClient) {
+ free((*sr)->sUsersPerClient);
+ (*sr)->sUsersPerClient = NULL;
+ }
+ if ((*sr)->sClientMode) {
+ free((*sr)->sClientMode);
+ (*sr)->sClientMode = NULL;
+ }
+ if ((*sr)->sTimeout) {
+ free((*sr)->sTimeout);
+ (*sr)->sTimeout = NULL;
+ }
+ if ((*sr)->realmName) {
+ free((*sr)->realmName);
+ (*sr)->realmName = NULL;
+ }
+ if ((*sr)->clientAddress) {
+ free((*sr)->clientAddress);
+ (*sr)->clientAddress = NULL;
+ }
+ if ((*sr)->usersTable) {
+ for (i = 0; i < (*sr)->usersLimit; ++i) {
+ if ((*sr)->usersTable[i]) {
+ ConnectUser_free(&((*sr)->usersTable[i]));
+ }
+ }
+ free((*sr)->usersTable);
+ (*sr)->usersTable = NULL;
+ }
+ if ((*sr)->clientsTable) {
+ for (i = 0; i < (*sr)->clientsLimit; ++i) {
+ if ((*sr)->clientsTable[i]) {
+ ConnectClient_free(&((*sr)->clientsTable[i]));
+ }
+ }
+ free((*sr)->clientsTable);
+ (*sr)->clientsTable = NULL;
+ }
+ if ((*sr)->raClientsTable) {
+ for (i = 0; i < (*sr)->raClientsLimit; ++i) {
+ if ((*sr)->raClientsTable[i]) {
+ ConnectClient_free(&((*sr)->raClientsTable[i]));
+ }
+ }
+ free((*sr)->raClientsTable);
+ (*sr)->raClientsTable = NULL;
+ }
+ if ((*sr)->usersClientsTable) {
+ for (i = 0; i < (*sr)->userClientPairs; ++i) {
+ if ((*sr)->usersClientsTable[i]) {
+ UsrCli_free(&((*sr)->usersClientsTable[i]));
+ }
+ }
+ free((*sr)->usersClientsTable);
+ (*sr)->usersClientsTable = NULL;
+ }
+ free((*sr));
+ (*sr) = NULL;
+}
+
+/*
+ * Function name: ServerRealm_set_hostName
+ * Description: Set realm's host name.
+ * Arguments: sr - pointer to ServerRealm structure
+ * hostName - realm's host name
+ */
+
+void
+ServerRealm_set_hostName(ServerRealm* sr, char* hostName)
+{
+ if (sr == NULL) {
+ return;
+ }
+ string_cp(&(sr->hostName), hostName);
+}
+
+/*
+ * Function name: ServerRealm_set_sUsersLimit
+ * Description: Set users limit description.
+ * Arguments: sr - pointer to ServerRealm structure
+ * sUsersLimit - users limit description
+ */
+
+void
+ServerRealm_set_sUsersLimit(ServerRealm* sr, char* sUsersLimit)
+{
+ if (sr == NULL) {
+ return;
+ }
+ string_cp(&(sr->sUsersLimit), sUsersLimit);
+}
+
+/*
+ * Function name: ServerRealm_set_sClientsLimit
+ * Description: Set clients limit description.
+ * Arguments: sr - pointer to ServerRealm structure
+ * sClientsLimit - clients limit description
+ */
+
+void
+ServerRealm_set_sClientsLimit(ServerRealm* sr, char* sClientsLimit)
+{
+ if (sr == NULL) {
+ return;
+ }
+ string_cp(&(sr->sClientsLimit), sClientsLimit);
+}
+
+/*
+ * Function name: ServerRealm_set_sRaClientsLimit
+ * Description: Set raClients limit description.
+ * Arguments: sr - pointer to ServerRealm structure
+ * sRaClientsLimit - raClients limit description
+ */
+
+void
+ServerRealm_set_sRaClientsLimit(ServerRealm* sr, char* sRaClientsLimit)
+{
+ if (sr == NULL) {
+ return;
+ }
+ string_cp(&(sr->sRaClientsLimit), sRaClientsLimit);
+}
+
+/*
+ * Function name: ServerRealm_set_sUsersPerClient
+ * Description: Set users per client description.
+ * Arguments: sr - pointer to ServerRealm structure
+ * sUsersPerClient - users per client description
+ */
+
+void
+ServerRealm_set_sUsersPerClient(ServerRealm* sr, char* sUsersPerClient)
+{
+ if (sr == NULL) {
+ return;
+ }
+ string_cp(&(sr->sUsersPerClient), sUsersPerClient);
+}
+
+/*
+ * Function name: ServerRealm_set_sClientMode
+ * Description: Set client mode description.
+ * Arguments: sr - pointer to ServerRealm structure
+ * sClientMode - client mode description
+ */
+
+void
+ServerRealm_set_sClientMode(ServerRealm* sr, char* sClientMode)
+{
+ if (sr == NULL) {
+ return;
+ }
+ string_cp(&(sr->sClientMode), sClientMode);
+}
+
+/*
+ * Function name: ServerRealm_set_sTimeout
+ * Description: Set timeout value description.
+ * Arguments: sr - pointer to ServerRealm structure
+ * sTimeout - timeout value description
+ */
+
+void
+ServerRealm_set_sTimeout(ServerRealm* sr, char* sTimeout)
+{
+ if (sr == NULL) {
+ return;
+ }
+ string_cp(&(sr->sTimeout), sTimeout);
+}
+
+/*
+ * Function name: ServerRealm_set_realmName
+ * Description: Set realm's name.
+ * Arguments: sr - pointer to ServerRealm structure
+ * realmName - realm's name
+ */
+
+void
+ServerRealm_set_realmName(ServerRealm* sr, char* realmName)
+{
+ if (sr == NULL) {
+ return;
+ }
+ string_cp(&(sr->realmName), realmName);
+}
+
+/*
+ * Function name: ServerRealm_set_password
+ * Description: Set realm's password.
+ * Arguments: sr - pointer to ServerRealm structure
+ * password - realm's password
+ */
+
+void
+ServerRealm_set_password(ServerRealm* sr, unsigned char* password)
+{
+ if (sr == NULL) {
+ return;
+ }
+ memcpy(sr->password, password, 4);
+}
+
+/*
+ * Function name: ServerRealm_set_connectedUsers
+ * Description: Set number of connected users.
+ * Arguments: sr - pointer to ServerRealm structure
+ * connectedUsers - number of connected users
+ */
+
+void
+ServerRealm_set_connectedUsers(ServerRealm* sr, int connectedUsers)
+{
+ if (sr == NULL) {
+ return;
+ }
+ sr->connectedUsers = connectedUsers;
+}
+
+/*
+ * Function name: ServerRealm_set_usersLimit
+ * Description: Set limit of connected users.
+ * Arguments: sr - pointer to ServerRealm structure
+ * usersLimit - limit of connected users
+ */
+
+void
+ServerRealm_set_usersLimit(ServerRealm* sr, int usersLimit)
+{
+ if (sr == NULL) {
+ return;
+ }
+ sr->usersLimit = usersLimit;
+}
+
+/*
+ * Function name: ServerRealm_set_connectedClients
+ * Description: Set number of connected clients.
+ * Arguments: sr - pointer to ServerRealm structure
+ * connectedClients - number of connected clients
+ */
+
+void
+ServerRealm_set_connectedClients(ServerRealm* sr, int connectedClients)
+{
+ if (sr == NULL) {
+ return;
+ }
+ sr->connectedClients = connectedClients;
+}
+
+/*
+ * Function name: ServerRealm_set_clientsLimit
+ * Description: Set limit of connected clients.
+ * Arguments: sr - pointer to ServerRealm structure
+ * clientsLimit - limit of connected clients
+ */
+
+void
+ServerRealm_set_clientsLimit(ServerRealm* sr, int clientsLimit)
+{
+ if (sr == NULL) {
+ return;
+ }
+ sr->clientsLimit = clientsLimit;
+}
+
+/*
+ * Function name: ServerRealm_set_connectedRaClients
+ * Description: Set number of connected raClients.
+ * Arguments: sr - pointer to ServerRealm structure
+ * connectedRaClients - number of connected raClients
+ */
+
+void
+ServerRealm_set_connectedRaClients(ServerRealm* sr, int connectedRaClients)
+{
+ if (sr == NULL) {
+ return;
+ }
+ sr->connectedRaClients = connectedRaClients;
+}
+
+/*
+ * Function name: ServerRealm_set_raClientsLimit
+ * Description: Set limit of connected raClients.
+ * Arguments: sr - pointer to ServerRealm structure
+ * raClientsLimit - limit of connected raClients
+ */
+
+void
+ServerRealm_set_raClientsLimit(ServerRealm* sr, int raClientsLimit)
+{
+ if (sr == NULL) {
+ return;
+ }
+ sr->raClientsLimit = raClientsLimit;
+}
+
+/*
+ * Function name: ServerRealm_set_usersPerClient
+ * Description: Set users per client limit.
+ * Arguments: sr - pointer to ServerRealm structure
+ * usersPerClient - users per client limit
+ */
+
+void
+ServerRealm_set_usersPerClient(ServerRealm* sr, int usersPerClient)
+{
+ if (sr == NULL) {
+ return;
+ }
+ sr->usersPerClient = usersPerClient;
+}
+
+/*
+ * Function name: ServerRealm_set_timeout
+ * Description: Set timeout value.
+ * Arguments: sr - pointer to ServerRealm structure
+ * timeout - timeout value
+ */
+
+void
+ServerRealm_set_timeout(ServerRealm* sr, int timeout)
+{
+ if (sr == NULL) {
+ return;
+ }
+ sr->timeout = timeout;
+}
+
+/*
+ * Function name: ServerRealm_set_clientMode
+ * Description: Set client mode.
+ * Arguments: sr - pointer to ServerRealm structure
+ * clientMode - client mode
+ */
+
+void
+ServerRealm_set_clientMode(ServerRealm* sr, int clientMode)
+{
+ if (sr == NULL) {
+ return;
+ }
+ sr->clientMode = clientMode;
+}
+
+/*
+ * Function name: ServerRealm_set_userClientPairs
+ * Description: Set user-client pairs amount.
+ * Arguments: sr - pointer to ServerRealm structure
+ * userClientPairs - user-client pairs amount
+ */
+
+void
+ServerRealm_set_userClientPairs(ServerRealm* sr, int userClientPairs)
+{
+ if (sr == NULL) {
+ return;
+ }
+ sr->userClientPairs = userClientPairs;
+}
+
+/*
+ * Function name: ServerRealm_set_clientsCounter
+ * Description: Set clients counter state.
+ * Arguments: sr - pointer to ServerRealm structure
+ * clientsCounter - clients counter state
+ */
+
+void
+ServerRealm_set_clientsCounter(ServerRealm* sr, int clientsCounter)
+{
+ if (sr == NULL) {
+ return;
+ }
+ sr->clientsCounter = clientsCounter;
+}
+
+/*
+ * Function name: ServerRealm_set_usersCounter
+ * Description: Set users counter state.
+ * Arguments: sr - pointer to ServerRealm structure
+ * usersCounter - users counter state
+ */
+
+void
+ServerRealm_set_usersCounter(ServerRealm* sr, int usersCounter)
+{
+ if (sr == NULL) {
+ return;
+ }
+ sr->usersCounter = usersCounter;
+}
+
+/*
+ * Function name: ServerRealm_set_realmType
+ * Description: Set type of the realm.
+ * Arguments: sr - pointer to ServerRealm structure
+ * realmType - type of the realm
+ */
+
+void
+ServerRealm_set_realmType(ServerRealm* sr, char realmType)
+{
+ if (sr == NULL) {
+ return;
+ }
+ sr->realmType = realmType;
+}
+
+/*
+ * Function name: ServerRealm_set_tunnelType
+ * Description: Set type of the tunnel.
+ * Arguments: sr - pointer to ServerRealm structure
+ * tunnelType - type of the tunnel
+ */
+
+void
+ServerRealm_set_tunnelType(ServerRealm* sr, char tunnelType)
+{
+ if (sr == NULL) {
+ return;
+ }
+ sr->tunnelType = tunnelType;
+}
+
+/*
+ * Function name: ServerRealm_set_dnsLookupsOn
+ * Description: Set dns lookups functionality on/off.
+ * Arguments: sr - pointer to ServerRealm structure
+ * dnsLookupsOn - dns lookups functionality on/off
+ */
+
+void
+ServerRealm_set_dnsLookupsOn(ServerRealm* sr, char dnsLookupsOn)
+{
+ if (sr == NULL) {
+ return;
+ }
+ sr->dnsLookupsOn = dnsLookupsOn;
+}
+
+/*
+ * Function name: ServerRealm_set_basePortOn
+ * Description: Set base port functionality on/off.
+ * Arguments: sr - pointer to ServerRealm structure
+ * basePortOn - base port functionality on/off
+ */
+
+void
+ServerRealm_set_basePortOn(ServerRealm* sr, char basePortOn)
+{
+ if (sr == NULL) {
+ return;
+ }
+ sr->basePortOn = basePortOn;
+}
+
+/*
+ * Function name: ServerRealm_set_auditOn
+ * Description: Set audit functionality on/off.
+ * Arguments: sr - pointer to ServerRealm structure
+ * auditOn - audit functionality on/off
+ */
+
+void
+ServerRealm_set_auditOn(ServerRealm* sr, char auditOn)
+{
+ if (sr == NULL) {
+ return;
+ }
+ sr->auditOn = auditOn;
+}
+
+/*
+ * Function name: ServerRealm_set_addressLength
+ * Description: Set client's address length.
+ * Arguments: sr - pointer to ServerRealm structure
+ * addressLength - client's address length
+ */
+
+void
+ServerRealm_set_addressLength(ServerRealm* sr, socklen_t addressLength)
+{
+ if (sr == NULL) {
+ return;
+ }
+ sr->addressLength = addressLength;
+}
+
+/*
+ * Function name: ServerRealm_set_clientAddress
+ * Description: Set client's network address.
+ * Arguments: sr - pointer to ServerRealm structure
+ * clientAddress - client's network address
+ */
+
+void
+ServerRealm_set_clientAddress(ServerRealm* sr, struct sockaddr* clientAddress)
+{
+ if (sr == NULL) {
+ return;
+ }
+ if (sr->clientAddress) {
+ free(sr->clientAddress);
+ sr->clientAddress = NULL;
+ }
+ sr->clientAddress = clientAddress;
+}
+
+/*
+ * Function name: ServerRealm_set_usersTable
+ * Description: Set table of users.
+ * Arguments: sr - pointer to ServerRealm structure
+ * usersTable - table of users
+ */
+
+void
+ServerRealm_set_usersTable(ServerRealm* sr, ConnectUser** usersTable)
+{
+ int i;
+ if (sr == NULL) {
+ return;
+ }
+ if (sr->usersTable) {
+ for (i = 0; i < sr->usersLimit; ++i) {
+ if (sr->usersTable[i]) {
+ ConnectUser_free(&(sr->usersTable[i]));
+ }
+ }
+ free(sr->usersTable);
+ sr->usersTable = NULL;
+ }
+ sr->usersTable = usersTable;
+}
+
+/*
+ * Function name: ServerRealm_set_clientsTable
+ * Description: Set table of clients.
+ * Arguments: sr - pointer to ServerRealm structure
+ * clientsTable - table of clients
+ */
+
+void
+ServerRealm_set_clientsTable(ServerRealm* sr, ConnectClient** clientsTable)
+{
+ int i;
+ if (sr == NULL) {
+ return;
+ }
+ if (sr->clientsTable) {
+ for (i = 0; i < sr->clientsLimit; ++i) {
+ if (sr->clientsTable[i]) {
+ ConnectClient_free(&(sr->clientsTable[i]));
+ }
+ }
+ free(sr->clientsTable);
+ sr->clientsTable = NULL;
+ }
+ sr->clientsTable = clientsTable;
+}
+
+/*
+ * Function name: ServerRealm_set_raClientsTable
+ * Description: Set table of raClients.
+ * Arguments: sr - pointer to ServerRealm structure
+ * raClientsTable - table of raClients
+ */
+
+void
+ServerRealm_set_raClientsTable(ServerRealm* sr, ConnectClient** raClientsTable)
+{
+ int i;
+ if (sr == NULL) {
+ return;
+ }
+ if (sr->raClientsTable) {
+ for (i = 0; i < sr->raClientsLimit; ++i) {
+ if (sr->raClientsTable[i]) {
+ ConnectClient_free(&(sr->raClientsTable[i]));
+ }
+ }
+ free(sr->raClientsTable);
+ sr->raClientsTable = NULL;
+ }
+ sr->raClientsTable = raClientsTable;
+}
+
+/*
+ * Function name: ServerRealm_set_usersClientsTable
+ * Description: Set table of user-client pairs.
+ * Arguments: sr - pointer to ServerRealm structure
+ * usersClientsTable - table of user-client pairs
+ */
+
+void
+ServerRealm_set_usersClientsTable(ServerRealm* sr, UsrCli** usersClientsTable)
+{
+ int i;
+ if (sr == NULL) {
+ return;
+ }
+ if (sr->usersClientsTable) {
+ for (i = 0; i < sr->userClientPairs; ++i) {
+ if (sr->usersClientsTable[i]) {
+ UsrCli_free(&(sr->usersClientsTable[i]));
+ }
+ }
+ free(sr->usersClientsTable);
+ sr->usersClientsTable = NULL;
+ }
+ sr->usersClientsTable = usersClientsTable;
+}
+
+/*
+ * Function name: ServerRealm_get_hostName
+ * Description: Get realm's host name.
+ * Arguments: sr - pointer to ServerRealm structure
+ * Returns: Realm's host name.
+ */
+
+char*
+ServerRealm_get_hostName(ServerRealm* sr)
+{
+ if (sr == NULL) {
+ return NULL;
+ }
+ return sr->hostName;
+}
+
+/*
+ * Function name: ServerRealm_get_sUsersLimit
+ * Description: Get users limit description.
+ * Arguments: sr - pointer to ServerRealm structure
+ * Returns: Users limit description.
+ */
+
+char*
+ServerRealm_get_sUsersLimit(ServerRealm* sr)
+{
+ if (sr == NULL) {
+ return NULL;
+ }
+ return sr->sUsersLimit;
+}
+
+/*
+ * Function name: ServerRealm_get_sClientsLimit
+ * Description: Get clients limit description.
+ * Arguments: sr - pointer to ServerRealm structure
+ * Returns: Clients limit description.
+ */
+
+char*
+ServerRealm_get_sClientsLimit(ServerRealm* sr)
+{
+ if (sr == NULL) {
+ return NULL;
+ }
+ return sr->sClientsLimit;
+}
+
+/*
+ * Function name: ServerRealm_get_sRaClientsLimit
+ * Description: Get raClients limit description.
+ * Arguments: sr - pointer to ServerRealm structure
+ * Returns: RaClients limit description.
+ */
+
+char*
+ServerRealm_get_sRaClientsLimit(ServerRealm* sr)
+{
+ if (sr == NULL) {
+ return NULL;
+ }
+ return sr->sRaClientsLimit;
+}
+
+/*
+ * Function name: ServerRealm_get_sUsersPerClient
+ * Description: Get users per client description.
+ * Arguments: sr - pointer to ServerRealm structure
+ * Returns: Users per client description.
+ */
+
+char*
+ServerRealm_get_sUsersPerClient(ServerRealm* sr)
+{
+ if (sr == NULL) {
+ return NULL;
+ }
+ return sr->sUsersPerClient;
+}
+
+/*
+ * Function name: ServerRealm_get_sClientMode
+ * Description: Get client mode description.
+ * Arguments: sr - pointer to ServerRealm structure
+ * Returns: Client mode description.
+ */
+
+char*
+ServerRealm_get_sClientMode(ServerRealm* sr)
+{
+ if (sr == NULL) {
+ return NULL;
+ }
+ return sr->sClientMode;
+}
+
+/*
+ * Function name: ServerRealm_get_sTimeout
+ * Description: Get timeout value description.
+ * Arguments: sr - pointer to ServerRealm structure
+ * Returns: Timeout value description.
+ */
+
+char*
+ServerRealm_get_sTimeout(ServerRealm* sr)
+{
+ if (sr == NULL) {
+ return NULL;
+ }
+ return sr->sTimeout;
+}
+
+/*
+ * Function name: ServerRealm_get_realmName
+ * Description: Get realm's name.
+ * Arguments: sr - pointer to ServerRealm structure
+ * Returns: Realm's name.
+ */
+
+char*
+ServerRealm_get_realmName(ServerRealm* sr)
+{
+ if (sr == NULL) {
+ return NULL;
+ }
+ return sr->realmName;
+}
+
+/*
+ * Function name: ServerRealm_get_password
+ * Description: Get realm's password.
+ * Arguments: sr - pointer to ServerRealm structure
+ * Returns: Realm's password.
+ */
+
+unsigned char*
+ServerRealm_get_password(ServerRealm* sr)
+{
+ if (sr == NULL) {
+ return NULL;
+ }
+ return sr->password;
+}
+
+/*
+ * Function name: ServerRealm_get_connectedUsers
+ * Description: Get number of connected users.
+ * Arguments: sr - pointer to ServerRealm structure
+ * Returns: Number of connected users.
+ */
+
+int
+ServerRealm_get_connectedUsers(ServerRealm* sr)
+{
+ if (sr == NULL) {
+ return -1;
+ }
+ return sr->connectedUsers;
+}
+
+/*
+ * Function name: ServerRealm_get_usersLimit
+ * Description: Get limit of connected users.
+ * Arguments: sr - pointer to ServerRealm structure
+ * Returns: Limit of connected users.
+ */
+
+int
+ServerRealm_get_usersLimit(ServerRealm* sr)
+{
+ if (sr == NULL) {
+ return -1;
+ }
+ return sr->usersLimit;
+}
+
+/*
+ * Function name: ServerRealm_get_connectedClients
+ * Description: Get number of connected clients.
+ * Arguments: sr - pointer to ServerRealm structure
+ * Returns: Number of connected clients.
+ */
+
+int
+ServerRealm_get_connectedClients(ServerRealm* sr)
+{
+ if (sr == NULL) {
+ return -1;
+ }
+ return sr->connectedClients;
+}
+
+/*
+ * Function name: ServerRealm_get_clientsLimit
+ * Description: Get limit of connected clients.
+ * Arguments: sr - pointer to ServerRealm structure
+ * Returns: Limit of connected clients.
+ */
+
+int
+ServerRealm_get_clientsLimit(ServerRealm* sr)
+{
+ if (sr == NULL) {
+ return -1;
+ }
+ return sr->clientsLimit;
+}
+
+/*
+ * Function name: ServerRealm_get_connectedRaClients
+ * Description: Get number of connected raClients.
+ * Arguments: sr - pointer to ServerRealm structure
+ * Returns: Number of connected raClients.
+ */
+
+int
+ServerRealm_get_connectedRaClients(ServerRealm* sr)
+{
+ if (sr == NULL) {
+ return -1;
+ }
+ return sr->connectedRaClients;
+}
+
+/*
+ * Function name: ServerRealm_get_raClientsLimit
+ * Description: Get limit of connected raClients.
+ * Arguments: sr - pointer to ServerRealm structure
+ * Returns: Limit of connected raClients.
+ */
+
+int
+ServerRealm_get_raClientsLimit(ServerRealm* sr)
+{
+ if (sr == NULL) {
+ return -1;
+ }
+ return sr->raClientsLimit;
+}
+
+/*
+ * Function name: ServerRealm_get_usersPerClient
+ * Description: Get users per client limit.
+ * Arguments: sr - pointer to ServerRealm structure
+ * Returns: Users per client limit.
+ */
+
+int
+ServerRealm_get_usersPerClient(ServerRealm* sr)
+{
+ if (sr == NULL) {
+ return -1;
+ }
+ return sr->usersPerClient;
+}
+
+/*
+ * Function name: ServerRealm_get_timeout
+ * Description: Get timeout value.
+ * Arguments: sr - pointer to ServerRealm structure
+ * Returns: Timeout value.
+ */
+
+int
+ServerRealm_get_timeout(ServerRealm* sr)
+{
+ if (sr == NULL) {
+ return 0;
+ }
+ return sr->timeout;
+}
+
+/*
+ * Function name: ServerRealm_get_clientMode
+ * Description: Get client mode.
+ * Arguments: sr - pointer to ServerRealm structure
+ * Returns: Client mode.
+ */
+
+int
+ServerRealm_get_clientMode(ServerRealm* sr)
+{
+ if (sr == NULL) {
+ return 0;
+ }
+ return sr->clientMode;
+}
+
+/*
+ * Function name: ServerRealm_get_userClientPairs
+ * Description: Get user-client pairs amount.
+ * Arguments: sr - pointer to ServerRealm structure
+ * Returns: User-client pairs amount.
+ */
+
+int
+ServerRealm_get_userClientPairs(ServerRealm* sr)
+{
+ if (sr == NULL) {
+ return 0;
+ }
+ return sr->userClientPairs;
+}
+
+/*
+ * Function name: ServerRealm_get_clientsCounter
+ * Description: Get clients counter state.
+ * Arguments: sr - pointer to ServerRealm structure
+ * Returns: Clients counter state.
+ */
+
+int
+ServerRealm_get_clientsCounter(ServerRealm* sr)
+{
+ if (sr == NULL) {
+ return -1;
+ }
+ return sr->clientsCounter;
+}
+
+/*
+ * Function name: ServerRealm_get_usersCounter
+ * Description: Get users counter state.
+ * Arguments: sr - pointer to ServerRealm structure
+ * Returns: Users counter state.
+ */
+
+int
+ServerRealm_get_usersCounter(ServerRealm* sr)
+{
+ if (sr == NULL) {
+ return -1;
+ }
+ return sr->usersCounter;
+}
+
+/*
+ * Function name: ServerRealm_get_realmType
+ * Description: Get type of the realm.
+ * Arguments: sr - pointer to ServerRealm structure
+ * Returns: Type of the realm.
+ */
+
+char
+ServerRealm_get_realmType(ServerRealm* sr)
+{
+ if (sr == NULL) {
+ return 0;
+ }
+ return sr->realmType;
+}
+
+/*
+ * Function name: ServerRealm_get_tunnelType
+ * Description: Get type of the tunnel.
+ * Arguments: sr - pointer to ServerRealm structure
+ * Returns: Type of the tunnel.
+ */
+
+char
+ServerRealm_get_tunnelType(ServerRealm* sr)
+{
+ if (sr == NULL) {
+ return 0;
+ }
+ return sr->tunnelType;
+}
+
+/*
+ * Function name: ServerRealm_get_dnsLookupsOn
+ * Description: Get dns lookups functionality on/off.
+ * Arguments: sr - pointer to ServerRealm structure
+ * Returns: Dns lookups functionality on/off.
+ */
+
+char
+ServerRealm_get_dnsLookupsOn(ServerRealm* sr)
+{
+ if (sr == NULL) {
+ return 0;
+ }
+ return sr->dnsLookupsOn;
+}
+
+/*
+ * Function name: ServerRealm_get_basePortOn
+ * Description: Get base port functionality on/off.
+ * Arguments: sr - pointer to ServerRealm structure
+ * Returns: Base port functionality on/off.
+ */
+
+char
+ServerRealm_get_basePortOn(ServerRealm* sr)
+{
+ if (sr == NULL) {
+ return 0;
+ }
+ return sr->basePortOn;
+}
+
+/*
+ * Function name: ServerRealm_get_auditOn
+ * Description: Get audit functionality on/off.
+ * Arguments: sr - pointer to ServerRealm structure
+ * Returns: Audit functionality on/off.
+ */
+
+char
+ServerRealm_get_auditOn(ServerRealm* sr)
+{
+ if (sr == NULL) {
+ return 0;
+ }
+ return sr->auditOn;
+}
+
+/*
+ * Function name: ServerRealm_get_addressLength
+ * Description: Get client's address length.
+ * Arguments: sr - pointer to ServerRealm structure
+ * Returns: Client's address length.
+ */
+
+socklen_t
+ServerRealm_get_addressLength(ServerRealm* sr)
+{
+ if (sr == NULL) {
+ return 0;
+ }
+ return sr->addressLength;
+}
+
+/*
+ * Function name: ServerRealm_get_clientAddress
+ * Description: Get client's network address.
+ * Arguments: sr - pointer to ServerRealm structure
+ * Returns: Client's network address.
+ */
+
+struct sockaddr*
+ServerRealm_get_clientAddress(ServerRealm* sr)
+{
+ if (sr == NULL) {
+ return NULL;
+ }
+ return sr->clientAddress;
+}
+
+/*
+ * Function name: ServerRealm_get_usersTable
+ * Description: Get table of users.
+ * Arguments: sr - pointer to ServerRealm structure
+ * Returns: Table of users.
+ */
+
+ConnectUser**
+ServerRealm_get_usersTable(ServerRealm* sr)
+{
+ if (sr == NULL) {
+ return NULL;
+ }
+ return sr->usersTable;
+}
+
+/*
+ * Function name: ServerRealm_get_clientsTable
+ * Description: Get table of clients.
+ * Arguments: sr - pointer to ServerRealm structure
+ * Returns: Table of clients.
+ */
+
+ConnectClient**
+ServerRealm_get_clientsTable(ServerRealm* sr)
+{
+ if (sr == NULL) {
+ return NULL;
+ }
+ return sr->clientsTable;
+}
+
+/*
+ * Function name: ServerRealm_get_raClientsTable
+ * Description: Get table of raClients.
+ * Arguments: sr - pointer to ServerRealm structure
+ * Returns: Table of raClients.
+ */
+
+ConnectClient**
+ServerRealm_get_raClientsTable(ServerRealm* sr)
+{
+ if (sr == NULL) {
+ return NULL;
+ }
+ return sr->raClientsTable;
+}
+
+/*
+ * Function name: ServerRealm_get_usersClientsTable
+ * Description: Get table of user-client pairs.
+ * Arguments: sr - pointer to ServerRealm structure
+ * Returns: Table of user-client pairs.
+ */
+
+UsrCli**
+ServerRealm_get_usersClientsTable(ServerRealm* sr)
+{
+ if (sr == NULL) {
+ return NULL;
+ }
+ return sr->usersClientsTable;
+}
+
+/*
+ * Function name: ServerRealm_increase_connectedUsers
+ * Description: Increase number of connected users.
+ * Arguments: sr - pointer to ServerRealm structure
+ */
+
+void
+ServerRealm_increase_connectedUsers(ServerRealm* sr)
+{
+ if (sr == NULL) {
+ return;
+ }
+ ServerRealm_set_connectedUsers(sr, ServerRealm_get_connectedUsers(sr) + 1);
+}
+
+/*
+ * Function name: ServerRealm_decrease_connectedUsers
+ * Description: Decrease number of connected users.
+ * Arguments: sr - pointer to ServerRealm structure
+ */
+
+void
+ServerRealm_decrease_connectedUsers(ServerRealm* sr)
+{
+ if (sr == NULL) {
+ return;
+ }
+ ServerRealm_set_connectedUsers(sr, ServerRealm_get_connectedUsers(sr) - 1);
+}
+
+/*
+ * Function name: ServerRealm_increase_connectedClients
+ * Description: Increase number of connected clients.
+ * Arguments: sr - pointer to ServerRealm structure
+ */
+
+void
+ServerRealm_increase_connectedClients(ServerRealm* sr)
+{
+ if (sr == NULL) {
+ return;
+ }
+ ServerRealm_set_connectedClients(sr, ServerRealm_get_connectedClients(sr) + 1);
+}
+
+/*
+ * Function name: ServerRealm_decrease_connectedClients
+ * Description: Decrease number of connected clients.
+ * Arguments: sr - pointer to ServerRealm structure
+ */
+
+void
+ServerRealm_decrease_connectedClients(ServerRealm* sr)
+{
+ if (sr == NULL) {
+ return;
+ }
+ ServerRealm_set_connectedClients(sr, ServerRealm_get_connectedClients(sr) - 1);
+}
+
+/*
+ * Function name: ServerRealm_increase_connectedRaClients
+ * Description: Increase number of connected raClients.
+ * Arguments: sr - pointer to ServerRealm structure
+ */
+
+void
+ServerRealm_increase_connectedRaClients(ServerRealm* sr)
+{
+ if (sr == NULL) {
+ return;
+ }
+ ServerRealm_set_connectedRaClients(sr, ServerRealm_get_connectedRaClients(sr) + 1);
+}
+
+/*
+ * Function name: ServerRealm_decrease_connectedRaClients
+ * Description: Decrease number of connected raClients.
+ * Arguments: sr - pointer to ServerRealm structure
+ */
+
+void
+ServerRealm_decrease_connectedRaClients(ServerRealm* sr)
+{
+ if (sr == NULL) {
+ return;
+ }
+ ServerRealm_set_connectedRaClients(sr, ServerRealm_get_connectedRaClients(sr) - 1);
+}
+
+/*
+ * Function name: ServerRealm_increase_usersCounter
+ * Description: Increase users counter state.
+ * Arguments: sr - pointer to ServerRealm structure
+ */
+
+void
+ServerRealm_increase_usersCounter(ServerRealm* sr)
+{
+ if (sr == NULL) {
+ return;
+ }
+ ServerRealm_set_usersCounter(sr, ServerRealm_get_usersCounter(sr) + 1);
+}
+
+/*
+ * Function name: ServerRealm_increase_clientsCounter
+ * Description: Increase clients counter state.
+ * Arguments: sr - pointer to ServerRealm structure
+ */
+
+void
+ServerRealm_increase_clientsCounter(ServerRealm* sr)
+{
+ if (sr == NULL) {
+ return;
+ }
+ ServerRealm_set_clientsCounter(sr, ServerRealm_get_clientsCounter(sr) + 1);
+}
diff --git a/src/server_realm_struct.h b/src/server_realm_struct.h
new file mode 100644
index 0000000..67458a7
--- /dev/null
+++ b/src/server_realm_struct.h
@@ -0,0 +1,141 @@
+/*
+ * active port forwarder - software for secure forwarding
+ * Copyright (C) 2003,2004,2005 jeremian <jeremian [at] poczta.fm>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ */
+
+#include "activefor.h"
+
+#ifndef _JS_SERVER_REALM_STRUCT_H
+#define _JS_SERVER_REALM_STRUCT_H
+
+typedef struct {
+ char* hostName;
+ char* sUsersLimit;
+ char* sClientsLimit;
+ char* sRaClientsLimit;
+ char* sUsersPerClient;
+ char* sClientMode;
+ char* sTimeout;
+ char* realmName;
+ unsigned char password[4];
+ int connectedUsers;
+ int usersLimit;
+ int connectedClients;
+ int clientsLimit;
+ int connectedRaClients;
+ int raClientsLimit;
+ int usersPerClient;
+ int timeout;
+ int clientMode;
+ int userClientPairs;
+ int clientsCounter;
+ int usersCounter;
+ char realmType;
+ char tunnelType;
+ char dnsLookupsOn;
+ char basePortOn;
+ char auditOn;
+ socklen_t addressLength;
+ struct sockaddr* clientAddress;
+ ConnectUser** usersTable;
+ ConnectClient** clientsTable;
+ ConnectClient** raClientsTable;
+ UsrCli** usersClientsTable;
+} ServerRealm;
+
+/* 'constructor' */
+ServerRealm* ServerRealm_new();
+/* 'destructor' */
+void ServerRealm_free(ServerRealm** sr);
+/* setters */
+void ServerRealm_set_hostName(ServerRealm* sr, char* hostName);
+void ServerRealm_set_sUsersLimit(ServerRealm* sr, char* sUsersLimit);
+void ServerRealm_set_sClientsLimit(ServerRealm* sr, char* sClientsLimit);
+void ServerRealm_set_sRaClientsLimit(ServerRealm* sr, char* sRaClientsLimit);
+void ServerRealm_set_sUsersPerClient(ServerRealm* sr, char* sUsersPerClient);
+void ServerRealm_set_sClientMode(ServerRealm* sr, char* sClientMode);
+void ServerRealm_set_sTimeout(ServerRealm* sr, char* sTimeout);
+void ServerRealm_set_realmName(ServerRealm* sr, char* realmName);
+void ServerRealm_set_password(ServerRealm* sr, unsigned char* password);
+void ServerRealm_set_connectedUsers(ServerRealm* sr, int connectedUsers);
+void ServerRealm_set_usersLimit(ServerRealm* sr, int usersLimit);
+void ServerRealm_set_connectedClients(ServerRealm* sr, int connectedClients);
+void ServerRealm_set_clientsLimit(ServerRealm* sr, int clientsLimit);
+void ServerRealm_set_connectedRaClients(ServerRealm* sr, int connectedRaClients);
+void ServerRealm_set_raClientsLimit(ServerRealm* sr, int raClientsLimit);
+void ServerRealm_set_usersPerClient(ServerRealm* sr, int usersPerClient);
+void ServerRealm_set_timeout(ServerRealm* sr, int timeout);
+void ServerRealm_set_clientMode(ServerRealm* sr, int clientMode);
+void ServerRealm_set_userClientPairs(ServerRealm* sr, int userClientPairs);
+void ServerRealm_set_clientsCounter(ServerRealm* sr, int clientsCounter);
+void ServerRealm_set_usersCounter(ServerRealm* sr, int usersCounter);
+void ServerRealm_set_realmType(ServerRealm* sr, char realmType);
+void ServerRealm_set_tunnelType(ServerRealm* sr, char tunnelType);
+void ServerRealm_set_dnsLookupsOn(ServerRealm* sr, char dnsLookupsOn);
+void ServerRealm_set_basePortOn(ServerRealm* sr, char basePortOn);
+void ServerRealm_set_auditOn(ServerRealm* sr, char auditOn);
+void ServerRealm_set_addressLength(ServerRealm* sr, socklen_t addressLength);
+void ServerRealm_set_clientAddress(ServerRealm* sr, struct sockaddr* clientAddress);
+void ServerRealm_set_usersTable(ServerRealm* sr, ConnectUser** usersTable);
+void ServerRealm_set_clientsTable(ServerRealm* sr, ConnectClient** clientsTable);
+void ServerRealm_set_raClientsTable(ServerRealm* sr, ConnectClient** raClientsTable);
+void ServerRealm_set_usersClientsTable(ServerRealm* sr, UsrCli** usersClientsTable);
+/* getters */
+char* ServerRealm_get_hostName(ServerRealm* sr);
+char* ServerRealm_get_sUsersLimit(ServerRealm* sr);
+char* ServerRealm_get_sClientsLimit(ServerRealm* sr);
+char* ServerRealm_get_sRaClientsLimit(ServerRealm* sr);
+char* ServerRealm_get_sUsersPerClient(ServerRealm* sr);
+char* ServerRealm_get_sClientMode(ServerRealm* sr);
+char* ServerRealm_get_sTimeout(ServerRealm* sr);
+char* ServerRealm_get_realmName(ServerRealm* sr);
+unsigned char* ServerRealm_get_password(ServerRealm* sr);
+int ServerRealm_get_connectedUsers(ServerRealm* sr);
+int ServerRealm_get_usersLimit(ServerRealm* sr);
+int ServerRealm_get_connectedClients(ServerRealm* sr);
+int ServerRealm_get_clientsLimit(ServerRealm* sr);
+int ServerRealm_get_connectedRaClients(ServerRealm* sr);
+int ServerRealm_get_raClientsLimit(ServerRealm* sr);
+int ServerRealm_get_usersPerClient(ServerRealm* sr);
+int ServerRealm_get_timeout(ServerRealm* sr);
+int ServerRealm_get_clientMode(ServerRealm* sr);
+int ServerRealm_get_userClientPairs(ServerRealm* sr);
+int ServerRealm_get_clientsCounter(ServerRealm* sr);
+int ServerRealm_get_usersCounter(ServerRealm* sr);
+char ServerRealm_get_realmType(ServerRealm* sr);
+char ServerRealm_get_tunnelType(ServerRealm* sr);
+char ServerRealm_get_dnsLookupsOn(ServerRealm* sr);
+char ServerRealm_get_basePortOn(ServerRealm* sr);
+char ServerRealm_get_auditOn(ServerRealm* sr);
+socklen_t ServerRealm_get_addressLength(ServerRealm* sr);
+struct sockaddr* ServerRealm_get_clientAddress(ServerRealm* sr);
+ConnectUser** ServerRealm_get_usersTable(ServerRealm* sr);
+ConnectClient** ServerRealm_get_clientsTable(ServerRealm* sr);
+ConnectClient** ServerRealm_get_raClientsTable(ServerRealm* sr);
+UsrCli** ServerRealm_get_usersClientsTable(ServerRealm* sr);
+/* other */
+void ServerRealm_increase_connectedUsers(ServerRealm* sr);
+void ServerRealm_decrease_connectedUsers(ServerRealm* sr);
+void ServerRealm_increase_connectedClients(ServerRealm* sr);
+void ServerRealm_decrease_connectedClients(ServerRealm* sr);
+void ServerRealm_increase_connectedRaClients(ServerRealm* sr);
+void ServerRealm_decrease_connectedRaClients(ServerRealm* sr);
+void ServerRealm_increase_usersCounter(ServerRealm* sr);
+void ServerRealm_increase_clientsCounter(ServerRealm* sr);
+
+#endif
diff --git a/src/server_remoteadmin.c b/src/server_remoteadmin.c
index 79d174b..adc8587 100644
--- a/src/server_remoteadmin.c
+++ b/src/server_remoteadmin.c
@@ -185,15 +185,18 @@ add_uptime_to_message(unsigned char* buff, char* info, time_t period)
}
int
-serve_admin(ConfigurationT* config, int realm, int client, unsigned char* buff)
+serve_admin(ServerConfiguration* config, int realm, int client, unsigned char* buff)
{
int length, n, i, j, ret;
time_t now, tmp;
llnodeT* llptr;
AuditListNode* alptr;
char olddf[51], newdf[51];
- char type = config->realmtable[realm].type | TYPE_SSL | TYPE_ZLIB;
- SslFd* master = ConnectClient_get_sslFd(config->realmtable[realm].raclitable[client]);
+ ConnectClient* cpointer;
+ ConnectUser* upointer;
+ ServerRealm* pointer = ServerConfiguration_get_realmsTable(config)[realm];
+ char type = ServerRealm_get_realmType(pointer) | TYPE_SSL | TYPE_ZLIB;
+ SslFd* master = ConnectClient_get_sslFd(ServerRealm_get_raClientsTable(pointer)[client]);
olddf[50] = newdf[50] = 0;
length = buff[3];
@@ -248,9 +251,12 @@ serve_admin(ConfigurationT* config, int realm, int client, unsigned char* buff)
}
case 3: { /* info */
add_to_message(buff, AF_VER("Version:"));
- add_to_message(buff, "Realms: %d", config->size);
- add_to_message(buff, "Certificate: %s", config->certif);
- add_to_message(buff, "Key: %s", config->keys);
+ add_to_message(buff, "Realms: %d",
+ ServerConfiguration_get_realmsNumber(config));
+ add_to_message(buff, "Certificate: %s",
+ ServerConfiguration_get_certificateFile(config));
+ add_to_message(buff, "Key: %s",
+ ServerConfiguration_get_keysFile(config));
llptr = getloglisthead();
i = 0;
while (llptr) {
@@ -258,7 +264,7 @@ serve_admin(ConfigurationT* config, int realm, int client, unsigned char* buff)
llptr = llptr->next;
++i;
}
- tmp = now - config->starttime;
+ tmp = now - ServerConfiguration_get_startTime(config);
add_uptime_to_message(buff, "Uptime", tmp);
add_to_message(buff, "Cg: %ld B", getcg());
add_to_message(buff, "Dateformat: %s", getdateformat());
@@ -266,37 +272,44 @@ serve_admin(ConfigurationT* config, int realm, int client, unsigned char* buff)
break;
}
case 4: { /* rshow */
- for (i = 0; i < config->size; ++i) {
+ for (i = 0; i < ServerConfiguration_get_realmsNumber(config); ++i) {
+ pointer = ServerConfiguration_get_realmsTable(config)[i];
add_to_message(buff, "\nRealm[%s]:", get_realmname(config, i));
- add_to_message(buff, "hostname: %s", config->realmtable[i].hostname);
+ add_to_message(buff, "hostname: %s", ServerRealm_get_hostName(pointer));
add_to_message(buff, "users: %d (max: %d)",
- config->realmtable[i].usercon, config->realmtable[i].usernum);
+ ServerRealm_get_connectedUsers(pointer),
+ ServerRealm_get_usersLimit(pointer));
add_to_message(buff, "clients: %d (max: %d)",
- config->realmtable[i].clicon-config->realmtable[i].raclicon,
- config->realmtable[i].clinum);
+ ServerRealm_get_connectedClients(pointer) -
+ ServerRealm_get_connectedRaClients(pointer),
+ ServerRealm_get_clientsLimit(pointer));
add_to_message(buff, "raclients: %d (max: %d)",
- config->realmtable[i].raclicon, config->realmtable[i].raclinum);
- add_to_message(buff, "users per client: %s", config->realmtable[i].usrpcli);
+ ServerRealm_get_connectedRaClients(pointer),
+ ServerRealm_get_raClientsLimit(pointer));
+ add_to_message(buff, "users per client: %s",
+ ServerRealm_get_sUsersPerClient(pointer));
add_to_message(buff, "user-client pairs: %d",
- config->realmtable[i].usrclinum);
- for (j = 0; j < config->realmtable[i].usrclinum; ++j) {
+ ServerRealm_get_userClientPairs(pointer));
+ for (j = 0; j < ServerRealm_get_userClientPairs(pointer); ++j) {
add_to_message(buff, " pair[%d]: listenport: %s, manageport: %s", j,
- UsrCli_get_listenPortName(config->realmtable[i].usrclitable[j]),
- UsrCli_get_managePortName(config->realmtable[i].usrclitable[j]));
+ UsrCli_get_listenPortName(
+ ServerRealm_get_usersClientsTable(pointer)[j]),
+ UsrCli_get_managePortName(
+ ServerRealm_get_usersClientsTable(pointer)[j]));
}
- add_to_message(buff, "climode: %s", config->realmtable[i].clim);
- add_to_message(buff, "timeout: %d", config->realmtable[i].tmout);
- add_to_message(buff, "baseport: %s", config->realmtable[i].baseport ?
+ add_to_message(buff, "climode: %s", ServerRealm_get_sClientMode(pointer));
+ add_to_message(buff, "timeout: %d", ServerRealm_get_timeout(pointer));
+ add_to_message(buff, "baseport: %s", ServerRealm_get_basePortOn(pointer) ?
"yes" : "no");
- add_to_message(buff, "audit: %s", config->realmtable[i].audit ?
- "yes" : "no");
- add_to_message(buff, "dnslookups: %s", config->realmtable[i].dnslookups ?
+ add_to_message(buff, "audit: %s", ServerRealm_get_auditOn(pointer) ?
"yes" : "no");
+ add_to_message(buff, "dnslookups: %s",
+ ServerRealm_get_dnsLookupsOn(pointer) ? "yes" : "no");
add_to_message(buff, "ssl: %s, zlib: %s, mode: %s",
- (TYPE_IS_SSL(config->realmtable[i].type))?"yes":"no",
- (TYPE_IS_ZLIB(config->realmtable[i].type))?"yes":"no",
- (TYPE_IS_TCP(config->realmtable[i].type))?"tcp":"udp");
- switch (config->realmtable[i].tunneltype) {
+ (TYPE_IS_SSL(ServerRealm_get_realmType(pointer))) ? "yes" : "no",
+ (TYPE_IS_ZLIB(ServerRealm_get_realmType(pointer))) ? "yes" : "no",
+ (TYPE_IS_TCP(ServerRealm_get_realmType(pointer))) ? "tcp" : "udp");
+ switch (ServerRealm_get_tunnelType(pointer)) {
case CONNECTCLIENT_TUNNELTYPE_DIRECT: {
add_to_message(buff, "tunneltype: direct");
break;
@@ -319,13 +332,14 @@ serve_admin(ConfigurationT* config, int realm, int client, unsigned char* buff)
}
case 5: { /* cshow*/
n = get_realmnumber(config, (char*) &buff[ret]);
- if ((n >= 0) && (n < config->size)) {
- for (i = 0; i < config->realmtable[n].clinum; ++i) {
- if (ConnectClient_get_state(config->realmtable[n].clitable[i]) !=
- CONNECTCLIENT_STATE_FREE) {
+ if ((n >= 0) && (n < ServerConfiguration_get_realmsNumber(config))) {
+ pointer = ServerConfiguration_get_realmsTable(config)[n];
+ for (i = 0; i < ServerRealm_get_clientsLimit(pointer); ++i) {
+ cpointer = ServerRealm_get_clientsTable(pointer)[i];
+ if (ConnectClient_get_state(cpointer) != CONNECTCLIENT_STATE_FREE) {
add_to_message(buff, "\nClient[%s]:",
- get_clientname(&(config->realmtable[n]), i));
- switch (ConnectClient_get_state(config->realmtable[n].clitable[i])) {
+ get_clientname(pointer, i));
+ switch (ConnectClient_get_state(cpointer)) {
case CONNECTCLIENT_STATE_CONNECTING: {
add_to_message(buff, "state: ssl handshake");
break;
@@ -343,24 +357,21 @@ serve_admin(ConfigurationT* config, int realm, int client, unsigned char* buff)
}
}
add_to_message(buff, "users: %d (max: %d)",
- ConnectClient_get_connected(config->realmtable[n].clitable[i]),
- ConnectClient_get_limit(config->realmtable[n].clitable[i]));
+ ConnectClient_get_connected(cpointer),
+ ConnectClient_get_limit(cpointer));
add_to_message(buff, "user-client pair: %d",
- ConnectClient_get_usrCliPair(config->realmtable[n].clitable[i]));
- tmp = now - ConnectClient_get_connectTime(
- config->realmtable[n].clitable[i]);
+ ConnectClient_get_usrCliPair(cpointer));
+ tmp = now - ConnectClient_get_connectTime(cpointer);
add_uptime_to_message(buff, "Connection time", tmp);
add_to_message(buff, "Id: %s",
- (ConnectClient_get_sClientId(
- config->realmtable[n].clitable[i]) == NULL)?"":
- ConnectClient_get_sClientId(config->realmtable[n].clitable[i]));
+ (ConnectClient_get_sClientId(cpointer) == NULL) ? "" :
+ ConnectClient_get_sClientId(cpointer));
add_to_message(buff, "Number: %d",
- ConnectClient_get_clientId(config->realmtable[n].clitable[i]));
+ ConnectClient_get_clientId(cpointer));
add_to_message(buff, "IP: %s, port: %s",
- ConnectClient_get_nameBuf(config->realmtable[n].clitable[i]),
- ConnectClient_get_portBuf(config->realmtable[n].clitable[i]));
- switch (ConnectClient_get_tunnelType(
- config->realmtable[n].clitable[i])) {
+ ConnectClient_get_nameBuf(cpointer),
+ ConnectClient_get_portBuf(cpointer));
+ switch (ConnectClient_get_tunnelType(cpointer)) {
case CONNECTCLIENT_TUNNELTYPE_DIRECT: {
add_to_message(buff, "tunneltype: direct");
break;
@@ -377,10 +388,10 @@ serve_admin(ConfigurationT* config, int realm, int client, unsigned char* buff)
add_to_message(buff, "tunneltype: UNKNOWN");
}
}
- if (config->realmtable[n].audit) {
+ if (ServerRealm_get_auditOn(pointer)) {
add_to_message(buff, "auditlog:");
alptr = AuditList_get_first(
- ConnectClient_get_auditList(config->realmtable[n].clitable[i]));
+ ConnectClient_get_auditList(cpointer));
while (alptr) {
add_to_message(buff,
"userid: %d ip: %s port: %s connected: %s duration: %s",
@@ -404,13 +415,14 @@ serve_admin(ConfigurationT* config, int realm, int client, unsigned char* buff)
}
case 6: { /* ushow */
n = get_realmnumber(config, (char*) &buff[ret]);
- if ((n >= 0) && (n < config->size)) {
- for (i = 0; i < config->realmtable[n].usernum; ++i) {
- if (ConnectUser_get_state(config->realmtable[n].contable[i]) !=
- S_STATE_CLEAR) {
+ if ((n >= 0) && (n < ServerConfiguration_get_realmsNumber(config))) {
+ pointer = ServerConfiguration_get_realmsTable(config)[n];
+ for (i = 0; i < ServerRealm_get_usersLimit(pointer); ++i) {
+ upointer = ServerRealm_get_usersTable(pointer)[i];
+ if (ConnectUser_get_state(upointer) != S_STATE_CLEAR) {
add_to_message(buff, "\nUser[%d]:",
- get_username(&(config->realmtable[n]), i));
- switch (ConnectUser_get_state(config->realmtable[n].contable[i])) {
+ get_username(pointer, i));
+ switch (ConnectUser_get_state(upointer)) {
case S_STATE_CLOSING: {
add_to_message(buff, "state: closing");
break;
@@ -419,6 +431,10 @@ serve_admin(ConfigurationT* config, int realm, int client, unsigned char* buff)
add_to_message(buff, "state: opening");
break;
}
+ case S_STATE_OPENING_CLOSED: {
+ add_to_message(buff, "state: opening (closed)");
+ break;
+ }
case S_STATE_OPEN: {
add_to_message(buff, "state: running");
break;
@@ -432,28 +448,27 @@ serve_admin(ConfigurationT* config, int realm, int client, unsigned char* buff)
}
}
add_to_message(buff, "connected to: Client[%s]",
- get_clientname(&(config->realmtable[n]),
- ConnectUser_get_whatClient(config->realmtable[n].contable[i])));
- tmp = now-ConnectUser_get_connectTime(config->realmtable[n].contable[i]);
+ get_clientname(pointer, ConnectUser_get_whatClient(upointer)));
+ tmp = now-ConnectUser_get_connectTime(upointer);
add_uptime_to_message(buff, "Connection time", tmp);
tmp = now - UserStats_get_lastActivity(
- ConnectUser_get_stats(config->realmtable[n].contable[i]));
+ ConnectUser_get_stats(upointer));
add_uptime_to_message(buff, "Idle time", tmp);
add_to_message(buff, "IP: %s, port: %s",
- ConnectUser_get_nameBuf(config->realmtable[n].contable[i]),
- ConnectUser_get_portBuf(config->realmtable[n].contable[i]));
+ ConnectUser_get_nameBuf(upointer),
+ ConnectUser_get_portBuf(upointer));
add_to_message(buff, "Downloaded: %d bytes",
UserStats_get_totalDownloadedBytes(
- ConnectUser_get_stats(config->realmtable[n].contable[i])));
+ ConnectUser_get_stats(upointer)));
add_to_message(buff, "download speed: %.2f B/s",
UserStats_get_downloadSpeed(
- ConnectUser_get_stats(config->realmtable[n].contable[i])));
+ ConnectUser_get_stats(upointer)));
add_to_message(buff, "Uploaded: %d bytes",
UserStats_get_totalUploadedBytes(
- ConnectUser_get_stats(config->realmtable[n].contable[i])));
+ ConnectUser_get_stats(upointer)));
add_to_message(buff, "upload speed: %.2f B/s",
UserStats_get_uploadSpeed(
- ConnectUser_get_stats(config->realmtable[n].contable[i])));
+ ConnectUser_get_stats(upointer)));
}
}
send_adm_message(type, master, buff, AF_RA_STATUS_OK);
@@ -468,7 +483,7 @@ serve_admin(ConfigurationT* config, int realm, int client, unsigned char* buff)
aflog(LOG_T_MANAGE, LOG_I_INFO,
"realm[%s]: Client[%s] (ra): commfd: CLOSED",
get_realmname(config, realm),
- get_raclientname(&(config->realmtable[realm]), client));
+ get_raclientname(pointer, client));
send_adm_message(type, master, buff, AF_RA_KICKED);
return 1;
}
@@ -482,10 +497,11 @@ serve_admin(ConfigurationT* config, int realm, int client, unsigned char* buff)
break;
}
n = get_realmnumber(config, (char*) &buff[ret]);
- if ((n >= 0) && (n < config->size)) {
+ if ((n >= 0) && (n < ServerConfiguration_get_realmsNumber(config))) {
add_to_message(buff, "changed timeout: %d --> %d",
- config->realmtable[n].tmout, i);
- config->realmtable[n].tmout = i;
+ ServerRealm_get_timeout(
+ ServerConfiguration_get_realmsTable(config)[n]), i);
+ ServerRealm_set_timeout(ServerConfiguration_get_realmsTable(config)[n], i);
send_adm_message(type, master, buff, AF_RA_STATUS_OK);
break;
}
@@ -505,15 +521,19 @@ serve_admin(ConfigurationT* config, int realm, int client, unsigned char* buff)
break;
}
n = get_realmnumber(config, (char*) &buff[ret]);
- if ((n >= 0) && (n < config->size)) {
+ if ((n >= 0) && (n < ServerConfiguration_get_realmsNumber(config))) {
add_to_message(buff, "changed audit: %s --> %s",
- config->realmtable[n].audit ? "yes" : "no", i ? "yes" : "no");
- config->realmtable[n].audit = i;
+ ServerRealm_get_auditOn(
+ ServerConfiguration_get_realmsTable(config)[n]) ? "yes" : "no",
+ i ? "yes" : "no");
+ ServerRealm_set_auditOn(ServerConfiguration_get_realmsTable(config)[n], i);
if (i == 0) {
- for (i = 0; i < config->realmtable[n].clinum; ++i) {
+ for (i = 0; i < ServerRealm_get_clientsLimit(
+ ServerConfiguration_get_realmsTable(config)[n]); ++i) {
AuditList_clear(
ConnectClient_get_auditList(
- config->realmtable[n].clitable[i]));
+ ServerRealm_get_clientsTable(
+ ServerConfiguration_get_realmsTable(config)[n])[i]));
}
}
send_adm_message(type, master, buff, AF_RA_STATUS_OK);
@@ -535,10 +555,13 @@ serve_admin(ConfigurationT* config, int realm, int client, unsigned char* buff)
break;
}
n = get_realmnumber(config, (char*) &buff[ret]);
- if ((n >= 0) && (n < config->size)) {
+ if ((n >= 0) && (n < ServerConfiguration_get_realmsNumber(config))) {
add_to_message(buff, "changed dnslookups: %s --> %s",
- config->realmtable[n].dnslookups ? "yes" : "no", i ? "yes" : "no");
- config->realmtable[n].dnslookups = i;
+ ServerRealm_get_dnsLookupsOn(
+ ServerConfiguration_get_realmsTable(config)[n]) ? "yes" : "no",
+ i ? "yes" : "no");
+ ServerRealm_set_dnsLookupsOn(
+ ServerConfiguration_get_realmsTable(config)[n], i);
send_adm_message(type, master, buff, AF_RA_STATUS_OK);
break;
}
@@ -567,16 +590,22 @@ serve_admin(ConfigurationT* config, int realm, int client, unsigned char* buff)
break;
}
j = -1;
- for (n = 0; n < config->size; ++n) {
- j = get_usernumber(&(config->realmtable[n]), i);
+ for (n = 0; n < ServerConfiguration_get_realmsNumber(config); ++n) {
+ pointer = ServerConfiguration_get_realmsTable(config)[n];
+ j = get_usernumber(pointer, i);
if (j != (-1)) {
- if ((ConnectUser_get_state(config->realmtable[n].contable[j]) ==
- S_STATE_OPEN) ||
- (ConnectUser_get_state(config->realmtable[n].contable[j]) ==
- S_STATE_STOPPED)) {
+ upointer = ServerRealm_get_usersTable(pointer)[j];
+ if ((ConnectUser_get_state(upointer) == S_STATE_OPEN) ||
+ (ConnectUser_get_state(upointer) == S_STATE_OPENING) ||
+ (ConnectUser_get_state(upointer) == S_STATE_STOPPED)) {
add_to_message(buff, "kicked: realm[%s] user[%d]",
- get_realmname(config, n), get_username(&(config->realmtable[n]), i));
- close(ConnectUser_get_connFd(config->realmtable[n].contable[j]));
+ get_realmname(config, n), get_username(pointer, j));
+ if (ConnectUser_get_state(upointer) == S_STATE_OPENING) {
+ ConnectUser_set_state(upointer, S_STATE_OPENING_CLOSED);
+ }
+ else {
+ close(ConnectUser_get_connFd(upointer));
+ }
send_adm_message(type, master, buff, AF_RA_STATUS_OK);
}
else {
@@ -606,14 +635,15 @@ serve_admin(ConfigurationT* config, int realm, int client, unsigned char* buff)
break;
}
j = -1;
- for (n = 0; n < config->size; ++n) {
- j = get_clientnumber(&(config->realmtable[n]), i);
+ for (n = 0; n < ServerConfiguration_get_realmsNumber(config); ++n) {
+ pointer = ServerConfiguration_get_realmsTable(config)[n];
+ j = get_clientnumber(pointer, i);
if (j != (-1)) {
- if (ConnectClient_get_state(config->realmtable[n].clitable[j]) >
+ if (ConnectClient_get_state(ServerRealm_get_clientsTable(pointer)[j]) >
CONNECTCLIENT_STATE_FREE) {
add_to_message(buff, "kicked: realm[%s] client[%s]",
get_realmname(config, n),
- get_clientname(&(config->realmtable[n]), j));
+ get_clientname(pointer, j));
send_adm_message(type, master, buff, AF_RA_STATUS_OK);
return (i+2);
}
diff --git a/src/server_remoteadmin.h b/src/server_remoteadmin.h
index a85070e..f50d20c 100644
--- a/src/server_remoteadmin.h
+++ b/src/server_remoteadmin.h
@@ -32,6 +32,6 @@
#include "realmnames.h"
#include "usernames.h"
-int serve_admin(ConfigurationT*, int, int, unsigned char*);
+int serve_admin(ServerConfiguration*, int, int, unsigned char*);
#endif
diff --git a/src/server_remove.c b/src/server_remove.c
index 003c484..21941cd 100644
--- a/src/server_remove.c
+++ b/src/server_remove.c
@@ -21,59 +21,59 @@
#include "server_remove.h"
void
-remove_client(RealmT* ptr, int client, fd_set* set, fd_set* wset, int* con)
+remove_client(ServerRealm* ptr, int client, fd_set* set, fd_set* wset, int* con)
{
int i;
- if (ConnectClient_get_state(ptr->clitable[client]) == CONNECTCLIENT_STATE_ACCEPTED) {
- for (i = 0; i < ptr->usernum; ++i) {
- if (ConnectUser_get_whatClient(ptr->contable[i]) == client) {
- if (ConnectUser_get_state(ptr->contable[i]) != S_STATE_CLEAR) {
- ConnectUser_set_state(ptr->contable[i], S_STATE_CLEAR);
- FD_CLR(ConnectUser_get_connFd(ptr->contable[i]), set);
- FD_CLR(ConnectUser_get_connFd(ptr->contable[i]), wset);
- close(ConnectUser_get_connFd(ptr->contable[i]));
- ptr->usercon--;
+ if (ConnectClient_get_state(ServerRealm_get_clientsTable(ptr)[client]) == CONNECTCLIENT_STATE_ACCEPTED) {
+ for (i = 0; i < ServerRealm_get_usersLimit(ptr); ++i) {
+ if (ConnectUser_get_whatClient(ServerRealm_get_usersTable(ptr)[i]) == client) {
+ if (ConnectUser_get_state(ServerRealm_get_usersTable(ptr)[i]) != S_STATE_CLEAR) {
+ ConnectUser_set_state(ServerRealm_get_usersTable(ptr)[i], S_STATE_CLEAR);
+ FD_CLR(ConnectUser_get_connFd(ServerRealm_get_usersTable(ptr)[i]), set);
+ FD_CLR(ConnectUser_get_connFd(ServerRealm_get_usersTable(ptr)[i]), wset);
+ close(ConnectUser_get_connFd(ServerRealm_get_usersTable(ptr)[i]));
+ ServerRealm_decrease_connectedUsers(ptr);
}
}
}
}
- for (i = 0; i < ConnectClient_get_limit(ptr->clitable[client]); ++i) {
- ConnectClient_get_users(ptr->clitable[client])[i] = -1;
+ for (i = 0; i < ConnectClient_get_limit(ServerRealm_get_clientsTable(ptr)[client]); ++i) {
+ ConnectClient_get_users(ServerRealm_get_clientsTable(ptr)[client])[i] = -1;
}
- if ((ptr->clinum != client) && (ptr->baseport == 1)) {
- close(ConnectClient_get_listenFd(ptr->clitable[client]));
- FD_CLR(ConnectClient_get_listenFd(ptr->clitable[client]), set);
+ if ((ServerRealm_get_clientsLimit(ptr) != client) && (ServerRealm_get_basePortOn(ptr) == 1)) {
+ close(ConnectClient_get_listenFd(ServerRealm_get_clientsTable(ptr)[client]));
+ FD_CLR(ConnectClient_get_listenFd(ServerRealm_get_clientsTable(ptr)[client]), set);
}
- ConnectClient_set_sClientId(ptr->clitable[client], NULL);
- ConnectClient_set_connected(ptr->clitable[client], 0);
- close(SslFd_get_fd(ConnectClient_get_sslFd(ptr->clitable[client])));
- FD_CLR(SslFd_get_fd(ConnectClient_get_sslFd(ptr->clitable[client])), set);
- if (ConnectClient_get_state(ptr->clitable[client]) == CONNECTCLIENT_STATE_AUTHORIZING) {
+ ConnectClient_set_sClientId(ServerRealm_get_clientsTable(ptr)[client], NULL);
+ ConnectClient_set_connected(ServerRealm_get_clientsTable(ptr)[client], 0);
+ close(SslFd_get_fd(ConnectClient_get_sslFd(ServerRealm_get_clientsTable(ptr)[client])));
+ FD_CLR(SslFd_get_fd(ConnectClient_get_sslFd(ServerRealm_get_clientsTable(ptr)[client])), set);
+ if (ConnectClient_get_state(ServerRealm_get_clientsTable(ptr)[client]) == CONNECTCLIENT_STATE_AUTHORIZING) {
(*con)--;
}
- SSL_clear(SslFd_get_ssl(ConnectClient_get_sslFd(ptr->clitable[client])));
- ConnectClient_set_state(ptr->clitable[client], CONNECTCLIENT_STATE_FREE);
- ptr->clicon--;
+ SSL_clear(SslFd_get_ssl(ConnectClient_get_sslFd(ServerRealm_get_clientsTable(ptr)[client])));
+ ConnectClient_set_state(ServerRealm_get_clientsTable(ptr)[client], CONNECTCLIENT_STATE_FREE);
+ ServerRealm_decrease_connectedClients(ptr);
}
void
-remove_raclient(RealmT* ptr, int client, fd_set* set, fd_set* wset, int* con)
+remove_raclient(ServerRealm* ptr, int client, fd_set* set, fd_set* wset, int* con)
{
int i;
- for (i = 0; i < ConnectClient_get_limit(ptr->raclitable[client]); ++i) {
- ConnectClient_get_users(ptr->raclitable[client])[i] = -1;
+ for (i = 0; i < ConnectClient_get_limit(ServerRealm_get_raClientsTable(ptr)[client]); ++i) {
+ ConnectClient_get_users(ServerRealm_get_raClientsTable(ptr)[client])[i] = -1;
}
- ConnectClient_set_sClientId(ptr->raclitable[client], NULL);
- ConnectClient_set_connected(ptr->raclitable[client], 0);
- close(SslFd_get_fd(ConnectClient_get_sslFd(ptr->raclitable[client])));
- FD_CLR(SslFd_get_fd(ConnectClient_get_sslFd(ptr->raclitable[client])), set);
- if (ConnectClient_get_state(ptr->raclitable[client]) == CONNECTCLIENT_STATE_AUTHORIZING) {
+ ConnectClient_set_sClientId(ServerRealm_get_raClientsTable(ptr)[client], NULL);
+ ConnectClient_set_connected(ServerRealm_get_raClientsTable(ptr)[client], 0);
+ close(SslFd_get_fd(ConnectClient_get_sslFd(ServerRealm_get_raClientsTable(ptr)[client])));
+ FD_CLR(SslFd_get_fd(ConnectClient_get_sslFd(ServerRealm_get_raClientsTable(ptr)[client])), set);
+ if (ConnectClient_get_state(ServerRealm_get_raClientsTable(ptr)[client]) == CONNECTCLIENT_STATE_AUTHORIZING) {
(*con)--;
}
- SSL_clear(SslFd_get_ssl(ConnectClient_get_sslFd(ptr->raclitable[client])));
- ptr->clicon--;
- if (ConnectClient_get_state(ptr->raclitable[client]) == CONNECTCLIENT_STATE_ACCEPTED) {
- ptr->raclicon--;
+ SSL_clear(SslFd_get_ssl(ConnectClient_get_sslFd(ServerRealm_get_raClientsTable(ptr)[client])));
+ ServerRealm_decrease_connectedClients(ptr);
+ if (ConnectClient_get_state(ServerRealm_get_raClientsTable(ptr)[client]) == CONNECTCLIENT_STATE_ACCEPTED) {
+ ServerRealm_decrease_connectedRaClients(ptr);
}
- ConnectClient_set_state(ptr->raclitable[client], CONNECTCLIENT_STATE_FREE);
+ ConnectClient_set_state(ServerRealm_get_raClientsTable(ptr)[client], CONNECTCLIENT_STATE_FREE);
}
diff --git a/src/server_remove.h b/src/server_remove.h
index 363b1cc..3a2f804 100644
--- a/src/server_remove.h
+++ b/src/server_remove.h
@@ -23,8 +23,8 @@
#ifndef _JS_SERVER_REMOVE_H
#define _JS_SERVER_REMOVE_H
-void remove_client(RealmT*, int, fd_set*, fd_set*, int*);
-void remove_raclient(RealmT*, int, fd_set*, fd_set*, int*);
+void remove_client(ServerRealm*, int, fd_set*, fd_set*, int*);
+void remove_raclient(ServerRealm*, int, fd_set*, fd_set*, int*);
#endif
diff --git a/src/server_signals.c b/src/server_signals.c
index ae5388d..55ceb4a 100644
--- a/src/server_signals.c
+++ b/src/server_signals.c
@@ -26,14 +26,16 @@
#include "http_proxy_functions.h"
#include "stats.h"
#include "logging.h"
+#include "server_configuration_struct.h"
-extern ConfigurationT config;
+extern ServerConfiguration* config;
void
server_sig_int(int signo)
{
int i, j;
unsigned char buff[5];
+ ServerRealm** scRealmsTable;
#ifdef HAVE_LIBPTHREAD
if (!is_this_a_mainthread()) {
@@ -41,24 +43,28 @@ server_sig_int(int signo)
}
#endif
- for (j = 0; j < config.size; ++j) {
+ for (j = 0; j < ServerConfiguration_get_realmsNumber(config); ++j) {
+ scRealmsTable = ServerConfiguration_get_realmsTable(config);
buff[0] = AF_S_CLOSING; /* closing */
- for (i = 0; i < config.realmtable[j].clinum; ++i) {
- if (ConnectClient_get_state(config.realmtable[j].clitable[i]) ==
+ for (i = 0; i < ServerRealm_get_clientsLimit(scRealmsTable[j]); ++i) {
+ if (ConnectClient_get_state(ServerRealm_get_clientsTable(scRealmsTable[j])[i]) ==
CONNECTCLIENT_STATE_ACCEPTED) {
- SslFd_send_message(config.realmtable[j].type,
+ SslFd_send_message(ServerRealm_get_realmType(scRealmsTable[j]),
ConnectClient_get_sslFd(
- config.realmtable[j].clitable[i]),
+ ServerRealm_get_clientsTable(scRealmsTable[j])[i]),
buff, 5);
+ close(SslFd_get_fd(ConnectClient_get_sslFd(
+ ServerRealm_get_clientsTable(scRealmsTable[j])[i])));
}
}
- for (i = 0; i < config.realmtable[j].raclinum; ++i) {
- if (ConnectClient_get_state(config.realmtable[j].raclitable[i]) ==
+ for (i = 0; i < ServerRealm_get_raClientsLimit(scRealmsTable[j]); ++i) {
+ if (ConnectClient_get_state(ServerRealm_get_raClientsTable(scRealmsTable[j])[i]) ==
CONNECTCLIENT_STATE_ACCEPTED) {
- SslFd_send_message(config.realmtable[j].type | TYPE_SSL,
+ SslFd_send_message(ServerRealm_get_realmType(scRealmsTable[j]) | TYPE_SSL,
ConnectClient_get_sslFd(
- config.realmtable[j].raclitable[i]),
+ ServerRealm_get_raClientsTable(scRealmsTable[j])[i]),
buff, 5);
+ close(SslFd_get_fd(ConnectClient_get_sslFd(ServerRealm_get_raClientsTable(scRealmsTable[j])[i])));
}
}
diff --git a/src/ssl_fd_struct.c b/src/ssl_fd_struct.c
index 61bf98c..c8038a4 100644
--- a/src/ssl_fd_struct.c
+++ b/src/ssl_fd_struct.c
@@ -20,14 +20,11 @@
#include <config.h>
-#include <stdlib.h>
-#include <string.h>
-#include <zlib.h>
-
#include "activefor.h"
#include "stats.h"
#include "logging.h"
#include "ssl_fd_struct.h"
+#include <zlib.h>
/*
* Function name: SslFd_new
diff --git a/src/usage.c b/src/usage.c
index 67e7046..a54dccd 100644
--- a/src/usage.c
+++ b/src/usage.c
@@ -58,7 +58,7 @@ server_long_usage(char* info)
printf(" -f, --cfgfile - the name of the file with the configuration for the\n");
printf(" active forwarder (server)\n");
printf(" -D, --dateformat - format of the date printed in logs (see 'man strftime'\n");
- printf(" for details) (default: %%d.%%m.%%Y %%H:%%M:%%S)\n\n");
+ printf(" for details) (default: %%Y-%%m-%%d %%H:%%M:%%S)\n\n");
printf(" -t, --timeout - the timeout value for the client's connection\n");
printf(" (default: 5)\n");
printf(" -u, --users - the amount of users allowed to use this server\n");
@@ -125,6 +125,12 @@ client_long_usage(char* info)
printf(" destination of the packets (default: the name\n");
printf(" returned by hostname function)\n");
printf(" -p, --portnum - the port we are forwarding connection to (required)\n");
+ printf(" --localname - local machine name for connection with afserver\n");
+ printf(" (used to bind socket to different interfaces)\n");
+ printf(" --localport - local port name for connection with afserver\n");
+ printf(" (used to bind socket to different addressees)\n");
+ printf(" --localdesname - local machine name for connections with destination\n");
+ printf(" application (used to bind socket to different interfaces)\n");
printf(" -V, --version - display version number\n");
printf(" -h, --help - prints this help\n\n");
printf(" Authorization:\n\n");
@@ -134,10 +140,12 @@ client_long_usage(char* info)
printf(" --ignorepkeys - ignore invalid server's public keys\n\n");
printf(" Configuration:\n\n");
printf(" -k, --keyfile - the name of the file with RSA key (default: client.rsa)\n");
+ printf(" -f, --cfgfile - the name of the file with the configuration for the\n");
+ printf(" active forwarder (client)\n");
printf(" -s, --storefile - the name of the file with stored public keys\n");
printf(" (default: known_hosts)\n");
printf(" -D, --dateformat - format of the date printed in logs (see 'man strftime'\n");
- printf(" for details) (default: %%d.%%m.%%Y %%H:%%M:%%S)\n");
+ printf(" for details) (default: %%Y-%%m-%%d %%H:%%M:%%S)\n");
printf(" -K, --keep-alive N - send keepalive packets every N seconds\n");
printf(" (default: not send keepalive packets)\n\n");
printf(" Auto-reconnection:\n\n");
@@ -151,10 +159,9 @@ client_long_usage(char* info)
printf(" -T, --ar-delay N - wait N seconds between reconnect tries (default: 5)\n\n");
printf(" Modes:\n\n");
printf(" -u, --udpmode - udp mode - client will use udp protocol to\n");
- printf(" communicate with the hostname:portnum (-p)\n");
+ printf(" communicate with the hostname:portnum\n");
printf(" -U, --reverseudp - reverse udp forwarding. Udp packets will be forwarded\n");
- printf(" from hostname:portnum (-p) to the server name:portnum\n");
- printf(" (-m)\n");
+ printf(" from hostname:portnum to the server name:manageport\n");
printf(" -r, --remoteadmin - remote administration mode. (using '-p #port' will\n");
printf(" force afclient to use port rather than stdin-stdout)\n\n");
printf(" Logging:\n\n");
diff --git a/src/usernames.c b/src/usernames.c
index 175cced..a1d2c2d 100644
--- a/src/usernames.c
+++ b/src/usernames.c
@@ -23,18 +23,18 @@
#include "usernames.h"
int
-get_username(RealmT* pointer, int user)
+get_username(ServerRealm* pointer, int user)
{
- return ConnectUser_get_userId(pointer->contable[user]);
+ return ConnectUser_get_userId(ServerRealm_get_usersTable(pointer)[user]);
}
int
-get_usernumber(RealmT* pointer, int userid)
+get_usernumber(ServerRealm* pointer, int userid)
{
int i;
-
- for (i = 0; i < pointer->usernum; ++i) {
- if (userid == ConnectUser_get_userId(pointer->contable[i])) {
+
+ for (i = 0; i < ServerRealm_get_usersLimit(pointer); ++i) {
+ if (userid == ConnectUser_get_userId(ServerRealm_get_usersTable(pointer)[i])) {
return i;
}
}
diff --git a/src/usernames.h b/src/usernames.h
index 0d0cb21..eb3023d 100644
--- a/src/usernames.h
+++ b/src/usernames.h
@@ -19,12 +19,13 @@
*/
#include "activefor.h"
+#include "server_realm_struct.h"
#ifndef _JS_USERNAMES_H
#define _JS_USERNAMES_H
-int get_username(RealmT*, int);
-int get_usernumber(RealmT*, int);
+int get_username(ServerRealm*, int);
+int get_usernumber(ServerRealm*, int);
#endif