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