diff --git a/include/tr/remote_data.h b/include/tr/remote_data.h index 088af63..eec025d 100644 --- a/include/tr/remote_data.h +++ b/include/tr/remote_data.h @@ -33,17 +33,16 @@ #include "tr/socket.h" TR_CLASS(TR_RemoteData) { - unsigned char * data; - size_t ndata; - TR_Socket socket; + TR_EXTENDS(TR_SizedData); + + TR_Socket remote; // TR_Socket might become a more abstract TR_Remote one day. + int free_remote; }; TR_INSTANCE_INIT(TR_RemoteData); TR_CLASSVARS_DECL(TR_RemoteData) {}; extern TR_RemoteData TR_emptyRemoteData; -void TR_remoteDataSetData(TR_RemoteData, unsigned char *, size_t); - #endif // __TR_REMOTE_DATA_H__ // vim: set ts=4 sw=4: diff --git a/include/tr/socket.h b/include/tr/socket.h index ed4af25..d8888ab 100644 --- a/include/tr/socket.h +++ b/include/tr/socket.h @@ -67,47 +67,50 @@ TR_CLASS(TR_Socket) { TR_INSTANCE_INIT(TR_Socket); TR_CLASSVARS_DECL(TR_Socket) {}; -#define TR_socketLog(socket) (((TR_Socket)(socket))->log) -#define TR_socketFlags(socket) (((TR_Socket)(socket))->flags) -#define TR_socketType(socket) (((TR_Socket)(socket))->type) -#define TR_socketHost(socket) (((TR_Socket)(socket))->host) -#define TR_socketPort(socket) (((TR_Socket)(socket))->port) -#define TR_socketCname(socket) (((TR_Socket)(socket))->cname) -#define TR_socketTtl(socket) (((TR_Socket)(socket))->ttl) -#define TR_socketAddr(socket) ((void *)&((TR_Socket)(socket))->addr) -#define TR_socketAddrlen(socket) (((TR_Socket)(socket))->addrlen) -#define TR_socketHandle(socket) (((TR_Socket)(socket))->handle) -#define TR_socketFinState(socket) (((TR_Socket)(socket))->fin_state) -#define TR_socketFinRd(socket) ((TR_socketFinState((socket)) & 1) == 1) -#define TR_socketFinWr(socket) ((TR_socketFinState((socket)) & 2) == 2) -#define TR_socketFinRdWr(socket) ((TR_socketFinState((socket)) & 3) == 3) - -#define TR_socketAddrPort(socket) \ - (((TR_Socket)(socket))->addr.info.sa_family == AF_INET \ - ? ((TR_Socket)(socket))->addr.in.sin_port \ - : ((TR_Socket)(socket))->addr.info.sa_family == AF_INET6 \ - ? ((TR_Socket)(socket))->addr.in6.sin6_port \ +#define TR_socketLog(socket) ((socket)->log) +#define TR_socketFlags(socket) ((socket)->flags) +#define TR_socketType(socket) ((socket)->type) +#define TR_socketHost(socket) ((socket)->host) +#define TR_socketPort(socket) ((socket)->port) +#define TR_socketCname(socket) ((socket)->cname) +#define TR_socketTtl(socket) ((socket)->ttl) +#define TR_socketAddr(socket) ((void *)&(socket)->addr) +#define TR_socketAddrlen(socket) ((socket)->addrlen) +#define TR_socketHandle(socket) ((socket)->handle) +#define TR_socketFinState(socket) ((socket)->fin_state) +#define TR_socketFinRd(socket) \ + ((TR_socketFinState(socket) & TR_FIN_RD) == TR_FIN_RD) +#define TR_socketFinWr(socket) \ + ((TR_socketFinState(socket) & TR_FIN_WR) == TR_FIN_WR) +#define TR_socketFinRdWr(socket) \ + ((TR_socketFinState(socket) & TR_FIN_RDWR) == TR_FIN_RDWR) + +#define TR_socketAddrPort(socket) \ + ((socket)->addr.info.sa_family == AF_INET \ + ? (socket)->addr.in.sin_port \ + : (socket)->addr.info.sa_family == AF_INET6 \ + ? (socket)->addr.in6.sin6_port \ : 0) -#define TR_socketAddrIp(socket) \ - (((TR_Socket)(socket))->addr.info.sa_family == AF_INET \ - ? (void *)&((TR_Socket)(socket))->addr.in.sin_addr.s_addr \ - : ((TR_Socket)(socket))->addr.info.sa_family == AF_INET6 \ - ? (void *)&((TR_Socket)(socket))->addr.in6.sin6_addr.s6_addr \ +#define TR_socketAddrIp(socket) \ + ((socket)->addr.info.sa_family == AF_INET \ + ? (void *)&(socket)->addr.in.sin_addr.s_addr \ + : (socket)->addr.info.sa_family == AF_INET6 \ + ? (void *)&(socket)->addr.in6.sin6_addr.s6_addr \ : NULL) -#define TR_socketAddrIplen(socket) \ - (((TR_Socket)(socket))->addr.info.sa_family == AF_INET \ - ? sizeof(((TR_Socket)(socket))->addr.in.sin_addr) \ - : ((TR_Socket)(socket))->addr.info.sa_family == AF_INET6 \ - ? sizeof(((TR_Socket)(socket))->addr.in6.sin6_addr) \ +#define TR_socketAddrIplen(socket) \ + ((socket)->addr.info.sa_family == AF_INET \ + ? sizeof((socket)->addr.in.sin_addr) \ + : (socket)->addr.info.sa_family == AF_INET6 \ + ? sizeof((socket)->addr.in6.sin6_addr) \ : 0) -#define TR_socketAddrIpStr(socket, buffer, nbuffer) \ - if (TR_socketAddrIp((socket))) \ - inet_ntop( \ - ((TR_Socket)(socket))->addr.info.sa_family, \ - TR_socketAddrIp((socket)), \ +#define TR_socketAddrIpStr(socket, buffer, nbuffer) \ + if (TR_socketAddrIp((socket))) \ + inet_ntop( \ + (socket)->addr.info.sa_family, \ + TR_socketAddrIp((socket)), \ buffer, nbuffer) TR_CLASS(TR_TcpSocket) { diff --git a/src/Makefile.am b/src/Makefile.am index 13b930f..672522c 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -17,7 +17,6 @@ TRIO = stream.c \ tcp_socket.c \ udp_socket.c \ remote_data.c \ - remote_data_set_data.c \ i_socket.c \ i_reader.c \ i_writer.c diff --git a/src/i_socket.c b/src/i_socket.c index b206622..74a35eb 100644 --- a/src/i_socket.c +++ b/src/i_socket.c @@ -55,7 +55,7 @@ TR_socketRecv(void * _this, size_t size) TR_RETCALL(_this, TR_Socket, recv, remote_data, size); - if (remote_data->ndata < 0) { + if (((TR_SizedData)remote_data)->size < 0) { switch (errno) { case (EAGAIN|EWOULDBLOCK): TR_delete(remote_data); @@ -72,7 +72,7 @@ TR_socketRecv(void * _this, size_t size) TR_delete(remote_data); return NULL; } - } else if (remote_data->ndata == 0) { + } else if (((TR_SizedData)remote_data)->size == 0) { // this is a remote close... TR_delete(remote_data); return NULL; diff --git a/src/remote_data.c b/src/remote_data.c index 25a7a2d..ad6153a 100644 --- a/src/remote_data.c +++ b/src/remote_data.c @@ -31,6 +31,7 @@ #include #include "trbase.h" + #include "tr/remote_data.h" #include "tr/socket.h" @@ -38,28 +39,25 @@ static int remoteDataCtor(void * _this, va_list * params) { - TR_RemoteData this = _this; - - this->socket = va_arg(*params, TR_Socket); - - this->data = NULL; - this->ndata = 0; + TR_PARENTCALL(_this, TR_Class, ctor, params); + ((TR_RemoteData)_this)->remote = va_arg(*params, TR_Socket); return 0; } static void -remoteDataDtor(void * _this) -{ - TR_RemoteData this = _this; +remoteDataDtor(void * _this) { + TR_PARENTCALL(_this, TR_Class, dtor); - TR_MEM_FREE(this->data); + if (((TR_RemoteData)_this)->free_remote) { + TR_delete(((TR_RemoteData)_this)->remote); + } } TR_INIT_IFACE(TR_Class, remoteDataCtor, remoteDataDtor, NULL); -TR_CREATE_CLASS(TR_RemoteData, NULL, NULL, TR_IF(TR_Class)); +TR_CREATE_CLASS(TR_RemoteData, TR_SizedData, NULL, TR_IF(TR_Class)); -TR_INSTANCE(TR_RemoteData, TR_emptyRemoteData, NULL, 0, NULL, NULL); +TR_INSTANCE(TR_RemoteData, TR_emptyRemoteData, { NULL, 0 }, NULL); // vim: set ts=4 sw=4: diff --git a/src/remote_data_set_data.c b/src/remote_data_set_data.c deleted file mode 100644 index 456220d..0000000 --- a/src/remote_data_set_data.c +++ /dev/null @@ -1,46 +0,0 @@ -/** - * \file - * - * \author Georg Hopp - * - * \copyright - * Copyright © 2014 Georg Hopp - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#include // for atoi() and exit() -#include // for errno -#include -#include - -#include "tr/remote_data.h" -#include "tr/logger.h" - -void -TR_remoteDataSetData(TR_RemoteData this, unsigned char * data, size_t size) -{ - if (this->data && TR_getSize(this->data) < size) { - TR_MEM_FREE(this->data); - } - - if (! this->data) { - this->data = TR_malloc(size); - } - - this->ndata = size; - memcpy(this->data, data, size); -} - -// vim: set ts=4 sw=4: diff --git a/src/socket_accept.c b/src/socket_accept.c index c2ad17b..93891bc 100644 --- a/src/socket_accept.c +++ b/src/socket_accept.c @@ -40,12 +40,13 @@ TR_TcpSocket TR_socketAccept(TR_TcpSocket this) { - TR_Socket remote = TR_new(TR_TcpSocket, TR_socketLog(this), NULL, 0, 0); + TR_Socket remote = + TR_new(TR_TcpSocket, TR_socketLog((TR_Socket)this), NULL, 0, 0); //int flags; remote->addrlen = ((TR_Socket)this)->addrlen; remote->handle = accept( - TR_socketHandle(this), + TR_socketHandle((TR_Socket)this), &(remote->addr.info), &(remote->addrlen)); @@ -58,8 +59,8 @@ TR_socketAccept(TR_TcpSocket this) } else { TR_socketAddrIpStr(remote, remote->host, TR_MAX_HOST); remote->port = TR_socketAddrPort(remote); - remote->type = TR_socketType(this); - remote->flags = TR_socketFlags(this); + remote->type = TR_socketType((TR_Socket)this); + remote->flags = TR_socketFlags((TR_Socket)this); } return (TR_TcpSocket)remote; diff --git a/src/tcp_socket.c b/src/tcp_socket.c index d617d46..6108463 100644 --- a/src/tcp_socket.c +++ b/src/tcp_socket.c @@ -42,9 +42,9 @@ tcpSocketCtor(void * _this, va_list * params) TR_PARENTCALL(_this, TR_Class, ctor, params); - TR_socketType(this) = SOCK_STREAM; - this->listen = FALSE; - this->connected = FALSE; + TR_socketType((TR_Socket)this) = SOCK_STREAM; + this->listen = FALSE; + this->connected = FALSE; return 0; } @@ -62,7 +62,7 @@ tcpSocketBind(void * _this) return -1; } - if (listen(TR_socketHandle(this), SOMAXCONN) != 0) { + if (listen(TR_socketHandle((TR_Socket)this), SOMAXCONN) != 0) { // error return -1; } @@ -76,28 +76,29 @@ int tcpSocketConnect(void * _this) { TR_Socket this = _this; - - return connect( + int retval = connect( this->handle, (struct sockaddr *)&(this->addr), this->addrlen); + + ((TR_TcpSocket)_this)->connected = TRUE; + return retval; } static TR_RemoteData tcpSocketRecv(TR_Socket this, size_t size) { - TR_RemoteData rdata = TR_new(TR_RemoteData, &(this->addr), this->addrlen); + TR_RemoteData rdata = NULL; unsigned char buffer[size]; ssize_t received; received = recv(this->handle, buffer, size, this->flags); if (-1 == received) { - perror("recv"); - TR_delete(rdata); + rdata = TR_new(TR_RemoteData, NULL, received, this); } else { - TR_remoteDataSetData(rdata, buffer, received); + rdata = TR_new(TR_RemoteData, buffer, received, this); } return rdata; @@ -107,7 +108,11 @@ static ssize_t tcpSocketSend(TR_Socket this, TR_RemoteData data) { - return send(this->handle, data->data, data->ndata, this->flags); + return send( + this->handle, + ((TR_SizedData)data)->data, + ((TR_SizedData)data)->size, + this->flags); } TR_INIT_IFACE(TR_Class, tcpSocketCtor, NULL, NULL); diff --git a/src/udp_socket.c b/src/udp_socket.c index 3103ce6..238419d 100644 --- a/src/udp_socket.c +++ b/src/udp_socket.c @@ -51,27 +51,29 @@ static TR_RemoteData udpSocketRecv(TR_Socket this, size_t size) { - TR_RemoteData rdata; - struct sockaddr_in addr; - socklen_t addrlen = this->addrlen; - unsigned char buffer[size]; - ssize_t received; + unsigned char buffer[size]; + ssize_t received; + TR_RemoteData rdata; + TR_Socket remote = TR_new(TR_UdpSocket, TR_socketLog(this), NULL, 0, 0); + + remote->addrlen = this->addrlen; received = recvfrom( this->handle, buffer, size, this->flags, - (struct sockaddr *)&addr, - &addrlen); + (struct sockaddr *)&(remote->addr), + &remote->addrlen); if (-1 == received) { - perror("recvfrom"); + rdata = TR_new(TR_RemoteData, NULL, received, remote); } else { - rdata = TR_new(TR_RemoteData, &addr, addrlen); - TR_remoteDataSetData(rdata, buffer, received); + rdata = TR_new(TR_RemoteData, buffer, received, remote); } + rdata->free_remote = 1; + return rdata; } @@ -83,11 +85,11 @@ udpSocketSend(TR_Socket this, TR_RemoteData data) send = sendto( this->handle, - data->data, - data->ndata, + ((TR_SizedData)data)->data, + ((TR_SizedData)data)->size, this->flags, - &(data->socket->addr.info), - data->socket->addrlen); + &(data->remote->addr.info), + data->remote->addrlen); if (-1 == send) { perror("sendto");