From nobody Tue Nov 11 08:45:25 2025 Delivered-To: importer@patchew.org Received-SPF: none (zoho.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 (zoho.com: 192.237.175.120 is neither permitted nor denied by domain of lists.xenproject.org) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org ARC-Seal: i=1; a=rsa-sha256; t=1569574928; cv=none; d=zoho.com; s=zohoarc; b=oFX5arNkNfSCrVOJURd8imqKVEWcERhVGOWmddu3GHF3UzcQJUcGMYodhTo8Cig0CnVT0d8HDijeqykMCzThevzL2W/CfztHA61relhSzcbjBMuZNjyJuRobDCkyxeTpQ6OlWRPxsbVujg/q4u08O9ECgZfXZi049a+aheowh4A= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1569574928; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=3GJgy7PNL4RE6m/V9ypNZFzlq3UKSvkxFIDWN9Qxd0I=; b=FvKWpYTXlavQ17eqJdlo+DzXx2RhVxXRLlPeLDTYnEUrdQnAlb8WuGQRXLSolEKW/vb/HHpKs29gFQVtWlGzUotus+YVzaOgwm6Vxcm0eH8JxeKbbqevl8W/Bpp0bG6daKSp1bZzMcMQQ2dhvtjMcvTNbJcAzYoY3ZvmxEmnfvA= ARC-Authentication-Results: i=1; mx.zoho.com; spf=none (zoho.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 156957492897263.067803215238655; Fri, 27 Sep 2019 02:02:08 -0700 (PDT) Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1iDm7T-0005Lh-3z; Fri, 27 Sep 2019 09:00:55 +0000 Received: from all-amaz-eas1.inumbo.com ([34.197.232.57] helo=us1-amaz-eas2.inumbo.com) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1iDm7R-0005Kw-VX for xen-devel@lists.xenproject.org; Fri, 27 Sep 2019 09:00:54 +0000 Received: from mx1.suse.de (unknown [195.135.220.15]) by localhost (Halon) with ESMTPS id 4e3d9c75-e105-11e9-9671-12813bfff9fa; Fri, 27 Sep 2019 09:00:52 +0000 (UTC) Received: from relay2.suse.de (unknown [195.135.220.254]) by mx1.suse.de (Postfix) with ESMTP id 3CDF5AFE3; Fri, 27 Sep 2019 09:00:51 +0000 (UTC) X-Inumbo-ID: 4e3d9c75-e105-11e9-9671-12813bfff9fa X-Virus-Scanned: by amavisd-new at test-mx.suse.de From: Juergen Gross To: xen-devel@lists.xenproject.org Date: Fri, 27 Sep 2019 11:00:45 +0200 Message-Id: <20190927090048.28872-4-jgross@suse.com> X-Mailer: git-send-email 2.16.4 In-Reply-To: <20190927090048.28872-1-jgross@suse.com> References: <20190927090048.28872-1-jgross@suse.com> Subject: [Xen-devel] [PATCH v1 3/6] libs: add libxenhypfs 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 , Ian Jackson , Wei Liu 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 new library libxenhypfs for access to the hypervisor filesystem. Signed-off-by: Juergen Gross Acked-by: Ian Jackson --- V1: - rename to libxenhypfs - add xenhypfs_write() --- tools/Rules.mk | 6 + tools/libs/Makefile | 1 + tools/libs/hypfs/Makefile | 14 ++ tools/libs/hypfs/core.c | 252 ++++++++++++++++++++++++++++++++= ++++ tools/libs/hypfs/include/xenhypfs.h | 60 +++++++++ tools/libs/hypfs/libxenhypfs.map | 9 ++ tools/libs/hypfs/xenhypfs.pc.in | 10 ++ 7 files changed, 352 insertions(+) create mode 100644 tools/libs/hypfs/Makefile create mode 100644 tools/libs/hypfs/core.c create mode 100644 tools/libs/hypfs/include/xenhypfs.h create mode 100644 tools/libs/hypfs/libxenhypfs.map create mode 100644 tools/libs/hypfs/xenhypfs.pc.in diff --git a/tools/Rules.mk b/tools/Rules.mk index cf8935d6a3..b1ebb4c96c 100644 --- a/tools/Rules.mk +++ b/tools/Rules.mk @@ -19,6 +19,7 @@ XEN_LIBXENGNTTAB =3D $(XEN_ROOT)/tools/libs/gnttab XEN_LIBXENCALL =3D $(XEN_ROOT)/tools/libs/call XEN_LIBXENFOREIGNMEMORY =3D $(XEN_ROOT)/tools/libs/foreignmemory XEN_LIBXENDEVICEMODEL =3D $(XEN_ROOT)/tools/libs/devicemodel +XEN_LIBXENHYPFS =3D $(XEN_ROOT)/tools/libs/hypfs XEN_LIBXC =3D $(XEN_ROOT)/tools/libxc XEN_XENLIGHT =3D $(XEN_ROOT)/tools/libxl # Currently libxlutil lives in the same directory as libxenlight @@ -134,6 +135,11 @@ SHDEPS_libxendevicemodel =3D $(SHLIB_libxentoollog) $(= SHLIB_libxentoolcore) $(SHLI LDLIBS_libxendevicemodel =3D $(SHDEPS_libxendevicemodel) $(XEN_LIBXENDEVIC= EMODEL)/libxendevicemodel$(libextension) SHLIB_libxendevicemodel =3D $(SHDEPS_libxendevicemodel) -Wl,-rpath-link= =3D$(XEN_LIBXENDEVICEMODEL) =20 +CFLAGS_libxenhypfs =3D -I$(XEN_LIBXENHYPFS)/include $(CFLAGS_xeninclude) +SHDEPS_libxenhypfs =3D $(SHLIB_libxentoollog) $(SHLIB_libxentoolcore) $(SH= LIB_xencall) +LDLIBS_libxenhypfs =3D $(SHDEPS_libxenhypfs) $(XEN_LIBXENHYPFS)/libxenhypf= s$(libextension) +SHLIB_libxenhypfs =3D $(SHDEPS_libxenhypfs) -Wl,-rpath-link=3D$(XEN_LIBXE= NHYPFS) + # code which compiles against libxenctrl get __XEN_TOOLS__ and # therefore sees the unstable hypercall interfaces. CFLAGS_libxenctrl =3D -I$(XEN_LIBXC)/include $(CFLAGS_libxentoollog) $(CFL= AGS_libxenforeignmemory) $(CFLAGS_libxendevicemodel) $(CFLAGS_xeninclude) -= D__XEN_TOOLS__ diff --git a/tools/libs/Makefile b/tools/libs/Makefile index 88901e7341..69cdfb5975 100644 --- a/tools/libs/Makefile +++ b/tools/libs/Makefile @@ -9,6 +9,7 @@ SUBDIRS-y +=3D gnttab SUBDIRS-y +=3D call SUBDIRS-y +=3D foreignmemory SUBDIRS-y +=3D devicemodel +SUBDIRS-y +=3D hypfs =20 ifeq ($(CONFIG_RUMP),y) SUBDIRS-y :=3D toolcore diff --git a/tools/libs/hypfs/Makefile b/tools/libs/hypfs/Makefile new file mode 100644 index 0000000000..c571597686 --- /dev/null +++ b/tools/libs/hypfs/Makefile @@ -0,0 +1,14 @@ +XEN_ROOT =3D $(CURDIR)/../../.. +include $(XEN_ROOT)/tools/Rules.mk + +MAJOR =3D 1 +MINOR =3D 0 +LIBNAME :=3D hypfs +USELIBS :=3D toollog toolcore call + +SRCS-y +=3D core.c + +include ../libs.mk + +$(PKG_CONFIG_LOCAL): PKG_CONFIG_INCDIR =3D $(XEN_LIBXENHYPFS)/include +$(PKG_CONFIG_LOCAL): PKG_CONFIG_CFLAGS_LOCAL =3D $(CFLAGS_xeninclude) diff --git a/tools/libs/hypfs/core.c b/tools/libs/hypfs/core.c new file mode 100644 index 0000000000..edbf37f2c1 --- /dev/null +++ b/tools/libs/hypfs/core.c @@ -0,0 +1,252 @@ +/* + * Copyright (c) 2019 SUSE Software Solutions Germany GmbH + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; If not, see . + */ + +#define __XEN_TOOLS__ 1 + +#include +#include +#include + +#include +#include +#include + +#include + +struct xenhypfs_handle { + xentoollog_logger *logger, *logger_tofree; + unsigned int flags; + xencall_handle *xcall; +}; + +xenhypfs_handle *xenhypfs_open(xentoollog_logger *logger, + unsigned open_flags) +{ + xenhypfs_handle *fshdl =3D calloc(1, sizeof(*fshdl)); + + if (!fshdl) + return NULL; + + fshdl->flags =3D open_flags; + fshdl->logger =3D logger; + fshdl->logger_tofree =3D NULL; + + if (!fshdl->logger) { + fshdl->logger =3D fshdl->logger_tofree =3D + (xentoollog_logger*) + xtl_createlogger_stdiostream(stderr, XTL_PROGRESS, 0); + if (!fshdl->logger) + goto err; + } + + fshdl->xcall =3D xencall_open(fshdl->logger, 0); + if (!fshdl->xcall) + goto err; + + + return fshdl; + +err: + xtl_logger_destroy(fshdl->logger_tofree); + xencall_close(fshdl->xcall); + free(fshdl); + return NULL; +} + +int xenhypfs_close(xenhypfs_handle *fshdl) +{ + if (!fshdl) + return 0; + + xencall_close(fshdl->xcall); + xtl_logger_destroy(fshdl->logger_tofree); + free(fshdl); + return 0; +} + +static int xenhypfs_get_pathbuf(xenhypfs_handle *fshdl, const char *path, + char **path_buf) +{ + int ret =3D -1; + int path_sz; + + if (!fshdl) { + errno =3D EBADF; + goto out; + } + + path_sz =3D strlen(path) + 1; + if (path_sz > XEN_HYPFS_MAX_PATHLEN) + { + errno =3D ENAMETOOLONG; + goto out; + } + + *path_buf =3D xencall_alloc_buffer(fshdl->xcall, path_sz); + if (!*path_buf) { + errno =3D ENOMEM; + goto out; + } + strcpy(*path_buf, path); + + ret =3D path_sz; + + out: + return ret; +} + +static void *xenhypfs_read_any(xenhypfs_handle *fshdl, const char *path, + unsigned int cmd) +{ + char *buf =3D NULL, *path_buf =3D NULL; + int ret; + int sz, path_sz; + + ret =3D xenhypfs_get_pathbuf(fshdl, path, &path_buf); + if (ret < 0) + goto out; + + path_sz =3D ret; + + for (sz =3D 4096; sz > 0; sz =3D ret) { + if (buf) + xencall_free_buffer(fshdl->xcall, buf); + + buf =3D xencall_alloc_buffer(fshdl->xcall, sz); + if (!buf) { + errno =3D ENOMEM; + goto out; + } + + ret =3D xencall5(fshdl->xcall, __HYPERVISOR_hypfs_op, cmd, + (unsigned long)path_buf, path_sz, + (unsigned long)buf, sz); + } + + if (ret < 0) { + errno =3D -ret; + xencall_free_buffer(fshdl->xcall, buf); + buf =3D NULL; + goto out; + } + + out: + ret =3D errno; + xencall_free_buffer(fshdl->xcall, path_buf); + errno =3D ret; + + return buf; +} + +char *xenhypfs_read(xenhypfs_handle *fshdl, const char *path) +{ + char *buf, *ret_buf =3D NULL; + int ret; + + buf =3D xenhypfs_read_any(fshdl, path, XEN_HYPFS_OP_read_contents); + if (buf) + ret_buf =3D strdup(buf); + + ret =3D errno; + xencall_free_buffer(fshdl->xcall, buf); + errno =3D ret; + + return ret_buf; +} + +struct xenhypfs_dirent *xenhypfs_readdir(xenhypfs_handle *fshdl, + const char *path, + unsigned int *num_entries) +{ + void *buf, *curr; + int ret; + char *names; + struct xenhypfs_dirent *ret_buf =3D NULL; + unsigned int n, name_sz =3D 0; + struct xen_hypfs_direntry *entry; + + buf =3D xenhypfs_read_any(fshdl, path, XEN_HYPFS_OP_read_dir); + if (!buf) + goto out; + + curr =3D buf; + for (n =3D 1;; n++) { + entry =3D curr; + name_sz +=3D strlen(entry->name) + 1; + if (!entry->off_next) + break; + + curr +=3D entry->off_next; + } + + ret_buf =3D malloc(n * sizeof(*ret_buf) + name_sz); + if (!ret_buf) + goto out; + + *num_entries =3D n; + names =3D (char *)(ret_buf + n); + curr =3D buf; + for (n =3D 0; n < *num_entries; n++) { + entry =3D curr; + ret_buf[n].name =3D names; + ret_buf[n].is_dir =3D entry->flags & XEN_HYPFS_ISDIR; + strcpy(names, entry->name); + names +=3D strlen(entry->name) + 1; + curr +=3D entry->off_next; + } + + out: + ret =3D errno; + xencall_free_buffer(fshdl->xcall, buf); + errno =3D ret; + + return ret_buf; +} + +int xenhypfs_write(xenhypfs_handle *fshdl, const char *path, const char *v= al) +{ + char *buf =3D NULL, *path_buf =3D NULL; + int ret, saved_errno; + int sz, path_sz; + + ret =3D xenhypfs_get_pathbuf(fshdl, path, &path_buf); + if (ret < 0) + goto out; + + path_sz =3D ret; + + sz =3D strlen(val) + 1; + buf =3D xencall_alloc_buffer(fshdl->xcall, sz); + if (!buf) { + ret =3D -1; + errno =3D ENOMEM; + goto out; + } + strcpy(buf, val); + + ret =3D xencall5(fshdl->xcall, __HYPERVISOR_hypfs_op, + XEN_HYPFS_OP_write_contents, + (unsigned long)path_buf, path_sz, + (unsigned long)buf, sz); + + out: + saved_errno =3D errno; + xencall_free_buffer(fshdl->xcall, path_buf); + xencall_free_buffer(fshdl->xcall, buf); + errno =3D saved_errno; + return ret; +} diff --git a/tools/libs/hypfs/include/xenhypfs.h b/tools/libs/hypfs/include= /xenhypfs.h new file mode 100644 index 0000000000..443221510a --- /dev/null +++ b/tools/libs/hypfs/include/xenhypfs.h @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2019 SUSE Software Solutions Germany GmbH + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; If not, see . + */ +#ifndef XENHYPFS_H +#define XENHYPFS_H + +#include +#include + +#include +#include + +/* Callers who don't care don't need to #include */ +struct xentoollog_logger; + +typedef struct xenhypfs_handle xenhypfs_handle; + +struct xenhypfs_dirent { + char *name; + bool is_dir; +}; + +xenhypfs_handle *xenhypfs_open(struct xentoollog_logger *logger, + unsigned int open_flags); +int xenhypfs_close(xenhypfs_handle *fshdl); + +/* Returned buffer should be freed via free(). */ +char *xenhypfs_read(xenhypfs_handle *fshdl, const char *path); + +/* Returned buffer should be freed via free(). */ +struct xenhypfs_dirent *xenhypfs_readdir(xenhypfs_handle *fshdl, + const char *path, + unsigned int *num_entries); + +int xenhypfs_write(xenhypfs_handle *fshdl, const char *path, const char *v= al); + +#endif /* XENHYPFS_H */ + +/* + * Local variables: + * mode: C + * c-file-style: "BSD" + * c-basic-offset: 4 + * tab-width: 4 + * indent-tabs-mode: nil + * End: + */ diff --git a/tools/libs/hypfs/libxenhypfs.map b/tools/libs/hypfs/libxenhypf= s.map new file mode 100644 index 0000000000..39c63f4367 --- /dev/null +++ b/tools/libs/hypfs/libxenhypfs.map @@ -0,0 +1,9 @@ +VERS_1.0 { + global: + xenhypfs_open; + xenhypfs_close; + xenhypfs_read; + xenhypfs_readdir; + xenhypfs_write; + local: *; /* Do not expose anything by default */ +}; diff --git a/tools/libs/hypfs/xenhypfs.pc.in b/tools/libs/hypfs/xenhypfs.pc= .in new file mode 100644 index 0000000000..9cb968f0db --- /dev/null +++ b/tools/libs/hypfs/xenhypfs.pc.in @@ -0,0 +1,10 @@ +prefix=3D@@prefix@@ +includedir=3D@@incdir@@ +libdir=3D@@libdir@@ + +Name: Xenhypfs +Description: The Xenhypfs library for Xen hypervisor +Version: @@version@@ +Cflags: -I${includedir} @@cflagslocal@@ +Libs: @@libsflag@@${libdir} -lxenhypfs +Requires.private: xentoolcore,xentoollog,xencall --=20 2.16.4 _______________________________________________ Xen-devel mailing list Xen-devel@lists.xenproject.org https://lists.xenproject.org/mailman/listinfo/xen-devel