Showing
9 changed files
with
92 additions
and
39 deletions
| ... | ... | @@ -30,12 +30,12 @@ |
| 30 | 30 | #include <netdb.h> |
| 31 | 31 | |
| 32 | 32 | #include "trbase.h" |
| 33 | +#include "tr/socket.h" | |
| 33 | 34 | |
| 34 | 35 | TR_CLASS(TR_RemoteData) { |
| 35 | - unsigned char * data; | |
| 36 | - size_t ndata; | |
| 37 | - struct sockaddr_in addr; // for now... should be more generic | |
| 38 | - socklen_t addrlen; | |
| 36 | + unsigned char * data; | |
| 37 | + size_t ndata; | |
| 38 | + TR_Socket socket; | |
| 39 | 39 | }; |
| 40 | 40 | |
| 41 | 41 | TR_INSTANCE_INIT(TR_RemoteData); | ... | ... |
| ... | ... | @@ -34,7 +34,7 @@ |
| 34 | 34 | //#include <arpa/inet.h> // for in_port_t |
| 35 | 35 | |
| 36 | 36 | #include "trbase.h" |
| 37 | -#include "tr/interface/socket.h" | |
| 37 | +//#include "tr/interface/socket.h" | |
| 38 | 38 | #include "tr/logger.h" |
| 39 | 39 | |
| 40 | 40 | typedef enum TR_e_socket_fin { |
| ... | ... | @@ -44,18 +44,25 @@ typedef enum TR_e_socket_fin { |
| 44 | 44 | TR_FIN_RDWR = 3 |
| 45 | 45 | } TR_SocketFin; |
| 46 | 46 | |
| 47 | +#define TR_MAX_HOST 256 | |
| 48 | +#define TR_MAX_CNAME 512 | |
| 49 | + | |
| 47 | 50 | TR_CLASS(TR_Socket) { |
| 48 | - TR_Logger log; | |
| 49 | - int flags; | |
| 50 | - int type; | |
| 51 | - char * host; | |
| 52 | - char * cname; | |
| 53 | - int port; | |
| 54 | - time_t ttl; | |
| 55 | - struct sockaddr_in addr; // for now... should be more generic. | |
| 56 | - socklen_t addrlen; | |
| 57 | - int handle; | |
| 58 | - TR_SocketFin fin_state; | |
| 51 | + TR_Logger log; | |
| 52 | + int flags; | |
| 53 | + int type; | |
| 54 | + char host[TR_MAX_HOST]; | |
| 55 | + char cname[TR_MAX_CNAME]; | |
| 56 | + int port; | |
| 57 | + time_t ttl; | |
| 58 | + union { | |
| 59 | + struct sockaddr info; | |
| 60 | + struct sockaddr_in in; | |
| 61 | + struct sockaddr_in6 in6; | |
| 62 | + } addr; | |
| 63 | + socklen_t addrlen; | |
| 64 | + int handle; | |
| 65 | + TR_SocketFin fin_state; | |
| 59 | 66 | }; |
| 60 | 67 | |
| 61 | 68 | TR_INSTANCE_INIT(TR_Socket); |
| ... | ... | @@ -67,7 +74,14 @@ TR_INSTANCE_INIT(TR_Socket); |
| 67 | 74 | #define TR_socketPort(socket) (((TR_Socket)(socket))->port) |
| 68 | 75 | #define TR_socketCname(socket) (((TR_Socket)(socket))->cname) |
| 69 | 76 | #define TR_socketTtl(socket) (((TR_Socket)(socket))->ttl) |
| 70 | -#define TR_socketAddr(socket) (((TR_Socket)(socket))->addr) | |
| 77 | + | |
| 78 | +#define TR_socketAddr(socket) \ | |
| 79 | + (((TR_Socket)(socket))->addr.info.sa_family == AF_INET \ | |
| 80 | + ? ((TR_Socket)(socket))->addr.in \ | |
| 81 | + : ((TR_Socket)(socket))->addr.info.sa_family == AF_INET6 \ | |
| 82 | + ? ((TR_Socket)(socket))->addr.in6 \ | |
| 83 | + : NULL) | |
| 84 | + | |
| 71 | 85 | #define TR_socketAddrlen(socket) (((TR_Socket)(socket))->addrlen) |
| 72 | 86 | #define TR_socketHandle(socket) (((TR_Socket)(socket))->handle) |
| 73 | 87 | #define TR_socketFinState(socket) (((TR_Socket)(socket))->fin_state) |
| ... | ... | @@ -75,8 +89,32 @@ TR_INSTANCE_INIT(TR_Socket); |
| 75 | 89 | #define TR_socketFinWr(socket) ((TR_socketFinState((socket)) & 2) == 2) |
| 76 | 90 | #define TR_socketFinRdWr(socket) ((TR_socketFinState((socket)) & 3) == 3) |
| 77 | 91 | |
| 78 | -#define TR_socketGetIp(socket) (TR_socketAddr(socket).sin_addr.s_addr) | |
| 79 | -#define TR_socketGetIpStr(socket) (inet_ntoa(TR_socketGetIp(socket))) | |
| 92 | +#define TR_socketAddrPort(socket) \ | |
| 93 | + (((TR_Socket)(socket))->addr.info.sa_family == AF_INET \ | |
| 94 | + ? ((TR_Socket)(socket))->addr.in.sin_port \ | |
| 95 | + : ((TR_Socket)(socket))->addr.info.sa_family == AF_INET6 \ | |
| 96 | + ? ((TR_Socket)(socket))->addr.in6.sin6_port \ | |
| 97 | + : -1) | |
| 98 | + | |
| 99 | +#define TR_socketAddrIp(socket) \ | |
| 100 | + (((TR_Socket)(socket))->addr.info.sa_family == AF_INET \ | |
| 101 | + ? ((TR_Socket)(socket))->addr.in.sin_addr.s_addr \ | |
| 102 | + : ((TR_Socket)(socket))->addr.info.sa_family == AF_INET6 \ | |
| 103 | + ? ((TR_Socket)(socket))->addr.in6.sin6_addr.s6_addr \ | |
| 104 | + : NULL) | |
| 105 | + | |
| 106 | +#define TR_socketAddrIpStr(socket, buffer, nbuffer) \ | |
| 107 | + (((TR_Socket)(socket))->addr.info.sa_family == AF_INET \ | |
| 108 | + ? inet_ntop( \ | |
| 109 | + ((TR_Socket)(socket))->addr.info.sa_family, \ | |
| 110 | + &((TR_Socket)(socket))->addr.in.sin_addr.s_addr, \ | |
| 111 | + buffer, nbuffer) \ | |
| 112 | + : ((TR_Socket)(socket))->addr.info.sa_family == AF_INET6 \ | |
| 113 | + ? inet_ntop( \ | |
| 114 | + ((TR_Socket)(socket))->addr.info.sa_family, \ | |
| 115 | + ((TR_Socket)(socket))->addr.in6.sin6_addr.s6_addr, \ | |
| 116 | + buffer, nbuffer) \ | |
| 117 | + : NULL) | |
| 80 | 118 | |
| 81 | 119 | TR_CLASS(TR_TcpSocket) { |
| 82 | 120 | TR_EXTENDS(TR_Socket); | ... | ... |
| ... | ... | @@ -30,18 +30,17 @@ |
| 30 | 30 | #include <sys/socket.h> |
| 31 | 31 | #include <netdb.h> |
| 32 | 32 | |
| 33 | -#include "tr/remote_data.h" | |
| 34 | 33 | #include "trbase.h" |
| 34 | +#include "tr/remote_data.h" | |
| 35 | +#include "tr/socket.h" | |
| 35 | 36 | |
| 36 | 37 | static |
| 37 | 38 | int |
| 38 | 39 | remoteDataCtor(void * _this, va_list * params) |
| 39 | 40 | { |
| 40 | - TR_RemoteData this = _this; | |
| 41 | - struct sockaddr * addr_ptr = va_arg(*params, struct sockaddr *); | |
| 41 | + TR_RemoteData this = _this; | |
| 42 | 42 | |
| 43 | - this->addrlen = va_arg(*params, socklen_t); | |
| 44 | - memcpy(&(this->addr), addr_ptr, this->addrlen); | |
| 43 | + this->socket = va_arg(*params, TR_Socket); | |
| 45 | 44 | |
| 46 | 45 | this->data = NULL; |
| 47 | 46 | this->ndata = 0; | ... | ... |
| ... | ... | @@ -35,7 +35,10 @@ TR_remoteDataSetData(TR_RemoteData this, unsigned char * data, size_t size) |
| 35 | 35 | TR_MEM_FREE(this->data); |
| 36 | 36 | } |
| 37 | 37 | |
| 38 | - this->data = TR_malloc(size); | |
| 38 | + if (! this->data) { | |
| 39 | + this->data = TR_malloc(size); | |
| 40 | + } | |
| 41 | + | |
| 39 | 42 | this->ndata = size; |
| 40 | 43 | memcpy(this->data, data, size); |
| 41 | 44 | } | ... | ... |
| ... | ... | @@ -25,6 +25,7 @@ |
| 25 | 25 | #include <unistd.h> |
| 26 | 26 | #include <stdio.h> |
| 27 | 27 | #include <fcntl.h> |
| 28 | +#include <string.h> | |
| 28 | 29 | |
| 29 | 30 | #include <sys/types.h> |
| 30 | 31 | #include <sys/socket.h> |
| ... | ... | @@ -32,6 +33,7 @@ |
| 32 | 33 | |
| 33 | 34 | #include "tr/remote_data.h" |
| 34 | 35 | #include "tr/socket.h" |
| 36 | +#include "tr/interface/socket.h" | |
| 35 | 37 | #include "tr/logger.h" |
| 36 | 38 | #include "trbase.h" |
| 37 | 39 | |
| ... | ... | @@ -39,16 +41,21 @@ static |
| 39 | 41 | int |
| 40 | 42 | socketCtor(void * _this, va_list * params) |
| 41 | 43 | { |
| 42 | - TR_Socket this = _this; | |
| 44 | + TR_Socket this = _this; | |
| 45 | + char * host; | |
| 43 | 46 | |
| 44 | - this->type = 0; | |
| 47 | + this->type = AF_UNSPEC; | |
| 45 | 48 | this->handle = -1; |
| 46 | 49 | this->log = va_arg(*params, TR_Logger); |
| 47 | - this->host = TR_strdup(va_arg(*params, char*)); | |
| 50 | + host = va_arg(*params, char*); | |
| 48 | 51 | this->port = va_arg(*params, int); |
| 49 | 52 | this->flags = va_arg(*params, int); |
| 50 | 53 | this->fin_state = TR_FIN_RDWR; |
| 51 | 54 | |
| 55 | + if (host) { | |
| 56 | + strncpy(this->host, host, TR_MAX_HOST); | |
| 57 | + } | |
| 58 | + | |
| 52 | 59 | return 0; |
| 53 | 60 | } |
| 54 | 61 | |
| ... | ... | @@ -58,9 +65,6 @@ socketDtor(void * _this) |
| 58 | 65 | { |
| 59 | 66 | TR_Socket this = _this; |
| 60 | 67 | |
| 61 | - TR_MEM_FREE(this->host); | |
| 62 | - TR_MEM_FREE(this->cname); | |
| 63 | - | |
| 64 | 68 | if (STDERR_FILENO < this->handle) { |
| 65 | 69 | TR_socketClose(this); |
| 66 | 70 | } |
| ... | ... | @@ -73,7 +77,7 @@ socketBind(void * _this) |
| 73 | 77 | TR_Socket this = _this; |
| 74 | 78 | int state; |
| 75 | 79 | |
| 76 | - state = bind(this->handle, (struct sockaddr *)&(this->addr), this->addrlen); | |
| 80 | + state = bind(this->handle, &(this->addr.info), this->addrlen); | |
| 77 | 81 | |
| 78 | 82 | if (-1 == state) { |
| 79 | 83 | perror("bind"); | ... | ... |
| ... | ... | @@ -46,7 +46,7 @@ TR_socketAccept(TR_TcpSocket this) |
| 46 | 46 | remote->addrlen = ((TR_Socket)this)->addrlen; |
| 47 | 47 | remote->handle = accept( |
| 48 | 48 | TR_socketHandle(this), |
| 49 | - (struct sockaddr *)&(remote->addr), | |
| 49 | + &(remote->addr.info), | |
| 50 | 50 | &(remote->addrlen)); |
| 51 | 51 | |
| 52 | 52 | //flags = fcntl(remote->handle, F_GETFL, 0); |
| ... | ... | @@ -56,8 +56,8 @@ TR_socketAccept(TR_TcpSocket this) |
| 56 | 56 | perror("accept"); |
| 57 | 57 | TR_delete(remote); |
| 58 | 58 | } else { |
| 59 | - remote->host = TR_strdup(inet_ntoa(remote->addr.sin_addr)); | |
| 60 | - remote->port = ntohs(remote->addr.sin_port); | |
| 59 | + TR_socketAddrIpStr(remote, remote->host, TR_MAX_HOST); | |
| 60 | + remote->port = TR_socketAddrPort(remote); | |
| 61 | 61 | remote->type = TR_socketType(this); |
| 62 | 62 | remote->flags = TR_socketFlags(this); |
| 63 | 63 | } | ... | ... |
| ... | ... | @@ -27,6 +27,7 @@ |
| 27 | 27 | #include <stdio.h> |
| 28 | 28 | #include <unistd.h> |
| 29 | 29 | #include <fcntl.h> |
| 30 | +#include <errno.h> | |
| 30 | 31 | |
| 31 | 32 | #include <sys/types.h> |
| 32 | 33 | #include <sys/socket.h> |
| ... | ... | @@ -41,6 +42,7 @@ TR_socketInit(TR_Socket this, TR_socketAction_fptr action) |
| 41 | 42 | struct addrinfo hint; |
| 42 | 43 | struct addrinfo * info, * current_info; |
| 43 | 44 | char port_str[6]; |
| 45 | + int code; | |
| 44 | 46 | |
| 45 | 47 | hint.ai_socktype = this->type; |
| 46 | 48 | hint.ai_flags = this->flags; |
| ... | ... | @@ -52,8 +54,11 @@ TR_socketInit(TR_Socket this, TR_socketAction_fptr action) |
| 52 | 54 | hint.ai_next = NULL; |
| 53 | 55 | |
| 54 | 56 | sprintf(port_str, "%u", this->port); |
| 55 | - if (0 != getaddrinfo(this->host, port_str, &hint, &info)) { | |
| 57 | + code = getaddrinfo(this->host, port_str, &hint, &info); | |
| 58 | + if (0 != code) { | |
| 56 | 59 | // TODO error handling... |
| 60 | + puts(gai_strerror(code)); | |
| 61 | + | |
| 57 | 62 | return FALSE; |
| 58 | 63 | } |
| 59 | 64 | |
| ... | ... | @@ -88,7 +93,9 @@ TR_socketInit(TR_Socket this, TR_socketAction_fptr action) |
| 88 | 93 | //int flags = fcntl(this->handle, F_GETFL, 0); |
| 89 | 94 | |
| 90 | 95 | //fcntl(this->handle, F_SETFL, flags | O_NONBLOCK); |
| 91 | - this->cname = TR_strdup(current_info->ai_canonname); | |
| 96 | + if (current_info->ai_canonname) { | |
| 97 | + strncpy(this->cname, current_info->ai_canonname, TR_MAX_CNAME); | |
| 98 | + } | |
| 92 | 99 | this->fin_state = TR_FIN_NO; |
| 93 | 100 | |
| 94 | 101 | //! Make the socket REUSE a TIME_WAIT socket | ... | ... |
| ... | ... | @@ -30,6 +30,7 @@ |
| 30 | 30 | #include <netdb.h> |
| 31 | 31 | |
| 32 | 32 | #include "tr/socket.h" |
| 33 | +#include "tr/interface/socket.h" | |
| 33 | 34 | #include "tr/logger.h" |
| 34 | 35 | #include "trbase.h" |
| 35 | 36 | |
| ... | ... | @@ -85,8 +86,8 @@ udpSocketSend(TR_Socket this, TR_RemoteData data) |
| 85 | 86 | data->data, |
| 86 | 87 | data->ndata, |
| 87 | 88 | this->flags, |
| 88 | - (struct sockaddr *)&(data->addr), | |
| 89 | - data->addrlen); | |
| 89 | + &(data->socket->addr.info), | |
| 90 | + data->socket->addrlen); | |
| 90 | 91 | |
| 91 | 92 | if (-1 == send) { |
| 92 | 93 | perror("sendto"); | ... | ... |
Please
register
or
login
to post a comment