static char cf_rngerr[] = "Number out of range";
+//FIXME: parsers should handle well empty strings, unwanted suffixes etc.
byte *
cf_parse_int(byte *str, int *ptr)
{
return msg;
}
+byte *
+cf_parse_ip(byte *p, u32 *varp)
+{
+ if (!*p)
+ return "Missing IP address";
+ uns x = 0;
+ if (*p == '0' && p[1] | 32 == 'X') {
+ errno = 0;
+ x = strtoul(p + 2, NULL, 16);
+ if (errno == ERANGE || x > 0xffffffff)
+ goto error;
+ }
+ else
+ for (uns i = 0; i < 4; i++) {
+ if (i) {
+ if (*p++ != '.')
+ goto error;
+ }
+ errno = 0;
+ char *p2;
+ uns y = strtoul(p, &p2, 10);
+ p = p2;
+ if (errno == ERANGE || y > 255)
+ goto error;
+ x = (x << 8) + y;
+ }
+ *varp = x;
+ return NULL;
+error:
+ return "Invalid IP address";
+}
+
static byte *
cf_parse_string(byte *str, byte **ptr)
{
{ sizeof(int), cf_parse_int },
{ sizeof(u64), cf_parse_u64 },
{ sizeof(double), cf_parse_double },
+ { sizeof(u32), cf_parse_ip },
{ sizeof(byte*), cf_parse_string }
};
static byte *
interpret_add_list(struct cf_item *item, int number, byte **pars, int *processed, void *ptr, enum operation op)
{
+ if (!number)
+ return "Missing value";
ASSERT(op < OP_REMOVE);
struct cf_section *sec = item->u.sec;
*processed = 0;
switch (item->cls)
{
case CC_STATIC:
+ if (!number)
+ return "Missing value";
taken = MIN(number, item->number);
*processed = taken;
cf_journal_block(ptr, taken * parsers[item->u.type].size);
enum cf_type {
CT_INT, CT_U64, CT_DOUBLE, // number types
+ CT_IP, // IP address
CT_STRING // string type
};
#define CF_DOUBLE(n,p) CF_STATIC(n,p,DOUBLE,double,1)
#define CF_DOUBLE_ARY(n,p,c) CF_STATIC(n,p,DOUBLE,double,c)
#define CF_DOUBLE_DYN(n,p,c) CF_DYNAMIC(n,p,DOUBLE,double,c)
+#define CF_IP(n,p) CF_STATIC(n,p,IP,u32,1)
+#define CF_IP_ARY(n,p,c) CF_STATIC(n,p,IP,u32,c)
+#define CF_IP_DYN(n,p,c) CF_DYNAMIC(n,p,IP,u32,c)
#define CF_STRING(n,p) CF_STATIC(n,p,STRING,byte*,1)
#define CF_STRING_ARY(n,p,c) CF_STATIC(n,p,STRING,byte*,c)
#define CF_STRING_DYN(n,p,c) CF_DYNAMIC(n,p,STRING,byte*,c)
byte *cf_parse_int(byte *str, int *ptr);
byte *cf_parse_u64(byte *str, u64 *ptr);
byte *cf_parse_double(byte *str, double *ptr);
+byte *cf_parse_ip(byte *p, u32 *varp);
#endif