commit
081888801f
@ -1,150 +0,0 @@
|
|||||||
From 691430206f1104b752b0e52386f317e639137788 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Jan Chaloupka <jchaloup@redhat.com>
|
|
||||||
Date: Mon, 15 Sep 2014 13:29:39 +0200
|
|
||||||
Subject: [PATCH] api.c: support for setting multiline values in control files
|
|
||||||
|
|
||||||
As of now, libcgroup does not support multiline values setting from configuration files. i.e. values in a form:
|
|
||||||
|
|
||||||
net_prio.ifpriomap="lo 7
|
|
||||||
eth0 66
|
|
||||||
eth1 5
|
|
||||||
eth2 4
|
|
||||||
eth3 3";
|
|
||||||
|
|
||||||
Thus, setting of more network interfaces can not be done from configuration file. Or
|
|
||||||
|
|
||||||
devices.allow="a *:* w
|
|
||||||
c 8:* r";
|
|
||||||
|
|
||||||
thus setting list of allow devices can not be set as well. The only way is to set it from userspace, e.g.:
|
|
||||||
# echo "lo 7" > /sys/fs/cgroup/net_prio/testGroup/net_prio.ifpriomap
|
|
||||||
# echo "eth 0" > /sys/fs/cgroup/net_prio/testGroup/net_prio.ifpriomap
|
|
||||||
# echo "eth 1" > /sys/fs/cgroup/net_prio/testGroup/net_prio.ifpriomap
|
|
||||||
# echo "eth 2" > /sys/fs/cgroup/net_prio/testGroup/net_prio.ifpriomap
|
|
||||||
# echo "eth 3" > /sys/fs/cgroup/net_prio/testGroup/net_prio.ifpriomap
|
|
||||||
|
|
||||||
This patch allows setting of multiline variables.
|
|
||||||
|
|
||||||
How this support works:
|
|
||||||
Multiline value is broken in lines and each line is set by write (man 2 write) syscall (without bufferring).
|
|
||||||
This implies change of fopen with open, fclose with close.
|
|
||||||
There is no control on multiline value, thus "eth0\n \t\n" can be set. However, setting
|
|
||||||
of " \t" will fail as write command returns -1. Thus administrator has to set correct
|
|
||||||
multiline values.
|
|
||||||
|
|
||||||
Tested on virtual machine with fedora and rhel with network interface lo, eth0-eth3. Configuration file:
|
|
||||||
|
|
||||||
# cat /etc/cgconfig.conf
|
|
||||||
group testGroup {
|
|
||||||
net_prio {
|
|
||||||
net_prio.ifpriomap="lo 7
|
|
||||||
eth0 66
|
|
||||||
eth1 5
|
|
||||||
eth2 4
|
|
||||||
eth3 3";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
net_prio has to be created before:
|
|
||||||
# modprobe netprio_cgroup
|
|
||||||
# mkdir /sys/fs/cgroup/net_prio
|
|
||||||
# mount -t cgroup -onet_prio none /sys/fs/cgroup/net_prio
|
|
||||||
|
|
||||||
Changelog:
|
|
||||||
test of success of strdup call
|
|
||||||
free str_val before return (str_val is changing in while cycle,
|
|
||||||
thus str_start_val points to the start of str_val before while)
|
|
||||||
|
|
||||||
Signed-off-by: Jan Chaloupka <jchaloup@redhat.com>
|
|
||||||
---
|
|
||||||
src/api.c | 50 ++++++++++++++++++++++++++++++++++++++++++++------
|
|
||||||
1 file changed, 44 insertions(+), 6 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/src/api.c b/src/api.c
|
|
||||||
index 5751b8f..d6c9d3a 100644
|
|
||||||
--- a/src/api.c
|
|
||||||
+++ b/src/api.c
|
|
||||||
@@ -1495,13 +1495,18 @@ static int cg_create_control_group(const char *path)
|
|
||||||
*/
|
|
||||||
static int cg_set_control_value(char *path, const char *val)
|
|
||||||
{
|
|
||||||
- FILE *control_file = NULL;
|
|
||||||
+ int ctl_file;
|
|
||||||
+ char *str_val;
|
|
||||||
+ char *str_val_start;
|
|
||||||
+ char *pos;
|
|
||||||
+ size_t len;
|
|
||||||
+
|
|
||||||
if (!cg_test_mounted_fs())
|
|
||||||
return ECGROUPNOTMOUNTED;
|
|
||||||
|
|
||||||
- control_file = fopen(path, "r+e");
|
|
||||||
+ ctl_file = open(path, O_RDWR | O_CLOEXEC);
|
|
||||||
|
|
||||||
- if (!control_file) {
|
|
||||||
+ if (ctl_file == -1) {
|
|
||||||
if (errno == EPERM) {
|
|
||||||
/*
|
|
||||||
* We need to set the correct error value, does the
|
|
||||||
@@ -1512,6 +1517,7 @@ static int cg_set_control_value(char *path, const char *val)
|
|
||||||
*/
|
|
||||||
char *path_dir_end;
|
|
||||||
char *tasks_path;
|
|
||||||
+ FILE *control_file;
|
|
||||||
|
|
||||||
path_dir_end = strrchr(path, '/');
|
|
||||||
if (path_dir_end == NULL)
|
|
||||||
@@ -1543,15 +1549,47 @@ static int cg_set_control_value(char *path, const char *val)
|
|
||||||
return ECGROUPVALUENOTEXIST;
|
|
||||||
}
|
|
||||||
|
|
||||||
- if (fprintf(control_file, "%s", val) < 0) {
|
|
||||||
+ /* Split the multiline value into lines. */
|
|
||||||
+ /* One line is a special case of multiline value. */
|
|
||||||
+ str_val = strdup(val);
|
|
||||||
+ if (str_val == NULL) {
|
|
||||||
last_errno = errno;
|
|
||||||
- fclose(control_file);
|
|
||||||
+ close(ctl_file);
|
|
||||||
return ECGOTHER;
|
|
||||||
}
|
|
||||||
- if (fclose(control_file) < 0) {
|
|
||||||
+
|
|
||||||
+ str_val_start = str_val;
|
|
||||||
+ pos = str_val;
|
|
||||||
+
|
|
||||||
+ do {
|
|
||||||
+ str_val = pos;
|
|
||||||
+ pos = strchr(str_val, '\n');
|
|
||||||
+
|
|
||||||
+ if (pos) {
|
|
||||||
+ *pos = '\0';
|
|
||||||
+ ++pos;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ len = strlen(str_val);
|
|
||||||
+ if (len > 0) {
|
|
||||||
+ if (write(ctl_file, str_val, len) == -1) {
|
|
||||||
+ last_errno = errno;
|
|
||||||
+ free(str_val_start);
|
|
||||||
+ close(ctl_file);
|
|
||||||
+ return ECGOTHER;
|
|
||||||
+ }
|
|
||||||
+ } else
|
|
||||||
+ cgroup_warn("Warning: skipping empty line for %s\n",
|
|
||||||
+ path);
|
|
||||||
+ } while(pos);
|
|
||||||
+
|
|
||||||
+ if (close(ctl_file)) {
|
|
||||||
last_errno = errno;
|
|
||||||
+ free(str_val_start);
|
|
||||||
return ECGOTHER;
|
|
||||||
}
|
|
||||||
+
|
|
||||||
+ free(str_val_start);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
--
|
|
||||||
1.9.3
|
|
||||||
|
|
||||||
@ -5,7 +5,7 @@
|
|||||||
Summary: Libcgroup is a library that abstracts the control group file system in Linux
|
Summary: Libcgroup is a library that abstracts the control group file system in Linux
|
||||||
Name: libcgroup
|
Name: libcgroup
|
||||||
Version: 0.41
|
Version: 0.41
|
||||||
Release: 22
|
Release: 23
|
||||||
License: LGPLv2+
|
License: LGPLv2+
|
||||||
URL: http://libcg.sourceforge.net/
|
URL: http://libcg.sourceforge.net/
|
||||||
Source0: http://downloads.sourceforge.net/libcg/%{name}-%{version}.tar.bz2
|
Source0: http://downloads.sourceforge.net/libcg/%{name}-%{version}.tar.bz2
|
||||||
@ -19,16 +19,15 @@ Patch2: libcgroup-0.40.rc1-coverity.patch
|
|||||||
Patch3: libcgroup-0.40.rc1-fread.patch
|
Patch3: libcgroup-0.40.rc1-fread.patch
|
||||||
Patch4: libcgroup-0.40.rc1-templates-fix.patch
|
Patch4: libcgroup-0.40.rc1-templates-fix.patch
|
||||||
Patch5: libcgroup-0.41-lex.patch
|
Patch5: libcgroup-0.41-lex.patch
|
||||||
Patch6: libcgroup-0.41-api.c-support-for-setting-multiline-values-in-contro.patch
|
Patch6: libcgroup-0.41-api.c-fix-order-of-memory-subsystem-parameters.patch
|
||||||
Patch7: libcgroup-0.41-api.c-fix-order-of-memory-subsystem-parameters.patch
|
Patch7: libcgroup-0.41-api.c-preserve-dirty-flag.patch
|
||||||
Patch8: libcgroup-0.41-api.c-preserve-dirty-flag.patch
|
Patch8: libcgroup-0.41-change-cgroup-of-threads.patch
|
||||||
Patch9: libcgroup-0.41-change-cgroup-of-threads.patch
|
Patch9: libcgroup-0.41-fix-infinite-loop.patch
|
||||||
Patch10: libcgroup-0.41-fix-infinite-loop.patch
|
Patch10: libcgroup-0.41-prevent-buffer-overflow.patch
|
||||||
Patch11: libcgroup-0.41-prevent-buffer-overflow.patch
|
Patch11: libcgroup-0.41-tasks-file-warning.patch
|
||||||
Patch12: libcgroup-0.41-tasks-file-warning.patch
|
Patch12: libcgroup-0.41-fix-log-level.patch
|
||||||
Patch13: libcgroup-0.41-fix-log-level.patch
|
Patch13: libcgroup-0.41-size-of-controller-values.patch
|
||||||
Patch14: libcgroup-0.41-size-of-controller-values.patch
|
Patch14: libcgroup-0.41-CVE-2018-14348.patch
|
||||||
Patch15: libcgroup-0.41-CVE-2018-14348.patch
|
|
||||||
Patch9000: bugfix-change-parser-match-order-fix-cgconfig-error.patch
|
Patch9000: bugfix-change-parser-match-order-fix-cgconfig-error.patch
|
||||||
|
|
||||||
BuildRequires: gcc,gcc-c++,byacc
|
BuildRequires: gcc,gcc-c++,byacc
|
||||||
@ -71,7 +70,6 @@ It provides helpful information for libcgroup-pam,libcgroup-devel,libcgroup-tool
|
|||||||
%patch12 -p1
|
%patch12 -p1
|
||||||
%patch13 -p1
|
%patch13 -p1
|
||||||
%patch14 -p1
|
%patch14 -p1
|
||||||
%patch15 -p1
|
|
||||||
%patch9000 -p1
|
%patch9000 -p1
|
||||||
|
|
||||||
%build
|
%build
|
||||||
@ -154,6 +152,12 @@ getent group cgred >/dev/null || groupadd -r cgred
|
|||||||
%attr(0644, root, root) %{_mandir}/man8/*
|
%attr(0644, root, root) %{_mandir}/man8/*
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Tue Jan 7 2020 openEuler Buildteam <buildteam@openeuler.org> - 0.41-23
|
||||||
|
- Type:enhancement
|
||||||
|
- Id:NA
|
||||||
|
- SUG:NA
|
||||||
|
- DESC:modify spec patch
|
||||||
|
|
||||||
* Thu Dec 19 2019 openEuler Buildteam <buildteam@openeuler.org> - 0.41-22
|
* Thu Dec 19 2019 openEuler Buildteam <buildteam@openeuler.org> - 0.41-22
|
||||||
- Type:enhancement
|
- Type:enhancement
|
||||||
- Id:NA
|
- Id:NA
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user