xref: /dflybsd-src/sbin/hammer2/cmd_volume.c (revision 0b7381572b131c74051832dc251604e7f77b5a54)
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