#include "server.h"
int main(int argc, char ** argv)
{
/* variables to parse arguments */
extern int optind,
optopt;
extern char * optarg;
char * log_file;
int c = (int)NULL,
errflg = (int)NULL,
verbose = (int)NULL,
optval = 1;
socklen_t optlen = sizeof(optval);
/* fd -> file descriptor */
int socket_server_fd = (int)NULL,
socket_server_port = (int)NULL,
socket_accept_fd = (int)NULL,
sockaddr_in_size = sizeof(struct sockaddr_in),
err = (int)NULL;
/* Internet socket address stuct */
struct sockaddr_in server_addr,
accept_addr;
struct client * clients = (struct client *) NULL,
* current = (struct client *) NULL;
pthread_t threads;
/* clear screen */
system(__CLEAR_SCREEN__);
while ( (c = getopt(argc, argv, ":vp:")) != -1 )
{
switch ( c )
{
case 'p':
if ( socket_server_port = strtol(optarg, 0, 10) == 0 )
{
fprintf(stderr, "Option -%c requires a valid port and '%s' isn't valid\n", optopt, optarg);
++errflg;
}
break;
case 'v':
verbose = 1;
break;
case ':':
/* -f or -o without operand */
fprintf(stderr, "Option -%c requires an operand\n", optopt);
++errflg;
break;
case '?':
fprintf(stderr, "Unrecognized option: -%c\n", optopt);
++errflg;
}
}
if ( errflg )
{
fprintf(stderr, "usage: . . . \n\n");
exit(2);
}
/* make a socket */
socket_server_fd = socket(AF_INET, SOCK_STREAM, 0);
if ( socket_server_fd == __SOCKET_ERROR__ )
{
printf("\nCould not make a socket\n");
return 0;
}
bzero((char *) &server_addr, sockaddr_in_size);
bzero((char *) &accept_addr, sockaddr_in_size);
if ( !socket_server_port )
socket_server_port = __DEFAULT_OPEN_PORT__;
/* fill address struct */
server_addr.sin_addr.s_addr = INADDR_ANY;
server_addr.sin_port = htons(socket_server_port);
server_addr.sin_family = AF_INET;
bzero(&(server_addr.sin_zero), 8);
if ( __DEBUG__ || verbose )
printf("\nBinding to port %d...\n", socket_server_port);
/* bind to a port */
if ( bind(socket_server_fd, (struct sockaddr *)&(server_addr), sizeof(server_addr)) == __SOCKET_ERROR__ )
{
printf("\nCould not connect to host\n");
exit(1);
}
/* get port number */
getsockname(socket_server_fd, (struct sockaddr *)&(server_addr), (socklen_t *) &(sockaddr_in_size));
if ( __DEBUG__ || verbose )
{
printf("\nopened socket as fd (%d) on port (%d) for stream i/o\n", socket_server_fd, ntohs(server_addr.sin_port));
printf("Server\n\
sin_family = %d\n\
sin_addr.s_addr = %d\n\
sin_port = %d\n"
, server_addr.sin_family
, server_addr.sin_addr.s_addr
, ntohs(server_addr.sin_port)
);
printf("\nMaking a listen queue of %d elements", __QUEUE_SIZE__);
}
/* establish listen queue */
if ( listen(socket_server_fd, __QUEUE_SIZE__) == __SOCKET_ERROR__ )
{
printf("\nCould not listen\n");
return 0;
}
for ( ; ; )
{
if ( __DEBUG__ || verbose )
puts("\nWaiting for a connection\n");
/* get the connected socket */
socket_accept_fd = accept(socket_server_fd, (struct sockaddr *) &(accept_addr), (socklen_t *) &(sockaddr_in_size));
fcntl(socket_accept_fd, F_SETFL, fcntl(socket_accept_fd, F_GETFL, 0) | O_NDELAY);
if ( socket_accept_fd > -1 )
{
if ( clients == (struct client *) NULL )
current = clients;
else
while ( (current = clients->next) != (struct client *) NULL );
current = (struct client *) malloc(sizeof(struct client));
current->next = (struct client *) NULL;
current->fd = socket_accept_fd;
current->sockaddr = accept_addr;
current->last = time(NULL);
char buffer_client[__BUFFER_SIZE__],
buffer_jabber[__BUFFER_SIZE__];
struct client * client = current;//(struct client *) pClient;
int i = 0, err;
time_t last;
char ip[46];
unsigned short port;
inet_ntop(AF_INET, &(client->sockaddr.sin_addr), ip, sizeof (ip));
port = ntohs(client->sockaddr.sin_port);
printf("\nGot a connection from %s, port %hu\n", ip, port);
/*---------------------------------------------------*/
int jabber_fd = (int)NULL,
jabber_port = (int)NULL,
jabber_error = (int)NULL;
struct sockaddr_in jabber_addr;
jabber_port = __DEFAULT_JABBER_PORT__;
jabber_fd = socket(AF_INET, SOCK_STREAM, 0);
fcntl(jabber_fd, F_SETFL, fcntl(jabber_fd, F_GETFL, 0) | O_NDELAY);
jabber_addr.sin_family = AF_INET;
inet_aton(__DEFAULT_JABBER_IP__, &jabber_addr.sin_addr);
//jabber_addr.sin_addr.s_addr = inet_addr(__DEFAULT_JABBER_IP__);
jabber_addr.sin_port = htons(jabber_port);
jabber_error = connect(jabber_fd, (struct sockaddr *) &(jabber_addr), sizeof(jabber_addr));
last = time(NULL);
int client_is_connected = -1;
int jabber_is_connected = -1;
int sockaddr_in_size = sizeof(struct sockaddr_in);
while ( client_is_connected != 0 )
{
/* read from client */
puts("\tread - client");
bzero(buffer_client, __BUFFER_SIZE__);
if ( (client_is_connected = read(client->fd, buffer_client, __BUFFER_SIZE__)) != 0 && strlen(buffer_jabber) > 0 )
{
puts("\twrite - client");
printf("\t%s\n", buffer_jabber);
/* write in the client */
write(client->fd, buffer_jabber, strlen(buffer_jabber));
}
/* read from jabber service */
puts("\tread - jabber");
bzero(buffer_jabber, __BUFFER_SIZE__);
if ( (jabber_is_connected = read(jabber_fd, buffer_jabber, __BUFFER_SIZE__)) && strlen(buffer_client) > 0 )
{
puts("\twrite - jabber");
printf("\t%s\n", buffer_client);
/* write in the jabber service */
if ( !strstr(buffer_jabber, "") )
write(jabber_fd, buffer_client, strlen(buffer_client));
}
if ( strstr(buffer_jabber, "") )
{
fcntl(jabber_fd, F_SETFL, fcntl(jabber_fd, F_GETFL, 0) | ~O_NDELAY);
//starttls(&jabber_fd, &client->fd);
int err;
SSL_CTX * ctx;
SSL * jabberssl;
//OpenSSL_add_all_algorithms();
SSL_library_init();
SSL_load_error_strings();
if ( !(ctx = SSL_CTX_new(TLSv1_server_method())) )
{
printf("Error creating the context.\n");
exit(0);
}
SSL_CTX_set_verify(ctx,SSL_VERIFY_NONE,NULL);
jabberssl = SSL_new(ctx);
puts("#1");
err=SSL_set_fd(jabberssl, jabber_fd);
if ( err < 1 )
{
puts("shsfghdfgh");
SSL_CTX_free(ctx);
}
puts("connect");
err = SSL_connect(jabberssl);
if ( err < 1 )
{
puts("client");
err = SSL_get_error(jabberssl, err);
printf("%d\n", err);
char err_str[1024];
ERR_error_string_n(ERR_get_error(), err_str, sizeof(err_str));
printf("%s\n", err_str);
SSL_CTX_free(ctx);
}
}
if ( jabber_is_connected == 0 )
client_is_connected = jabber_is_connected;
puts("end loop");
usleep(500000);
}
if ( close(jabber_fd) == __SOCKET_ERROR__ )
{
printf("\nCould not close jabber socket\n");
return 0;
}
/*---------------------------------------------------*/
if ( close(client->fd) == __SOCKET_ERROR__ )
{
printf("\nCould not close socket\n");
return 0;
}
fflush(stdin);
fflush(stdout);
free(client);
//pthread_create(&(threads), NULL, handler, (void *) current);
}
}
pthread_exit(NULL);
}
void * handler(void * pClient)
{
char buffer_client[__BUFFER_SIZE__],
buffer_jabber[__BUFFER_SIZE__];
struct client * client = (struct client *) pClient;
int i = 0, err;
time_t last;
char ip[46];
unsigned short port;
inet_ntop(AF_INET, &(client->sockaddr.sin_addr), ip, sizeof (ip));
port = ntohs(client->sockaddr.sin_port);
printf("\nGot a connection from %s, port %hu\n", ip, port);
/*---------------------------------------------------*/
int jabber_fd = (int)NULL,
jabber_port = (int)NULL,
jabber_error = (int)NULL;
struct sockaddr_in jabber_addr;
jabber_port = __DEFAULT_JABBER_PORT__;
jabber_fd = socket(AF_INET, SOCK_STREAM, 0);
fcntl(jabber_fd, F_SETFL, fcntl(jabber_fd, F_GETFL, 0) | O_NDELAY);
jabber_addr.sin_family = AF_INET;
inet_aton(__DEFAULT_JABBER_IP__, &jabber_addr.sin_addr);
//jabber_addr.sin_addr.s_addr = inet_addr(__DEFAULT_JABBER_IP__);
jabber_addr.sin_port = htons(jabber_port);
jabber_error = connect(jabber_fd, (struct sockaddr *) &(jabber_addr), sizeof(jabber_addr));
last = time(NULL);
int client_is_connected = -1;
int jabber_is_connected = -1;
int sockaddr_in_size = sizeof(struct sockaddr_in);
while ( client_is_connected != 0 )
{
/* read from client */
puts("\tread - client");
bzero(buffer_client, __BUFFER_SIZE__);
if ( (client_is_connected = read(client->fd, buffer_client, __BUFFER_SIZE__)) != 0 && strlen(buffer_jabber) > 0 )
{
puts("\twrite - client");
printf("\t%s\n", buffer_jabber);
/* write in the client */
write(client->fd, buffer_jabber, strlen(buffer_jabber));
}
/* read from jabber service */
puts("\tread - jabber");
bzero(buffer_jabber, __BUFFER_SIZE__);
if ( (jabber_is_connected = read(jabber_fd, buffer_jabber, __BUFFER_SIZE__)) && strlen(buffer_client) > 0 )
{
puts("\twrite - jabber");
printf("\t%s\n", buffer_client);
/* write in the jabber service */
if ( !strstr(buffer_jabber, "") )
write(jabber_fd, buffer_client, strlen(buffer_client));
}
if ( strstr(buffer_jabber, "") )
{
fcntl(jabber_fd, F_SETFL, fcntl(jabber_fd, F_GETFL, 0) | ~O_NDELAY);
//starttls(&jabber_fd, &client->fd);
int err;
SSL_CTX * ctx;
SSL * jabberssl;
//OpenSSL_add_all_algorithms();
SSL_library_init();
SSL_load_error_strings();
if ( !(ctx = SSL_CTX_new(TLSv1_server_method())) )
{
printf("Error creating the context.\n");
exit(0);
}
SSL_CTX_set_verify(ctx,SSL_VERIFY_NONE,NULL);
jabberssl = SSL_new(ctx);
puts("#1");
err=SSL_set_fd(jabberssl, jabber_fd);
if ( err < 1 )
{
puts("shsfghdfgh");
SSL_CTX_free(ctx);
}
puts("connect");
err = SSL_connect(jabberssl);
if ( err < 1 )
{
puts("client");
err = SSL_get_error(jabberssl, err);
printf("%d\n", err);
char err_str[1024];
ERR_error_string_n(ERR_get_error(), err_str, sizeof(err_str));
printf("%s\n", err_str);
SSL_CTX_free(ctx);
}
}
if ( jabber_is_connected == 0 )
client_is_connected = jabber_is_connected;
puts("end loop");
usleep(500000);
}
if ( close(jabber_fd) == __SOCKET_ERROR__ )
{
printf("\nCould not close jabber socket\n");
return 0;
}
/*---------------------------------------------------*/
if ( close(client->fd) == __SOCKET_ERROR__ )
{
printf("\nCould not close socket\n");
return 0;
}
fflush(stdin);
fflush(stdout);
free(client);
pthread_exit(NULL);
}