Update header notices information
authorVasilis Tsiligiannis <b_tsiligiannis@silverton.gr>
Sun, 28 Feb 2010 14:21:19 +0000 (16:21 +0200)
committerVasilis Tsiligiannis <b_tsiligiannis@silverton.gr>
Sun, 28 Feb 2010 14:21:19 +0000 (16:21 +0200)
lib/quagga/src/olsrd_plugin.c
lib/quagga/src/quagga.c
lib/quagga/src/quagga.h

index 9d61560..804807c 100644 (file)
@@ -1,14 +1,22 @@
+/*
+ * OLSRd Quagga plugin
+ *
+ * Copyright (C) 2006-2008 Immo 'FaUl' Wehrenberg <immo@chaostreff-dortmund.de>
+ * Copyright (C) 2007-2010 Vasilis Tsiligiannis <acinonyxs@yahoo.gr>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation or - at your option - under
+ * the terms of the GNU General Public Licence version 2 but can be
+ * linked to any BSD-Licenced Software with public available sourcecode
+ *
+ */
 
+/* -------------------------------------------------------------------------
+ * File               : olsrd_plugin.c
+ * Description        : functions to setup plugin
+ * ------------------------------------------------------------------------- */
 
-/***************************************************************************
- *                                                                         *
- *   This program is free software; you can redistribute it and/or modify  *
- *   it under the terms of the GNU General Public License version 2 as     *
- *   published by the Free Software Foundation or - at your option - under *
- *   the terms of the GNU General Public Licence version 2 but can be      *
- *   linked to any BSD-Licenced Software with public available sourcecode. *
- *                                                                         *
- ***************************************************************************/
 
 #include <stdio.h>
 #include <string.h>
index 0db3671..05307d4 100644 (file)
@@ -1,21 +1,21 @@
+/*
+ * OLSRd Quagga plugin
+ *
+ * Copyright (C) 2006-2008 Immo 'FaUl' Wehrenberg <immo@chaostreff-dortmund.de>
+ * Copyright (C) 2007-2010 Vasilis Tsiligiannis <acinonyxs@yahoo.gr>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation or - at your option - under
+ * the terms of the GNU General Public Licence version 2 but can be
+ * linked to any BSD-Licenced Software with public available sourcecode
+ *
+ */
 
-/***************************************************************************
- projekt              : olsrd-quagga
- file                 : quagga.c
- usage                : communication with the zebra-daemon
- copyright            : (C) 2006 by Immo 'FaUl' Wehrenberg
- e-mail               : immo@chaostreff-dortmund.de
- ***************************************************************************/
-
-/***************************************************************************
- *                                                                         *
- *   This program is free software; you can redistribute it and/or modify  *
- *   it under the terms of the GNU General Public License version 2 as     *
- *   published by the Free Software Foundation or - at your option - under *
- *   the terms of the GNU General Public Licence version 2 but can be      *
- *   linked to any BSD-Licenced Software with public available sourcecode. *
- *                                                                         *
- ***************************************************************************/
+/* -------------------------------------------------------------------------
+ * File               : quagga.c
+ * Description        : functions to interface to the zebra daemon
+ * ------------------------------------------------------------------------- */
 
 #define HAVE_SOCKLEN_T
 
@@ -201,7 +201,8 @@ zebra_send_command(unsigned char *options)
       }
     }
     pnt = pnt + ret;
-  } while ((len -= ret));
+  }
+  while ((len -= ret));
   free(options);
   return 0;
 }
@@ -308,30 +309,38 @@ zebra_parse(void *foo __attribute__ ((unused)))
 // tries to read a packet from zebra_socket
 // if there is something to read - make sure to read whole packages
 static unsigned char *
-try_read(ssize_t * len)
+try_read(ssize_t * size)
 {
-  unsigned char *buf = NULL;
-  ssize_t ret = 0, bsize = 0;
-  uint16_t length = 0, l = 0;
-  int sockstate;
+  unsigned char *buf;
+  ssize_t bytes, bufsize;
+  uint16_t length, offset;
+  int sockstatus;
 
-  *len = 0;
+  offset = *size = bufsize = 0;
 
-  sockstate = fcntl(zebra.sock, F_GETFL, 0);
-  fcntl(zebra.sock, F_SETFL, sockstate | O_NONBLOCK);
+  /* save socket status and set non-blocking for read */
+  sockstatus = fcntl(zebra.sock, F_GETFL);
+  fcntl(zebra.sock, F_SETFL, sockstatus|O_NONBLOCK);
 
+  /* read whole packages */
   do {
-    if (*len == bsize) {
-      bsize += BUFSIZE;
-      buf = my_realloc(buf, bsize, "Zebra try_read");
+
+    /* (re)allocate buffer */
+    if (*size == bufsize) {
+      bufsize += BUFSIZE;
+      buf = my_realloc(buf, bufsize, "Zebra try_read");
     }
-    ret = read (zebra.sock, buf + *len, bsize - *len);
-    if (!ret) {                 // nothing more to read, packet is broken, discard!
+
+    /* read from socket */
+    bytes = read(zebra.sock, buf + *size, bufsize - *size);
+    /* handle broken packet */
+    if (!bytes) {
       free(buf);
       return NULL;
     }
-
-    if (ret < 0) {
+    /* handle no data available */
+    if (bytes < 0) {
+      /* handle disconnect */
       if (errno != EAGAIN) {    // oops - we got disconnected
         OLSR_PRINTF(1, "(QUAGGA) Disconnected from zebra\n");
         zebra.status &= ~STATUS_CONNECTED;
@@ -340,18 +349,25 @@ try_read(ssize_t * len)
       return NULL;
     }
 
-    *len += ret;
+    *size += bytes;
+
+    /* detect zebra packet fragmentation */
     do {
-      memcpy(&length, buf + l, 2);
+      memcpy(&length, buf + offset, sizeof length);
       length = ntohs(length);
-      l += length;
-    } while (*len > l);
-    if (*len < l)
-      fcntl(zebra.sock, F_SETFL, sockstate);
+      offset += length;
+    }
+    while (*size >= (ssize_t) (offset + sizeof length));
+    /* set blocking socket on fragmented packet */
+    if (*size != offset)
+      fcntl(zebra.sock, F_SETFL, sockstatus);
+
   }
-  while (*len != l); // GOT FULL PACKAGE!!
+  while (*size != offset);
+
+  /* restore socket status */
+  fcntl(zebra.sock, F_SETFL, sockstatus);
 
-  fcntl(zebra.sock, F_SETFL, sockstate);
   return buf;
 }
 
index daccd5e..0b0158e 100644 (file)
@@ -1,21 +1,21 @@
+/*
+ * OLSRd Quagga plugin
+ *
+ * Copyright (C) 2006-2008 Immo 'FaUl' Wehrenberg <immo@chaostreff-dortmund.de>
+ * Copyright (C) 2007-2010 Vasilis Tsiligiannis <acinonyxs@yahoo.gr>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation or - at your option - under
+ * the terms of the GNU General Public Licence version 2 but can be
+ * linked to any BSD-Licenced Software with public available sourcecode
+ *
+ */
 
-/***************************************************************************
- projekt              : olsrd-quagga
- file                 : quagga.h
- usage                : header for quagga.c
- copyright            : (C) 2006 by Immo 'FaUl' Wehrenberg
- e-mail               : immo@chaostreff-dortmund.de
- ***************************************************************************/
-
-/***************************************************************************
- *                                                                         *
- *   This program is free software; you can redistribute it and/or modify  *
- *   it under the terms of the GNU General Public License version 2 as     *
- *   published by the Free Software Foundation or - at your option - under *
- *   the terms of the GNU General Public Licence version 2 but can be      *
- *   linked to any BSD-Licenced Software with public available sourcecode. *
- *                                                                         *
- ***************************************************************************/
+/* -------------------------------------------------------------------------
+ * File               : quagga.h
+ * Description        : header file for quagga.c
+ * ------------------------------------------------------------------------- */
 
 #include "routing_table.h" /* rt_entry */
 #include "olsr_types.h" /* olsr_ip_addr */