| #ifndef __BOOTENV_H__ |
| #define __BOOTENV_H__ |
| /* |
| * Copyright (c) International Business Machines Corp., 2006 |
| * |
| * This program is free software; you can redistribute it and/or modify |
| * it under the terms of the GNU General Public License as published by |
| * the Free Software Foundation; either version 2 of the License, or |
| * (at your option) any later version. |
| * |
| * This program is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See |
| * the GNU General Public License for more details. |
| * |
| * You should have received a copy of the GNU General Public License |
| * along with this program; if not, write to the Free Software |
| * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
| */ |
| |
| #include <stdio.h> /* FILE */ |
| #include <stdint.h> |
| #include <pfiflash.h> |
| |
| /* DOXYGEN DOCUMENTATION */ |
| |
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
| |
| /** |
| * @file bootenv.h |
| * @author oliloh@de.ibm.com |
| * @version 1.3 |
| * |
| * 1.3 Some renaming |
| */ |
| |
| /** |
| * @mainpage Usage |
| * |
| * @section intro Introduction |
| * This library provides all functionality to handle with the so-called |
| * platform description data (PDD) and the bootparameters defined in |
| * U-Boot. It is able to apply the defined PDD operations in PDD update |
| * scenarios. For more information about the PDD and bootparameter |
| * environment "bootenv" confer the PDD documentation. |
| * |
| * @section ret Return codes |
| * This library defines some return codes which will be delivered classified |
| * as warnings or errors. See the "Defines" section for details and numeric |
| * values. |
| * |
| * @section benv Bootenv format description |
| * There are two different input formats: |
| * - text files |
| * - binary files |
| * |
| * @subsection txt Text Files |
| * Text files have to be specified like: |
| * @verbatim key1=value1,value2,value7\n key2=value55,value1\n key4=value1\n@endverbatim |
| * |
| * @subsection bin Binary files |
| * Binary files have to be specified like: |
| * @verbatim<CRC32-bit>key1=value1,value2,value7\0key2=value55,value1\0... @endverbatim |
| * You can confer the U-Boot documentation for more details. |
| * |
| * @section benvlists Bootenv lists format description. |
| * Values referenced in the preceeding subsection can be |
| * defined like lists: |
| * @verbatim value1,value2,value3 @endverbatim |
| * There are some situation where a conversion of a comma |
| * seperated list can be useful, e.g. to get a list |
| * of defined PDD entries. |
| */ |
| |
| #define BOOTENV_MAXSIZE (1024 * 100) /* max 100kiB space for bootenv */ |
| |
| /** |
| * @def BOOTENV_ECRC |
| * @brief Given binary file is to large. |
| * @def BOOTENV_EFMT |
| * @brief Given bootenv section has an invalid format |
| * @def BOOTENV_EBADENTRY |
| * @brief Bad entry in the bootenv section. |
| * @def BOOTENV_EINVAL |
| * @brief Invalid bootenv defintion. |
| * @def BOOTENV_ENOPDD |
| * @brief Given bootenv sectoin has no PDD defintion string (pdd=...). |
| * @def BOOTENV_EPDDINVAL |
| * @brief Given bootenv section has an invalid PDD defintion. |
| * @def BOOTENV_ENOTIMPL |
| * @brief Functionality not implemented. |
| * @def BOOTENV_ECOPY |
| * @brief Bootenv memory copy error |
| * @def BOOTENV_ENOTFOUND |
| * @brief Given key has has no value. |
| * @def BOOTENV_EMAX |
| * @brief Highest error value. |
| */ |
| #define BOOTENV_ETOOBIG 1 |
| #define BOOTENV_EFMT 2 |
| #define BOOTENV_EBADENTRY 3 |
| #define BOOTENV_EINVAL 4 |
| #define BOOTENV_ENOPDD 5 |
| #define BOOTENV_EPDDINVAL 6 |
| #define BOOTENV_ENOTIMPL 7 |
| #define BOOTENV_ECOPY 8 |
| #define BOOTENV_ENOTFOUND 9 |
| #define BOOTENV_EMAX 10 |
| |
| /** |
| * @def BOOTENV_W |
| * @brief A warning which is handled internally as an error |
| * but can be recovered by manual effort. |
| * @def BOOTENV_WPDD_STRING_DIFFERS |
| * @brief The PDD strings of old and new PDD differ and |
| * can cause update problems, because new PDD values |
| * are removed from the bootenv section completely. |
| */ |
| #define BOOTENV_W 20 |
| #define BOOTENV_WPDD_STRING_DIFFERS 21 |
| #define BOOTENV_WMAX 22 /* highest warning value */ |
| |
| |
| typedef struct bootenv *bootenv_t; |
| /**< A bootenv library handle. */ |
| |
| typedef struct bootenv_list *bootenv_list_t; |
| /**< A handle for a value list. */ |
| |
| typedef int(*pdd_func_t)(bootenv_t, bootenv_t, bootenv_t*, |
| int*, char*, size_t); |
| |
| |
| /** |
| * @brief Get a new handle. |
| * @return 0 |
| * @return or error |
| * */ |
| int bootenv_create(bootenv_t *env); |
| |
| /** |
| * @brief Cleanup structure. |
| * @param env Bootenv structure which shall be destroyed. |
| * @return 0 |
| * @return or error |
| */ |
| int bootenv_destroy(bootenv_t *env); |
| |
| /** |
| * @brief Copy a bootenv handle. |
| * @param in The input bootenv. |
| * @param out The copied output bootenv. Discards old data. |
| * @return 0 |
| * @return or error |
| */ |
| int bootenv_copy_bootenv(bootenv_t in, bootenv_t *out); |
| |
| /** |
| * @brief Looks for a value inside the bootenv data. |
| * @param env Handle to a bootenv structure. |
| * @param key The key. |
| * @return NULL key not found |
| * @return !NULL ptr to value |
| */ |
| int bootenv_get(bootenv_t env, const char *key, const char **value); |
| |
| |
| /** |
| * @brief Looks for a value inside the bootenv data and converts it to num. |
| * @param env Handle to a bootenv structure. |
| * @param key The key. |
| * @param value A pointer to the resulting numerical value |
| * @return NULL key not found |
| * @return !NULL ptr to value |
| */ |
| int bootenv_get_num(bootenv_t env, const char *key, uint32_t *value); |
| |
| /** |
| * @brief Set a bootenv value by key. |
| * @param env Handle to a bootenv structure. |
| * @param key Key. |
| * @param value Value to set. |
| * @return 0 |
| * @return or error |
| */ |
| int bootenv_set(bootenv_t env, const char *key, const char *value); |
| |
| /** |
| * @brief Remove the given key (and its value) from a bootenv structure. |
| * @param env Handle to a bootenv structure. |
| * @param key Key. |
| * @return 0 |
| * @return or error |
| */ |
| int bootenv_unset(bootenv_t env, const char *key); |
| |
| |
| /** |
| * @brief Get a vector of all keys which are currently set |
| * within a bootenv handle. |
| * @param env Handle to a bootenv structure. |
| * @param size The size of the allocated array structure. |
| * @param sort Flag, if set the vector is sorted ascending. |
| * @return NULL on error. |
| * @return !NULL a pointer to the first element the allocated vector. |
| * @warning Free the allocate memory yourself! |
| */ |
| int bootenv_get_key_vector(bootenv_t env, size_t *size, int sort, |
| const char ***vector); |
| |
| /** |
| * @brief Calculate the size in bytes which are necessary to write the |
| * current bootenv section in a *binary file. |
| * @param env bootenv handle. |
| * @param size The size in bytes of the bootenv handle. |
| * @return 0 |
| * @return or ERROR. |
| */ |
| int bootenv_size(bootenv_t env, size_t *size); |
| |
| /** |
| * @brief Read a binary bootenv file. |
| * @param fp File pointer to input stream. |
| * @param env bootenv handle. |
| * @param size maximum data size. |
| * @return 0 |
| * @return or ERROR. |
| */ |
| int bootenv_read(FILE* fp, bootenv_t env, size_t size); |
| |
| /** |
| * @param ret_crc return value of crc of read data |
| */ |
| int bootenv_read_crc(FILE* fp, bootenv_t env, size_t size, uint32_t *ret_crc); |
| |
| /** |
| * @brief Read bootenv data from an text/ascii file. |
| * @param fp File pointer to ascii PDD file. |
| * @param env bootenv handle |
| * @return 0 |
| * @return or ERROR. |
| */ |
| int bootenv_read_txt(FILE* fp, bootenv_t env); |
| |
| /** |
| * @brief Write a bootenv structure to the given location (binary). |
| * @param fp Filepointer to binary file. |
| * @param env Bootenv structure which shall be written. |
| * @return 0 |
| * @return or error |
| */ |
| int bootenv_write(FILE* fp, bootenv_t env); |
| |
| /** |
| * @param ret_crc return value of crc of read data |
| */ |
| int bootenv_write_crc(FILE* fp, bootenv_t env, uint32_t* ret_crc); |
| |
| /** |
| * @brief Write a bootenv structure to the given location (text). |
| * @param fp Filepointer to text file. |
| * @param env Bootenv structure which shall be written. |
| * @return 0 |
| * @return or error |
| */ |
| int bootenv_write_txt(FILE* fp, bootenv_t env); |
| |
| /** |
| * @brief Compare bootenvs using memcmp(). |
| * @param first First bootenv. |
| * @param second Second bootenv. |
| * @return 0 if bootenvs are equal |
| * @return < 0 if error |
| * @return > 0 if unequal |
| */ |
| int bootenv_compare(bootenv_t first, bootenv_t second); |
| |
| /** |
| * @brief Prototype for a PDD handling funtion |
| */ |
| |
| /** |
| * @brief The PDD keep operation. |
| * @param env_old The old bootenv structure. |
| * @param env_new The new bootenv structure. |
| * @param env_res The result of PDD keep. |
| * @param warnings A flag which marks any warnings. |
| * @return 0 |
| * @return or error |
| * @note For a complete documentation about the algorithm confer the |
| * PDD documentation. |
| */ |
| int bootenv_pdd_keep(bootenv_t env_old, bootenv_t env_new, |
| bootenv_t *env_res, int *warnings, |
| char *err_buf, size_t err_buf_size); |
| |
| |
| /** |
| * @brief The PDD merge operation. |
| * @param env_old The old bootenv structure. |
| * @param env_new The new bootenv structure. |
| * @param env_res The result of merge-pdd. |
| * @param warnings A flag which marks any warnings. |
| * @return 0 |
| * @return or error |
| * @note For a complete documentation about the algorithm confer the |
| * PDD documentation. |
| */ |
| int bootenv_pdd_merge(bootenv_t env_old, bootenv_t env_new, |
| bootenv_t *env_res, int *warnings, |
| char *err_buf, size_t err_buf_size); |
| |
| /** |
| * @brief The PDD overwrite operation. |
| * @param env_old The old bootenv structure. |
| * @param env_new The new bootenv structure. |
| * @param env_res The result of overwrite-pdd. |
| * @param warnings A flag which marks any warnings. |
| * @return 0 |
| * @return or error |
| * @note For a complete documentation about the algorithm confer the |
| * PDD documentation. |
| */ |
| int bootenv_pdd_overwrite(bootenv_t env_new, |
| bootenv_t env_old, bootenv_t *env_res, int *warnings, |
| char *err_buf, size_t err_buf_size); |
| |
| /** |
| * @brief Dump a bootenv structure to stdout. (Debug) |
| * @param env Handle to a bootenv structure. |
| * @return 0 |
| * @return or error |
| */ |
| int bootenv_dump(bootenv_t env); |
| |
| /** |
| * @brief Validate a bootenv structure. |
| * @param env Handle to a bootenv structure. |
| * @return 0 |
| * @return or error |
| */ |
| int bootenv_valid(bootenv_t env); |
| |
| /** |
| * @brief Create a new bootenv list structure. |
| * @return NULL on error |
| * @return or a new list handle. |
| * @note This structure is used to store values in a list. |
| * A useful addition when handling PDD strings. |
| */ |
| int bootenv_list_create(bootenv_list_t *list); |
| |
| /** |
| * @brief Destroy a bootenv list structure |
| * @param list Handle to a bootenv list structure. |
| * @return 0 |
| * @return or error |
| */ |
| int bootenv_list_destroy(bootenv_list_t *list); |
| |
| /** |
| * @brief Import a list from a comma seperated string |
| * @param list Handle to a bootenv list structure. |
| * @param str Comma seperated string list. |
| * @return 0 |
| * @return or error |
| */ |
| int bootenv_list_import(bootenv_list_t list, const char *str); |
| |
| /** |
| * @brief Export a list to a string of comma seperated values. |
| * @param list Handle to a bootenv list structure. |
| * @return NULL one error |
| * @return or pointer to a newly allocated string. |
| * @warning Free the allocated memory by yourself! |
| */ |
| int bootenv_list_export(bootenv_list_t list, char **string); |
| |
| /** |
| * @brief Add an item to the list. |
| * @param list A handle of a list structure. |
| * @param item An item. |
| * @return 0 |
| * @return or error |
| */ |
| int bootenv_list_add(bootenv_list_t list, const char *item); |
| |
| /** |
| * @brief Remove an item from the list. |
| * @param list A handle of a list structure. |
| * @param item An item. |
| * @return 0 |
| * @return or error |
| */ |
| int bootenv_list_remove(bootenv_list_t list, const char *item); |
| |
| /** |
| * @brief Check if a given item is in a given list. |
| * @param list A handle of a list structure. |
| * @param item An item. |
| * @return 1 Item is in list. |
| * @return 0 Item is not in list. |
| */ |
| int bootenv_list_is_in(bootenv_list_t list, const char *item); |
| |
| |
| /** |
| * @brief Convert a list into a vector of all values inside the list. |
| * @param list Handle to a bootenv structure. |
| * @param size The size of the allocated vector structure. |
| * @return 0 |
| * @return or error |
| * @warning Free the allocate memory yourself! |
| */ |
| int bootenv_list_to_vector(bootenv_list_t list, size_t *size, |
| const char ***vector); |
| |
| /** |
| * @brief Convert a list into a vector of all values inside the list. |
| * @param list Handle to a bootenv structure. |
| * @param size The size of the allocated vector structure. |
| * @return 0 |
| * @return or error |
| * @warning Free the allocate memory yourself! |
| */ |
| int bootenv_list_to_num_vector(bootenv_list_t list, size_t *size, |
| uint32_t **vector); |
| |
| #ifdef __cplusplus |
| } |
| #endif |
| #endif /*__BOOTENV_H__ */ |