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