bectl(8): Move dataset printing out into its own function

This may later get reused for printing snapshot and/or origin snapshot
information.
This commit is contained in:
Kyle Evans 2018-08-03 01:46:46 +00:00
parent 513044c181
commit 970fd6543a
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/projects/bectl/; revision=337225

View File

@ -43,12 +43,19 @@
#include <be.h>
#define HEADER_BE "BE"
#define HEADER_BE "BE"
#define HEADER_ACTIVE "Active"
#define HEADER_MOUNT "Mountpoint"
#define HEADER_SPACE "Space"
#define HEADER_CREATED "Created"
struct printc {
int be_colsz;
int active_colsz_def;
int mount_colsz;
int space_colsz;
};
static int bectl_cmd_activate(int argc, char *argv[]);
static int bectl_cmd_create(int argc, char *argv[]);
static int bectl_cmd_destroy(int argc, char *argv[]);
@ -56,6 +63,7 @@ static int bectl_cmd_export(int argc, char *argv[]);
static int bectl_cmd_import(int argc, char *argv[]);
static int bectl_cmd_add(int argc, char *argv[]);
static int bectl_cmd_jail(int argc, char *argv[]);
static void print_dataset(nvpair_t *cur, struct printc *pc);
static int bectl_cmd_list(int argc, char *argv[]);
static int bectl_cmd_mount(int argc, char *argv[]);
static int bectl_cmd_rename(int argc, char *argv[]);
@ -410,18 +418,74 @@ bectl_cmd_jail(int argc, char *argv[])
return (0);
}
static void
print_dataset(nvpair_t *cur, struct printc *pc)
{
#define BUFSZ 64
char buf[BUFSZ];
unsigned long long ctimenum, space;
nvlist_t *dsprops;
char *creation, *mnt, *name, *spacestr;
int active_colsz;
boolean_t active_now, active_reboot;
name = nvpair_name(cur);
/* XXX TODO: Some views show snapshots */
if (strchr(name, '@') != NULL)
return;
printf("%*s ", pc->be_colsz, name);
active_colsz = pc->active_colsz_def;
nvpair_value_nvlist(cur, &dsprops);
if (nvlist_lookup_boolean_value(dsprops, "active",
&active_now) == 0 && active_now) {
printf("N");
active_colsz--;
}
if (nvlist_lookup_boolean_value(dsprops, "nextboot",
&active_reboot) == 0 && active_reboot) {
printf("R");
active_colsz--;
}
if (active_colsz == pc->active_colsz_def) {
printf("-");
active_colsz--;
}
printf("%*s ", -active_colsz, " ");
if (nvlist_lookup_string(dsprops, "mountpoint", &mnt) == 0)
printf("%*s ", pc->mount_colsz, mnt);
else
printf("%*s ", pc->mount_colsz, "-");
if (nvlist_lookup_string(dsprops, "used", &spacestr) == 0) {
space = strtoull(spacestr, NULL, 10);
/* Alas, there's more to it,. */
humanize_number(buf, 6, space, "", HN_AUTOSCALE,
HN_DECIMAL | HN_NOSPACE | HN_B);
printf("%*s ", pc->space_colsz, buf);
} else
printf("%*s ", pc->space_colsz, "-");
if (nvlist_lookup_string(dsprops, "creation", &creation) == 0) {
ctimenum = strtoull(creation, NULL, 10);
strftime(buf, BUFSZ, "%Y-%m-%d %H:%M",
localtime((time_t *)&ctimenum));
printf("%s", buf);
}
printf("\n");
#undef BUFSZ
}
static int
bectl_cmd_list(int argc, char *argv[])
{
#define BUFSZ 64
struct printc pc;
nvpair_t *cur;
nvlist_t *props, *dsprops;
unsigned long long ctimenum, space;
nvlist_t *props;
size_t be_maxcol;
int active_colsz, active_colsz_def, be_colsz, mount_colsz, opt, space_colsz;
char buf[BUFSZ], *creation, *mnt, *spacestr;
boolean_t active_now, active_reboot;
int opt;
bool show_all_datasets, show_space, hide_headers, show_snaps;
props = NULL;
@ -470,62 +534,20 @@ bectl_cmd_list(int argc, char *argv[])
be_maxcol = MAX(be_maxcol, strlen(nvpair_name(cur)));
}
be_colsz = -be_maxcol;
pc.be_colsz = -be_maxcol;
/* To be made negative after calculating final col sz */
active_colsz_def = strlen(HEADER_ACTIVE);
mount_colsz = -(int)strlen(HEADER_MOUNT);
space_colsz = -(int)strlen(HEADER_SPACE);
printf("%*s %s %s %s %s\n", be_colsz, HEADER_BE, HEADER_ACTIVE,
pc.active_colsz_def = strlen(HEADER_ACTIVE);
pc.mount_colsz = -(int)strlen(HEADER_MOUNT);
pc.space_colsz = -(int)strlen(HEADER_SPACE);
printf("%*s %s %s %s %s\n", pc.be_colsz, HEADER_BE, HEADER_ACTIVE,
HEADER_MOUNT, HEADER_SPACE, HEADER_CREATED);
buf[5] = '\0';
cur = NULL;
for (cur = nvlist_next_nvpair(props, NULL); cur != NULL;
cur = nvlist_next_nvpair(props, cur)) {
printf("%*s ", be_colsz, nvpair_name(cur));
// NR
active_colsz = active_colsz_def;
nvpair_value_nvlist(cur, &dsprops);
if (nvlist_lookup_boolean_value(dsprops, "active",
&active_now) == 0 && active_now) {
printf("N");
active_colsz--;
}
if (nvlist_lookup_boolean_value(dsprops, "nextboot",
&active_reboot) == 0 && active_reboot) {
printf("R");
active_colsz--;
}
if (active_colsz == active_colsz_def) {
printf("-");
active_colsz--;
}
printf("%*s ", -active_colsz, " ");
if (nvlist_lookup_string(dsprops, "mountpoint", &mnt) == 0)
printf("%*s ", mount_colsz, mnt);
else
printf("%*s ", mount_colsz, "-");
// used
if (nvlist_lookup_string(dsprops, "used", &spacestr) == 0) {
space = strtoull(spacestr, NULL, 10);
humanize_number(buf, 6, space, "", HN_AUTOSCALE,
HN_DECIMAL | HN_NOSPACE | HN_B);
printf("%*s ", space_colsz, buf);
} else
printf("%*s ", space_colsz, "-");
if (nvlist_lookup_string(dsprops, "creation", &creation) == 0) {
ctimenum = strtoull(creation, NULL, 10);
strftime(buf, BUFSZ, "%Y-%m-%d %H:%M",
localtime((time_t *)&ctimenum));
printf("%s", buf);
}
printf("\n");
print_dataset(cur, &pc);
}
be_prop_list_free(props);
return (0);
#undef BUFSZ
}