char *write_buffer;
/**
- * Size of our write buffer.
+ * Max size of our write buffer.
+ */
+ size_t max_write_buffer_size;
+
+ /**
+ * Current size of our write buffer.
*/
size_t write_buffer_size;
/**
* Current read-offset in write buffer (how many
- * bytes have already been send).
+ * bytes have already been sent).
*/
size_t write_buffer_pos;
*osSocket, size_t maxbuf)
{
struct GNUNET_CONNECTION_Handle *ret;
- ret = GNUNET_malloc (sizeof (struct GNUNET_CONNECTION_Handle) + maxbuf);
- ret->write_buffer = (char *) &ret[1];
+ ret = GNUNET_malloc (sizeof (struct GNUNET_CONNECTION_Handle));
GNUNET_assert (maxbuf < GNUNET_SERVER_MAX_MESSAGE_SIZE);
- ret->write_buffer_size = maxbuf;
+ ret->write_buffer_size = GNUNET_SERVER_MIN_BUFFER_SIZE;
+ ret->max_write_buffer_size = maxbuf;
+ ret->write_buffer = GNUNET_malloc(ret->write_buffer_size);
ret->sock = osSocket;
ret->sched = sched;
return ret;
GNUNET_free (uaddr);
return NULL;
}
- ret = GNUNET_malloc (sizeof (struct GNUNET_CONNECTION_Handle) + maxbuf);
- ret->write_buffer = (char *) &ret[1];
+ ret = GNUNET_malloc (sizeof (struct GNUNET_CONNECTION_Handle));
+
GNUNET_assert (maxbuf < GNUNET_SERVER_MAX_MESSAGE_SIZE);
- ret->write_buffer_size = maxbuf;
+ ret->write_buffer_size = GNUNET_SERVER_MIN_BUFFER_SIZE;
+ ret->max_write_buffer_size = maxbuf;
+ ret->write_buffer = GNUNET_malloc(ret->write_buffer_size);
ret->addr = uaddr;
ret->addrlen = addrlen;
ret->sock = sock;
static void
connect_fail_continuation (struct GNUNET_CONNECTION_Handle *h)
{
+#if DEBUG_CONNECTION
GNUNET_log ((0 != strncmp (h->hostname,
"localhost:",
10))
: GNUNET_ERROR_TYPE_WARNING,
_("Failed to establish TCP connection to `%s:%u', no further addresses to try.\n"),
h->hostname, h->port);
+#endif
/* connect failed / timed out */
GNUNET_break (h->ap_head == NULL);
GNUNET_break (h->ap_tail == NULL);
GNUNET_free (ap);
return; /* not supported by OS */
}
+#if DEBUG_CONNECTION
GNUNET_log (GNUNET_ERROR_TYPE_INFO,
_("Trying to connect to `%s' (%p)\n"),
GNUNET_a2s (ap->addr, ap->addrlen), h);
+#endif
if ((GNUNET_OK != GNUNET_NETWORK_socket_connect (ap->sock,
ap->addr,
ap->addrlen)) &&
struct GNUNET_CONNECTION_Handle *ret;
GNUNET_assert (0 < strlen (hostname)); /* sanity check */
- ret = GNUNET_malloc (sizeof (struct GNUNET_CONNECTION_Handle) + maxbuf);
+ ret = GNUNET_malloc (sizeof (struct GNUNET_CONNECTION_Handle));
ret->cfg = cfg;
ret->sched = sched;
- ret->write_buffer = (char *) &ret[1];
+
GNUNET_assert (maxbuf < GNUNET_SERVER_MAX_MESSAGE_SIZE);
- ret->write_buffer_size = maxbuf;
+ ret->write_buffer_size = GNUNET_SERVER_MIN_BUFFER_SIZE;
+ ret->max_write_buffer_size = maxbuf;
+ ret->write_buffer = GNUNET_malloc(ret->write_buffer_size);
ret->port = port;
ret->hostname = GNUNET_strdup (hostname);
ret->dns_active = GNUNET_RESOLVER_ip_get (sched,
un->sun_path[0] = '\0';
slen = sizeof (struct sockaddr_un);
#endif
- ret = GNUNET_malloc (sizeof (struct GNUNET_CONNECTION_Handle) + maxbuf);
+ ret = GNUNET_malloc (sizeof (struct GNUNET_CONNECTION_Handle));
ret->cfg = cfg;
ret->sched = sched;
- ret->write_buffer = (char *) &ret[1];
GNUNET_assert (maxbuf < GNUNET_SERVER_MAX_MESSAGE_SIZE);
- ret->write_buffer_size = maxbuf;
+ ret->write_buffer_size = GNUNET_SERVER_MIN_BUFFER_SIZE;
+ ret->max_write_buffer_size = maxbuf;
+ ret->write_buffer = GNUNET_malloc(ret->write_buffer_size);
ret->port = 0;
ret->hostname = NULL;
ret->addr = (struct sockaddr*) un;
GNUNET_CONNECTION_TransmitReadyNotify
notify, void *notify_cls)
{
+ size_t temp_size;
if (sock->nth.notify_ready != NULL)
return NULL;
GNUNET_assert (notify != NULL);
+ if ((sock->write_buffer_size < size) && (size < sock->max_write_buffer_size))
+ {
+ temp_size = sock->write_buffer_size + size;
+ if (temp_size > sock->max_write_buffer_size)
+ temp_size = sock->max_write_buffer_size;
+
+ sock->write_buffer = GNUNET_realloc(sock->write_buffer, temp_size);
+ sock->write_buffer_size = temp_size;
+ }
GNUNET_assert (sock->write_buffer_size >= size);
GNUNET_assert (sock->write_buffer_off <= sock->write_buffer_size);
GNUNET_assert (sock->write_buffer_pos <= sock->write_buffer_size);
/**
* Size of the buffer (starting at 'hdr').
*/
+ size_t curr_buf;
+
+ /**
+ * Maximum size of the buffer.
+ */
size_t maxbuf;
/**
/**
* Beginning of the buffer. Typed like this to force alignment.
*/
- struct GNUNET_MessageHeader hdr;
+ struct GNUNET_MessageHeader *hdr;
};
{
struct GNUNET_SERVER_MessageStreamTokenizer *ret;
- ret = GNUNET_malloc (maxbuf + sizeof (struct GNUNET_SERVER_MessageStreamTokenizer));
+ ret = GNUNET_malloc (sizeof (struct GNUNET_SERVER_MessageStreamTokenizer));
+ ret->hdr = GNUNET_malloc(GNUNET_SERVER_MIN_BUFFER_SIZE);
+ ret->curr_buf = GNUNET_SERVER_MIN_BUFFER_SIZE;
ret->maxbuf = maxbuf;
ret->cb = cb;
ret->cb_cls = cb_cls;
int need_align;
unsigned long offset;
int ret;
+ size_t newsize;
#if DEBUG_SERVER_MST
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
(unsigned int) size,
(unsigned int) (mst->pos - mst->off));
#endif
+ if ((size > mst->curr_buf) && (size < mst->maxbuf)) /* Received bigger message than we can currently handle! */
+ {
+ newsize = mst->curr_buf + size; /* How much space do we need? */
+ if (newsize > mst->maxbuf)
+ newsize = mst->maxbuf; /* Check it's not bigger than maxbuf */
+
+ mst->hdr = GNUNET_realloc(mst->hdr, newsize);
+ mst->curr_buf = newsize;
+ }
+
ret = GNUNET_OK;
- ibuf = (char*) &mst->hdr;
+ ibuf = (char*)mst->hdr;
while (mst->pos > 0)
{
do_align:
- if ( (mst->maxbuf - mst->off < sizeof (struct GNUNET_MessageHeader)) ||
+ if ( (mst->curr_buf - mst->off < sizeof (struct GNUNET_MessageHeader)) ||
(0 != (mst->off % ALIGN_FACTOR)) )
{
/* need to align or need more space */
GNUNET_break_op (0);
return GNUNET_SYSERR;
}
- if (mst->maxbuf - mst->off < want)
+ if (mst->curr_buf - mst->off < want)
{
/* need more space */
mst->pos -= mst->off;
copy:
if ( (size > 0) && (! purge) )
{
- GNUNET_assert (mst->pos + size <= mst->maxbuf);
+ GNUNET_assert (mst->pos + size <= mst->curr_buf);
memcpy (&ibuf[mst->pos], buf, size);
mst->pos += size;
}