WIP: pth transistion, 3rd step, commands basically ported
[rxpd] / src / rxpd_buffer.c
index 8f54bc0052930ebda9968eab3e91ffc8f17ed8c3..5f489feee1c7f56f9fba738143a68e37e1f7f89f 100644 (file)
@@ -33,7 +33,7 @@ rxpd_buffer_init (struct rxpd_buffer* self, struct rxpd_connection* conn)
 
 
 char*
-rxpd_buffer_readline (struct rxpd_buffer* self, int again)
+rxpd_buffer_readline (struct rxpd_buffer* self)
 {
   int fd = self->conn->fd;
 
@@ -46,44 +46,44 @@ rxpd_buffer_readline (struct rxpd_buffer* self, int again)
       // TODO handle \r's
     }
 
-  if (!again && self->state == RXPD_OK)   // we only read when again is 0, first iteration
-    {
-      ssize_t r = 0;
-      do
-        {
-          r = read(fd, self->eob, 4095 - (self->eob - self->buffer));
-        }
-      while (r == -1 && errno == EINTR);
-
-      if (r != -1)
-        {
-
-          if (r == 0)
-            {
-              shutdown (fd, SHUT_RD);
-              self->state = RXPD_EOF;
-            }
-
-          self->eob += r;
-        }
-      else
-        self->state = RXPD_ERROR;
-    }
-
-  // find next newline, terminate string there
-  for (char* i = self->buffer; i < self->eob; ++i)
-    {
-      if (*i == '\n')
-        {
-          *i = '\0';
-          self->eol = i;
-          break;
-        }
-    }
-
-  // TODO handle buffer overfulls
 
-  return (self->eob == self->buffer) ? NULL : self->buffer;
+  do {
+    // find next newline, terminate string there
+    for (char* i = self->buffer; i < self->eob; ++i)
+      {
+        if (*i == '\n')
+          {
+            *i = '\0';
+            self->eol = i;
+            // have line, return it
+            return (self->eob == self->buffer) ? NULL : self->buffer;
+          }
+      }
+
+    // else we have to read
+    if (self->state == RXPD_OK)
+      {
+        ssize_t r = 0;
+        do
+          {
+            r = pth_read (fd, self->eob, 4095 - (self->eob - self->buffer));
+          }
+        while (r == -1 && errno == EINTR);
+
+        if (r != -1)
+          {
+            if (r == 0)
+              {
+                shutdown (fd, SHUT_RD);
+                self->state = RXPD_EOF;
+              }
+            self->eob += r;
+          }
+        else
+          self->state = RXPD_ERROR;
+      }
+  } while (1);  // TODO while (!buffer overfulls)  
+  return NULL;
 }
 
 /*
@@ -100,13 +100,13 @@ rxpd_buffer_write(int fd, short event, void* ptr)
 int
 rxpd_buffer_printf (struct rxpd_buffer* self, const char* fmt, ...)
 {
-  // for now we do a blocking write, needs to be fixed some day
+  // for now we do a blocking write, needs to be fixed some day, timeout!
   va_list ap;
   va_start(ap, fmt);
   int n = vsnprintf (self->buffer, 4096, fmt, ap);
   va_end(ap);
 
-  write (self->conn->fd, self->buffer, n);
+  pth_write (self->conn->fd, self->buffer, n);
 
   if (n>4095)
     return 0;