Merge tag 'upstream/1.2.3'
[quagga-debian.git] / lib / command.c
index 662f8a3d8be3a0ec6622c66ae282651de45ae249..e1d9ff6520f8d778193e5a2a0964b0d92571ef96 100644 (file)
@@ -1700,7 +1700,7 @@ cmd_element_match(struct cmd_element *cmd_element,
  *                That vector will contain all struct command_token* of the
  *                cmd_element which matched against the given vline at the given
  *                index.
- * @return A code specifying if an error occured. If all went right, it's
+ * @return A code specifying if an error occurred. If all went right, it's
  *         CMD_SUCCESS.
  */
 static int
@@ -2812,7 +2812,7 @@ command_config_read_one_line (struct vty *vty, struct cmd_element **cmd, int use
         ret != CMD_SUCCESS && ret != CMD_WARNING &&
         ret != CMD_ERR_NOTHING_TODO && vty->node != CONFIG_NODE) {
     vty->node = node_parent(vty->node);
-    ret = cmd_execute_command_strict (vline, vty, NULL);
+    ret = cmd_execute_command_strict (vline, vty, cmd);
   }
 
   // If climbing the tree did not work then ignore the command and
@@ -3071,7 +3071,7 @@ DEFUN (config_write_file,
        "Write to configuration file\n")
 {
   unsigned int i;
-  int fd;
+  int fd, dupfd = -1;
   struct cmd_node *node;
   char *config_file;
   char *config_file_tmp = NULL;
@@ -3124,7 +3124,20 @@ DEFUN (config_write_file,
        if ((*node->func) (file_vty))
          vty_out (file_vty, "!\n");
       }
+  
+  if ((dupfd = dup (file_vty->wfd)) < 0)
+    {
+      vty_out (vty, "Couldn't dup fd (for fdatasync) for %s, %s (%d).%s", 
+               config_file, safe_strerror(errno), errno, VTY_NEWLINE);
+    }
+
   vty_close (file_vty);
+  
+  if (fdatasync (dupfd) < 0)
+    {
+      vty_out (vty, "Couldn't fdatasync %s, %s (%d)!%s",
+               config_file, safe_strerror(errno), errno, VTY_NEWLINE);
+    }
 
   if (unlink (config_file_sav) != 0)
     if (errno != ENOENT)
@@ -3139,21 +3152,12 @@ DEFUN (config_write_file,
                VTY_NEWLINE);
       goto finished;
     }
-  sync ();
-  if (unlink (config_file) != 0)
+  if (rename (config_file_tmp, config_file) != 0)
     {
-      vty_out (vty, "Can't unlink configuration file %s.%s", config_file,
-               VTY_NEWLINE);
-      goto finished;
-    }
-  if (link (config_file_tmp, config_file) != 0)
-    {
-      vty_out (vty, "Can't save configuration file %s.%s", config_file,
-              VTY_NEWLINE);
+      vty_out (vty, "Can't move configuration file %s into place.%s",
+               config_file, VTY_NEWLINE);
       goto finished;
     }
-  sync ();
-  
   if (chmod (config_file, CONFIGFILE_MASK) != 0)
     {
       vty_out (vty, "Can't chmod configuration file %s: %s (%d).%s", 
@@ -3166,6 +3170,8 @@ DEFUN (config_write_file,
   ret = CMD_SUCCESS;
 
 finished:
+  if (dupfd >= 0)
+    close (dupfd);
   unlink (config_file_tmp);
   XFREE (MTYPE_TMP, config_file_tmp);
   XFREE (MTYPE_TMP, config_file_sav);