// // apfs_util.c // electra // // Created by CoolStar on 2/26/18. // Copyright © 2018 Electra Team. All rights reserved. // #include "apfs_util.h" #include #include #include #include #include #include #include #include #include int list_snapshots(const char *vol) { int dirfd = open(vol, O_RDONLY, 0); if (dirfd < 0) { perror("open"); return -1; } struct attrlist alist = { 0 }; char abuf[2048]; alist.commonattr = ATTR_BULK_REQUIRED; int count = fs_snapshot_list(dirfd, &alist, &abuf[0], sizeof (abuf), 0); if (count < 0) { perror("fs_snapshot_list"); return -1; } char *p = &abuf[0]; for (int i = 0; i < count; i++) { char *field = p; uint32_t len = *(uint32_t *)field; field += sizeof (uint32_t); attribute_set_t attrs = *(attribute_set_t *)field; field += sizeof (attribute_set_t); if (attrs.commonattr & ATTR_CMN_NAME) { attrreference_t ar = *(attrreference_t *)field; char *name = field + ar.attr_dataoffset; field += sizeof (attrreference_t); (void) printf("%s\n", name); } p += len; } return (0); } int check_snapshot(const char *vol, const char *snap) { int dirfd = open(vol, O_RDONLY, 0); if (dirfd < 0) { perror("open"); return -1; } struct attrlist alist = { 0 }; char abuf[2048]; alist.commonattr = ATTR_BULK_REQUIRED; int count = fs_snapshot_list(dirfd, &alist, &abuf[0], sizeof (abuf), 0); if (count < 0) { perror("fs_snapshot_list"); return -1; } char *p = &abuf[0]; for (int i = 0; i < count; i++) { char *field = p; uint32_t len = *(uint32_t *)field; field += sizeof (uint32_t); attribute_set_t attrs = *(attribute_set_t *)field; field += sizeof (attribute_set_t); if (attrs.commonattr & ATTR_CMN_NAME) { attrreference_t ar = *(attrreference_t *)field; const char *name = field + ar.attr_dataoffset; field += sizeof (attrreference_t); if (strcmp(name, snap) == 0){ return 1; } } p += len; } return (0); }