--- a/src/line_proto.c Tue Mar 10 01:46:09 2009 +0200
+++ b/src/line_proto.c Tue Mar 10 02:34:11 2009 +0200
@@ -133,14 +133,9 @@
return SUCCESS;
error:
- if (lp) {
- free(lp->in_buf);
- free(lp->out_buf);
-
- // XXX: handle sock init errors
- }
-
- free(lp);
+ // cleanup the lp
+ if (lp)
+ line_proto_release(lp);
return ERROR_CODE(err);
}
@@ -250,7 +245,7 @@
int line_proto_send (struct line_proto *lp, const char *line)
{
int ret;
- size_t len = strlen(line);
+ size_t len = strlen(line), ret_len;
// drop line if we already have output buffered
if (lp->out_offset)
@@ -263,16 +258,19 @@
return -ERROR_CODE(&lp->err);
}
+ // length of the sent data
+ ret_len = ret;
+
// EAGAIN or partial?
- if (ret < len) {
- size_t trailing = len - ret;
+ if (ret_len < len) {
+ size_t trailing = len - ret_len;
// ensure it's not waaaay too long
if (trailing > lp->buf_len)
return -ERR_LINE_TOO_LONG;
// copy remaining portion to buffer
- memcpy(lp->out_buf, line + ret, trailing);
+ memcpy(lp->out_buf, line + ret_len, trailing);
// update offset
lp->out_offset = trailing;
@@ -294,6 +292,7 @@
int line_proto_flush (struct line_proto *lp)
{
int ret;
+ size_t ret_len;
// try and write the line
if ((ret = sock_stream_write(lp->sock, lp->out_buf, lp->out_offset)) < 0) {
@@ -302,19 +301,21 @@
return -ERROR_CODE(&lp->err);
}
+ ret_len = ret;
+
// empty now?
- if (ret == lp->out_offset) {
+ if (ret_len == lp->out_offset) {
lp->out_offset = 0;
return SUCCESS;
}
// partial?
- if (ret > 0) {
- size_t remaining = lp->out_offset - ret;
+ if (ret_len > 0) {
+ size_t remaining = lp->out_offset - ret_len;
// move the rest up
- memmove(lp->out_buf, lp->out_buf + ret, remaining);
+ memmove(lp->out_buf, lp->out_buf + ret_len, remaining);
// update offset
lp->out_offset = remaining;
@@ -334,3 +335,17 @@
return &lp->err;
}
+void line_proto_release (struct line_proto *lp)
+{
+ // free buffers
+ free(lp->in_buf);
+ free(lp->out_buf);
+
+ // socket?
+ if (lp->sock)
+ sock_stream_release(lp->sock);
+
+ // free the state itself
+ free(lp);
+}
+