}
s = INVALID_SOCKET;
- buf = (char *) malloc (SSBUFSZ + 3);
+ buf = 0;
putp = getp = 0;
int i1, i2, i3, i4;
SimpleSocket::~SimpleSocket ()
{
- if (s != INVALID_SOCKET)
- closesocket (s);
- s = INVALID_SOCKET;
- if (buf)
- free (buf);
- buf = 0;
+ invalidate ();
}
int
va_list args;
va_start (args, fmt);
vsprintf (buf, fmt, args);
- return send (s, buf, strlen (buf), 0);
+ return write (buf, strlen (buf));
}
int
SimpleSocket::write (const char *buf, int len)
{
- return send (s, buf, len, 0);
+ int rv;
+ if (!ok ())
+ return -1;
+ if ((rv = send (s, buf, len, 0)) == -1)
+ invalidate ();
+ return rv;
}
int
SimpleSocket::fill ()
{
+ if (!ok ())
+ return -1;
+
+ if (buf == 0)
+ buf = (char *) malloc (SSBUFSZ + 3);
if (putp == getp)
putp = getp = 0;
if (r > 0)
{
putp += r;
- return r;
}
- return 0;
+ else if (r < 0 && putp == getp)
+ {
+ invalidate();
+ }
+ return r;
}
char *
getp = 0;
}
if (putp == getp)
- fill();
+ if (fill () <= 0)
+ return 0;
// getp is zero, always, here, and putp is the count
char *nl;
while ((*nl == '\n' || *nl == '\r') && nl >= buf)
*nl-- = 0;
}
- else
+ else if (putp > getp)
{
getp = putp;
nl = buf + putp;
nl[1] = 0;
}
+ else
+ return 0;
return buf;
}
int
SimpleSocket::read (char *ubuf, int ulen)
{
+ if (!ok ())
+ return -1;
+
int n, rv=0;
if (putp > getp)
{
while (ulen > 0)
{
n = recv (s, ubuf, ulen, 0);
+ if (n < 0)
+ invalidate();
if (n <= 0)
- return rv;
+ return rv > 0 ? rv : n;
ubuf += n;
ulen -= n;
rv += n;
}
return rv;
}
+
+void
+SimpleSocket::invalidate (void)
+{
+ if (s != INVALID_SOCKET)
+ closesocket (s);
+ s = INVALID_SOCKET;
+ if (buf)
+ free (buf);
+ buf = 0;
+ getp = putp = 0;
+}