cffi / demo /

""" source target newname

creates a exactly named snapshots and bails out if they exist

import argparse
import fcntl
import os
import sys

import cffi

ffi = cffi.FFI()

    #define BTRFS_IOC_SNAP_CREATE_V2 ...
    struct btrfs_ioctl_vol_args_v2 {
        int64_t fd;
        char name[];

v = ffi.verify("#include <btrfs/ioctl.h>")

parser = argparse.ArgumentParser(usage=__doc__.strip())
parser.add_argument('source', help='source subvolume')
parser.add_argument('target', help='target directory')
parser.add_argument('newname', help='name of the new snapshot')
opts = parser.parse_args()

source =, os.O_DIRECTORY)
target =, os.O_DIRECTORY)

args ='struct btrfs_ioctl_vol_args_v2 *') = opts.newname
args.fd = source
args_buffer = ffi.buffer(args)
    fcntl.ioctl(target, v.BTRFS_IOC_SNAP_CREATE_V2, args_buffer)
except IOError as e:
    print e
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.