static int attr_counter_set_collect(struct mtree_writer *,
struct mtree_entry *);
static void attr_counter_set_free(struct mtree_writer *);
-static int get_keys(struct mtree_writer *, struct mtree_entry *);
+static int get_global_set_keys(struct mtree_writer *, struct mtree_entry *);
static int mtree_entry_add_child_tail(struct mtree_entry *,
struct mtree_entry *);
static int mtree_entry_create_virtual_dir(struct archive_write *, const char *,
mtree->set.fflags_clear))
effkeys &= ~F_FLAGS;
}
+ } else {
+ if (acs->uid_list == NULL)
+ keys &= ~(F_UNAME | F_UID);
+ if (acs->gid_list == NULL)
+ keys &= ~(F_GNAME | F_GID);
+ if (acs->mode_list == NULL)
+ keys &= ~F_MODE;
+ if (acs->flags_list == NULL)
+ keys &= ~F_FLAGS;
}
if ((keys & effkeys & F_TYPE) != 0) {
if (mtree->dironly) {
}
static int
-get_keys(struct mtree_writer *mtree, struct mtree_entry *me)
+get_global_set_keys(struct mtree_writer *mtree, struct mtree_entry *me)
{
int keys;
me->rdevminor = archive_entry_rdevminor(entry);
me->size = archive_entry_size(entry);
if (me->filetype == AE_IFDIR) {
- me->dir_info = malloc(sizeof(*me->dir_info));
+ me->dir_info = calloc(1, sizeof(*me->dir_info));
if (me->dir_info == NULL) {
mtree_entry_free(me);
archive_set_error(&a->archive, ENOMEM,
}
mtree_quote(str, me->basename.s);
- keys = get_keys(mtree, me);
+ keys = get_global_set_keys(mtree, me);
if ((keys & F_NLINK) != 0 &&
me->nlink != 1 && me->filetype != AE_IFDIR)
archive_string_sprintf(str, " nlink=%u", me->nlink);
ret = write_mtree_entry(a, np);
if (ret != ARCHIVE_OK)
return (ARCHIVE_FATAL);
+ } else {
+ /* Whenever output_global_set is enabled
+ * output global value(/set keywords)
+ * even if the directory entry is not allowd
+ * to be written because the global values
+ * can be used for the children. */
+ if (mtree->output_global_set)
+ write_global(mtree);
}
/*
* Output the attribute of all files except directory files.
static const char image [] = {
"#mtree\n"
-"/set type=file uid=1001 gid=1001 mode=644\n"
"\n"
"# .\n"
+"/set type=file uid=1001 gid=1001 mode=644\n"
". time=1231975636.0 mode=755 type=dir\n"
" COPYING time=1231975636.0 size=8\n"
" Makefile time=1233041050.0 size=8\n"
static const char image_dironly [] = {
"#mtree\n"
-"/set type=dir uid=1001 gid=1001 mode=755\n"
"# .\n"
+"/set type=dir uid=1001 gid=1001 mode=755\n"
". time=1231975636.0\n"
"# ./subdir\n"
"subdir time=1233504586.0\n"
static const char image [] = {
"#mtree\n"
-"/set type=file uid=1001 gid=1001 mode=644\n"
"\n"
"# .\n"
+"/set type=file uid=1001 gid=1001 mode=644\n"
". time=1231975636.0 mode=755 type=dir\n"
" COPYING time=1231975636.0 size=8\n"
" Makefile time=1233041050.0 size=8\n"
static const char image_dironly [] = {
"#mtree\n"
-"/set type=dir uid=1001 gid=1001 mode=755\n"
"# .\n"
+"/set type=dir uid=1001 gid=1001 mode=755\n"
". time=1231975636.0\n"
"# ./subdir\n"
" subdir time=1233504586.0\n"