Lines Matching defs:mtree

222 				 * directory files, like mtree(8) -d option. */
225 * global values. When generating mtree
374 * Indent a line as mtree utility to be readable for people.
377 mtree_indent(struct mtree_writer *mtree)
382 if (mtree->classic) {
383 if (mtree->indent) {
385 pd = mtree->depth * 4;
387 nd = mtree->depth?4:0;
393 s = r = mtree->ebuf.s;
401 archive_strappend_char(&mtree->buf, ' ');
402 archive_strncat(&mtree->buf, s, r - s);
404 archive_strncat(&mtree->buf, " \\\n", 3);
406 archive_strappend_char(&mtree->buf, ' ');
410 archive_strappend_char(&mtree->buf, ' ');
421 archive_strncat(&mtree->buf, s, x - s);
422 archive_strncat(&mtree->buf, " \\\n", 3);
424 archive_strappend_char(&mtree->buf, ' ');
431 archive_strappend_char(&mtree->buf, ' ');
432 archive_strcat(&mtree->buf, s);
437 archive_strncat(&mtree->buf, s, x - s);
438 archive_strncat(&mtree->buf, " \\\n", 3);
440 archive_strappend_char(&mtree->buf, ' ');
443 archive_strcat(&mtree->buf, s);
444 archive_string_empty(&mtree->ebuf);
453 write_global(struct mtree_writer *mtree)
462 keys = mtree->keys & SET_KEYS;
463 oldkeys = mtree->set.keys;
465 acs = &mtree->acs;
466 if (mtree->set.processing) {
475 mtree->set.uid == acs->uid_list->m_entry->uid)
482 mtree->set.gid == acs->gid_list->m_entry->gid)
489 mtree->set.mode == acs->mode_list->m_entry->mode)
497 mtree->set.fflags_set &&
499 mtree->set.fflags_clear))
513 if (mtree->dironly) {
515 mtree->set.type = AE_IFDIR;
518 mtree->set.type = AE_IFREG;
532 mtree->set.uid = acs->uid_list->m_entry->uid;
534 (intmax_t)mtree->set.uid);
547 mtree->set.gid = acs->gid_list->m_entry->gid;
549 (intmax_t)mtree->set.gid);
552 mtree->set.mode = acs->mode_list->m_entry->mode;
554 (unsigned int)mtree->set.mode);
562 mtree->set.fflags_set =
564 mtree->set.fflags_clear =
573 archive_string_sprintf(&mtree->buf, "/unset%s\n", unsetstr.s);
576 archive_string_sprintf(&mtree->buf, "/set%s\n", setstr.s);
578 mtree->set.keys = keys;
579 mtree->set.processing = 1;
655 attr_counter_set_collect(struct mtree_writer *mtree, struct mtree_entry *me)
658 struct att_counter_set *acs = &mtree->acs;
659 int keys = mtree->keys;
732 attr_counter_set_free(struct mtree_writer *mtree)
734 struct att_counter_set *acs = &mtree->acs;
743 get_global_set_keys(struct mtree_writer *mtree, struct mtree_entry *me)
747 keys = mtree->keys;
753 if (mtree->set.keys == 0)
756 if ((mtree->set.keys & (F_GNAME | F_GID)) != 0 &&
757 mtree->set.gid == me->gid)
759 if ((mtree->set.keys & (F_UNAME | F_UID)) != 0 &&
760 mtree->set.uid == me->uid)
762 if (mtree->set.keys & F_FLAGS) {
763 if (mtree->set.fflags_set == me->fflags_set &&
764 mtree->set.fflags_clear == me->fflags_clear)
767 if ((mtree->set.keys & F_MODE) != 0 && mtree->set.mode == me->mode)
775 if ((mtree->set.keys & F_TYPE) != 0 &&
776 mtree->set.type == AE_IFDIR)
781 if ((mtree->set.keys & F_TYPE) != 0 &&
782 mtree->set.type == AE_IFREG)
804 "Can't allocate memory for a mtree entry");
843 "Can't allocate memory for a mtree entry");
856 "Can't allocate memory for a mtree entry");
886 struct mtree_writer *mtree= a->format_data;
890 if (mtree->first) {
891 mtree->first = 0;
892 archive_strcat(&mtree->buf, "#mtree\n");
893 if ((mtree->keys & SET_KEYS) == 0)
894 mtree->output_global_set = 0;/* Disabled. */
897 mtree->entry_bytes_remaining = archive_entry_size(entry);
900 if (mtree->dironly && archive_entry_filetype(entry) != AE_IFDIR)
911 mtree->mtree_entry = mtree_entry;
917 sum_init(mtree);
925 struct mtree_writer *mtree = a->format_data;
930 if (mtree->classic) {
933 * pathname of the entry as mtree utility does
936 if (!mtree->dironly)
937 archive_strappend_char(&mtree->buf, '\n');
939 archive_string_sprintf(&mtree->buf,
943 archive_string_sprintf(&mtree->buf,
947 if (mtree->output_global_set)
948 write_global(mtree);
950 archive_string_empty(&mtree->ebuf);
951 str = (mtree->indent || mtree->classic)? &mtree->ebuf : &mtree->buf;
953 if (!mtree->classic && me->parentdir.s) {
963 keys = get_global_set_keys(mtree, me);
980 } else if (mtree->set.processing &&
981 (mtree->set.keys & F_FLAGS) != 0)
1060 if (mtree->indent || mtree->classic)
1061 mtree_indent(mtree);
1063 if (mtree->buf.length > 32768) {
1065 a, mtree->buf.s, mtree->buf.length);
1066 archive_string_empty(&mtree->buf);
1075 struct mtree_writer *mtree = a->format_data;
1079 if (mtree->indent) {
1080 int i, pd = mtree->depth * 4;
1082 archive_strappend_char(&mtree->buf, ' ');
1084 archive_string_sprintf(&mtree->buf, "# %s/%s\n",
1088 if (mtree->indent) {
1089 archive_string_empty(&mtree->ebuf);
1090 archive_strncat(&mtree->ebuf, "..\n\n", (mtree->dironly)?3:4);
1091 mtree_indent(mtree);
1093 archive_strncat(&mtree->buf, "..\n\n", (mtree->dironly)?3:4);
1095 if (mtree->buf.length > 32768) {
1097 a, mtree->buf.s, mtree->buf.length);
1098 archive_string_empty(&mtree->buf);
1105 * Write mtree entries saved at attr_counter_set_collect() function.
1110 struct mtree_writer *mtree = a->format_data;
1111 struct mtree_entry *np = mtree->root;
1116 if (mtree->output_global_set) {
1121 attr_counter_set_reset(mtree);
1124 if (attr_counter_set_collect(mtree, e) < 0) {
1131 if (!np->dir_info->virtual || mtree->classic) {
1141 if (mtree->output_global_set)
1142 write_global(mtree);
1147 mtree->depth++;
1159 mtree->depth--;
1166 if (mtree->indent)
1167 mtree->depth++;
1169 } else if (mtree->classic) {
1171 * While printing mtree classic, if there are not
1186 if (mtree->indent)
1187 mtree->depth--;
1188 if (mtree->classic) {
1197 * Switch to next mtree entry in the directory.
1211 struct mtree_writer *mtree = a->format_data;
1214 if ((me = mtree->mtree_entry) == NULL)
1216 mtree->mtree_entry = NULL;
1219 sum_final(mtree, me->reg_info);
1227 struct mtree_writer *mtree= a->format_data;
1230 if (mtree->root != NULL) {
1238 return __archive_write_output(a, mtree->buf.s, mtree->buf.length);
1244 struct mtree_writer *mtree= a->format_data;
1246 if (n > mtree->entry_bytes_remaining)
1247 n = (size_t)mtree->entry_bytes_remaining;
1248 mtree->entry_bytes_remaining -= n;
1251 if (mtree->mtree_entry == NULL)
1254 if (mtree->mtree_entry->filetype == AE_IFREG)
1255 sum_update(mtree, buff, n);
1263 struct mtree_writer *mtree= a->format_data;
1265 if (mtree == NULL)
1269 mtree_entry_register_free(mtree);
1270 archive_string_free(&mtree->cur_dirstr);
1271 archive_string_free(&mtree->ebuf);
1272 archive_string_free(&mtree->buf);
1273 attr_counter_set_free(mtree);
1274 free(mtree);
1283 struct mtree_writer *mtree= a->format_data;
1299 mtree->dironly = (value != NULL)? 1: 0;
1315 mtree->indent = (value != NULL)? 1: 0;
1372 mtree->output_global_set = (value != NULL)? 1: 0;
1379 mtree->keys |= keybit;
1381 mtree->keys &= ~keybit;
1395 struct mtree_writer *mtree;
1402 if ((mtree = calloc(1, sizeof(*mtree))) == NULL) {
1404 "Can't allocate mtree data");
1408 mtree->mtree_entry = NULL;
1409 mtree->first = 1;
1410 memset(&(mtree->set), 0, sizeof(mtree->set));
1411 mtree->keys = DEFAULT_KEYS;
1412 mtree->dironly = 0;
1413 mtree->indent = 0;
1414 archive_string_init(&mtree->ebuf);
1415 archive_string_init(&mtree->buf);
1416 mtree_entry_register_init(mtree);
1417 a->format_data = mtree;
1419 a->format_name = "mtree";
1426 a->archive.archive_format_name = "mtree";
1447 struct mtree_writer *mtree;
1449 mtree = (struct mtree_writer *)a->format_data;
1451 /* Set to output a mtree archive in classic format. */
1452 mtree->classic = 1;
1453 /* Basically, mtree classic format uses '/set' global
1455 mtree->output_global_set = 1;
1461 sum_init(struct mtree_writer *mtree)
1464 mtree->compute_sum = 0;
1466 if (mtree->keys & F_CKSUM) {
1467 mtree->compute_sum |= F_CKSUM;
1468 mtree->crc = 0;
1469 mtree->crc_len = 0;
1472 if (mtree->keys & F_MD5) {
1473 if (archive_md5_init(&mtree->md5ctx) == ARCHIVE_OK)
1474 mtree->compute_sum |= F_MD5;
1476 mtree->keys &= ~F_MD5;/* Not supported. */
1480 if (mtree->keys & F_RMD160) {
1481 if (archive_rmd160_init(&mtree->rmd160ctx) == ARCHIVE_OK)
1482 mtree->compute_sum |= F_RMD160;
1484 mtree->keys &= ~F_RMD160;/* Not supported. */
1488 if (mtree->keys & F_SHA1) {
1489 if (archive_sha1_init(&mtree->sha1ctx) == ARCHIVE_OK)
1490 mtree->compute_sum |= F_SHA1;
1492 mtree->keys &= ~F_SHA1;/* Not supported. */
1496 if (mtree->keys & F_SHA256) {
1497 if (archive_sha256_init(&mtree->sha256ctx) == ARCHIVE_OK)
1498 mtree->compute_sum |= F_SHA256;
1500 mtree->keys &= ~F_SHA256;/* Not supported. */
1504 if (mtree->keys & F_SHA384) {
1505 if (archive_sha384_init(&mtree->sha384ctx) == ARCHIVE_OK)
1506 mtree->compute_sum |= F_SHA384;
1508 mtree->keys &= ~F_SHA384;/* Not supported. */
1512 if (mtree->keys & F_SHA512) {
1513 if (archive_sha512_init(&mtree->sha512ctx) == ARCHIVE_OK)
1514 mtree->compute_sum |= F_SHA512;
1516 mtree->keys &= ~F_SHA512;/* Not supported. */
1522 sum_update(struct mtree_writer *mtree, const void *buff, size_t n)
1524 if (mtree->compute_sum & F_CKSUM) {
1532 COMPUTE_CRC(mtree->crc, *p);
1533 mtree->crc_len += n;
1536 if (mtree->compute_sum & F_MD5)
1537 archive_md5_update(&mtree->md5ctx, buff, n);
1540 if (mtree->compute_sum & F_RMD160)
1541 archive_rmd160_update(&mtree->rmd160ctx, buff, n);
1544 if (mtree->compute_sum & F_SHA1)
1545 archive_sha1_update(&mtree->sha1ctx, buff, n);
1548 if (mtree->compute_sum & F_SHA256)
1549 archive_sha256_update(&mtree->sha256ctx, buff, n);
1552 if (mtree->compute_sum & F_SHA384)
1553 archive_sha384_update(&mtree->sha384ctx, buff, n);
1556 if (mtree->compute_sum & F_SHA512)
1557 archive_sha512_update(&mtree->sha512ctx, buff, n);
1562 sum_final(struct mtree_writer *mtree, struct reg_info *reg)
1565 if (mtree->compute_sum & F_CKSUM) {
1568 for (len = mtree->crc_len; len != 0; len >>= 8)
1569 COMPUTE_CRC(mtree->crc, len & 0xff);
1570 reg->crc = ~mtree->crc;
1573 if (mtree->compute_sum & F_MD5)
1574 archive_md5_final(&mtree->md5ctx, reg->buf_md5);
1577 if (mtree->compute_sum & F_RMD160)
1578 archive_rmd160_final(&mtree->rmd160ctx, reg->buf_rmd160);
1581 if (mtree->compute_sum & F_SHA1)
1582 archive_sha1_final(&mtree->sha1ctx, reg->buf_sha1);
1585 if (mtree->compute_sum & F_SHA256)
1586 archive_sha256_final(&mtree->sha256ctx, reg->buf_sha256);
1589 if (mtree->compute_sum & F_SHA384)
1590 archive_sha384_final(&mtree->sha384ctx, reg->buf_sha384);
1593 if (mtree->compute_sum & F_SHA512)
1594 archive_sha512_final(&mtree->sha512ctx, reg->buf_sha512);
1597 reg->compute_sum = mtree->compute_sum;
1845 * to add "./" to the head of the pathname because mtree reader
1846 * will suppose that it is v1(a.k.a classic) mtree format and
1922 mtree_entry_register_add(struct mtree_writer *mtree, struct mtree_entry *file)
1925 *mtree->file_list.last = file;
1926 mtree->file_list.last = &(file->next);
1930 mtree_entry_register_init(struct mtree_writer *mtree)
1932 mtree->file_list.first = NULL;
1933 mtree->file_list.last = &(mtree->file_list.first);
1937 mtree_entry_register_free(struct mtree_writer *mtree)
1941 file = mtree->file_list.first;
2007 struct mtree_writer *mtree = (struct mtree_writer *)a->format_data;
2016 if (mtree->root != NULL) {
2017 np = mtree->root;
2020 mtree->root = file;
2021 mtree_entry_register_add(mtree, file);
2040 if (archive_strlen(&(mtree->cur_dirstr))
2042 strcmp(mtree->cur_dirstr.s, fn) == 0) {
2044 &(mtree->cur_dirent->dir_info->rbtree),
2048 &(mtree->cur_dirent->dir_info->rbtree),
2052 file->parent = mtree->cur_dirent;
2053 mtree_entry_register_add(mtree, file);
2057 dent = mtree->root;
2071 dent == mtree->root) {
2117 mtree->root = vp;
2124 mtree_entry_register_add(mtree, vp);
2143 mtree->cur_dirent = dent;
2144 archive_string_empty(&(mtree->cur_dirstr));
2145 archive_string_ensure(&(mtree->cur_dirstr),
2150 mtree->cur_dirstr.s[0] = 0;
2153 archive_string_copy(&(mtree->cur_dirstr),
2156 &(mtree->cur_dirstr), '/');
2158 archive_string_concat(&(mtree->cur_dirstr),
2170 mtree_entry_register_add(mtree, file);
2202 /* Update the existent mtree entry's attributes by the new one's. */