12598090bSJoe Hershberger /* 22598090bSJoe Hershberger * (C) Copyright 2012 32598090bSJoe Hershberger * Joe Hershberger, National Instruments, joe.hershberger@ni.com 42598090bSJoe Hershberger * 52598090bSJoe Hershberger * See file CREDITS for list of people who contributed to this 62598090bSJoe Hershberger * project. 72598090bSJoe Hershberger * 82598090bSJoe Hershberger * This program is free software; you can redistribute it and/or 92598090bSJoe Hershberger * modify it under the terms of the GNU General Public License as 102598090bSJoe Hershberger * published by the Free Software Foundation; either version 2 of 112598090bSJoe Hershberger * the License, or (at your option) any later version. 122598090bSJoe Hershberger * 132598090bSJoe Hershberger * This program is distributed in the hope that it will be useful, 142598090bSJoe Hershberger * but WITHOUT ANY WARRANTY; without even the implied warranty of 152598090bSJoe Hershberger * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 162598090bSJoe Hershberger * GNU General Public License for more details. 172598090bSJoe Hershberger * 182598090bSJoe Hershberger * You should have received a copy of the GNU General Public License 192598090bSJoe Hershberger * along with this program; if not, write to the Free Software 202598090bSJoe Hershberger * Foundation, Inc., 59 Temple Place, Suite 330, Boston, 212598090bSJoe Hershberger * MA 02111-1307 USA 222598090bSJoe Hershberger */ 232598090bSJoe Hershberger 242598090bSJoe Hershberger #ifndef __ENV_FLAGS_H__ 252598090bSJoe Hershberger #define __ENV_FLAGS_H__ 262598090bSJoe Hershberger 272598090bSJoe Hershberger enum env_flags_vartype { 282598090bSJoe Hershberger env_flags_vartype_string, 292598090bSJoe Hershberger env_flags_vartype_decimal, 302598090bSJoe Hershberger env_flags_vartype_hex, 312598090bSJoe Hershberger env_flags_vartype_bool, 322598090bSJoe Hershberger #ifdef CONFIG_CMD_NET 332598090bSJoe Hershberger env_flags_vartype_ipaddr, 342598090bSJoe Hershberger env_flags_vartype_macaddr, 352598090bSJoe Hershberger #endif 362598090bSJoe Hershberger env_flags_vartype_end 372598090bSJoe Hershberger }; 382598090bSJoe Hershberger 39267541f7SJoe Hershberger enum env_flags_varaccess { 40267541f7SJoe Hershberger env_flags_varaccess_any, 41267541f7SJoe Hershberger env_flags_varaccess_readonly, 42267541f7SJoe Hershberger env_flags_varaccess_writeonce, 43267541f7SJoe Hershberger env_flags_varaccess_changedefault, 44267541f7SJoe Hershberger env_flags_varaccess_end 45267541f7SJoe Hershberger }; 46267541f7SJoe Hershberger 472598090bSJoe Hershberger #define ENV_FLAGS_VAR ".flags" 482598090bSJoe Hershberger #define ENV_FLAGS_ATTR_MAX_LEN 2 492598090bSJoe Hershberger #define ENV_FLAGS_VARTYPE_LOC 0 50267541f7SJoe Hershberger #define ENV_FLAGS_VARACCESS_LOC 1 512598090bSJoe Hershberger 522598090bSJoe Hershberger #ifndef CONFIG_ENV_FLAGS_LIST_STATIC 532598090bSJoe Hershberger #define CONFIG_ENV_FLAGS_LIST_STATIC "" 542598090bSJoe Hershberger #endif 552598090bSJoe Hershberger 56*1d6cd0a3SJoe Hershberger #ifdef CONFIG_CMD_NET 57*1d6cd0a3SJoe Hershberger #ifdef CONFIG_ENV_OVERWRITE 58*1d6cd0a3SJoe Hershberger #define ETHADDR_FLAGS "ethaddr:ma," 59*1d6cd0a3SJoe Hershberger #else 60*1d6cd0a3SJoe Hershberger #ifdef CONFIG_OVERWRITE_ETHADDR_ONCE 61*1d6cd0a3SJoe Hershberger #define ETHADDR_FLAGS "ethaddr:mc," 62*1d6cd0a3SJoe Hershberger #else 63*1d6cd0a3SJoe Hershberger #define ETHADDR_FLAGS "ethaddr:mo," 64*1d6cd0a3SJoe Hershberger #endif 65*1d6cd0a3SJoe Hershberger #endif 66*1d6cd0a3SJoe Hershberger #else 67*1d6cd0a3SJoe Hershberger #define ETHADDR_FLAGS "" 68*1d6cd0a3SJoe Hershberger #endif 69*1d6cd0a3SJoe Hershberger 70*1d6cd0a3SJoe Hershberger #ifndef CONFIG_ENV_OVERWRITE 71*1d6cd0a3SJoe Hershberger #define SERIAL_FLAGS "serial#:so," 72*1d6cd0a3SJoe Hershberger #else 73*1d6cd0a3SJoe Hershberger #define SERIAL_FLAGS "" 74*1d6cd0a3SJoe Hershberger #endif 75*1d6cd0a3SJoe Hershberger 762598090bSJoe Hershberger #define ENV_FLAGS_LIST_STATIC \ 77*1d6cd0a3SJoe Hershberger ETHADDR_FLAGS \ 78*1d6cd0a3SJoe Hershberger SERIAL_FLAGS \ 792598090bSJoe Hershberger CONFIG_ENV_FLAGS_LIST_STATIC 802598090bSJoe Hershberger 81fffad71bSJoe Hershberger #ifdef CONFIG_CMD_ENV_FLAGS 82fffad71bSJoe Hershberger /* 83fffad71bSJoe Hershberger * Print the whole list of available type flags. 84fffad71bSJoe Hershberger */ 85fffad71bSJoe Hershberger void env_flags_print_vartypes(void); 86fffad71bSJoe Hershberger /* 87267541f7SJoe Hershberger * Print the whole list of available access flags. 88267541f7SJoe Hershberger */ 89267541f7SJoe Hershberger void env_flags_print_varaccess(void); 90267541f7SJoe Hershberger /* 91fffad71bSJoe Hershberger * Return the name of the type. 92fffad71bSJoe Hershberger */ 93fffad71bSJoe Hershberger const char *env_flags_get_vartype_name(enum env_flags_vartype type); 94267541f7SJoe Hershberger /* 95267541f7SJoe Hershberger * Return the name of the access. 96267541f7SJoe Hershberger */ 97267541f7SJoe Hershberger const char *env_flags_get_varaccess_name(enum env_flags_varaccess access); 98fffad71bSJoe Hershberger #endif 99fffad71bSJoe Hershberger 1002598090bSJoe Hershberger /* 1012598090bSJoe Hershberger * Parse the flags string from a .flags attribute list into the vartype enum. 1022598090bSJoe Hershberger */ 1032598090bSJoe Hershberger enum env_flags_vartype env_flags_parse_vartype(const char *flags); 104267541f7SJoe Hershberger /* 105267541f7SJoe Hershberger * Parse the flags string from a .flags attribute list into the varaccess enum. 106267541f7SJoe Hershberger */ 107267541f7SJoe Hershberger enum env_flags_varaccess env_flags_parse_varaccess(const char *flags); 108267541f7SJoe Hershberger /* 109267541f7SJoe Hershberger * Parse the binary flags from a hash table entry into the varaccess enum. 110267541f7SJoe Hershberger */ 111267541f7SJoe Hershberger enum env_flags_varaccess env_flags_parse_varaccess_from_binflags(int binflags); 1122598090bSJoe Hershberger 11330fd4fadSJoe Hershberger #ifdef USE_HOSTCC 11430fd4fadSJoe Hershberger /* 11530fd4fadSJoe Hershberger * Look up the type of a variable directly from the .flags var. 11630fd4fadSJoe Hershberger */ 11730fd4fadSJoe Hershberger enum env_flags_vartype env_flags_get_type(const char *name); 11830fd4fadSJoe Hershberger /* 119267541f7SJoe Hershberger * Look up the access of a variable directly from the .flags var. 120267541f7SJoe Hershberger */ 121267541f7SJoe Hershberger enum env_flags_varaccess env_flags_get_access(const char *name); 122267541f7SJoe Hershberger /* 12330fd4fadSJoe Hershberger * Validate the newval for its type to conform with the requirements defined by 12430fd4fadSJoe Hershberger * its flags (directly looked at the .flags var). 12530fd4fadSJoe Hershberger */ 12630fd4fadSJoe Hershberger int env_flags_validate_type(const char *name, const char *newval); 12730fd4fadSJoe Hershberger /* 128267541f7SJoe Hershberger * Validate the newval for its access to conform with the requirements defined 129267541f7SJoe Hershberger * by its flags (directly looked at the .flags var). 130267541f7SJoe Hershberger */ 131267541f7SJoe Hershberger int env_flags_validate_access(const char *name, int check_mask); 132267541f7SJoe Hershberger /* 133267541f7SJoe Hershberger * Validate that the proposed access to variable "name" is valid according to 134267541f7SJoe Hershberger * the defined flags for that variable, if any. 135267541f7SJoe Hershberger */ 136267541f7SJoe Hershberger int env_flags_validate_varaccess(const char *name, int check_mask); 137267541f7SJoe Hershberger /* 13830fd4fadSJoe Hershberger * Validate the parameters passed to "env set" for type compliance 13930fd4fadSJoe Hershberger */ 14030fd4fadSJoe Hershberger int env_flags_validate_env_set_params(int argc, char * const argv[]); 14130fd4fadSJoe Hershberger 14230fd4fadSJoe Hershberger #else /* !USE_HOSTCC */ 14330fd4fadSJoe Hershberger 1442598090bSJoe Hershberger #include <search.h> 1452598090bSJoe Hershberger 1462598090bSJoe Hershberger /* 1472598090bSJoe Hershberger * When adding a variable to the environment, initialize the flags for that 1482598090bSJoe Hershberger * variable. 1492598090bSJoe Hershberger */ 1502598090bSJoe Hershberger void env_flags_init(ENTRY *var_entry); 1512598090bSJoe Hershberger 1522598090bSJoe Hershberger /* 1532598090bSJoe Hershberger * Validate the newval for to conform with the requirements defined by its flags 1542598090bSJoe Hershberger */ 1552598090bSJoe Hershberger int env_flags_validate(const ENTRY *item, const char *newval, enum env_op op, 1562598090bSJoe Hershberger int flag); 1572598090bSJoe Hershberger 158267541f7SJoe Hershberger #endif /* USE_HOSTCC */ 159267541f7SJoe Hershberger 1602598090bSJoe Hershberger /* 1612598090bSJoe Hershberger * These are the binary flags used in the environment entry->flags variable to 1622598090bSJoe Hershberger * decribe properties of veriables in the table 1632598090bSJoe Hershberger */ 1642598090bSJoe Hershberger #define ENV_FLAGS_VARTYPE_BIN_MASK 0x00000007 1652598090bSJoe Hershberger /* The actual variable type values use the enum value (within the mask) */ 166267541f7SJoe Hershberger #define ENV_FLAGS_VARACCESS_PREVENT_DELETE 0x00000008 167267541f7SJoe Hershberger #define ENV_FLAGS_VARACCESS_PREVENT_CREATE 0x00000010 168267541f7SJoe Hershberger #define ENV_FLAGS_VARACCESS_PREVENT_OVERWR 0x00000020 169267541f7SJoe Hershberger #define ENV_FLAGS_VARACCESS_PREVENT_NONDEF_OVERWR 0x00000040 170267541f7SJoe Hershberger #define ENV_FLAGS_VARACCESS_BIN_MASK 0x00000078 17130fd4fadSJoe Hershberger 1722598090bSJoe Hershberger #endif /* __ENV_FLAGS_H__ */ 173