diff options
Diffstat (limited to 'src/metaentry.c')
-rw-r--r-- | src/metaentry.c | 80 |
1 files changed, 57 insertions, 23 deletions
diff --git a/src/metaentry.c b/src/metaentry.c index ed0e23d..7f1012f 100644 --- a/src/metaentry.c +++ b/src/metaentry.c @@ -432,50 +432,84 @@ mentries_tofile_v0(const struct metahash *mhash, FILE * to) } } +/* Compare two mentries by path */ +static int +mentry_cmp_path(const struct metaentry *a, const struct metaentry *b) +{ + return strcmp(a->path, b->path); +} + +/* Compare two mentries by path, as is sutiable for qsort(3) */ +static int +mentry_cmp_path_q(const void *a, const void *b) +{ + return mentry_cmp_path(*((const struct metaentry **) a), + *((const struct metaentry **) b)); +} + /* Stores metaentries to a Format 1 file */ static void mentries_tofile_v1(const struct metahash *mhash, FILE * to) { const struct metaentry *mentry; - int key; + const struct metaentry **entarr; + int key, entries = 0; struct tm tm; char tmbuf[20]; unsigned i; - fputc('\n', to); + for (key = 0; key < HASH_INDEXES; key++) { + for (mentry = mhash->bucket[key]; mentry; mentry = mentry->next) { + ++entries; + } + } + entarr = xmalloc(entries * sizeof(struct metaentry *)); + i = 0; for (key = 0; key < HASH_INDEXES; key++) { for (mentry = mhash->bucket[key]; mentry; mentry = mentry->next) { - write_string_url(mentry->path, to); + entarr[i++] = mentry; + } + } - fputc('\t', to); - write_string_url(mentry->owner, to); + qsort(entarr, entries, sizeof(struct metaentry *), mentry_cmp_path_q); - fputc('\t', to); - write_string_url(mentry->group, to); + fputc('\n', to); - fputc('\t', to); - fprintf(to, "%.6o", mentry->mode); + for (key = 0; key < entries; key++) { + mentry = entarr[key]; - fputc('\t', to); - gmtime_r(&mentry->mtime, &tm); - strftime(tmbuf, sizeof(tmbuf), "%Y-%m-%dT%H:%M:%S", &tm); - fputs(tmbuf, to); + write_string_url(mentry->path, to); - fputc('.', to); - fprintf(to, "%.9ldZ", mentry->mtimensec); + fputc('\t', to); + write_string_url(mentry->owner, to); - for (i = 0; i < mentry->xattrs; i++) { - fputc('\t', to); - write_string_url(mentry->xattr_names[i], to); - fputc('\t', to); - write_binary_url(mentry->xattr_values[i], - mentry->xattr_lvalues[i], to); - } + fputc('\t', to); + write_string_url(mentry->group, to); - fputc('\n', to); + fputc('\t', to); + fprintf(to, "%.6o", mentry->mode); + + fputc('\t', to); + gmtime_r(&mentry->mtime, &tm); + strftime(tmbuf, sizeof(tmbuf), "%Y-%m-%dT%H:%M:%S", &tm); + fputs(tmbuf, to); + + fputc('.', to); + fprintf(to, "%.9ldZ", mentry->mtimensec); + + for (i = 0; i < mentry->xattrs; i++) { + fputc('\t', to); + write_string_url(mentry->xattr_names[i], to); + fputc('\t', to); + write_binary_url(mentry->xattr_values[i], + mentry->xattr_lvalues[i], to); } + + fputc('\n', to); } + + free(entarr); } /* Stores metaentries to a file */ |