Browse Source

use new SizedData from trbase and remove automatic cast.

1.0.0
Georg Hopp 11 years ago
parent
commit
0f1d2b904a
  1. 9
      include/tr/remote_data.h
  2. 73
      include/tr/socket.h
  3. 1
      src/Makefile.am
  4. 4
      src/i_socket.c
  5. 22
      src/remote_data.c
  6. 46
      src/remote_data_set_data.c
  7. 9
      src/socket_accept.c
  8. 27
      src/tcp_socket.c
  9. 30
      src/udp_socket.c

9
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:

73
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) {

1
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

4
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;

22
src/remote_data.c

@ -31,6 +31,7 @@
#include <netdb.h>
#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:

46
src/remote_data_set_data.c

@ -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 <http://www.gnu.org/licenses/>.
*/
#include <string.h> // for atoi() and exit()
#include <errno.h> // for errno
#include <stdio.h>
#include <unistd.h>
#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:

9
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;

27
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);

30
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");

Loading…
Cancel
Save