xref: /freebsd-src/sys/contrib/openzfs/cmd/zfs_ids_to_path.c (revision 716fd348e01c5f2ba125f878a634a753436c2994)
1*716fd348SMartin Matuska /*
2*716fd348SMartin Matuska  * CDDL HEADER START
3*716fd348SMartin Matuska  *
4*716fd348SMartin Matuska  * The contents of this file are subject to the terms of the
5*716fd348SMartin Matuska  * Common Development and Distribution License (the "License").
6*716fd348SMartin Matuska  * You may not use this file except in compliance with the License.
7*716fd348SMartin Matuska  *
8*716fd348SMartin Matuska  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*716fd348SMartin Matuska  * or http://www.opensolaris.org/os/licensing.
10*716fd348SMartin Matuska  * See the License for the specific language governing permissions
11*716fd348SMartin Matuska  * and limitations under the License.
12*716fd348SMartin Matuska  *
13*716fd348SMartin Matuska  * When distributing Covered Code, include this CDDL HEADER in each
14*716fd348SMartin Matuska  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*716fd348SMartin Matuska  * If applicable, add the following below this CDDL HEADER, with the
16*716fd348SMartin Matuska  * fields enclosed by brackets "[]" replaced with your own identifying
17*716fd348SMartin Matuska  * information: Portions Copyright [yyyy] [name of copyright owner]
18*716fd348SMartin Matuska  *
19*716fd348SMartin Matuska  * CDDL HEADER END
20*716fd348SMartin Matuska  */
21*716fd348SMartin Matuska /*
22*716fd348SMartin Matuska  * Copyright (c) 2019 by Delphix. All rights reserved.
23*716fd348SMartin Matuska  */
24*716fd348SMartin Matuska #include <libintl.h>
25*716fd348SMartin Matuska #include <unistd.h>
26*716fd348SMartin Matuska #include <sys/types.h>
27*716fd348SMartin Matuska #include <stdint.h>
28*716fd348SMartin Matuska #include <libzfs.h>
29*716fd348SMartin Matuska #include <stdio.h>
30*716fd348SMartin Matuska #include <stdlib.h>
31*716fd348SMartin Matuska #include <errno.h>
32*716fd348SMartin Matuska 
33*716fd348SMartin Matuska libzfs_handle_t *g_zfs;
34*716fd348SMartin Matuska 
35*716fd348SMartin Matuska static void
36*716fd348SMartin Matuska usage(int err)
37*716fd348SMartin Matuska {
38*716fd348SMartin Matuska 	fprintf(stderr, "Usage: zfs_ids_to_path [-v] <pool> <objset id> "
39*716fd348SMartin Matuska 	    "<object id>\n");
40*716fd348SMartin Matuska 	exit(err);
41*716fd348SMartin Matuska }
42*716fd348SMartin Matuska 
43*716fd348SMartin Matuska int
44*716fd348SMartin Matuska main(int argc, char **argv)
45*716fd348SMartin Matuska {
46*716fd348SMartin Matuska 	boolean_t verbose = B_FALSE;
47*716fd348SMartin Matuska 	int c;
48*716fd348SMartin Matuska 	while ((c = getopt(argc, argv, "v")) != -1) {
49*716fd348SMartin Matuska 		switch (c) {
50*716fd348SMartin Matuska 		case 'v':
51*716fd348SMartin Matuska 			verbose = B_TRUE;
52*716fd348SMartin Matuska 			break;
53*716fd348SMartin Matuska 		}
54*716fd348SMartin Matuska 	}
55*716fd348SMartin Matuska 	argc -= optind;
56*716fd348SMartin Matuska 	argv += optind;
57*716fd348SMartin Matuska 
58*716fd348SMartin Matuska 	if (argc != 3) {
59*716fd348SMartin Matuska 		(void) fprintf(stderr, "Incorrect number of arguments: %d\n",
60*716fd348SMartin Matuska 		    argc);
61*716fd348SMartin Matuska 		usage(1);
62*716fd348SMartin Matuska 	}
63*716fd348SMartin Matuska 
64*716fd348SMartin Matuska 	uint64_t objset, object;
65*716fd348SMartin Matuska 	if (sscanf(argv[1], "%llu", (u_longlong_t *)&objset) != 1) {
66*716fd348SMartin Matuska 		(void) fprintf(stderr, "Invalid objset id: %s\n", argv[1]);
67*716fd348SMartin Matuska 		usage(2);
68*716fd348SMartin Matuska 	}
69*716fd348SMartin Matuska 	if (sscanf(argv[2], "%llu", (u_longlong_t *)&object) != 1) {
70*716fd348SMartin Matuska 		(void) fprintf(stderr, "Invalid object id: %s\n", argv[2]);
71*716fd348SMartin Matuska 		usage(3);
72*716fd348SMartin Matuska 	}
73*716fd348SMartin Matuska 	if ((g_zfs = libzfs_init()) == NULL) {
74*716fd348SMartin Matuska 		(void) fprintf(stderr, "%s\n", libzfs_error_init(errno));
75*716fd348SMartin Matuska 		return (4);
76*716fd348SMartin Matuska 	}
77*716fd348SMartin Matuska 	zpool_handle_t *pool = zpool_open(g_zfs, argv[0]);
78*716fd348SMartin Matuska 	if (pool == NULL) {
79*716fd348SMartin Matuska 		fprintf(stderr, "Could not open pool %s\n", argv[0]);
80*716fd348SMartin Matuska 		libzfs_fini(g_zfs);
81*716fd348SMartin Matuska 		return (5);
82*716fd348SMartin Matuska 	}
83*716fd348SMartin Matuska 
84*716fd348SMartin Matuska 	char pathname[PATH_MAX * 2];
85*716fd348SMartin Matuska 	if (verbose) {
86*716fd348SMartin Matuska 		zpool_obj_to_path_ds(pool, objset, object, pathname,
87*716fd348SMartin Matuska 		    sizeof (pathname));
88*716fd348SMartin Matuska 	} else {
89*716fd348SMartin Matuska 		zpool_obj_to_path(pool, objset, object, pathname,
90*716fd348SMartin Matuska 		    sizeof (pathname));
91*716fd348SMartin Matuska 	}
92*716fd348SMartin Matuska 	printf("%s\n", pathname);
93*716fd348SMartin Matuska 	zpool_close(pool);
94*716fd348SMartin Matuska 	libzfs_fini(g_zfs);
95*716fd348SMartin Matuska 	return (0);
96*716fd348SMartin Matuska }
97