1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * (C) Copyright 2012 3*4882a593Smuzhiyun * Joe Hershberger, National Instruments, joe.hershberger@ni.com 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * SPDX-License-Identifier: GPL-2.0+ 6*4882a593Smuzhiyun */ 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun #ifndef __ENV_FLAGS_H__ 9*4882a593Smuzhiyun #define __ENV_FLAGS_H__ 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun enum env_flags_vartype { 12*4882a593Smuzhiyun env_flags_vartype_string, 13*4882a593Smuzhiyun env_flags_vartype_decimal, 14*4882a593Smuzhiyun env_flags_vartype_hex, 15*4882a593Smuzhiyun env_flags_vartype_bool, 16*4882a593Smuzhiyun #ifdef CONFIG_CMD_NET 17*4882a593Smuzhiyun env_flags_vartype_ipaddr, 18*4882a593Smuzhiyun env_flags_vartype_macaddr, 19*4882a593Smuzhiyun #endif 20*4882a593Smuzhiyun env_flags_vartype_end 21*4882a593Smuzhiyun }; 22*4882a593Smuzhiyun 23*4882a593Smuzhiyun enum env_flags_varaccess { 24*4882a593Smuzhiyun env_flags_varaccess_any, 25*4882a593Smuzhiyun env_flags_varaccess_readonly, 26*4882a593Smuzhiyun env_flags_varaccess_writeonce, 27*4882a593Smuzhiyun env_flags_varaccess_changedefault, 28*4882a593Smuzhiyun env_flags_varaccess_end 29*4882a593Smuzhiyun }; 30*4882a593Smuzhiyun 31*4882a593Smuzhiyun #define ENV_FLAGS_VAR ".flags" 32*4882a593Smuzhiyun #define ENV_FLAGS_ATTR_MAX_LEN 2 33*4882a593Smuzhiyun #define ENV_FLAGS_VARTYPE_LOC 0 34*4882a593Smuzhiyun #define ENV_FLAGS_VARACCESS_LOC 1 35*4882a593Smuzhiyun 36*4882a593Smuzhiyun #ifndef CONFIG_ENV_FLAGS_LIST_STATIC 37*4882a593Smuzhiyun #define CONFIG_ENV_FLAGS_LIST_STATIC "" 38*4882a593Smuzhiyun #endif 39*4882a593Smuzhiyun 40*4882a593Smuzhiyun #ifdef CONFIG_CMD_NET 41*4882a593Smuzhiyun #ifdef CONFIG_REGEX 42*4882a593Smuzhiyun #define ETHADDR_WILDCARD "\\d?" 43*4882a593Smuzhiyun #else 44*4882a593Smuzhiyun #define ETHADDR_WILDCARD 45*4882a593Smuzhiyun #endif 46*4882a593Smuzhiyun #ifdef CONFIG_ENV_OVERWRITE 47*4882a593Smuzhiyun #define ETHADDR_FLAGS "eth" ETHADDR_WILDCARD "addr:ma," 48*4882a593Smuzhiyun #else 49*4882a593Smuzhiyun #ifdef CONFIG_OVERWRITE_ETHADDR_ONCE 50*4882a593Smuzhiyun #define ETHADDR_FLAGS "eth" ETHADDR_WILDCARD "addr:mc," 51*4882a593Smuzhiyun #else 52*4882a593Smuzhiyun #define ETHADDR_FLAGS "eth" ETHADDR_WILDCARD "addr:mo," 53*4882a593Smuzhiyun #endif 54*4882a593Smuzhiyun #endif 55*4882a593Smuzhiyun #define NET_FLAGS \ 56*4882a593Smuzhiyun "ipaddr:i," \ 57*4882a593Smuzhiyun "gatewayip:i," \ 58*4882a593Smuzhiyun "netmask:i," \ 59*4882a593Smuzhiyun "serverip:i," \ 60*4882a593Smuzhiyun "nvlan:d," \ 61*4882a593Smuzhiyun "vlan:d," \ 62*4882a593Smuzhiyun "dnsip:i," 63*4882a593Smuzhiyun #else 64*4882a593Smuzhiyun #define ETHADDR_FLAGS 65*4882a593Smuzhiyun #define NET_FLAGS 66*4882a593Smuzhiyun #endif 67*4882a593Smuzhiyun 68*4882a593Smuzhiyun #ifndef CONFIG_ENV_OVERWRITE 69*4882a593Smuzhiyun #define SERIAL_FLAGS "serial#:so," 70*4882a593Smuzhiyun #else 71*4882a593Smuzhiyun #define SERIAL_FLAGS "" 72*4882a593Smuzhiyun #endif 73*4882a593Smuzhiyun 74*4882a593Smuzhiyun #define ENV_FLAGS_LIST_STATIC \ 75*4882a593Smuzhiyun ETHADDR_FLAGS \ 76*4882a593Smuzhiyun NET_FLAGS \ 77*4882a593Smuzhiyun SERIAL_FLAGS \ 78*4882a593Smuzhiyun CONFIG_ENV_FLAGS_LIST_STATIC 79*4882a593Smuzhiyun 80*4882a593Smuzhiyun #ifdef CONFIG_CMD_ENV_FLAGS 81*4882a593Smuzhiyun /* 82*4882a593Smuzhiyun * Print the whole list of available type flags. 83*4882a593Smuzhiyun */ 84*4882a593Smuzhiyun void env_flags_print_vartypes(void); 85*4882a593Smuzhiyun /* 86*4882a593Smuzhiyun * Print the whole list of available access flags. 87*4882a593Smuzhiyun */ 88*4882a593Smuzhiyun void env_flags_print_varaccess(void); 89*4882a593Smuzhiyun /* 90*4882a593Smuzhiyun * Return the name of the type. 91*4882a593Smuzhiyun */ 92*4882a593Smuzhiyun const char *env_flags_get_vartype_name(enum env_flags_vartype type); 93*4882a593Smuzhiyun /* 94*4882a593Smuzhiyun * Return the name of the access. 95*4882a593Smuzhiyun */ 96*4882a593Smuzhiyun const char *env_flags_get_varaccess_name(enum env_flags_varaccess access); 97*4882a593Smuzhiyun #endif 98*4882a593Smuzhiyun 99*4882a593Smuzhiyun /* 100*4882a593Smuzhiyun * Parse the flags string from a .flags attribute list into the vartype enum. 101*4882a593Smuzhiyun */ 102*4882a593Smuzhiyun enum env_flags_vartype env_flags_parse_vartype(const char *flags); 103*4882a593Smuzhiyun /* 104*4882a593Smuzhiyun * Parse the flags string from a .flags attribute list into the varaccess enum. 105*4882a593Smuzhiyun */ 106*4882a593Smuzhiyun enum env_flags_varaccess env_flags_parse_varaccess(const char *flags); 107*4882a593Smuzhiyun /* 108*4882a593Smuzhiyun * Parse the binary flags from a hash table entry into the varaccess enum. 109*4882a593Smuzhiyun */ 110*4882a593Smuzhiyun enum env_flags_varaccess env_flags_parse_varaccess_from_binflags(int binflags); 111*4882a593Smuzhiyun 112*4882a593Smuzhiyun #ifdef CONFIG_CMD_NET 113*4882a593Smuzhiyun /* 114*4882a593Smuzhiyun * Check if a string has the format of an Ethernet MAC address 115*4882a593Smuzhiyun */ 116*4882a593Smuzhiyun int eth_validate_ethaddr_str(const char *addr); 117*4882a593Smuzhiyun #endif 118*4882a593Smuzhiyun 119*4882a593Smuzhiyun #ifdef USE_HOSTCC 120*4882a593Smuzhiyun /* 121*4882a593Smuzhiyun * Look up the type of a variable directly from the .flags var. 122*4882a593Smuzhiyun */ 123*4882a593Smuzhiyun enum env_flags_vartype env_flags_get_type(const char *name); 124*4882a593Smuzhiyun /* 125*4882a593Smuzhiyun * Look up the access of a variable directly from the .flags var. 126*4882a593Smuzhiyun */ 127*4882a593Smuzhiyun enum env_flags_varaccess env_flags_get_access(const char *name); 128*4882a593Smuzhiyun /* 129*4882a593Smuzhiyun * Validate the newval for its type to conform with the requirements defined by 130*4882a593Smuzhiyun * its flags (directly looked at the .flags var). 131*4882a593Smuzhiyun */ 132*4882a593Smuzhiyun int env_flags_validate_type(const char *name, const char *newval); 133*4882a593Smuzhiyun /* 134*4882a593Smuzhiyun * Validate the newval for its access to conform with the requirements defined 135*4882a593Smuzhiyun * by its flags (directly looked at the .flags var). 136*4882a593Smuzhiyun */ 137*4882a593Smuzhiyun int env_flags_validate_access(const char *name, int check_mask); 138*4882a593Smuzhiyun /* 139*4882a593Smuzhiyun * Validate that the proposed access to variable "name" is valid according to 140*4882a593Smuzhiyun * the defined flags for that variable, if any. 141*4882a593Smuzhiyun */ 142*4882a593Smuzhiyun int env_flags_validate_varaccess(const char *name, int check_mask); 143*4882a593Smuzhiyun /* 144*4882a593Smuzhiyun * Validate the parameters passed to "env set" for type compliance 145*4882a593Smuzhiyun */ 146*4882a593Smuzhiyun int env_flags_validate_env_set_params(char *name, char *const val[], int count); 147*4882a593Smuzhiyun 148*4882a593Smuzhiyun #else /* !USE_HOSTCC */ 149*4882a593Smuzhiyun 150*4882a593Smuzhiyun #include <search.h> 151*4882a593Smuzhiyun 152*4882a593Smuzhiyun /* 153*4882a593Smuzhiyun * When adding a variable to the environment, initialize the flags for that 154*4882a593Smuzhiyun * variable. 155*4882a593Smuzhiyun */ 156*4882a593Smuzhiyun void env_flags_init(ENTRY *var_entry); 157*4882a593Smuzhiyun 158*4882a593Smuzhiyun /* 159*4882a593Smuzhiyun * Validate the newval for to conform with the requirements defined by its flags 160*4882a593Smuzhiyun */ 161*4882a593Smuzhiyun int env_flags_validate(const ENTRY *item, const char *newval, enum env_op op, 162*4882a593Smuzhiyun int flag); 163*4882a593Smuzhiyun 164*4882a593Smuzhiyun #endif /* USE_HOSTCC */ 165*4882a593Smuzhiyun 166*4882a593Smuzhiyun /* 167*4882a593Smuzhiyun * These are the binary flags used in the environment entry->flags variable to 168*4882a593Smuzhiyun * decribe properties of veriables in the table 169*4882a593Smuzhiyun */ 170*4882a593Smuzhiyun #define ENV_FLAGS_VARTYPE_BIN_MASK 0x00000007 171*4882a593Smuzhiyun /* The actual variable type values use the enum value (within the mask) */ 172*4882a593Smuzhiyun #define ENV_FLAGS_VARACCESS_PREVENT_DELETE 0x00000008 173*4882a593Smuzhiyun #define ENV_FLAGS_VARACCESS_PREVENT_CREATE 0x00000010 174*4882a593Smuzhiyun #define ENV_FLAGS_VARACCESS_PREVENT_OVERWR 0x00000020 175*4882a593Smuzhiyun #define ENV_FLAGS_VARACCESS_PREVENT_NONDEF_OVERWR 0x00000040 176*4882a593Smuzhiyun #define ENV_FLAGS_VARACCESS_BIN_MASK 0x00000078 177*4882a593Smuzhiyun 178*4882a593Smuzhiyun #endif /* __ENV_FLAGS_H__ */ 179