Skip to content
Permalink
Browse files

Add option [-V|--version] to emit version string

Closes #2501

Signed-off-by: TerraTech <1118433+TerraTech@users.noreply.github.com>
  • Loading branch information...
TerraTech committed Apr 10, 2019
1 parent 83472fa commit f48b81117f4c1750998dcec75daf1c2f511458a7
Showing with 156 additions and 3 deletions.
  1. +24 −0 cmd/zfs/zfs_main.c
  2. +26 −1 cmd/zpool/zpool_main.c
  3. +7 −0 include/libzfs.h
  4. +65 −0 lib/libzfs/libzfs_util.c
  5. +17 −1 man/man8/zfs.8
  6. +17 −1 man/man8/zpool.8
@@ -117,6 +117,7 @@ static int zfs_do_load_key(int argc, char **argv);
static int zfs_do_unload_key(int argc, char **argv);
static int zfs_do_change_key(int argc, char **argv);
static int zfs_do_project(int argc, char **argv);
static int zfs_do_version(int argc, char **argv);

/*
* Enable a reasonable set of defaults for libumem debugging on DEBUG builds.
@@ -171,6 +172,7 @@ typedef enum {
HELP_LOAD_KEY,
HELP_UNLOAD_KEY,
HELP_CHANGE_KEY,
HELP_VERSION
} zfs_help_t;

typedef struct zfs_command {
@@ -189,6 +191,8 @@ typedef struct zfs_command {
* the generic usage message.
*/
static zfs_command_t command_table[] = {
{ "version", zfs_do_version, HELP_VERSION },
{ NULL },
{ "create", zfs_do_create, HELP_CREATE },
{ "destroy", zfs_do_destroy, HELP_DESTROY },
{ NULL },
@@ -379,6 +383,8 @@ get_usage(zfs_help_t idx)
"\t [-o keylocation=<value>] [-o pbkfd2iters=<value>]\n"
"\t <filesystem|volume>\n"
"\tchange-key -i [-l] <filesystem|volume>\n"));
case HELP_VERSION:
return (gettext("\tversion\n"));
}

abort();
@@ -8059,6 +8065,18 @@ zfs_do_project(int argc, char **argv)
return (ret);
}

/*
* Display version message
*/
static int
zfs_do_version(int argc, char **argv)
{
if (zfs_version_print() == -1)
return (1);

return (0);
}

int
main(int argc, char **argv)
{
@@ -8114,6 +8132,12 @@ main(int argc, char **argv)
(strcmp(cmdname, "--help") == 0))
usage(B_TRUE);

/*
* Special case '-V|--version'
*/
if ((strcmp(cmdname, "-V") == 0) || (strcmp(cmdname, "--version") == 0))
return (zfs_do_version(argc, argv));

if ((g_zfs = libzfs_init()) == NULL) {
(void) fprintf(stderr, "%s", libzfs_error_init(errno));
return (1);
@@ -115,6 +115,8 @@ static int zpool_do_set(int, char **);

static int zpool_do_sync(int, char **);

static int zpool_do_version(int, char **);

/*
* These libumem hooks provide a reasonable set of defaults for the allocator's
* debugging facilities.
@@ -164,7 +166,8 @@ typedef enum {
HELP_SPLIT,
HELP_SYNC,
HELP_REGUID,
HELP_REOPEN
HELP_REOPEN,
HELP_VERSION
} zpool_help_t;


@@ -263,6 +266,8 @@ typedef struct zpool_command {
* the generic usage message.
*/
static zpool_command_t command_table[] = {
{ "version", zpool_do_version, HELP_VERSION },
{ NULL },
{ "create", zpool_do_create, HELP_CREATE },
{ "destroy", zpool_do_destroy, HELP_DESTROY },
{ NULL },
@@ -404,6 +409,8 @@ get_usage(zpool_help_t idx)
return (gettext("\treguid <pool>\n"));
case HELP_SYNC:
return (gettext("\tsync [pool] ...\n"));
case HELP_VERSION:
return (gettext("\tversion\n"));
}

abort();
@@ -9222,6 +9229,18 @@ find_command_idx(char *command, int *idx)
return (1);
}

/*
* Display version message
*/
static int
zpool_do_version(int argc, char **argv)
{
if (zfs_version_print() == -1)
return (1);

return (0);
}

int
main(int argc, char **argv)
{
@@ -9252,6 +9271,12 @@ main(int argc, char **argv)
if ((strcmp(cmdname, "-?") == 0) || strcmp(cmdname, "--help") == 0)
usage(B_TRUE);

/*
* Special case '-V|--version'
*/
if ((strcmp(cmdname, "-V") == 0) || (strcmp(cmdname, "--version") == 0))
return (zpool_do_version(argc, argv));

if ((g_zfs = libzfs_init()) == NULL) {
(void) fprintf(stderr, "%s", libzfs_error_init(errno));
return (1);
@@ -815,6 +815,13 @@ void libzfs_free_str_array(char **strs, int count);

int libzfs_envvar_is_set(char *envvar);

/*
* Utility functions for zfs version
*/
extern void zfs_version_userland(char *, int);
extern int zfs_version_kernel(char *, int);
extern int zfs_version_print(void);

/*
* Given a device or file, determine if it is part of a pool.
*/
@@ -54,6 +54,8 @@
#include "zfeature_common.h"
#include <zfs_fletcher.h>
#include <libzutil.h>
#include <sys/zfs_sysfs.h>
#include "zfs_gitrev.h"

int
libzfs_errno(libzfs_handle_t *hdl)
@@ -1940,3 +1942,66 @@ zprop_iter(zprop_func func, void *cb, boolean_t show_all, boolean_t ordered,
{
return (zprop_iter_common(func, cb, show_all, ordered, type));
}

/*
* Fill given version buffer with zfs userland version
*/
void
zfs_version_userland(char *version, int len)
{
(void) strlcpy(version, ZFS_META_GITREV, len);
}

/*
* Fill given version buffer with zfs kernel version read from ZFS_SYSFS_DIR
* Returns 0 on success, and -1 on error (with errno set)
*/
int
zfs_version_kernel(char *version, int len)
{
int _errno;
int fd;
int rlen;

if ((fd = open(ZFS_SYSFS_DIR "/version", O_RDONLY)) == -1)
return (-1);

if ((rlen = read(fd, version, len)) == -1) {
version[0] = '\0';
_errno = errno;
(void) close(fd);
errno = _errno;
return (-1);
}

version[rlen-1] = '\0'; /* discard '\n' */

if (close(fd) == -1)
return (-1);

return (0);
}

/*
* Prints both zfs userland and kernel versions
* Returns 0 on success, and -1 on error (with errno set)
*/
int
zfs_version_print(void)
{
char zver_userland[128];
char zver_kernel[128];

if (zfs_version_kernel(zver_kernel, sizeof (zver_kernel)) == -1) {
fprintf(stderr, "zfs_version_kernel() failed: %s\n",
strerror(errno));
return (-1);
}

zfs_version_userland(zver_userland, sizeof (zver_userland));

(void) printf("%s\n", zver_userland);
(void) printf("zfs-kmod-%s\n", zver_kernel);

return (0);
}
@@ -38,7 +38,7 @@
.Nd configures ZFS file systems
.Sh SYNOPSIS
.Nm
.Fl ?
.Fl ?V
.Nm
.Cm create
.Op Fl p
@@ -327,6 +327,8 @@
.Fl i
.Op Fl l
.Ar filesystem
.Nm
.Cm version
.Sh DESCRIPTION
The
.Nm
@@ -2453,6 +2455,13 @@ original form.
Displays a help message.
.It Xo
.Nm
.Fl V, -version
.Xc
An alias for the
.Nm zfs Cm version
subcommand.
.It Xo
.Nm
.Cm create
.Op Fl p
.Oo Fl o Ar property Ns = Ns Ar value Oc Ns ...
@@ -4622,6 +4631,13 @@ Indicates that zfs should make
inherit the key of its parent. Note that this command can only be run on an
encryption root that has an encrypted parent.
.El
.It Xo
.Nm
.Cm version
.Xc
Displays the software version of the
.Nm
userland utility and the zfs kernel module.
.El
.Sh EXIT STATUS
The
@@ -35,7 +35,7 @@
.Nd configure ZFS storage pools
.Sh SYNOPSIS
.Nm
.Fl ?
.Fl ?V
.Nm
.Cm add
.Op Fl fgLnP
@@ -210,6 +210,8 @@
.Cm upgrade
.Op Fl V Ar version
.Fl a Ns | Ns Ar pool Ns ...
.Nm
.Cm version
.Sh DESCRIPTION
The
.Nm
@@ -933,6 +935,13 @@ The following subcommands are supported:
Displays a help message.
.It Xo
.Nm
.Fl V, -version
.Xc
An alias for the
.Nm zpool Cm version
subcommand.
.It Xo
.Nm
.Cm add
.Op Fl fgLnP
.Oo Fl o Ar property Ns = Ns Ar value Oc
@@ -2465,6 +2474,13 @@ flag is specified, no features will be enabled on the pool.
This option can only be used to increase the version number up to the last
supported legacy version number.
.El
.It Xo
.Nm
.Cm version
.Xc
Displays the software version of the
.Nm
userland utility and the zfs kernel module.
.El
.Sh EXIT STATUS
The following exit values are returned:

0 comments on commit f48b811

Please sign in to comment.
You can’t perform that action at this time.