]> git.puffer.fish Git - matthieu/frr.git/commitdiff
bgpd: flock() dump files (BZ#742)
authorDaniel Kozlowski <dkozlowski@sevone.com>
Wed, 26 Sep 2012 12:01:24 +0000 (12:01 +0000)
committerDavid Lamparter <equinox@opensourcerouting.org>
Fri, 2 Nov 2012 05:58:38 +0000 (22:58 -0700)
flock()ing the BGP dump files helps consumers determine when they're
safe to read.

Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
bgpd/bgp_dump.c

index edb725a97b353b24961d9869a851e7ae74ab9cf2..7754860126dbbccf17ba5b2eb0e157d2e3adb8b1 100644 (file)
@@ -95,6 +95,7 @@ static FILE *
 bgp_dump_open_file (struct bgp_dump *bgp_dump)
 {
   int ret;
+  int fd;
   time_t clock;
   struct tm *tm;
   char fullpath[MAXPATHLEN];
@@ -131,6 +132,16 @@ bgp_dump_open_file (struct bgp_dump *bgp_dump)
       umask(oldumask);
       return NULL;
     }
+  else
+    {
+      fd = fileno(bgp_dump->fp);
+      ret = flock( fd, LOCK_EX );
+      if (ret != 0)
+       {
+         zlog_warn ("bgp_dump_open_file: Unable to flock() file %s: %s", realpath, strerror (errno));
+       }
+    }
+
   umask(oldumask);  
 
   return bgp_dump->fp;
@@ -195,6 +206,7 @@ bgp_dump_set_size (struct stream *s, int type)
 static void
 bgp_dump_routes_index_table(struct bgp *bgp)
 {
+  int ret;
   struct peer *peer;
   struct listnode *node;
   uint16_t peerno = 0;
@@ -266,7 +278,11 @@ bgp_dump_routes_index_table(struct bgp *bgp)
 
   bgp_dump_set_size(obuf, MSG_TABLE_DUMP_V2);
 
-  fwrite (STREAM_DATA (obuf), stream_get_endp (obuf), 1, bgp_dump_routes.fp);
+  ret = fwrite (STREAM_DATA (obuf), stream_get_endp (obuf), 1, bgp_dump_routes.fp);
+  if (ret != 1)
+    {
+      zlog_warn ("bgp_dump_routes_index_table: fwrite returned %d, expected 1: %s", ret, strerror (errno));
+    }
   fflush (bgp_dump_routes.fp);
 }
 
@@ -275,6 +291,7 @@ bgp_dump_routes_index_table(struct bgp *bgp)
 static unsigned int
 bgp_dump_routes_func (int afi, int first_run, unsigned int seq)
 {
+  int ret;
   struct stream *obuf;
   struct bgp_info *info;
   struct bgp_node *rn;
@@ -373,8 +390,11 @@ bgp_dump_routes_func (int afi, int first_run, unsigned int seq)
       seq++;
 
       bgp_dump_set_size(obuf, MSG_TABLE_DUMP_V2);
-      fwrite (STREAM_DATA (obuf), stream_get_endp (obuf), 1, bgp_dump_routes.fp);
-
+      ret = fwrite (STREAM_DATA (obuf), stream_get_endp (obuf), 1, bgp_dump_routes.fp);
+      if (ret != 1)
+        {
+          zlog_warn ("bgp_dump_routes_func: fwrite returned %d, expected 1: %s", ret, strerror (errno));
+        }
     }
 
   fflush (bgp_dump_routes.fp);
@@ -464,6 +484,7 @@ bgp_dump_common (struct stream *obuf, struct peer *peer, int forceas4)
 void
 bgp_dump_state (struct peer *peer, int status_old, int status_new)
 {
+  int ret;
   struct stream *obuf;
 
   /* If dump file pointer is disabled return immediately. */
@@ -484,7 +505,11 @@ bgp_dump_state (struct peer *peer, int status_old, int status_new)
   bgp_dump_set_size (obuf, MSG_PROTOCOL_BGP4MP);
 
   /* Write to the stream. */
-  fwrite (STREAM_DATA (obuf), stream_get_endp (obuf), 1, bgp_dump_all.fp);
+  ret = fwrite (STREAM_DATA (obuf), stream_get_endp (obuf), 1, bgp_dump_all.fp);
+  if (ret != 1)
+    {
+      zlog_warn ("bgp_dump_state: fwrite returned %d, expected 1: %s", ret, strerror (errno));
+    }
   fflush (bgp_dump_all.fp);
 }
 
@@ -492,6 +517,7 @@ static void
 bgp_dump_packet_func (struct bgp_dump *bgp_dump, struct peer *peer,
                      struct stream *packet)
 {
+  int ret;
   struct stream *obuf;
 
   /* If dump file pointer is disabled return immediately. */
@@ -520,7 +546,11 @@ bgp_dump_packet_func (struct bgp_dump *bgp_dump, struct peer *peer,
   bgp_dump_set_size (obuf, MSG_PROTOCOL_BGP4MP);
 
   /* Write to the stream. */
-  fwrite (STREAM_DATA (obuf), stream_get_endp (obuf), 1, bgp_dump->fp);
+  ret = fwrite (STREAM_DATA (obuf), stream_get_endp (obuf), 1, bgp_dump->fp);
+  if (ret != 1)
+    {
+      zlog_warn ("bgp_dump_packet_func: fwrite returned %d, expected 1: %s", ret, strerror (errno));
+    }
   fflush (bgp_dump->fp);
 }