// Compile with: // cc -DUID=$UID -DUSER=$USER -D_LARGEFILE64_SOURCE -o zfs_mount zfs_mount.c `pkg-config --cflags --libs libzfs` // then install with: // sudo cp zfs_mount /usr/local/bin // sudo setcap cap_sys_admin+ep /usr/local/bin/zfs_mount #include #include #include #include #define STR_AUX(x) #x #define STR(x) STR_AUX(x) int main(int argc, char **argv) { if (argc != 2) { fprintf(stderr, "Usage: %s \n", argv[0]); return 2; } char* fs_path = argv[1]; char* user = getlogin(); uid_t uid = getuid(); if (strcmp(user, STR(USER)) != 0 || uid != UID) { fprintf(stderr, "Bad user: %s (%d)\n", user, uid); return 1; } libzfs_handle_t *g_zfs; if ((g_zfs = libzfs_init()) == NULL) { fprintf(stderr, "%s\n", libzfs_error_init(errno)); return 1; } zfs_handle_t *zhp; if ((zhp = zfs_open(g_zfs, fs_path, ZFS_TYPE_FILESYSTEM)) == NULL) { fprintf(stderr, "filesystem '%s' cannot be " "mounted, does it exist?\n", fs_path); libzfs_fini(g_zfs); return 1; } if (zfs_mount(zhp, "", 0)) { fprintf(stderr, "zfs_mount() failed: %s\n", libzfs_error_description(g_zfs)); zfs_close(zhp); libzfs_fini(g_zfs); return 1; } zfs_close(zhp); libzfs_fini(g_zfs); return 0; }