From nobody Sat Feb 7 05:53:40 2026 Delivered-To: importer@patchew.org Received-SPF: none (zohomail.com: 192.237.175.120 is neither permitted nor denied by domain of lists.xenproject.org) client-ip=192.237.175.120; envelope-from=xen-devel-bounces@lists.xenproject.org; helo=lists.xenproject.org; Authentication-Results: mx.zohomail.com; spf=none (zohomail.com: 192.237.175.120 is neither permitted nor denied by domain of lists.xenproject.org) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org Return-Path: Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) by mx.zohomail.com with SMTPS id 1580897551031248.05727571618604; Wed, 5 Feb 2020 02:12:31 -0800 (PST) Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1izHf4-0003KO-5p; Wed, 05 Feb 2020 10:11:58 +0000 Received: from us1-rack-iad1.inumbo.com ([172.99.69.81]) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1izHf2-0003Js-TO for xen-devel@lists.xenproject.org; Wed, 05 Feb 2020 10:11:56 +0000 Received: from mx2.suse.de (unknown [195.135.220.15]) by us1-rack-iad1.inumbo.com (Halon) with ESMTPS id eac1aade-47ff-11ea-ad98-bc764e2007e4; Wed, 05 Feb 2020 10:11:47 +0000 (UTC) Received: from relay2.suse.de (unknown [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 888BAB019; Wed, 5 Feb 2020 10:11:45 +0000 (UTC) X-Inumbo-ID: eac1aade-47ff-11ea-ad98-bc764e2007e4 X-Virus-Scanned: by amavisd-new at test-mx.suse.de From: Juergen Gross To: xen-devel@lists.xenproject.org Date: Wed, 5 Feb 2020 11:11:38 +0100 Message-Id: <20200205101141.24769-6-jgross@suse.com> X-Mailer: git-send-email 2.16.4 In-Reply-To: <20200205101141.24769-1-jgross@suse.com> References: <20200205101141.24769-1-jgross@suse.com> Subject: [Xen-devel] [PATCH v4 5/8] tools: add xenfs tool X-BeenThere: xen-devel@lists.xenproject.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Cc: Juergen Gross , Stefano Stabellini , Julien Grall , Wei Liu , Konrad Rzeszutek Wilk , George Dunlap , Andrew Cooper , Ian Jackson , Jan Beulich MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Errors-To: xen-devel-bounces@lists.xenproject.org Sender: "Xen-devel" Add the xenfs tool for accessing the hypervisor filesystem. Signed-off-by: Juergen Gross Acked-by: Wei Liu --- V1: - rename to xenhypfs - don't use "--" for subcommands - add write support V2: - escape non-printable characters per default with cat subcommand (Ian Jackson) - add -b option to cat subcommand (Ian Jackson) - add man page V3: - adapt to new hypfs interface --- .gitignore | 1 + docs/man/xenhypfs.1.pod | 61 ++++++++++++++++ tools/misc/Makefile | 6 ++ tools/misc/xenhypfs.c | 189 ++++++++++++++++++++++++++++++++++++++++++++= ++++ 4 files changed, 257 insertions(+) create mode 100644 docs/man/xenhypfs.1.pod create mode 100644 tools/misc/xenhypfs.c diff --git a/.gitignore b/.gitignore index e98c3f056d..fd5610718d 100644 --- a/.gitignore +++ b/.gitignore @@ -367,6 +367,7 @@ tools/libxl/test_timedereg tools/libxl/test_fdderegrace tools/firmware/etherboot/eb-roms.h tools/firmware/etherboot/gpxe-git-snapshot.tar.gz +tools/misc/xenhypfs tools/misc/xenwatchdogd tools/misc/xen-hvmcrash tools/misc/xen-lowmemd diff --git a/docs/man/xenhypfs.1.pod b/docs/man/xenhypfs.1.pod new file mode 100644 index 0000000000..37aa488fcc --- /dev/null +++ b/docs/man/xenhypfs.1.pod @@ -0,0 +1,61 @@ +=3Dhead1 NAME + +xenhypfs - Xen tool to access Xen hypervisor file system + +=3Dhead1 SYNOPSIS + +B I [I] [I] + +=3Dhead1 DESCRIPTION + +The B program is used to access the Xen hypervisor file system. +It can be used to show the available entries, to show their contents and +(if allowed) to modify their contents. + +=3Dhead1 SUBCOMMANDS + +=3Dover 4 + +=3Ditem B I + +List the available entries below I. + +=3Ditem B [I<-b>] I + +Show the contents of the entry specified by I. Non-printable charact= ers +other than white space characters (like tab, new line) will be shown as +B<\xnn> (B being a two digit hex number) unless the option B<-b> is +specified. + +=3Ditem B I I + +Set the contents of the entry specified by I to I. + +=3Ditem B + +Show all the entries of the file system as a tree. + +=3Dback + +=3Dhead1 RETURN CODES + +=3Dover 4 + +=3Ditem B<0> + +Success + +=3Ditem B<1> + +Invalid usage (e.g. unknown subcommand, unknown option, missing parameter). + +=3Ditem B<2> + +Entry not found while traversing the tree. + +=3Ditem B<3> + +Access right violation. + +=3Dback + diff --git a/tools/misc/Makefile b/tools/misc/Makefile index 63947bfadc..9fdb13597f 100644 --- a/tools/misc/Makefile +++ b/tools/misc/Makefile @@ -24,6 +24,7 @@ INSTALL_SBIN-$(CONFIG_X86) +=3D xen-lowmemd INSTALL_SBIN-$(CONFIG_X86) +=3D xen-mfndump INSTALL_SBIN-$(CONFIG_X86) +=3D xen-ucode INSTALL_SBIN +=3D xencov +INSTALL_SBIN +=3D xenhypfs INSTALL_SBIN +=3D xenlockprof INSTALL_SBIN +=3D xenperf INSTALL_SBIN +=3D xenpm @@ -86,6 +87,9 @@ xenperf: xenperf.o xenpm: xenpm.o $(CC) $(LDFLAGS) -o $@ $< $(LDLIBS_libxenctrl) $(APPEND_LDFLAGS) =20 +xenhypfs: xenhypfs.o + $(CC) $(LDFLAGS) -o $@ $< $(LDLIBS_libxenhypfs) $(APPEND_LDFLAGS) + xenlockprof: xenlockprof.o $(CC) $(LDFLAGS) -o $@ $< $(LDLIBS_libxenctrl) $(APPEND_LDFLAGS) =20 @@ -94,6 +98,8 @@ xen-hptool.o: CFLAGS +=3D -I$(XEN_ROOT)/tools/libxc $(CFL= AGS_libxencall) xen-hptool: xen-hptool.o $(CC) $(LDFLAGS) -o $@ $< $(LDLIBS_libxenevtchn) $(LDLIBS_libxenctrl) $(L= DLIBS_libxenguest) $(LDLIBS_libxenstore) $(APPEND_LDFLAGS) =20 +xenhypfs.o: CFLAGS +=3D $(CFLAGS_libxenhypfs) + # xen-mfndump incorrectly uses libxc internals xen-mfndump.o: CFLAGS +=3D -I$(XEN_ROOT)/tools/libxc $(CFLAGS_libxencall) xen-mfndump: xen-mfndump.o diff --git a/tools/misc/xenhypfs.c b/tools/misc/xenhypfs.c new file mode 100644 index 0000000000..0b834bf4fa --- /dev/null +++ b/tools/misc/xenhypfs.c @@ -0,0 +1,189 @@ +#define _GNU_SOURCE +#include +#include +#include +#include +#include + +static struct xenhypfs_handle *hdl; + +static int usage(void) +{ + fprintf(stderr, "usage: xenhypfs ls \n"); + fprintf(stderr, " xenhypfs cat [-b] \n"); + fprintf(stderr, " xenhypfs write \n"); + fprintf(stderr, " xenhypfs tree\n"); + + return 1; +} + +static void xenhypfs_print_escaped(char *string) +{ + char *c; + + for (c =3D string; *c; c++) { + if (isgraph(*c) || isspace(*c)) + printf("%c", *c); + else + printf("\\x%02x", *c); + } + printf("\n"); +} + +static int xenhypfs_cat(int argc, char *argv[]) +{ + int ret =3D 0; + char *result; + char *path; + bool bin =3D false; + + switch (argc) { + case 1: + path =3D argv[0]; + break; + + case 2: + if (strcmp(argv[0], "-b")) + return usage(); + bin =3D true; + path =3D argv[1]; + break; + + default: + return usage(); + } + + result =3D xenhypfs_read(hdl, path); + if (!result) { + perror("could not read"); + ret =3D 3; + } else { + if (!bin) + printf("%s\n", result); + else + xenhypfs_print_escaped(result); + free(result); + } + + return ret; +} + +static int xenhypfs_wr(char *path, char *val) +{ + int ret; + + ret =3D xenhypfs_write(hdl, path, val); + if (ret) { + perror("could not write"); + ret =3D 3; + } + + return ret; +} + +static char *xenhypfs_type(struct xenhypfs_dirent *ent) +{ + char *res; + + switch (ent->type) { + case xenhypfs_type_dir: + res =3D " "; + break; + case xenhypfs_type_blob: + res =3D " "; + break; + case xenhypfs_type_string: + res =3D ""; + break; + case xenhypfs_type_uint: + res =3D " "; + break; + case xenhypfs_type_int: + res =3D " "; + break; + default: + res =3D "<\?\?\?> "; + break; + } + + return res; +} + +static int xenhypfs_ls(char *path) +{ + struct xenhypfs_dirent *ent; + unsigned int n, i; + int ret =3D 0; + + ent =3D xenhypfs_readdir(hdl, path, &n); + if (!ent) { + perror("could not read dir"); + ret =3D 3; + } else { + for (i =3D 0; i < n; i++) + printf("%s r%c %s\n", xenhypfs_type(ent + i), + ent[i].is_writable ? 'w' : '-', ent[i].name); + + free(ent); + } + + return ret; +} + +static int xenhypfs_tree_sub(char *path, unsigned int depth) +{ + struct xenhypfs_dirent *ent; + unsigned int n, i; + int ret =3D 0; + char *p; + + ent =3D xenhypfs_readdir(hdl, path, &n); + if (!ent) + return 2; + + for (i =3D 0; i < n; i++) { + printf("%*s%s%s\n", depth * 2, "", ent[i].name, + ent[i].type =3D=3D xenhypfs_type_dir ? "/" : ""); + if (ent[i].type =3D=3D xenhypfs_type_dir) { + asprintf(&p, "%s%s%s", path, (depth =3D=3D 1) ? "" : "/", ent[= i].name); + if (xenhypfs_tree_sub(p, depth + 1)) + ret =3D 2; + } + } + + free(ent); + + return ret; +} + +static int xenhypfs_tree(void) +{ + printf("/\n"); + + return xenhypfs_tree_sub("/", 1); +} + +int main(int argc, char *argv[]) +{ + int ret; + + hdl =3D xenhypfs_open(NULL, 0); + + if (!hdl) { + fprintf(stderr, "Could not open libxenhypfs\n"); + ret =3D 2; + } else if (argc >=3D 3 && !strcmp(argv[1], "cat")) + ret =3D xenhypfs_cat(argc - 2, argv + 2); + else if (argc =3D=3D 3 && !strcmp(argv[1], "ls")) + ret =3D xenhypfs_ls(argv[2]); + else if (argc =3D=3D 4 && !strcmp(argv[1], "write")) + ret =3D xenhypfs_wr(argv[2], argv[3]); + else if (argc =3D=3D 2 && !strcmp(argv[1], "tree")) + ret =3D xenhypfs_tree(); + else + ret =3D usage(); + + xenhypfs_close(hdl); + + return ret; +} --=20 2.16.4 _______________________________________________ Xen-devel mailing list Xen-devel@lists.xenproject.org https://lists.xenproject.org/mailman/listinfo/xen-devel