blob: 8fecdbf41797ddeb53fc7593453a8cebfb6e9d3e [file] [log] [blame]
#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__ */