<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -3,6 +3,7 @@
 #include &lt;unistd.h&gt;
 #include &lt;arpa/inet.h&gt;
 #include &lt;string.h&gt;
+#include &lt;assert.h&gt;
 #include &lt;libxml/parser.h&gt;
 #include &lt;libxml/tree.h&gt;
 #include &lt;libxslt/xslt.h&gt;
@@ -49,6 +50,30 @@ void send_string(const char *s)
   send_buffer(s, strlen(s));
 }
 
+void recv_buffer(char **buf, int *buflen)
+{
+  int rlen;
+  char *b;
+
+  assert(read(STDIN_FILENO, &amp;rlen, 4) == 4);
+  rlen = ntohl(rlen);
+
+  if (*buf)
+    free(*buf);
+  *buf = malloc(rlen + 1); /* space for one '\0' */
+  *buflen = rlen;
+
+  b = *buf;
+  while(rlen &gt; 0)
+  {
+    int c;
+    c = read(STDIN_FILENO, b, rlen);
+    assert(c &gt; 0);
+    b += c;
+    rlen -= c;
+  }
+}
+
 char **parse_params(char *buf_, int buflen)
 {
   static char **params = NULL;
@@ -121,11 +146,10 @@ void xmlXPathFuncCallback(xmlXPathParserContextPtr ctxt, int nargs)
   const xmlChar *name, *xmlns;
   int i;
   ei_x_buff arguments;
-  //fprintf(stderr, &quot;callback %i\n&quot;,nargs);
 
-  uint32_t rlen;
-  int rindex = 0, version;
-  char *rbuf = NULL, *s;
+  int rindex = 0, version, rlen = 0;
+  static char *rbuf = NULL;
+  char *s;
   ei_term term;
 
   xmlXPathObjectPtr ret = NULL;
@@ -135,7 +159,6 @@ void xmlXPathFuncCallback(xmlXPathParserContextPtr ctxt, int nargs)
 
   name = ctxt-&gt;context-&gt;function;
   xmlns = ctxt-&gt;context-&gt;functionURI;
-  fprintf(stderr, &quot;callback {%s}%s\n&quot;, xmlns, name);
 
   ei_x_new_with_version(&amp;arguments);
   ei_x_encode_list_header(&amp;arguments, nargs + 2);
@@ -154,12 +177,7 @@ void xmlXPathFuncCallback(xmlXPathParserContextPtr ctxt, int nargs)
   write(STDOUT_FILENO, arguments.buff, arguments.index);
   ei_x_free(&amp;arguments);
 
-  if (read(STDIN_FILENO, &amp;rlen, 4) != 4)
-    exit(-1);
-  rlen = ntohl(rlen);
-  rbuf = malloc(rlen);
-  if (read(STDIN_FILENO, rbuf, rlen) != rlen)
-    exit(-1);
+  recv_buffer(&amp;rbuf, &amp;rlen);
 
   ei_decode_version(rbuf, &amp;rindex, &amp;version);
   ei_decode_ei_term(rbuf, &amp;rindex, &amp;term);
@@ -220,15 +238,13 @@ void xmlXPathFuncCallback(xmlXPathParserContextPtr ctxt, int nargs)
     fprintf(stderr, &quot;unknown type: %i\n&quot;, term.ei_type);
   }
   valuePush(ctxt, ret);
-
-  free(rbuf);
 }
 
 extern int xmlLoadExtDtdDefaultValue;
 
 int main()
 {
-  uint32_t rlen, running = 1, rbuflen = 0;
+  int running = 1, rlen = 0;
   char *rbuf = NULL;
   xsltStylesheetPtr xslt = NULL;
   xmlDocPtr xml = NULL, xsltDoc, res;
@@ -263,19 +279,7 @@ int main()
 
   while(running)
   {
-    if (read(STDIN_FILENO, &amp;rlen, 4) != 4)
-      exit(1);
-    rlen = ntohl(rlen);
-    //fprintf(stderr, &quot;expecting %i bytes\n&quot;, rlen);
-    if (rlen &gt;= rbuflen)
-    {
-      if (rbuf)
-        free(rbuf);
-      rbuf = malloc(rlen + 1);
-    }
-    if (read(STDIN_FILENO, rbuf, rlen) != rlen)
-      exit(1);
-    //fprintf(stderr, &quot;read %i bytes\n&quot;, rlen);
+    recv_buffer(&amp;rbuf, &amp;rlen);
     rbuf[rlen] = '\0';
 
     switch(rbuf[0])</diff>
      <filename>erlxslt.c</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>538add73bea42c0b9b92fd387b2d059612610a78</id>
    </parent>
  </parents>
  <author>
    <name>Astro</name>
    <email>astro@spaceboyz.net</email>
  </author>
  <url>http://github.com/astro/erlxslt/commit/f47e42bfe654f45f1e0ff082330074c115146eca</url>
  <id>f47e42bfe654f45f1e0ff082330074c115146eca</id>
  <committed-date>2008-11-19T07:47:02-08:00</committed-date>
  <authored-date>2008-11-19T07:47:02-08:00</authored-date>
  <message>use assert() instead of checking, work around truncated read()s</message>
  <tree>317017e6a55fbc9d1b2ee58f825ebb29b15193b5</tree>
  <committer>
    <name>Astro</name>
    <email>astro@spaceboyz.net</email>
  </committer>
</commit>
