Initial SRPM import
Signed-off-by: Tomas Hozza <thozza@redhat.com>
This commit is contained in:
parent
0c8ad59152
commit
8e8f9a7b03
6
.gitignore
vendored
6
.gitignore
vendored
@ -0,0 +1,6 @@
|
||||
/hv_get_dhcp_info.sh
|
||||
/hv_get_dns_info.sh
|
||||
/hv_kvp_daemon.c
|
||||
/hv_set_ifconfig.sh
|
||||
/hv_vss_daemon.c
|
||||
/COPYING
|
229
hyperv-daemons.spec
Normal file
229
hyperv-daemons.spec
Normal file
@ -0,0 +1,229 @@
|
||||
# HyperV KVP daemon binary name
|
||||
%global hv_kvp_daemon hypervkvpd
|
||||
# HyperV VSS daemon binary name
|
||||
%global hv_vss_daemon hypervvssd
|
||||
# snapshot version
|
||||
%global snapver .20130826git
|
||||
# use hardened build
|
||||
%global _hardened_build 1
|
||||
|
||||
Name: hyperv-daemons
|
||||
Version: 0
|
||||
Release: 0.1%{?snapver}%{?dist}
|
||||
Summary: HyperV daemons suite
|
||||
|
||||
Group: System Environment/Daemons
|
||||
License: GPLv2
|
||||
URL: http://www.kernel.org
|
||||
|
||||
# Source files obtained from kernel upstream 2013-08-26.
|
||||
# git://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
|
||||
# The daemon and scripts are located in "master branch - /tools/hv"
|
||||
# COPYING -> https://git.kernel.org/cgit/linux/kernel/git/next/linux-next.git/plain/COPYING?id=refs/tags/next-20130822
|
||||
Source0: COPYING
|
||||
|
||||
# HYPERV KVP DAEMON
|
||||
# hv_kvp_daemon.c -> https://git.kernel.org/cgit/linux/kernel/git/next/linux-next.git/plain/tools/hv/hv_kvp_daemon.c?id=refs/tags/next-20130822
|
||||
Source1: hv_kvp_daemon.c
|
||||
# hv_get_dhcp_info.sh -> https://git.kernel.org/cgit/linux/kernel/git/next/linux-next.git/plain/tools/hv/hv_get_dhcp_info.sh?id=refs/tags/next-20130822
|
||||
Source2: hv_get_dhcp_info.sh
|
||||
# hv_get_dns_info.sh -> https://git.kernel.org/cgit/linux/kernel/git/next/linux-next.git/plain/tools/hv/hv_get_dns_info.sh?id=refs/tags/next-20130822
|
||||
Source3: hv_get_dns_info.sh
|
||||
# hv_set_ifconfig.sh -> https://git.kernel.org/cgit/linux/kernel/git/next/linux-next.git/plain/tools/hv/hv_set_ifconfig.sh?id=refs/tags/next-20130822
|
||||
Source4: hv_set_ifconfig.sh
|
||||
Source5: hypervkvpd.service
|
||||
|
||||
# HYPERV VSS DAEMON
|
||||
# hv_vss_daemon.c -> https://git.kernel.org/cgit/linux/kernel/git/next/linux-next.git/plain/tools/hv/hv_vss_daemon.c?id=refs/tags/next-20130822
|
||||
Source100: hv_vss_daemon.c
|
||||
Source101: hypervvssd.service
|
||||
|
||||
# HYPERV KVP DAEMON
|
||||
# Correct paths to external scripts ("/usr/libexec/hypervkvpd").
|
||||
Patch0: hypervkvpd-0-corrected_paths_to_external_scripts.patch
|
||||
# use quoted include for linux/hyperv.h because we use gcc option
|
||||
# -iquote for include PATH where it is located. This is because
|
||||
# some headers in system include PATH are also in kernel-devel
|
||||
# package.
|
||||
Patch1: hypervkvpd-0-include_fix.patch
|
||||
# rhbz#872566
|
||||
Patch2: hypervkvpd-0-long_file_names_from_readdir.patch
|
||||
# Remove daemon() call and let systemd handle it
|
||||
Patch3: hypervkvpd-0-dont_call_deamon.patch
|
||||
|
||||
# HYPERV VSS DAEMON
|
||||
# use quoted include for linux/hyperv.h because we use gcc option
|
||||
# -iquote for include PATH where it is located. This is because
|
||||
# some headers in system include PATH are also in kernel-devel
|
||||
# package.
|
||||
Patch100: hypervvssd-0-fix_includes.patch
|
||||
# Remove daemon() call and let systemd handle it
|
||||
Patch101: hypervvssd-0-dont_call_daemon.patch
|
||||
|
||||
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
|
||||
# HyperV is available only on x86 architectures
|
||||
ExclusiveArch: i686 x86_64
|
||||
Requires: hypervkvpd = %{version}-%{release}
|
||||
Requires: hypervvssd = %{version}-%{release}
|
||||
|
||||
%description
|
||||
Suite of daemons that are needed when Linux guest
|
||||
is running on Windows Host with HyperV.
|
||||
|
||||
|
||||
%package -n hypervkvpd
|
||||
Summary: HyperV key value pair (KVP) daemon
|
||||
Group: System Environment/Daemons
|
||||
Requires: %{name}-license = %{version}-%{release}
|
||||
BuildRequires: systemd, kernel-devel
|
||||
Requires(post): systemd
|
||||
Requires(preun): systemd
|
||||
Requires(postun): systemd
|
||||
|
||||
%description -n hypervkvpd
|
||||
Hypervkvpd is an implementation of HyperV key value pair (KVP)
|
||||
functionality for Linux. The daemon first registers with the
|
||||
kernel driver. After this is done it collects information
|
||||
requested by Windows Host about the Linux Guest. It also supports
|
||||
IP injection functionality on the Guest.
|
||||
|
||||
|
||||
%package -n hypervvssd
|
||||
Summary: HyperV VSS daemon
|
||||
Group: System Environment/Daemons
|
||||
Requires: %{name}-license = %{version}-%{release}
|
||||
BuildRequires: systemd, kernel-devel
|
||||
Requires(post): systemd
|
||||
Requires(preun): systemd
|
||||
Requires(postun): systemd
|
||||
|
||||
%description -n hypervvssd
|
||||
Hypervvssd is an implementation of HyperV VSS functionality
|
||||
for Linux. The daemon is used for host initiated guest snapshot
|
||||
on HyperV hypervisor. The daemon first registers with the
|
||||
kernel driver. After this is done it waits for instructions
|
||||
from Windows Host if to "freeze" or "thaw" the filesystem
|
||||
on the Linux Guest.
|
||||
|
||||
|
||||
%package license
|
||||
Summary: License of the HyperV daemons suite
|
||||
Group: Applications/System
|
||||
BuildArch: noarch
|
||||
|
||||
%description license
|
||||
Contains license of the HyperV daemons suite.
|
||||
|
||||
|
||||
%prep
|
||||
%setup -Tc
|
||||
cp -pvL %{SOURCE0} COPYING
|
||||
|
||||
cp -pvL %{SOURCE1} hv_kvp_daemon.c
|
||||
cp -pvL %{SOURCE2} hv_get_dhcp_info.sh
|
||||
cp -pvL %{SOURCE3} hv_get_dns_info.sh
|
||||
cp -pvL %{SOURCE4} hv_set_ifconfig.sh
|
||||
cp -pvL %{SOURCE5} hypervkvpd.service
|
||||
|
||||
cp -pvL %{SOURCE100} hv_vss_daemon.c
|
||||
cp -pvL %{SOURCE101} hypervvssd.service
|
||||
|
||||
%patch0 -p1 -b .external_scripts
|
||||
%patch1 -p1 -b .include
|
||||
%patch2 -p1 -b .long_names
|
||||
%patch3 -p1 -b .daemon
|
||||
|
||||
%patch100 -p1 -b .include
|
||||
%patch101 -p1 -b .daemon
|
||||
|
||||
|
||||
%build
|
||||
# kernel-devel version
|
||||
%{!?kversion: %global kversion `ls %{_usrsrc}/kernels | sort -dr | head -n 1`}
|
||||
|
||||
# HYPERV KVP DAEMON
|
||||
gcc \
|
||||
$RPM_OPT_FLAGS \
|
||||
-iquote %{_usrsrc}/kernels/%{kversion}/include \
|
||||
-c hv_kvp_daemon.c
|
||||
|
||||
gcc \
|
||||
$RPM_LD_FLAGS \
|
||||
hv_kvp_daemon.o \
|
||||
-o %{hv_kvp_daemon}
|
||||
|
||||
# HYPERV VSS DAEMON
|
||||
gcc \
|
||||
$RPM_OPT_FLAGS \
|
||||
-iquote %{_usrsrc}/kernels/%{kversion}/include \
|
||||
-c hv_vss_daemon.c
|
||||
|
||||
gcc \
|
||||
$RPM_LD_FLAGS \
|
||||
hv_vss_daemon.o \
|
||||
-o %{hv_vss_daemon}
|
||||
|
||||
|
||||
%install
|
||||
rm -rf %{buildroot}
|
||||
|
||||
mkdir -p %{buildroot}%{_sbindir}
|
||||
install -p -m 0755 %{hv_kvp_daemon} %{buildroot}%{_sbindir}
|
||||
install -p -m 0755 %{hv_vss_daemon} %{buildroot}%{_sbindir}
|
||||
mkdir -p %{buildroot}%{_unitdir}
|
||||
# Systemd unit file
|
||||
install -p -m 0644 %{SOURCE5} %{buildroot}%{_unitdir}
|
||||
install -p -m 0644 %{SOURCE101} %{buildroot}%{_unitdir}
|
||||
# Shell scripts for the daemon
|
||||
mkdir -p %{buildroot}%{_libexecdir}/%{name}
|
||||
install -p -m 0755 hv_get_dhcp_info.sh %{buildroot}%{_libexecdir}/%{name}/hv_get_dhcp_info
|
||||
install -p -m 0755 hv_get_dns_info.sh %{buildroot}%{_libexecdir}/%{name}/hv_get_dns_info
|
||||
install -p -m 0755 hv_set_ifconfig.sh %{buildroot}%{_libexecdir}/%{name}/hv_set_ifconfig
|
||||
# Directory for pool files
|
||||
mkdir -p %{buildroot}%{_sharedstatedir}/hyperv
|
||||
|
||||
|
||||
%post -n hypervkvpd
|
||||
%systemd_post hypervkvpd.service
|
||||
|
||||
%preun -n hypervkvpd
|
||||
%systemd_preun hypervkvpd.service
|
||||
|
||||
%postun -n hypervkvpd
|
||||
# hypervkvpd daemon does NOT support restarting (driver, neither)
|
||||
%systemd_postun hypervkvpd.service
|
||||
# If removing the package, delete %%{_sharedstatedir}/hyperv directory
|
||||
if [ "$1" -eq "0" ] ; then
|
||||
rm -rf %{_sharedstatedir}/hyperv || :
|
||||
fi
|
||||
|
||||
|
||||
%post -n hypervvssd
|
||||
%systemd_post hypervvssd.service
|
||||
|
||||
%postun -n hypervvssd
|
||||
%systemd_postun hypervvssd.service
|
||||
|
||||
%preun -n hypervvssd
|
||||
%systemd_preun hypervvssd.service
|
||||
|
||||
|
||||
%files -n hypervkvpd
|
||||
%{_sbindir}/%{hv_kvp_daemon}
|
||||
%{_unitdir}/hypervkvpd.service
|
||||
%dir %{_libexecdir}/%{name}
|
||||
%{_libexecdir}/%{name}/hv_get_dhcp_info
|
||||
%{_libexecdir}/%{name}/hv_get_dns_info
|
||||
%{_libexecdir}/%{name}/hv_set_ifconfig
|
||||
%dir %{_sharedstatedir}/hyperv
|
||||
|
||||
%files -n hypervvssd
|
||||
%{_sbindir}/%{hv_vss_daemon}
|
||||
%{_unitdir}/hypervvssd.service
|
||||
|
||||
%files license
|
||||
%doc COPYING
|
||||
|
||||
%changelog
|
||||
* Mon Aug 26 2013 Tomas Hozza <thozza@redhat.com> - 0-0.1.20130826git
|
||||
- Initial package
|
45
hypervkvpd-0-corrected_paths_to_external_scripts.patch
Normal file
45
hypervkvpd-0-corrected_paths_to_external_scripts.patch
Normal file
@ -0,0 +1,45 @@
|
||||
From c8cec9f3f9c34aa824e652a01ae08e7e7a621daa Mon Sep 17 00:00:00 2001
|
||||
From: Tomas Hozza <thozza@redhat.com>
|
||||
Date: Wed, 26 Sep 2012 10:26:55 +0200
|
||||
Subject: [PATCH] Corrected paths to hypervkvpd external scripts.
|
||||
|
||||
Corrected paths to hypervkvpd external scripts, because
|
||||
they will be located in "/usr/libexec/hypervkvpd".
|
||||
---
|
||||
hv_kvp_daemon.c | 6 +++---
|
||||
1 file changed, 3 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/hv_kvp_daemon.c b/hv_kvp_daemon.c
|
||||
index 5959aff..3ea3af2 100644
|
||||
--- a/hv_kvp_daemon.c
|
||||
+++ b/hv_kvp_daemon.c
|
||||
@@ -812,7 +812,7 @@ static void kvp_get_ipconfig_info(char *if_name,
|
||||
* .
|
||||
*/
|
||||
|
||||
- sprintf(cmd, "%s", "hv_get_dns_info");
|
||||
+ sprintf(cmd, "%s", "/usr/libexec/hypervkvpd/hv_get_dns_info");
|
||||
|
||||
/*
|
||||
* Execute the command to gather DNS info.
|
||||
@@ -829,7 +829,7 @@ static void kvp_get_ipconfig_info(char *if_name,
|
||||
* Enabled: DHCP enabled.
|
||||
*/
|
||||
|
||||
- sprintf(cmd, "%s %s", "hv_get_dhcp_info", if_name);
|
||||
+ sprintf(cmd, "%s %s", "/usr/libexec/hypervkvpd/hv_get_dhcp_info", if_name);
|
||||
|
||||
file = popen(cmd, "r");
|
||||
if (file == NULL)
|
||||
@@ -1331,7 +1331,7 @@ setval_done:
|
||||
* invoke the external script to do its magic.
|
||||
*/
|
||||
|
||||
- snprintf(cmd, sizeof(cmd), "%s %s", "hv_set_ifconfig", if_file);
|
||||
+ snprintf(cmd, sizeof(cmd), "%s %s", "/usr/libexec/hypervkvpd/hv_set_ifconfig", if_file);
|
||||
if (system(cmd)) {
|
||||
syslog(LOG_ERR, "Failed to execute cmd '%s'; error: %d %s",
|
||||
cmd, errno, strerror(errno));
|
||||
--
|
||||
1.7.11.4
|
||||
|
12
hypervkvpd-0-dont_call_deamon.patch
Normal file
12
hypervkvpd-0-dont_call_deamon.patch
Normal file
@ -0,0 +1,12 @@
|
||||
diff -up hypervkvpd-0/hv_kvp_daemon.c.daemon hypervkvpd-0/hv_kvp_daemon.c
|
||||
--- hypervkvpd-0/hv_kvp_daemon.c.daemon 2013-08-09 10:51:41.020041192 +0200
|
||||
+++ hypervkvpd-0/hv_kvp_daemon.c 2013-08-09 10:53:23.217056215 +0200
|
||||
@@ -1434,8 +1434,6 @@ int main(void)
|
||||
char *kvp_recv_buffer;
|
||||
size_t kvp_recv_buffer_len;
|
||||
|
||||
- if (daemon(1, 0))
|
||||
- return 1;
|
||||
openlog("KVP", 0, LOG_USER);
|
||||
syslog(LOG_INFO, "KVP starting; pid is:%d", getpid());
|
||||
|
21
hypervkvpd-0-include_fix.patch
Normal file
21
hypervkvpd-0-include_fix.patch
Normal file
@ -0,0 +1,21 @@
|
||||
diff -up hypervkvpd-0/hv_kvp_daemon.c.include hypervkvpd-0/hv_kvp_daemon.c
|
||||
--- hypervkvpd-0/hv_kvp_daemon.c.include 2013-03-20 14:47:30.812899613 +0100
|
||||
+++ hypervkvpd-0/hv_kvp_daemon.c 2013-03-20 14:47:42.337896971 +0100
|
||||
@@ -26,7 +26,7 @@
|
||||
#include <sys/socket.h>
|
||||
#include <sys/poll.h>
|
||||
#include <sys/utsname.h>
|
||||
-#include <linux/types.h>
|
||||
+/* #include <linux/types.h> */
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
@@ -35,7 +35,7 @@
|
||||
#include <errno.h>
|
||||
#include <arpa/inet.h>
|
||||
#include <linux/connector.h>
|
||||
-#include <linux/hyperv.h>
|
||||
+#include "linux/hyperv.h"
|
||||
#include <linux/netlink.h>
|
||||
#include <ifaddrs.h>
|
||||
#include <netdb.h>
|
92
hypervkvpd-0-long_file_names_from_readdir.patch
Normal file
92
hypervkvpd-0-long_file_names_from_readdir.patch
Normal file
@ -0,0 +1,92 @@
|
||||
From 396ee697e4d5c7d10bacf6d4670fb4ddab357330 Mon Sep 17 00:00:00 2001
|
||||
From: Tomas Hozza <thozza@redhat.com>
|
||||
Date: Mon, 5 Nov 2012 13:56:02 +0100
|
||||
Subject: [PATCH] Tools: hv: Fix for long file names from readdir
|
||||
|
||||
kvp_get_if_name and kvp_mac_to_if_name copy strings into statically
|
||||
sized buffers which could be too small to store really long names.
|
||||
|
||||
Buffer sizes have been increased and length checks added via snprintf.
|
||||
---
|
||||
hv_kvp_daemon.c | 26 +++++++++-----------------
|
||||
1 file changed, 9 insertions(+), 17 deletions(-)
|
||||
|
||||
diff --git a/hv_kvp_daemon.c b/hv_kvp_daemon.c
|
||||
index 3ea3af2..4c2ab6a 100755
|
||||
--- a/hv_kvp_daemon.c
|
||||
+++ b/hv_kvp_daemon.c
|
||||
@@ -44,6 +44,7 @@
|
||||
#include <fcntl.h>
|
||||
#include <dirent.h>
|
||||
#include <net/if.h>
|
||||
+#include <limits.h>
|
||||
|
||||
/*
|
||||
* KVP protocol: The user mode component first registers with the
|
||||
@@ -588,26 +589,22 @@ static char *kvp_get_if_name(char *guid)
|
||||
DIR *dir;
|
||||
struct dirent *entry;
|
||||
FILE *file;
|
||||
- char *p, *q, *x;
|
||||
+ char *p, *x;
|
||||
char *if_name = NULL;
|
||||
char buf[256];
|
||||
char *kvp_net_dir = "/sys/class/net/";
|
||||
- char dev_id[256];
|
||||
+ char dev_id[PATH_MAX];
|
||||
|
||||
dir = opendir(kvp_net_dir);
|
||||
if (dir == NULL)
|
||||
return NULL;
|
||||
|
||||
- snprintf(dev_id, sizeof(dev_id), "%s", kvp_net_dir);
|
||||
- q = dev_id + strlen(kvp_net_dir);
|
||||
-
|
||||
while ((entry = readdir(dir)) != NULL) {
|
||||
/*
|
||||
* Set the state for the next pass.
|
||||
*/
|
||||
- *q = '\0';
|
||||
- strcat(dev_id, entry->d_name);
|
||||
- strcat(dev_id, "/device/device_id");
|
||||
+ snprintf(dev_id, sizeof(dev_id), "%s%s/device/device_id", kvp_net_dir,
|
||||
+ entry->d_name);
|
||||
|
||||
file = fopen(dev_id, "r");
|
||||
if (file == NULL)
|
||||
@@ -680,28 +677,23 @@ static char *kvp_mac_to_if_name(char *mac)
|
||||
DIR *dir;
|
||||
struct dirent *entry;
|
||||
FILE *file;
|
||||
- char *p, *q, *x;
|
||||
+ char *p, *x;
|
||||
char *if_name = NULL;
|
||||
char buf[256];
|
||||
char *kvp_net_dir = "/sys/class/net/";
|
||||
- char dev_id[256];
|
||||
+ char dev_id[PATH_MAX];
|
||||
int i;
|
||||
|
||||
dir = opendir(kvp_net_dir);
|
||||
if (dir == NULL)
|
||||
return NULL;
|
||||
|
||||
- snprintf(dev_id, sizeof(dev_id), kvp_net_dir);
|
||||
- q = dev_id + strlen(kvp_net_dir);
|
||||
-
|
||||
while ((entry = readdir(dir)) != NULL) {
|
||||
/*
|
||||
* Set the state for the next pass.
|
||||
*/
|
||||
- *q = '\0';
|
||||
-
|
||||
- strcat(dev_id, entry->d_name);
|
||||
- strcat(dev_id, "/address");
|
||||
+ snprintf(dev_id, sizeof(dev_id), "%s%s/address", kvp_net_dir,
|
||||
+ entry->d_name);
|
||||
|
||||
file = fopen(dev_id, "r");
|
||||
if (file == NULL)
|
||||
--
|
||||
1.7.11.7
|
||||
|
10
hypervkvpd.service
Normal file
10
hypervkvpd.service
Normal file
@ -0,0 +1,10 @@
|
||||
[Unit]
|
||||
Description=Hyper-V KVP daemon
|
||||
ConditionVirtualization=microsoft
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
ExecStart=/usr/sbin/hypervkvpd
|
||||
|
||||
[Install]
|
||||
WantedBy=basic.target
|
13
hypervvssd-0-dont_call_daemon.patch
Normal file
13
hypervvssd-0-dont_call_daemon.patch
Normal file
@ -0,0 +1,13 @@
|
||||
diff -up ./hv_vss_daemon.c.daemon ./hv_vss_daemon.c
|
||||
--- ./hv_vss_daemon.c.daemon 2013-06-26 10:26:42.272419971 +0200
|
||||
+++ ./hv_vss_daemon.c 2013-06-26 10:27:12.894443174 +0200
|
||||
@@ -148,9 +148,6 @@ int main(void)
|
||||
char *vss_recv_buffer;
|
||||
size_t vss_recv_buffer_len;
|
||||
|
||||
- if (daemon(1, 0))
|
||||
- return 1;
|
||||
-
|
||||
openlog("Hyper-V VSS", 0, LOG_USER);
|
||||
syslog(LOG_INFO, "VSS starting; pid is:%d", getpid());
|
||||
|
12
hypervvssd-0-fix_includes.patch
Normal file
12
hypervvssd-0-fix_includes.patch
Normal file
@ -0,0 +1,12 @@
|
||||
diff -up ./hv_vss_daemon.c.include ./hv_vss_daemon.c
|
||||
--- ./hv_vss_daemon.c.include 2013-06-26 10:36:36.444910963 +0200
|
||||
+++ ./hv_vss_daemon.c 2013-06-26 10:37:22.115951240 +0200
|
||||
@@ -34,7 +34,7 @@
|
||||
#include <arpa/inet.h>
|
||||
#include <linux/fs.h>
|
||||
#include <linux/connector.h>
|
||||
-#include <linux/hyperv.h>
|
||||
+#include "linux/hyperv.h"
|
||||
#include <linux/netlink.h>
|
||||
#include <syslog.h>
|
||||
|
9
hypervvssd.service
Normal file
9
hypervvssd.service
Normal file
@ -0,0 +1,9 @@
|
||||
[Unit]
|
||||
Description=Hyper-V VSS daemon
|
||||
ConditionVirtualization=microsoft
|
||||
|
||||
[Service]
|
||||
ExecStart=/usr/sbin/hypervvssd
|
||||
|
||||
[Install]
|
||||
WantedBy=basic.target
|
6
sources
6
sources
@ -0,0 +1,6 @@
|
||||
5a1b4a81be9d5bbbf8869976408354e8 hv_get_dhcp_info.sh
|
||||
dbb5cc7ec83ccc7b1c39458a7521c9b4 hv_get_dns_info.sh
|
||||
38064680ecf579444d853803ab265528 hv_kvp_daemon.c
|
||||
da7f77aa7507e950851cbb53673ce5d4 hv_set_ifconfig.sh
|
||||
8ae1875cc2bbf54e4a0b39f9f75a457d hv_vss_daemon.c
|
||||
d7810fab7487fb0aad327b76f1be7cd7 COPYING
|
Loading…
Reference in New Issue
Block a user