summaryrefslogtreecommitdiffstats
path: root/src/datatype.c
diff options
context:
space:
mode:
authorPablo Neira Ayuso <pablo@netfilter.org>2015-06-04 20:57:20 +0200
committerPablo Neira Ayuso <pablo@netfilter.org>2015-06-04 20:57:20 +0200
commit7c357801945977a7a7759ead56b4cb320673219b (patch)
treed90c08dcd9286f37b9cfe24a4eabb5f73fb454de /src/datatype.c
parent933fb6b993d9ddd9a96d15edbea393dc56c932e3 (diff)
parent575cc4519aa177c573481f683e07c2789a2f870a (diff)
Merge branch 'next-4.1'
Diffstat (limited to 'src/datatype.c')
-rw-r--r--src/datatype.c82
1 files changed, 41 insertions, 41 deletions
diff --git a/src/datatype.c b/src/datatype.c
index c93f76a3..f93337b1 100644
--- a/src/datatype.c
+++ b/src/datatype.c
@@ -760,11 +760,9 @@ const struct datatype icmpx_code_type = {
.sym_tbl = &icmpx_code_tbl,
};
-static void time_type_print(const struct expr *expr)
+void time_print(uint64_t seconds)
{
- uint64_t days, hours, minutes, seconds;
-
- seconds = mpz_get_uint64(expr->value);
+ uint64_t days, hours, minutes;
days = seconds / 86400;
seconds %= 86400;
@@ -775,8 +773,6 @@ static void time_type_print(const struct expr *expr)
minutes = seconds / 60;
seconds %= 60;
- printf("\"");
-
if (days > 0)
printf("%"PRIu64"d", days);
if (hours > 0)
@@ -785,8 +781,6 @@ static void time_type_print(const struct expr *expr)
printf("%"PRIu64"m", minutes);
if (seconds > 0)
printf("%"PRIu64"s", seconds);
-
- printf("\"");
}
enum {
@@ -805,8 +799,8 @@ static uint32_t str2int(char *tmp, const char *c, int k)
return atoi(tmp);
}
-static struct error_record *time_type_parse(const struct expr *sym,
- struct expr **res)
+struct error_record *time_parse(const struct location *loc, const char *str,
+ uint64_t *res)
{
int i, len;
unsigned int k = 0;
@@ -815,76 +809,82 @@ static struct error_record *time_type_parse(const struct expr *sym,
uint64_t d = 0, h = 0, m = 0, s = 0;
uint32_t mask = 0;
- c = sym->identifier;
+ c = str;
len = strlen(c);
for (i = 0; i < len; i++, c++) {
switch (*c) {
case 'd':
- if (mask & DAY) {
- return error(&sym->location,
+ if (mask & DAY)
+ return error(loc,
"Day has been specified twice");
- }
+
d = str2int(tmp, c, k);
k = 0;
mask |= DAY;
break;
case 'h':
- if (mask & HOUR) {
- return error(&sym->location,
+ if (mask & HOUR)
+ return error(loc,
"Hour has been specified twice");
- }
+
h = str2int(tmp, c, k);
k = 0;
- if (h > 23) {
- return error(&sym->location,
- "Hour needs to be 0-23");
- }
mask |= HOUR;
break;
case 'm':
- if (mask & MIN) {
- return error(&sym->location,
+ if (mask & MIN)
+ return error(loc,
"Minute has been specified twice");
- }
+
m = str2int(tmp, c, k);
k = 0;
- if (m > 59) {
- return error(&sym->location,
- "Minute needs to be 0-59");
- }
mask |= MIN;
break;
case 's':
- if (mask & SECS) {
- return error(&sym->location,
+ if (mask & SECS)
+ return error(loc,
"Second has been specified twice");
- }
+
s = str2int(tmp, c, k);
k = 0;
- if (s > 59) {
- return error(&sym->location,
- "second needs to be 0-59");
- }
mask |= SECS;
break;
default:
if (!isdigit(*c))
- return error(&sym->location, "wrong format");
+ return error(loc, "wrong time format");
- if (k++ >= array_size(tmp)) {
- return error(&sym->location,
- "value too large");
- }
+ if (k++ >= array_size(tmp))
+ return error(loc, "value too large");
break;
}
}
/* default to seconds if no unit was specified */
if (!mask)
- s = atoi(sym->identifier);
+ s = atoi(str);
else
s = 24*60*60*d+60*60*h+60*m+s;
+ *res = s;
+ return NULL;
+}
+
+
+static void time_type_print(const struct expr *expr)
+{
+ time_print(mpz_get_uint64(expr->value));
+}
+
+static struct error_record *time_type_parse(const struct expr *sym,
+ struct expr **res)
+{
+ struct error_record *erec;
+ uint64_t s;
+
+ erec = time_parse(&sym->location, sym->identifier, &s);
+ if (erec != NULL)
+ return erec;
+
if (s > UINT32_MAX)
return error(&sym->location, "value too large");