Showing
9 changed files
with
92 additions
and
39 deletions
@@ -30,12 +30,12 @@ | @@ -30,12 +30,12 @@ | ||
30 | #include <netdb.h> | 30 | #include <netdb.h> |
31 | 31 | ||
32 | #include "trbase.h" | 32 | #include "trbase.h" |
33 | +#include "tr/socket.h" | ||
33 | 34 | ||
34 | TR_CLASS(TR_RemoteData) { | 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 | TR_INSTANCE_INIT(TR_RemoteData); | 41 | TR_INSTANCE_INIT(TR_RemoteData); |
@@ -34,7 +34,7 @@ | @@ -34,7 +34,7 @@ | ||
34 | //#include <arpa/inet.h> // for in_port_t | 34 | //#include <arpa/inet.h> // for in_port_t |
35 | 35 | ||
36 | #include "trbase.h" | 36 | #include "trbase.h" |
37 | -#include "tr/interface/socket.h" | 37 | +//#include "tr/interface/socket.h" |
38 | #include "tr/logger.h" | 38 | #include "tr/logger.h" |
39 | 39 | ||
40 | typedef enum TR_e_socket_fin { | 40 | typedef enum TR_e_socket_fin { |
@@ -44,18 +44,25 @@ typedef enum TR_e_socket_fin { | @@ -44,18 +44,25 @@ typedef enum TR_e_socket_fin { | ||
44 | TR_FIN_RDWR = 3 | 44 | TR_FIN_RDWR = 3 |
45 | } TR_SocketFin; | 45 | } TR_SocketFin; |
46 | 46 | ||
47 | +#define TR_MAX_HOST 256 | ||
48 | +#define TR_MAX_CNAME 512 | ||
49 | + | ||
47 | TR_CLASS(TR_Socket) { | 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 | TR_INSTANCE_INIT(TR_Socket); | 68 | TR_INSTANCE_INIT(TR_Socket); |
@@ -67,7 +74,14 @@ TR_INSTANCE_INIT(TR_Socket); | @@ -67,7 +74,14 @@ TR_INSTANCE_INIT(TR_Socket); | ||
67 | #define TR_socketPort(socket) (((TR_Socket)(socket))->port) | 74 | #define TR_socketPort(socket) (((TR_Socket)(socket))->port) |
68 | #define TR_socketCname(socket) (((TR_Socket)(socket))->cname) | 75 | #define TR_socketCname(socket) (((TR_Socket)(socket))->cname) |
69 | #define TR_socketTtl(socket) (((TR_Socket)(socket))->ttl) | 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 | #define TR_socketAddrlen(socket) (((TR_Socket)(socket))->addrlen) | 85 | #define TR_socketAddrlen(socket) (((TR_Socket)(socket))->addrlen) |
72 | #define TR_socketHandle(socket) (((TR_Socket)(socket))->handle) | 86 | #define TR_socketHandle(socket) (((TR_Socket)(socket))->handle) |
73 | #define TR_socketFinState(socket) (((TR_Socket)(socket))->fin_state) | 87 | #define TR_socketFinState(socket) (((TR_Socket)(socket))->fin_state) |
@@ -75,8 +89,32 @@ TR_INSTANCE_INIT(TR_Socket); | @@ -75,8 +89,32 @@ TR_INSTANCE_INIT(TR_Socket); | ||
75 | #define TR_socketFinWr(socket) ((TR_socketFinState((socket)) & 2) == 2) | 89 | #define TR_socketFinWr(socket) ((TR_socketFinState((socket)) & 2) == 2) |
76 | #define TR_socketFinRdWr(socket) ((TR_socketFinState((socket)) & 3) == 3) | 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 | TR_CLASS(TR_TcpSocket) { | 119 | TR_CLASS(TR_TcpSocket) { |
82 | TR_EXTENDS(TR_Socket); | 120 | TR_EXTENDS(TR_Socket); |
@@ -30,18 +30,17 @@ | @@ -30,18 +30,17 @@ | ||
30 | #include <sys/socket.h> | 30 | #include <sys/socket.h> |
31 | #include <netdb.h> | 31 | #include <netdb.h> |
32 | 32 | ||
33 | -#include "tr/remote_data.h" | ||
34 | #include "trbase.h" | 33 | #include "trbase.h" |
34 | +#include "tr/remote_data.h" | ||
35 | +#include "tr/socket.h" | ||
35 | 36 | ||
36 | static | 37 | static |
37 | int | 38 | int |
38 | remoteDataCtor(void * _this, va_list * params) | 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 | this->data = NULL; | 45 | this->data = NULL; |
47 | this->ndata = 0; | 46 | this->ndata = 0; |
@@ -35,7 +35,10 @@ TR_remoteDataSetData(TR_RemoteData this, unsigned char * data, size_t size) | @@ -35,7 +35,10 @@ TR_remoteDataSetData(TR_RemoteData this, unsigned char * data, size_t size) | ||
35 | TR_MEM_FREE(this->data); | 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 | this->ndata = size; | 42 | this->ndata = size; |
40 | memcpy(this->data, data, size); | 43 | memcpy(this->data, data, size); |
41 | } | 44 | } |
@@ -25,6 +25,7 @@ | @@ -25,6 +25,7 @@ | ||
25 | #include <unistd.h> | 25 | #include <unistd.h> |
26 | #include <stdio.h> | 26 | #include <stdio.h> |
27 | #include <fcntl.h> | 27 | #include <fcntl.h> |
28 | +#include <string.h> | ||
28 | 29 | ||
29 | #include <sys/types.h> | 30 | #include <sys/types.h> |
30 | #include <sys/socket.h> | 31 | #include <sys/socket.h> |
@@ -32,6 +33,7 @@ | @@ -32,6 +33,7 @@ | ||
32 | 33 | ||
33 | #include "tr/remote_data.h" | 34 | #include "tr/remote_data.h" |
34 | #include "tr/socket.h" | 35 | #include "tr/socket.h" |
36 | +#include "tr/interface/socket.h" | ||
35 | #include "tr/logger.h" | 37 | #include "tr/logger.h" |
36 | #include "trbase.h" | 38 | #include "trbase.h" |
37 | 39 | ||
@@ -39,16 +41,21 @@ static | @@ -39,16 +41,21 @@ static | ||
39 | int | 41 | int |
40 | socketCtor(void * _this, va_list * params) | 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 | this->handle = -1; | 48 | this->handle = -1; |
46 | this->log = va_arg(*params, TR_Logger); | 49 | this->log = va_arg(*params, TR_Logger); |
47 | - this->host = TR_strdup(va_arg(*params, char*)); | 50 | + host = va_arg(*params, char*); |
48 | this->port = va_arg(*params, int); | 51 | this->port = va_arg(*params, int); |
49 | this->flags = va_arg(*params, int); | 52 | this->flags = va_arg(*params, int); |
50 | this->fin_state = TR_FIN_RDWR; | 53 | this->fin_state = TR_FIN_RDWR; |
51 | 54 | ||
55 | + if (host) { | ||
56 | + strncpy(this->host, host, TR_MAX_HOST); | ||
57 | + } | ||
58 | + | ||
52 | return 0; | 59 | return 0; |
53 | } | 60 | } |
54 | 61 | ||
@@ -58,9 +65,6 @@ socketDtor(void * _this) | @@ -58,9 +65,6 @@ socketDtor(void * _this) | ||
58 | { | 65 | { |
59 | TR_Socket this = _this; | 66 | TR_Socket this = _this; |
60 | 67 | ||
61 | - TR_MEM_FREE(this->host); | ||
62 | - TR_MEM_FREE(this->cname); | ||
63 | - | ||
64 | if (STDERR_FILENO < this->handle) { | 68 | if (STDERR_FILENO < this->handle) { |
65 | TR_socketClose(this); | 69 | TR_socketClose(this); |
66 | } | 70 | } |
@@ -73,7 +77,7 @@ socketBind(void * _this) | @@ -73,7 +77,7 @@ socketBind(void * _this) | ||
73 | TR_Socket this = _this; | 77 | TR_Socket this = _this; |
74 | int state; | 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 | if (-1 == state) { | 82 | if (-1 == state) { |
79 | perror("bind"); | 83 | perror("bind"); |
@@ -46,7 +46,7 @@ TR_socketAccept(TR_TcpSocket this) | @@ -46,7 +46,7 @@ TR_socketAccept(TR_TcpSocket this) | ||
46 | remote->addrlen = ((TR_Socket)this)->addrlen; | 46 | remote->addrlen = ((TR_Socket)this)->addrlen; |
47 | remote->handle = accept( | 47 | remote->handle = accept( |
48 | TR_socketHandle(this), | 48 | TR_socketHandle(this), |
49 | - (struct sockaddr *)&(remote->addr), | 49 | + &(remote->addr.info), |
50 | &(remote->addrlen)); | 50 | &(remote->addrlen)); |
51 | 51 | ||
52 | //flags = fcntl(remote->handle, F_GETFL, 0); | 52 | //flags = fcntl(remote->handle, F_GETFL, 0); |
@@ -56,8 +56,8 @@ TR_socketAccept(TR_TcpSocket this) | @@ -56,8 +56,8 @@ TR_socketAccept(TR_TcpSocket this) | ||
56 | perror("accept"); | 56 | perror("accept"); |
57 | TR_delete(remote); | 57 | TR_delete(remote); |
58 | } else { | 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 | remote->type = TR_socketType(this); | 61 | remote->type = TR_socketType(this); |
62 | remote->flags = TR_socketFlags(this); | 62 | remote->flags = TR_socketFlags(this); |
63 | } | 63 | } |
@@ -27,6 +27,7 @@ | @@ -27,6 +27,7 @@ | ||
27 | #include <stdio.h> | 27 | #include <stdio.h> |
28 | #include <unistd.h> | 28 | #include <unistd.h> |
29 | #include <fcntl.h> | 29 | #include <fcntl.h> |
30 | +#include <errno.h> | ||
30 | 31 | ||
31 | #include <sys/types.h> | 32 | #include <sys/types.h> |
32 | #include <sys/socket.h> | 33 | #include <sys/socket.h> |
@@ -41,6 +42,7 @@ TR_socketInit(TR_Socket this, TR_socketAction_fptr action) | @@ -41,6 +42,7 @@ TR_socketInit(TR_Socket this, TR_socketAction_fptr action) | ||
41 | struct addrinfo hint; | 42 | struct addrinfo hint; |
42 | struct addrinfo * info, * current_info; | 43 | struct addrinfo * info, * current_info; |
43 | char port_str[6]; | 44 | char port_str[6]; |
45 | + int code; | ||
44 | 46 | ||
45 | hint.ai_socktype = this->type; | 47 | hint.ai_socktype = this->type; |
46 | hint.ai_flags = this->flags; | 48 | hint.ai_flags = this->flags; |
@@ -52,8 +54,11 @@ TR_socketInit(TR_Socket this, TR_socketAction_fptr action) | @@ -52,8 +54,11 @@ TR_socketInit(TR_Socket this, TR_socketAction_fptr action) | ||
52 | hint.ai_next = NULL; | 54 | hint.ai_next = NULL; |
53 | 55 | ||
54 | sprintf(port_str, "%u", this->port); | 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 | // TODO error handling... | 59 | // TODO error handling... |
60 | + puts(gai_strerror(code)); | ||
61 | + | ||
57 | return FALSE; | 62 | return FALSE; |
58 | } | 63 | } |
59 | 64 | ||
@@ -88,7 +93,9 @@ TR_socketInit(TR_Socket this, TR_socketAction_fptr action) | @@ -88,7 +93,9 @@ TR_socketInit(TR_Socket this, TR_socketAction_fptr action) | ||
88 | //int flags = fcntl(this->handle, F_GETFL, 0); | 93 | //int flags = fcntl(this->handle, F_GETFL, 0); |
89 | 94 | ||
90 | //fcntl(this->handle, F_SETFL, flags | O_NONBLOCK); | 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 | this->fin_state = TR_FIN_NO; | 99 | this->fin_state = TR_FIN_NO; |
93 | 100 | ||
94 | //! Make the socket REUSE a TIME_WAIT socket | 101 | //! Make the socket REUSE a TIME_WAIT socket |
@@ -30,6 +30,7 @@ | @@ -30,6 +30,7 @@ | ||
30 | #include <netdb.h> | 30 | #include <netdb.h> |
31 | 31 | ||
32 | #include "tr/socket.h" | 32 | #include "tr/socket.h" |
33 | +#include "tr/interface/socket.h" | ||
33 | #include "tr/logger.h" | 34 | #include "tr/logger.h" |
34 | #include "trbase.h" | 35 | #include "trbase.h" |
35 | 36 | ||
@@ -85,8 +86,8 @@ udpSocketSend(TR_Socket this, TR_RemoteData data) | @@ -85,8 +86,8 @@ udpSocketSend(TR_Socket this, TR_RemoteData data) | ||
85 | data->data, | 86 | data->data, |
86 | data->ndata, | 87 | data->ndata, |
87 | this->flags, | 88 | this->flags, |
88 | - (struct sockaddr *)&(data->addr), | ||
89 | - data->addrlen); | 89 | + &(data->socket->addr.info), |
90 | + data->socket->addrlen); | ||
90 | 91 | ||
91 | if (-1 == send) { | 92 | if (-1 == send) { |
92 | perror("sendto"); | 93 | perror("sendto"); |
Please
register
or
login
to post a comment