src/line_proto.c
changeset 28 9c1050bc8709
parent 27 e6639132bead
child 32 ae66e9ae4afb
--- 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);
+}
+