1*d8f839f9SJason King /*
2*d8f839f9SJason King * CDDL HEADER START
3*d8f839f9SJason King *
4*d8f839f9SJason King * This file and its contents are supplied under the terms of the
5*d8f839f9SJason King * Common Development and Distribution License ("CDDL"), version 1.0.
6*d8f839f9SJason King * You may only use this file in accordance with the terms of version
7*d8f839f9SJason King * 1.0 of the CDDL.
8*d8f839f9SJason King *
9*d8f839f9SJason King * A full copy of the text of the CDDL should have accompanied this
10*d8f839f9SJason King * source. A copy of the CDDL is also available via the Internet at
11*d8f839f9SJason King * http://www.illumos.org/license/CDDL.
12*d8f839f9SJason King *
13*d8f839f9SJason King * CDDL HEADER END
14*d8f839f9SJason King */
15*d8f839f9SJason King
16*d8f839f9SJason King /*
17*d8f839f9SJason King * Copyright 2020 Joyent, Inc.
18*d8f839f9SJason King */
19*d8f839f9SJason King
20*d8f839f9SJason King #include <stdio.h>
21*d8f839f9SJason King #include <stdlib.h>
22*d8f839f9SJason King #include <string.h>
23*d8f839f9SJason King #include <sys/debug.h>
24*d8f839f9SJason King #include <sys/fs/zfs.h>
25*d8f839f9SJason King #include <libzfs_core.h>
26*d8f839f9SJason King #include <libnvpair.h>
27*d8f839f9SJason King
28*d8f839f9SJason King const char prog[] =
29*d8f839f9SJason King "arg = ... \n"
30*d8f839f9SJason King "fs = arg[\"dataset\"]\n"
31*d8f839f9SJason King "hexkey = arg[\"" ZPOOL_HIDDEN_ARGS "\"][\"key\"]\n"
32*d8f839f9SJason King "err = zfs.sync.change_key(fs, hexkey, 'hex')\n"
33*d8f839f9SJason King "msg = \"changing key on \" .. fs .. \" err=\" .. err\n"
34*d8f839f9SJason King "return msg";
35*d8f839f9SJason King
36*d8f839f9SJason King /*
37*d8f839f9SJason King * Get the pool name from a dataset. This is crude but good enough
38*d8f839f9SJason King * for a test.
39*d8f839f9SJason King */
40*d8f839f9SJason King static char *
get_pool(const char * dataset)41*d8f839f9SJason King get_pool(const char *dataset)
42*d8f839f9SJason King {
43*d8f839f9SJason King char *res = strdup(dataset);
44*d8f839f9SJason King
45*d8f839f9SJason King if (res == NULL)
46*d8f839f9SJason King abort();
47*d8f839f9SJason King
48*d8f839f9SJason King char *p = strchr(res, '/');
49*d8f839f9SJason King
50*d8f839f9SJason King if (p != NULL)
51*d8f839f9SJason King *p = '\0';
52*d8f839f9SJason King
53*d8f839f9SJason King return (res);
54*d8f839f9SJason King }
55*d8f839f9SJason King
56*d8f839f9SJason King int
main(int argc,char * argv[])57*d8f839f9SJason King main(int argc, char *argv[])
58*d8f839f9SJason King {
59*d8f839f9SJason King const char *dataset = argv[1];
60*d8f839f9SJason King const char *key = argv[2];
61*d8f839f9SJason King char *pool = NULL;
62*d8f839f9SJason King nvlist_t *args = fnvlist_alloc();
63*d8f839f9SJason King nvlist_t *hidden_args = fnvlist_alloc();
64*d8f839f9SJason King nvlist_t *result = NULL;
65*d8f839f9SJason King int ret = 0;
66*d8f839f9SJason King
67*d8f839f9SJason King if (argc != 3) {
68*d8f839f9SJason King (void) fprintf(stderr, "Usage: %s dataset key\n", argv[0]);
69*d8f839f9SJason King exit(2);
70*d8f839f9SJason King }
71*d8f839f9SJason King
72*d8f839f9SJason King VERIFY0(libzfs_core_init());
73*d8f839f9SJason King
74*d8f839f9SJason King pool = get_pool(dataset);
75*d8f839f9SJason King
76*d8f839f9SJason King fnvlist_add_string(args, "dataset", dataset);
77*d8f839f9SJason King fnvlist_add_string(hidden_args, "key", key);
78*d8f839f9SJason King fnvlist_add_nvlist(args, ZPOOL_HIDDEN_ARGS, hidden_args);
79*d8f839f9SJason King
80*d8f839f9SJason King ret = lzc_channel_program(pool, prog, ZCP_DEFAULT_INSTRLIMIT,
81*d8f839f9SJason King ZCP_DEFAULT_MEMLIMIT, args, &result);
82*d8f839f9SJason King
83*d8f839f9SJason King (void) printf("lzc_channel_program returned %d", ret);
84*d8f839f9SJason King if (ret != 0)
85*d8f839f9SJason King (void) printf(" (%s)", strerror(ret));
86*d8f839f9SJason King (void) fputc('\n', stdout);
87*d8f839f9SJason King
88*d8f839f9SJason King dump_nvlist(result, 5);
89*d8f839f9SJason King
90*d8f839f9SJason King nvlist_free(args);
91*d8f839f9SJason King nvlist_free(hidden_args);
92*d8f839f9SJason King nvlist_free(result);
93*d8f839f9SJason King free(pool);
94*d8f839f9SJason King
95*d8f839f9SJason King libzfs_core_fini();
96*d8f839f9SJason King
97*d8f839f9SJason King return (ret);
98*d8f839f9SJason King }
99