/* * Based on the declared type enum, validate that the value string complies * with that format */ static int _env_flags_validate_type(const char *value, enum env_flags_vartype type) { const char *end; #ifdef CONFIG_CMD_NET const char *cur; int i; #endif switch (type) { case env_flags_vartype_string: break; case env_flags_vartype_decimal: skip_num(0, value, &end, -1); if (*end != '\0') return -1; break; case env_flags_vartype_hex: skip_num(1, value, &end, -1); if (*end != '\0') return -1; if (value + 2 == end && is_hex_prefix(value)) return -1; break; case env_flags_vartype_bool: if (value[0] != '1' && value[0] != 'y' && value[0] != 't' && value[0] != 'Y' && value[0] != 'T' && value[0] != '0' && value[0] != 'n' && value[0] != 'f' && value[0] != 'N' && value[0] != 'F') return -1; if (value[1] != '\0') return -1; break; #ifdef CONFIG_CMD_NET case env_flags_vartype_ipaddr: cur = value; for (i = 0; i < 4; i++) { skip_num(0, cur, &end, 3); if (cur == end) return -1; if (i != 3 && *end != '.') return -1; if (i == 3 && *end != '\0') return -1; cur = end + 1; } break; case env_flags_vartype_macaddr: if (eth_validate_ethaddr_str(value)) return -1; break; #endif case env_flags_vartype_end: return -1; } /* OK */ return 0; }
static void skip_num(int hex, const char *value, const char **end, int max_digits) { int i; if (hex && is_hex_prefix(value)) value += 2; for (i = max_digits; i != 0; i--) { if (hex && !isxdigit(*value)) break; if (!hex && !isdigit(*value)) break; value++; } if (end != NULL) *end = value; }
int eth_validate_ethaddr_str(const char *addr) { const char *end; const char *cur; int i; cur = addr; for (i = 0; i < 6; i++) { skip_num(1, cur, &end, 2); if (cur == end) return -1; if (cur + 2 == end && is_hex_prefix(cur)) return -1; if (i != 5 && *end != ':') return -1; if (i == 5 && *end != '\0') return -1; cur = end + 1; } return 0; }