|
Zbigniew Jędrzejewski-Szmek |
96237b |
From 4cae8946d581a6ecf0b26e154bf9c00e390024b2 Mon Sep 17 00:00:00 2001
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
Date: Sun, 2 Mar 2014 00:05:16 -0500
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
Subject: [PATCH] Allow fractional parts in disk sizes
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
It seems natural to be able to say SystemMaxUsage=1.5G.
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
https://bugzilla.redhat.com/show_bug.cgi?id=1047568
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
(cherry picked from commit 9480794b277b5ce33e467578ed669996df576bb9)
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
---
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
src/shared/util.c | 24 ++++++++++++++++++++++--
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
src/test/test-util.c | 42 +++++++++++++++++++++++++++++++++++++-----
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
2 files changed, 59 insertions(+), 7 deletions(-)
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
diff --git a/src/shared/util.c b/src/shared/util.c
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
index 5cb598c..3164515 100644
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
--- a/src/shared/util.c
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
+++ b/src/shared/util.c
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
@@ -2198,6 +2198,8 @@ int parse_size(const char *t, off_t base, off_t *size) {
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
p = t;
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
do {
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
long long l;
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
+ unsigned long long l2;
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
+ double frac = 0;
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
char *e;
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
unsigned i;
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
@@ -2213,14 +2215,32 @@ int parse_size(const char *t, off_t base, off_t *size) {
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
if (e == p)
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
return -EINVAL;
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
+ if (*e == '.') {
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
+ e++;
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
+ if (*e >= '0' && *e <= '9') {
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
+ char *e2;
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
+
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
+ /* strotoull itself would accept space/+/- */
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
+ l2 = strtoull(e, &e2, 10);
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
+
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
+ if (errno == ERANGE)
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
+ return -errno;
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
+
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
+ /* Ignore failure. E.g. 10.M is valid */
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
+ frac = l2;
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
+ for (; e < e2; e++)
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
+ frac /= 10;
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
+ }
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
+ }
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
+
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
e += strspn(e, WHITESPACE);
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
for (i = 0; i < n_entries; i++)
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
if (startswith(e, table[i].suffix)) {
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
unsigned long long tmp;
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
- if ((unsigned long long) l > ULLONG_MAX / table[i].factor)
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
+ if ((unsigned long long) l + (frac > 0) > ULLONG_MAX / table[i].factor)
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
return -ERANGE;
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
- tmp = l * table[i].factor;
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
+ tmp = l * table[i].factor + (unsigned long long) (frac * table[i].factor);
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
if (tmp > ULLONG_MAX - r)
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
return -ERANGE;
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
diff --git a/src/test/test-util.c b/src/test/test-util.c
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
index b718206..74f83a2 100644
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
--- a/src/test/test-util.c
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
+++ b/src/test/test-util.c
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
@@ -30,6 +30,7 @@
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
#include "strv.h"
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
#include "def.h"
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
#include "fileio.h"
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
+#include "conf-parser.h"
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
static void test_streq_ptr(void) {
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
assert_se(streq_ptr(NULL, NULL));
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
@@ -441,17 +442,32 @@ static void test_parse_size(void) {
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
assert_se(parse_size("111", 1024, &bytes) == 0);
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
assert_se(bytes == 111);
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
+ assert_se(parse_size("111.4", 1024, &bytes) == 0);
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
+ assert_se(bytes == 111);
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
+
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
assert_se(parse_size(" 112 B", 1024, &bytes) == 0);
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
assert_se(bytes == 112);
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
- assert_se(parse_size("3 K", 1024, &bytes) == 0);
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
+ assert_se(parse_size(" 112.6 B", 1024, &bytes) == 0);
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
+ assert_se(bytes == 112);
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
+
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
+ assert_se(parse_size("3.5 K", 1024, &bytes) == 0);
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
+ assert_se(bytes == 3*1024 + 512);
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
+
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
+ assert_se(parse_size("3. K", 1024, &bytes) == 0);
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
+ assert_se(bytes == 3*1024);
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
+
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
+ assert_se(parse_size("3.0 K", 1024, &bytes) == 0);
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
assert_se(bytes == 3*1024);
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
- assert_se(parse_size(" 4 M 11K", 1024, &bytes) == 0);
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
- assert_se(bytes == 4*1024*1024 + 11 * 1024);
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
+ assert_se(parse_size("3. 0 K", 1024, &bytes) == 0);
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
+ assert_se(bytes == 3);
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
- assert_se(parse_size("3B3G", 1024, &bytes) == 0);
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
- assert_se(bytes == 3ULL*1024*1024*1024 + 3);
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
+ assert_se(parse_size(" 4 M 11.5K", 1024, &bytes) == 0);
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
+ assert_se(bytes == 4*1024*1024 + 11 * 1024 + 512);
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
+
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
+ assert_se(parse_size("3B3.5G", 1024, &bytes) == 0);
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
+ assert_se(bytes == 3ULL*1024*1024*1024 + 512*1024*1024 + 3);
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
assert_se(parse_size("3B3G4T", 1024, &bytes) == 0);
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
assert_se(bytes == (4ULL*1024 + 3)*1024*1024*1024 + 3);
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
@@ -464,6 +480,10 @@ static void test_parse_size(void) {
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
assert_se(parse_size("12X", 1024, &bytes) == -EINVAL);
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
+ assert_se(parse_size("12.5X", 1024, &bytes) == -EINVAL);
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
+
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
+ assert_se(parse_size("12.5e3", 1024, &bytes) == -EINVAL);
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
+
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
assert_se(parse_size("1024E", 1024, &bytes) == -ERANGE);
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
assert_se(parse_size("-1", 1024, &bytes) == -ERANGE);
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
assert_se(parse_size("-1024E", 1024, &bytes) == -ERANGE);
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
@@ -473,6 +493,14 @@ static void test_parse_size(void) {
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
assert_se(parse_size("-10B 20K", 1024, &bytes) == -ERANGE);
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
}
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
+static void test_config_parse_iec_off(void) {
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
+ off_t offset = 0;
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
+ assert_se(config_parse_iec_off(NULL, "/this/file", 11, "Section", 22, "Size", 0, "4M", &offset, NULL) == 0);
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
+ assert_se(offset == 4 * 1024 * 1024);
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
+
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
+ assert_se(config_parse_iec_off(NULL, "/this/file", 11, "Section", 22, "Size", 0, "4.5M", &offset, NULL) == 0);
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
+}
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
+
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
static void test_strextend(void) {
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
_cleanup_free_ char *str = strdup("0123");
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
strextend(&str, "456", "78", "9", NULL);
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
@@ -589,6 +617,9 @@ static void test_writing_tmpfile(void) {
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
}
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
int main(int argc, char *argv[]) {
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
+ log_parse_environment();
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
+ log_open();
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
+
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
test_streq_ptr();
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
test_first_word();
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
test_close_many();
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
@@ -618,6 +649,7 @@ int main(int argc, char *argv[]) {
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
test_get_process_comm();
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
test_protect_errno();
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
test_parse_size();
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
+ test_config_parse_iec_off();
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
test_strextend();
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
test_strrep();
|
|
Zbigniew Jędrzejewski-Szmek |
96237b |
test_split_pair();
|