]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
* util/grub-fstest.c (cmd_cmp): Compare directories recursively.
authorVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Thu, 3 May 2012 14:45:40 +0000 (16:45 +0200)
committerVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Thu, 3 May 2012 14:45:40 +0000 (16:45 +0200)
ChangeLog
util/grub-fstest.c

index bd2dc605fd42e54621c3b580ed83164a1fcdf1da..5a02e65cc8dfbca37d7031ce37bb32ebb7fa1017 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2012-05-03  Vladimir Serbinenko  <phcoder@gmail.com>
+
+       * util/grub-fstest.c (cmd_cmp): Compare directories recursively.
+
 2012-05-03  Vladimir Serbinenko  <phcoder@gmail.com>
 
        * grub-core/fs/reiserfs.c (grub_reiserfs_iterate_dir): Put a trailing
index c17a4ab7843a2af124095d4b8cce6f064b11bea8..b36c165aad1dae99b1db9ce0c3d8b3ed8b9fe031 100644 (file)
 #include <string.h>
 #include <stdlib.h>
 
+#include <sys/types.h>
+#include <dirent.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
 #include "progname.h"
 #include "argp.h"
 
@@ -245,6 +251,48 @@ cmd_cmp (char *src, char *dest)
     return 0;
   }
 
+  struct stat st;
+  if (stat (dest, &st) == -1)
+    grub_util_error (_("OS file %s open error: %s"), dest,
+                    strerror (errno));
+
+  if (S_ISDIR (st.st_mode))
+    {
+      DIR *dir = opendir (dest);
+      struct dirent *entry;
+      if (dir == NULL)
+       {
+         grub_util_error (_("OS file %s open error: %s"), dest,
+                          strerror (errno));
+         return;
+       }
+      while ((entry = readdir (dir)))
+       {
+         char *srcnew, *destnew;
+         char *ptr;
+         if (strcmp (entry->d_name, ".") == 0
+             || strcmp (entry->d_name, "..") == 0)
+           continue;
+         srcnew = xmalloc (strlen (src) + sizeof ("/")
+                           + strlen (entry->d_name));
+         destnew = xmalloc (strlen (dest) + sizeof ("/")
+                           + strlen (entry->d_name));
+         ptr = stpcpy (srcnew, src);
+         *ptr++ = '/';
+         strcpy (ptr, entry->d_name);
+         ptr = stpcpy (destnew, dest);
+         *ptr++ = '/';
+         strcpy (ptr, entry->d_name);
+
+         if (lstat (dest, &st) == -1 || S_ISLNK (st.st_mode))
+           continue;
+
+         cmd_cmp (srcnew, destnew);
+       }
+      closedir (dir);
+      return;
+    }
+
   ff = fopen (dest, "rb");
   if (ff == NULL)
     {