summaryrefslogtreecommitdiffstats
path: root/src/utils.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/utils.c')
-rw-r--r--src/utils.c61
1 files changed, 37 insertions, 24 deletions
diff --git a/src/utils.c b/src/utils.c
index ebd40b5..c6bf9ff 100644
--- a/src/utils.c
+++ b/src/utils.c
@@ -66,57 +66,70 @@ static struct {
[NFT_TYPE_S64] = { .len = sizeof(int64_t), .min = INT64_MIN, .max = INT64_MAX },
};
-int nft_strtoi(const char *string, int base, void *out, enum nft_type type)
+
+int nft_get_value(enum nft_type type, void *val, void *out)
{
- int64_t sval = 0;
- uint64_t uval = -1;
- char *endptr;
+ int64_t sval;
+ uint64_t uval;
switch (type) {
case NFT_TYPE_U8:
case NFT_TYPE_U16:
case NFT_TYPE_U32:
case NFT_TYPE_U64:
- uval = strtoll(string, &endptr, base);
+ uval = *((uint64_t *)val);
+ if (uval > basetype[type].max) {
+ errno = ERANGE;
+ return -1;
+ }
+ memcpy(out, &uval, basetype[type].len);
break;
case NFT_TYPE_S8:
case NFT_TYPE_S16:
case NFT_TYPE_S32:
case NFT_TYPE_S64:
- sval = strtoull(string, &endptr, base);
+ sval = *((int64_t *)val);
+ if (sval < basetype[type].min ||
+ sval > (int64_t)basetype[type].max) {
+ errno = ERANGE;
+ return -1;
+ }
+ memcpy(out, &sval, basetype[type].len);
break;
- default:
- errno = EINVAL;
- return -1;
}
- if (*endptr) {
- errno = EINVAL;
- return -1;
- }
+ return 0;
+}
+
+int nft_strtoi(const char *string, int base, void *out, enum nft_type type)
+{
+ int64_t sval = 0;
+ uint64_t uval = -1;
+ char *endptr;
switch (type) {
case NFT_TYPE_U8:
case NFT_TYPE_U16:
case NFT_TYPE_U32:
case NFT_TYPE_U64:
- if (uval > basetype[type].max) {
- errno = ERANGE;
- return -1;
- }
- memcpy(out, &uval, basetype[type].len);
+ uval = strtoll(string, &endptr, base);
+ nft_get_value(type, &uval, out);
break;
case NFT_TYPE_S8:
case NFT_TYPE_S16:
case NFT_TYPE_S32:
case NFT_TYPE_S64:
- if (sval < basetype[type].min ||
- sval > (int64_t)basetype[type].max) {
- errno = ERANGE;
- return -1;
- }
- memcpy(out, &sval, basetype[type].len);
+ sval = strtoull(string, &endptr, base);
+ nft_get_value(type, &sval, out);
break;
+ default:
+ errno = EINVAL;
+ return -1;
+ }
+
+ if (*endptr) {
+ errno = EINVAL;
+ return -1;
}
return 0;