123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 |
- //
- // apfs_util.c
- // electra
- //
- // Created by CoolStar on 2/26/18.
- // Copyright © 2018 Electra Team. All rights reserved.
- //
- #include "apfs_util.h"
- #include <fcntl.h>
- #include <sys/syscall.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <unistd.h>
- #include <errno.h>
- #include <sys/attr.h>
- #include <sys/snapshot.h>
- 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);
- }
|