blob: 8e50ec14c8fd1fa46927c3eaaa74e5006a48790b [file] [log] [blame]
// SPDX-License-Identifier: GPL-2.0
/*
* Copyright (c) 2023 Oracle.
* All Rights Reserved.
*/
#include "libxfs.h"
#include "command.h"
#include "init.h"
#include "io.h"
#include "libfrog/fsgeom.h"
#include "libfrog/logging.h"
static cmdinfo_t fsuuid_cmd;
static cmdinfo_t sysfspath_cmd;
static int
fsuuid_f(
int argc,
char **argv)
{
struct xfs_fsop_geom fsgeo;
int ret;
char bp[40];
ret = -xfrog_geometry(file->fd, &fsgeo);
if (ret) {
xfrog_perror(ret, "XFS_IOC_FSGEOMETRY");
exitcode = 1;
} else {
platform_uuid_unparse((uuid_t *)fsgeo.uuid, bp);
printf("UUID = %s\n", bp);
}
return 0;
}
#ifndef FS_IOC_GETFSSYSFSPATH
struct fs_sysfs_path {
__u8 len;
__u8 name[128];
};
#define FS_IOC_GETFSSYSFSPATH _IOR(0x15, 1, struct fs_sysfs_path)
#endif
static void
sysfspath_help(void)
{
printf(_(
"\n"
" print the sysfs path for the open file\n"
"\n"
" Prints the path in sysfs where one might find information about the\n"
" filesystem backing the open files. The path is not required to exist.\n"
" -d -- return the path in debugfs, if any\n"
"\n"));
}
static int
sysfspath_f(
int argc,
char **argv)
{
struct fs_sysfs_path path;
bool debugfs = false;
int c;
int ret;
while ((c = getopt(argc, argv, "d")) != EOF) {
switch (c) {
case 'd':
debugfs = true;
break;
default:
exitcode = 1;
return command_usage(&sysfspath_cmd);
}
}
ret = ioctl(file->fd, FS_IOC_GETFSSYSFSPATH, &path);
if (ret) {
xfrog_perror(ret, "FS_IOC_GETSYSFSPATH");
exitcode = 1;
return 0;
}
if (debugfs)
printf("/sys/kernel/debug/%.*s\n", path.len, path.name);
else
printf("/sys/fs/%.*s\n", path.len, path.name);
return 0;
}
void
fsuuid_init(void)
{
fsuuid_cmd.name = "fsuuid";
fsuuid_cmd.cfunc = fsuuid_f;
fsuuid_cmd.argmin = 0;
fsuuid_cmd.argmax = 0;
fsuuid_cmd.flags = CMD_FLAG_ONESHOT | CMD_NOMAP_OK;
fsuuid_cmd.oneline = _("get mounted filesystem UUID");
add_command(&fsuuid_cmd);
sysfspath_cmd.name = "sysfspath";
sysfspath_cmd.cfunc = sysfspath_f;
sysfspath_cmd.argmin = 0;
sysfspath_cmd.argmax = -1;
sysfspath_cmd.args = _("-d");
sysfspath_cmd.flags = CMD_NOMAP_OK | CMD_FLAG_FOREIGN_OK;
sysfspath_cmd.oneline = _("get mounted filesystem sysfs path");
sysfspath_cmd.help = sysfspath_help;
add_command(&sysfspath_cmd);
}