X-Git-Url: http://git.annexia.org/?a=blobdiff_plain;f=helper%2Fappliance.c;h=85efd756e74472c312d81a477d78550277045b9b;hb=beade5dece2fa01d78da8a2f12d5a86adc96ad13;hp=4cbebf4d46cd6fe2f1b615e5915ac7d68fd4192f;hpb=0f89ba0654de234429042ffcc91c8a0de94ec98b;p=febootstrap.git diff --git a/helper/appliance.c b/helper/appliance.c index 4cbebf4..85efd75 100644 --- a/helper/appliance.c +++ b/helper/appliance.c @@ -123,27 +123,33 @@ iterate_inputs (char **inputs, int nr_inputs, struct writer *writer) } } +static int +string_compare (const void *p1, const void *p2) +{ + return strcmp (* (char * const *) p1, * (char * const *) p2); +} + static void iterate_input_directory (const char *dirname, int dirfd, struct writer *writer) { - char path[PATH_MAX]; - strcpy (path, dirname); - size_t len = strlen (dirname); - path[len++] = '/'; - - char *inputs[] = { path }; - DIR *dir = fdopendir (dirfd); if (dir == NULL) error (EXIT_FAILURE, errno, "fdopendir: %s", dirname); + char **entries = NULL; + size_t nr_entries = 0, nr_alloc = 0; + struct dirent *d; while ((errno = 0, d = readdir (dir)) != NULL) { if (d->d_name[0] == '.') /* ignore ., .. and any hidden files. */ continue; - strcpy (&path[len], d->d_name); - iterate_inputs (inputs, 1, writer); + /* Ignore *~ files created by editors. */ + size_t len = strlen (d->d_name); + if (len > 0 && d->d_name[len-1] == '~') + continue; + + add_string (&entries, &nr_entries, &nr_alloc, d->d_name); } if (errno != 0) @@ -151,6 +157,27 @@ iterate_input_directory (const char *dirname, int dirfd, struct writer *writer) if (closedir (dir) == -1) error (EXIT_FAILURE, errno, "closedir: %s", dirname); + + add_string (&entries, &nr_entries, &nr_alloc, NULL); + + /* Visit directory entries in order. In febootstrap <= 2.8 we + * didn't impose any order, but that led to some difficult + * heisenbugs. + */ + sort (entries, string_compare); + + char path[PATH_MAX]; + strcpy (path, dirname); + size_t len = strlen (dirname); + path[len++] = '/'; + + char *inputs[] = { path }; + + size_t i; + for (i = 0; entries[i] != NULL; ++i) { + strcpy (&path[len], entries[i]); + iterate_inputs (inputs, 1, writer); + } } /* Copy kernel modules.