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