diff --git a/ChangeLog b/ChangeLog index bd2dc605f..5a02e65cc 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2012-05-03 Vladimir Serbinenko + + * util/grub-fstest.c (cmd_cmp): Compare directories recursively. + 2012-05-03 Vladimir Serbinenko * grub-core/fs/reiserfs.c (grub_reiserfs_iterate_dir): Put a trailing diff --git a/util/grub-fstest.c b/util/grub-fstest.c index c17a4ab78..b36c165aa 100644 --- a/util/grub-fstest.c +++ b/util/grub-fstest.c @@ -40,6 +40,12 @@ #include #include +#include +#include +#include +#include +#include + #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) {