sbuf.c revision 1ca4a6ab3f30cc1d00058a1a23e62bb267016ea1
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * Copyright (c) 1995 Danny Gasparovski.
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatna * Please read the file COPYRIGHT for the
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * terms and conditions of the copyright.
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo/* Done as a macro in socket.h */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * sbspace(struct sockbuff *sb)
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * return SB_DATALEN - sb->sb_cc;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * We can only drop how much we have
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * This should never succeed
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo /* Already alloced, realloc if necessary */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo sb->sb_wptr = sb->sb_rptr = sb->sb_data = (char *)realloc(sb->sb_data, size);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo sb->sb_wptr = sb->sb_rptr = sb->sb_data = (char *)malloc(size);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * Try and write() to the socket, whatever doesn't get written
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * append to the buffer... for a host with a fast net connection,
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * this prevents an unnecessary copy of the data
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * (the socket is non-blocking, so we won't hang)
28b1e50e4eed7be353f9778497714aab53ef2a0dSriharsha Basavapatnasbappend(PNATState pData, struct socket *so, struct mbuf *m)
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo /* Shouldn't happen, but... e.g. foreign host closes connection */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo if (m->m_len <= 0) {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * If there is urgent data, call sosendoob
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * if not all was sent, sowrite will take care of the rest
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * (The rest of this function is just an optimisation)
if (ret <= 0) {
struct mbuf *m;
len -= n;
if (len) {
n += nn;
int off;
int len;
char *to;
char *from;
if (len)