]>
git.saurik.com Git - apple/xnu.git/blob - libsyscall/wrappers/fs_snapshot.c
2 * Copyright (c) 2016 Apple Inc. All rights reserved.
4 * @APPLE_LICENSE_HEADER_START@
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. Please obtain a copy of the License at
10 * http://www.opensource.apple.com/apsl/ and read it before using this
13 * The Original Code and all software distributed under the License are
14 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
15 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
16 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
18 * Please see the License for the specific language governing rights and
19 * limitations under the License.
21 * @APPLE_LICENSE_HEADER_END@
24 #include <sys/snapshot.h>
31 extern int __fs_snapshot(uint32_t, int, const char *, const char *, void *,
35 fs_snapshot_create(int dirfd
, const char *name
, uint32_t flags
)
37 return __fs_snapshot(SNAPSHOT_OP_CREATE
, dirfd
, name
, NULL
, NULL
, flags
);
41 fs_snapshot_list(int dirfd
, struct attrlist
*alist
, void *attrbuf
, size_t bufsize
,
49 return (getattrlistbulk(dirfd
, alist
, attrbuf
, bufsize
,
50 FSOPT_LIST_SNAPSHOT
));
54 fs_snapshot_delete(int dirfd
, const char *name
, uint32_t flags
)
56 return __fs_snapshot(SNAPSHOT_OP_DELETE
, dirfd
, name
, NULL
, NULL
, flags
);
60 fs_snapshot_rename(int dirfd
, const char *old
, const char *new, uint32_t flags
)
62 return __fs_snapshot(SNAPSHOT_OP_RENAME
, dirfd
, old
, new, NULL
, flags
);
66 fs_snapshot_revert(int dirfd
, const char *name
, uint32_t flags
)
68 return __fs_snapshot(SNAPSHOT_OP_REVERT
, dirfd
, name
, NULL
, NULL
, flags
);
72 * XXX Temporary hack to do what mount_apfs(8) does. This will be removed and
73 * replaced with a VFS_IOCTL based implementation in the kernel.
78 #ifndef SNAPSHOT_OP_MOUNT
79 #define SNAPSHOT_OP_MOUNT 0x4
82 #define FS_MOUNT_SNAPSHOT 2
83 #define MAX_SNAPSHOT_NAMELEN 256
85 struct fs_mount_options
{
90 struct fs_mount_args
{
92 struct fs_mount_options options
;
94 uint16_t _padding_
[3];
96 struct { // FS_MOUNT_SNAPSHOT
98 char snap_name
[MAX_SNAPSHOT_NAMELEN
];
100 struct { // APFS_MOUNT_FOR_CONVERSION
106 fs_snapshot_mount(int dirfd
, const char *dir
, const char *snapshot
,
110 struct fs_mount_args mnt_args
;
112 mnt_args
.specdev
= NULL
;
113 mnt_args
.mode
= FS_MOUNT_SNAPSHOT
;
114 if (fstat(dirfd
, &st
) == -1)
117 mnt_args
.snap_fsys
= st
.st_dev
;
118 strlcpy(mnt_args
.snap_name
, snapshot
, sizeof(mnt_args
.snap_name
));
119 return (__fs_snapshot(SNAPSHOT_OP_MOUNT
, dirfd
, snapshot
, dir
,
120 (void *)&mnt_args
, flags
));