1*0b738157STomohiro Kusumi /*
2*0b738157STomohiro Kusumi * Copyright (c) 2020 Tomohiro Kusumi <tkusumi@netbsd.org>
3*0b738157STomohiro Kusumi * Copyright (c) 2020 The DragonFly Project
4*0b738157STomohiro Kusumi * All rights reserved.
5*0b738157STomohiro Kusumi *
6*0b738157STomohiro Kusumi * This code is derived from software contributed to The DragonFly Project
7*0b738157STomohiro Kusumi * by Matthew Dillon <dillon@dragonflybsd.org>
8*0b738157STomohiro Kusumi *
9*0b738157STomohiro Kusumi * Redistribution and use in source and binary forms, with or without
10*0b738157STomohiro Kusumi * modification, are permitted provided that the following conditions
11*0b738157STomohiro Kusumi * are met:
12*0b738157STomohiro Kusumi *
13*0b738157STomohiro Kusumi * 1. Redistributions of source code must retain the above copyright
14*0b738157STomohiro Kusumi * notice, this list of conditions and the following disclaimer.
15*0b738157STomohiro Kusumi * 2. Redistributions in binary form must reproduce the above copyright
16*0b738157STomohiro Kusumi * notice, this list of conditions and the following disclaimer in
17*0b738157STomohiro Kusumi * the documentation and/or other materials provided with the
18*0b738157STomohiro Kusumi * distribution.
19*0b738157STomohiro Kusumi * 3. Neither the name of The DragonFly Project nor the names of its
20*0b738157STomohiro Kusumi * contributors may be used to endorse or promote products derived
21*0b738157STomohiro Kusumi * from this software without specific, prior written permission.
22*0b738157STomohiro Kusumi *
23*0b738157STomohiro Kusumi * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
24*0b738157STomohiro Kusumi * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
25*0b738157STomohiro Kusumi * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
26*0b738157STomohiro Kusumi * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
27*0b738157STomohiro Kusumi * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
28*0b738157STomohiro Kusumi * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING,
29*0b738157STomohiro Kusumi * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
30*0b738157STomohiro Kusumi * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
31*0b738157STomohiro Kusumi * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
32*0b738157STomohiro Kusumi * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
33*0b738157STomohiro Kusumi * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
34*0b738157STomohiro Kusumi * SUCH DAMAGE.
35*0b738157STomohiro Kusumi */
36*0b738157STomohiro Kusumi
37*0b738157STomohiro Kusumi #include "hammer2.h"
38*0b738157STomohiro Kusumi
39*0b738157STomohiro Kusumi int
cmd_volume_list(int ac,char ** av)40*0b738157STomohiro Kusumi cmd_volume_list(int ac, char **av)
41*0b738157STomohiro Kusumi {
42*0b738157STomohiro Kusumi hammer2_ioc_volume_list_t vollist;
43*0b738157STomohiro Kusumi hammer2_ioc_volume_t *entry;
44*0b738157STomohiro Kusumi int fd, i, j, n, w, all = 0, ecode = 0;
45*0b738157STomohiro Kusumi
46*0b738157STomohiro Kusumi if (ac == 1 && av[0] == NULL) {
47*0b738157STomohiro Kusumi av = get_hammer2_mounts(&ac);
48*0b738157STomohiro Kusumi all = 1;
49*0b738157STomohiro Kusumi }
50*0b738157STomohiro Kusumi vollist.volumes = calloc(HAMMER2_MAX_VOLUMES, sizeof(*vollist.volumes));
51*0b738157STomohiro Kusumi
52*0b738157STomohiro Kusumi for (i = 0; i < ac; ++i) {
53*0b738157STomohiro Kusumi if (i)
54*0b738157STomohiro Kusumi printf("\n");
55*0b738157STomohiro Kusumi if (ac > 1 || all)
56*0b738157STomohiro Kusumi printf("%s\n", av[i]);
57*0b738157STomohiro Kusumi if ((fd = hammer2_ioctl_handle(av[i])) < 0) {
58*0b738157STomohiro Kusumi ecode = 1;
59*0b738157STomohiro Kusumi goto failed;
60*0b738157STomohiro Kusumi }
61*0b738157STomohiro Kusumi
62*0b738157STomohiro Kusumi vollist.nvolumes = HAMMER2_MAX_VOLUMES;
63*0b738157STomohiro Kusumi if (ioctl(fd, HAMMER2IOC_VOLUME_LIST, &vollist) < 0) {
64*0b738157STomohiro Kusumi perror("ioctl");
65*0b738157STomohiro Kusumi close(fd);
66*0b738157STomohiro Kusumi ecode = 1;
67*0b738157STomohiro Kusumi goto failed;
68*0b738157STomohiro Kusumi }
69*0b738157STomohiro Kusumi
70*0b738157STomohiro Kusumi w = 0;
71*0b738157STomohiro Kusumi for (j = 0; j < vollist.nvolumes; ++j) {
72*0b738157STomohiro Kusumi entry = &vollist.volumes[j];
73*0b738157STomohiro Kusumi n = (int)strlen(entry->path);
74*0b738157STomohiro Kusumi if (n > w)
75*0b738157STomohiro Kusumi w = n;
76*0b738157STomohiro Kusumi }
77*0b738157STomohiro Kusumi
78*0b738157STomohiro Kusumi if (QuietOpt > 0) {
79*0b738157STomohiro Kusumi for (j = 0; j < vollist.nvolumes; ++j) {
80*0b738157STomohiro Kusumi entry = &vollist.volumes[j];
81*0b738157STomohiro Kusumi printf("%s\n", entry->path);
82*0b738157STomohiro Kusumi }
83*0b738157STomohiro Kusumi } else {
84*0b738157STomohiro Kusumi printf("version %d\n", vollist.version);
85*0b738157STomohiro Kusumi printf("@%s\n", vollist.pfs_name);
86*0b738157STomohiro Kusumi for (j = 0; j < vollist.nvolumes; ++j) {
87*0b738157STomohiro Kusumi entry = &vollist.volumes[j];
88*0b738157STomohiro Kusumi printf("volume%-2d %-*.*s %s",
89*0b738157STomohiro Kusumi entry->id, w, w, entry->path,
90*0b738157STomohiro Kusumi sizetostr(entry->size));
91*0b738157STomohiro Kusumi if (VerboseOpt > 0)
92*0b738157STomohiro Kusumi printf(" 0x%016jx 0x%016jx",
93*0b738157STomohiro Kusumi (intmax_t)entry->offset,
94*0b738157STomohiro Kusumi (intmax_t)entry->size);
95*0b738157STomohiro Kusumi printf("\n");
96*0b738157STomohiro Kusumi }
97*0b738157STomohiro Kusumi }
98*0b738157STomohiro Kusumi close(fd);
99*0b738157STomohiro Kusumi }
100*0b738157STomohiro Kusumi failed:
101*0b738157STomohiro Kusumi free(vollist.volumes);
102*0b738157STomohiro Kusumi if (all)
103*0b738157STomohiro Kusumi put_hammer2_mounts(ac, av);
104*0b738157STomohiro Kusumi
105*0b738157STomohiro Kusumi return (ecode);
106*0b738157STomohiro Kusumi }
107