X-Git-Url: http://git.pk910.de/?a=blobdiff_plain;f=src%2FClientSocket.c;h=cdf76f4fea8ef9113c4d309b553d8c473144f971;hb=78e040af3fcc36ab684611c0f98b4381ff420878;hp=c49577724393e3de6b1443841072ff8e1ed46105;hpb=c32e8254ec4ed0d77757e32f8aa5aabcdb494057;p=NeonServV5.git diff --git a/src/ClientSocket.c b/src/ClientSocket.c index c495777..cdf76f4 100644 --- a/src/ClientSocket.c +++ b/src/ClientSocket.c @@ -1,4 +1,4 @@ -/* ClientSocket.c - NeonServ v5.3 +/* ClientSocket.c - NeonServ v5.5 * Copyright (C) 2011-2012 Philipp Kreil (pk910) * * This program is free software: you can redistribute it and/or modify @@ -35,7 +35,7 @@ static pthread_mutex_t synchronized; static pthread_mutex_t synchronized_recv; struct ParseOrder { - unsigned long tid; + unsigned int tid; struct ParseOrder *next; }; struct ParseOrder *parse_order = NULL; @@ -74,6 +74,7 @@ struct ClientSocket* create_socket(char *host, int port, char *bindto, char *pas client->ident = strdup(ident); client->realname = strdup(realname); client->user = NULL; + client->network_name = NULL; client->flags = 0; client->bufferpos = 0; client->traffic_in = 0; @@ -105,6 +106,7 @@ int connect_socket(struct ClientSocket *client) { #ifndef WIN32 static int _connect_socket(struct ClientSocket *client) { if((client->flags & SOCKET_FLAG_CONNECTED)) return 1; + client->connection_time = time(0); int sock; struct addrinfo hints, *res; @@ -206,7 +208,6 @@ static int _connect_socket(struct ClientSocket *client) { client->sock = sock; client->flags |= SOCKET_FLAG_CONNECTED | SOCKET_FLAG_RECONNECT; - client->connection_time = time(0); if(client->flags & SOCKET_FLAG_SSL) { ssl_connect(client); @@ -230,8 +231,9 @@ static int _connect_socket(struct ClientSocket *client) { return 1; } #else -static int connect_socket(struct ClientSocket *client) { +static int _connect_socket(struct ClientSocket *client) { if((client->flags & SOCKET_FLAG_CONNECTED)) return 1; + client->connection_time = time(0); struct hostent *host; struct sockaddr_in addr; int sock; @@ -261,7 +263,6 @@ static int connect_socket(struct ClientSocket *client) { client->sock = sock; client->flags |= SOCKET_FLAG_CONNECTED | SOCKET_FLAG_RECONNECT; - client->connection_time = time(0); if(client->flags & SOCKET_FLAG_SSL) { @@ -344,6 +345,8 @@ static void destroy_socket(struct ClientSocket *client, int free_socket) { free(client->bind); if(client->pass) free(client->pass); + if(client->network_name) + free(client->network_name); free(client); } else if(client->flags & SOCKET_FLAG_FAST_JUMP) { client->flags &= ~SOCKET_FLAG_FAST_JUMP; @@ -354,17 +357,22 @@ static void destroy_socket(struct ClientSocket *client, int free_socket) { int write_socket_force(struct ClientSocket *client, char* msg, int len) { SYNCHRONIZE(synchronized); - printf("[send %d] %s", len, msg); + #ifdef HAVE_THREADS + putlog(LOGLEVEL_RAW, "[%d send %d] %s", getCurrentThreadID(), len, msg); + #else + putlog(LOGLEVEL_RAW, "[send %d] %s", len, msg); + #endif + int ret = 1; if(!(client->flags & SOCKET_FLAG_HAVE_SSL) || ssl_write(client, msg, len) == -2) { #ifdef WIN32 - send(client->sock, msg, len, 0); + ret = send(client->sock, msg, len, 0); #else - write(client->sock, msg, len); + ret = write(client->sock, msg, len); #endif } client->traffic_out += len; DESYNCHRONIZE(synchronized); - return 1; + return ret; } int write_socket(struct ClientSocket *client, char* msg, int len) { @@ -376,7 +384,7 @@ int write_socket(struct ClientSocket *client, char* msg, int len) { } #if HAVE_THREADS -static void clientsocket_start_of_recv(unsigned long tid) { +static void clientsocket_start_of_recv(unsigned int tid) { SYNCHRONIZE(whohandler_sync); struct ParseOrder *entry, *last; for(last = parse_order; last; last = last->next) { @@ -393,7 +401,7 @@ static void clientsocket_start_of_recv(unsigned long tid) { DESYNCHRONIZE(whohandler_sync); } -static void clientsocket_end_of_recv(unsigned long tid) { +static void clientsocket_end_of_recv(unsigned int tid) { SYNCHRONIZE(whohandler_sync); struct ParseOrder *entry, *last = NULL; for(entry = parse_order; entry; entry = entry->next) { @@ -410,7 +418,7 @@ static void clientsocket_end_of_recv(unsigned long tid) { DESYNCHRONIZE(whohandler_sync); } -int clientsocket_parseorder_top(unsigned long tid) { +int clientsocket_parseorder_top(unsigned int tid) { if(parse_order && parse_order->tid == tid) return 1; else @@ -418,8 +426,8 @@ int clientsocket_parseorder_top(unsigned long tid) { } #endif -void socket_loop(int timeout_seconds) { - if(sockets == NULL) return; +int socket_loop(int timeout_seconds) { + if(sockets == NULL) return 0; int is_synchronized = 1; SYNCHRONIZE(synchronized_recv); fd_set fds; @@ -437,10 +445,6 @@ void socket_loop(int timeout_seconds) { timeout.tv_sec = timeout_seconds; timeout.tv_usec = 0; ret = select(ret + 1, &fds, NULL, NULL, &timeout); - if(ret == 0) { - DESYNCHRONIZE(synchronized_recv); - return; - } for (sock = sockets->data; sock; sock = next) { next = sock->next; if((sock->flags & (SOCKET_FLAG_CONNECTED | SOCKET_FLAG_QUITTED)) == SOCKET_FLAG_CONNECTED && FD_ISSET(sock->sock, &fds)) { @@ -494,7 +498,7 @@ void socket_loop(int timeout_seconds) { sock->bufferpos -= used; } is_synchronized = 0; - unsigned long tid = syscall(SYS_gettid); + unsigned int tid = (unsigned int) pthread_self_tid(); clientsocket_start_of_recv(tid); DESYNCHRONIZE(synchronized_recv); parse_lines(sock, linesbuf, used); @@ -530,6 +534,7 @@ void socket_loop(int timeout_seconds) { if(is_synchronized) { DESYNCHRONIZE(synchronized_recv); } + return 1; } void @@ -575,6 +580,8 @@ void free_sockets() { free(client->bind); if(client->pass) free(client->pass); + if(client->network_name) + free(client->network_name); free(client); } free(sockets);