diff options
Diffstat (limited to 'ubi-utils/include')
| -rw-r--r-- | ubi-utils/include/libiniparser.h | 280 | ||||
| -rw-r--r-- | ubi-utils/include/libubi.h | 340 | ||||
| -rw-r--r-- | ubi-utils/include/libubigen.h | 109 | 
3 files changed, 729 insertions, 0 deletions
diff --git a/ubi-utils/include/libiniparser.h b/ubi-utils/include/libiniparser.h new file mode 100644 index 0000000..be3c667 --- /dev/null +++ b/ubi-utils/include/libiniparser.h @@ -0,0 +1,280 @@ + +/*-------------------------------------------------------------------------*/ +/** +   @file    iniparser.h +   @author  N. Devillard +   @date    Sep 2007 +   @version 3.0 +   @brief   Parser for ini files. +*/ +/*--------------------------------------------------------------------------*/ + +/* +	$Id: iniparser.h,v 1.24 2007-11-23 21:38:19 ndevilla Exp $ +	$Revision: 1.24 $ +*/ + +#ifndef _INIPARSER_H_ +#define _INIPARSER_H_ + +/*--------------------------------------------------------------------------- +   								Includes + ---------------------------------------------------------------------------*/ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +/* + * The following #include is necessary on many Unixes but not Linux. + * It is not needed for Windows platforms. + * Uncomment it if needed. + */ +/* #include <unistd.h> */ + +#include "dictionary.h" + +/*--------------------------------------------------------------------------- +   								Macros + ---------------------------------------------------------------------------*/ +/** For backwards compatibility only */ +#define iniparser_getstr(d, k)  iniparser_getstring(d, k, NULL) +#define iniparser_setstr        iniparser_setstring + +/*-------------------------------------------------------------------------*/ +/** +  @brief    Get number of sections in a dictionary +  @param    d   Dictionary to examine +  @return   int Number of sections found in dictionary + +  This function returns the number of sections found in a dictionary. +  The test to recognize sections is done on the string stored in the +  dictionary: a section name is given as "section" whereas a key is +  stored as "section:key", thus the test looks for entries that do not +  contain a colon. + +  This clearly fails in the case a section name contains a colon, but +  this should simply be avoided. + +  This function returns -1 in case of error. + */ +/*--------------------------------------------------------------------------*/ + +int iniparser_getnsec(dictionary * d); + + +/*-------------------------------------------------------------------------*/ +/** +  @brief    Get name for section n in a dictionary. +  @param    d   Dictionary to examine +  @param    n   Section number (from 0 to nsec-1). +  @return   Pointer to char string + +  This function locates the n-th section in a dictionary and returns +  its name as a pointer to a string statically allocated inside the +  dictionary. Do not free or modify the returned string! + +  This function returns NULL in case of error. + */ +/*--------------------------------------------------------------------------*/ + +char * iniparser_getsecname(dictionary * d, int n); + + +/*-------------------------------------------------------------------------*/ +/** +  @brief    Save a dictionary to a loadable ini file +  @param    d   Dictionary to dump +  @param    f   Opened file pointer to dump to +  @return   void + +  This function dumps a given dictionary into a loadable ini file. +  It is Ok to specify @c stderr or @c stdout as output files. + */ +/*--------------------------------------------------------------------------*/ + +void iniparser_dump_ini(dictionary * d, FILE * f); + +/*-------------------------------------------------------------------------*/ +/** +  @brief    Dump a dictionary to an opened file pointer. +  @param    d   Dictionary to dump. +  @param    f   Opened file pointer to dump to. +  @return   void + +  This function prints out the contents of a dictionary, one element by +  line, onto the provided file pointer. It is OK to specify @c stderr +  or @c stdout as output files. This function is meant for debugging +  purposes mostly. + */ +/*--------------------------------------------------------------------------*/ +void iniparser_dump(dictionary * d, FILE * f); + +/*-------------------------------------------------------------------------*/ +/** +  @brief    Get the string associated to a key +  @param    d       Dictionary to search +  @param    key     Key string to look for +  @param    def     Default value to return if key not found. +  @return   pointer to statically allocated character string + +  This function queries a dictionary for a key. A key as read from an +  ini file is given as "section:key". If the key cannot be found, +  the pointer passed as 'def' is returned. +  The returned char pointer is pointing to a string allocated in +  the dictionary, do not free or modify it. + */ +/*--------------------------------------------------------------------------*/ +char * iniparser_getstring(dictionary * d, const char * key, char * def); + +/*-------------------------------------------------------------------------*/ +/** +  @brief    Get the string associated to a key, convert to an int +  @param    d Dictionary to search +  @param    key Key string to look for +  @param    notfound Value to return in case of error +  @return   integer + +  This function queries a dictionary for a key. A key as read from an +  ini file is given as "section:key". If the key cannot be found, +  the notfound value is returned. + +  Supported values for integers include the usual C notation +  so decimal, octal (starting with 0) and hexadecimal (starting with 0x) +  are supported. Examples: + +  - "42"      ->  42 +  - "042"     ->  34 (octal -> decimal) +  - "0x42"    ->  66 (hexa  -> decimal) + +  Warning: the conversion may overflow in various ways. Conversion is +  totally outsourced to strtol(), see the associated man page for overflow +  handling. + +  Credits: Thanks to A. Becker for suggesting strtol() + */ +/*--------------------------------------------------------------------------*/ +int iniparser_getint(dictionary * d, const char * key, int notfound); + +/*-------------------------------------------------------------------------*/ +/** +  @brief    Get the string associated to a key, convert to a double +  @param    d Dictionary to search +  @param    key Key string to look for +  @param    notfound Value to return in case of error +  @return   double + +  This function queries a dictionary for a key. A key as read from an +  ini file is given as "section:key". If the key cannot be found, +  the notfound value is returned. + */ +/*--------------------------------------------------------------------------*/ +double iniparser_getdouble(dictionary * d, char * key, double notfound); + +/*-------------------------------------------------------------------------*/ +/** +  @brief    Get the string associated to a key, convert to a boolean +  @param    d Dictionary to search +  @param    key Key string to look for +  @param    notfound Value to return in case of error +  @return   integer + +  This function queries a dictionary for a key. A key as read from an +  ini file is given as "section:key". If the key cannot be found, +  the notfound value is returned. + +  A true boolean is found if one of the following is matched: + +  - A string starting with 'y' +  - A string starting with 'Y' +  - A string starting with 't' +  - A string starting with 'T' +  - A string starting with '1' + +  A false boolean is found if one of the following is matched: + +  - A string starting with 'n' +  - A string starting with 'N' +  - A string starting with 'f' +  - A string starting with 'F' +  - A string starting with '0' + +  The notfound value returned if no boolean is identified, does not +  necessarily have to be 0 or 1. + */ +/*--------------------------------------------------------------------------*/ +int iniparser_getboolean(dictionary * d, const char * key, int notfound); + + +/*-------------------------------------------------------------------------*/ +/** +  @brief    Set an entry in a dictionary. +  @param    ini     Dictionary to modify. +  @param    entry   Entry to modify (entry name) +  @param    val     New value to associate to the entry. +  @return   int 0 if Ok, -1 otherwise. + +  If the given entry can be found in the dictionary, it is modified to +  contain the provided value. If it cannot be found, -1 is returned. +  It is Ok to set val to NULL. + */ +/*--------------------------------------------------------------------------*/ +int iniparser_setstring(dictionary * ini, char * entry, char * val); + + +/*-------------------------------------------------------------------------*/ +/** +  @brief    Delete an entry in a dictionary +  @param    ini     Dictionary to modify +  @param    entry   Entry to delete (entry name) +  @return   void + +  If the given entry can be found, it is deleted from the dictionary. + */ +/*--------------------------------------------------------------------------*/ +void iniparser_unset(dictionary * ini, char * entry); + +/*-------------------------------------------------------------------------*/ +/** +  @brief    Finds out if a given entry exists in a dictionary +  @param    ini     Dictionary to search +  @param    entry   Name of the entry to look for +  @return   integer 1 if entry exists, 0 otherwise + +  Finds out if a given entry exists in the dictionary. Since sections +  are stored as keys with NULL associated values, this is the only way +  of querying for the presence of sections in a dictionary. + */ +/*--------------------------------------------------------------------------*/ +int iniparser_find_entry(dictionary * ini, char * entry) ; + +/*-------------------------------------------------------------------------*/ +/** +  @brief    Parse an ini file and return an allocated dictionary object +  @param    ininame Name of the ini file to read. +  @return   Pointer to newly allocated dictionary + +  This is the parser for ini files. This function is called, providing +  the name of the file to be read. It returns a dictionary object that +  should not be accessed directly, but through accessor functions +  instead. + +  The returned dictionary must be freed using iniparser_freedict(). + */ +/*--------------------------------------------------------------------------*/ +dictionary * iniparser_load(const char * ininame); + +/*-------------------------------------------------------------------------*/ +/** +  @brief    Free all memory associated to an ini dictionary +  @param    d Dictionary to free +  @return   void + +  Free all memory associated to an ini dictionary. +  It is mandatory to call this function before the dictionary object +  gets out of the current context. + */ +/*--------------------------------------------------------------------------*/ +void iniparser_freedict(dictionary * d); + +#endif diff --git a/ubi-utils/include/libubi.h b/ubi-utils/include/libubi.h new file mode 100644 index 0000000..0cdb67c --- /dev/null +++ b/ubi-utils/include/libubi.h @@ -0,0 +1,340 @@ +/* + * 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. + * + * Author: Artem B. Bityutskiy + * + * UBI (Unsorted Block Images) library. + */ + +#ifndef __LIBUBI_H__ +#define __LIBUBI_H__ + +#include <stdint.h> +#include <mtd/ubi-user.h> +#include <ctype.h> +#include <mtd/ubi-header.h> + +#ifdef __cplusplus +extern "C" { +#endif + +/* UBI version libubi is made for */ +#define LIBUBI_UBI_VERSION 1 + +/* UBI library descriptor */ +typedef void * libubi_t; + +/** + * struct ubi_attach_request - MTD device attachement request. + * @dev_num: number to assigne to the newly created UBI device + *           (%UBI_DEV_NUM_AUTO should be used to automatically assign the + *           number) + * @mtd_num: MTD device number to attach + * @vid_hdr_offset: VID header offset (%0 means default offset and this is what + *                  most of the users want) + */ +struct ubi_attach_request +{ +	int dev_num; +	int mtd_num; +	int vid_hdr_offset; +}; + +/** + * struct ubi_mkvol_request - volume creation request. + * @vol_id: ID to assign to the new volume (%UBI_VOL_NUM_AUTO should be used to + *          automatically assign ID) + * @alignment: volume alignment + * @bytes: volume size in bytes + * @vol_type: volume type (%UBI_DYNAMIC_VOLUME or %UBI_STATIC_VOLUME) + * @name: volume name + */ +struct ubi_mkvol_request +{ +	int vol_id; +	int alignment; +	long long bytes; +	int vol_type; +	const char *name; +}; + +/** + * struct ubi_info - general UBI information. + * @dev_count: count of UBI devices in system + * @lowest_dev_num: lowest UBI device number + * @highest_dev_num: highest UBI device number + * @version: UBI version + * @ctrl_major: major number of the UBI control device + * @ctrl_minor: minor number of the UBI control device + */ +struct ubi_info +{ +	int dev_count; +	int lowest_dev_num; +	int highest_dev_num; +	int version; +	int ctrl_major; +	int ctrl_minor; +}; + +/** + * struct ubi_dev_info - UBI device information. + * @vol_count: count of volumes on this UBI device + * @lowest_vol_num: lowest volume number + * @highest_vol_num: highest volume number + * @major: major number of corresponding character device + * @minor: minor number of corresponding character device + * @total_lebs: total number of logical eraseblocks on this UBI device + * @avail_lebs: how many logical eraseblocks are not used and available for new + *             volumes + * @total_bytes: @total_lebs * @leb_size + * @avail_bytes: @avail_lebs * @leb_size + * @bad_count: count of bad physical eraseblocks + * @leb_size: logical eraseblock size + * @max_ec: current highest erase counter value + * @bad_rsvd: how many physical eraseblocks of the underlying flash device are + *            reserved for bad eraseblocks handling + * @max_vol_count: maximum possible number of volumes on this UBI device + * @min_io_size: minimum input/output unit size of the UBI device + */ +struct ubi_dev_info +{ +	int dev_num; +	int vol_count; +	int lowest_vol_num; +	int highest_vol_num; +	int major; +	int minor; +	int total_lebs; +	int avail_lebs; +	long long total_bytes; +	long long avail_bytes; +	int bad_count; +	int leb_size; +	long long max_ec; +	int bad_rsvd; +	int max_vol_count; +	int min_io_size; +}; + +/** + * struct ubi_vol_info - UBI volume information. + * @dev_num: UBI device number the volume resides on + * @vol_id: ID of this volume + * @major: major number of corresponding volume character device + * @minor: minor number of corresponding volume character device + * @dev_major: major number of corresponding UBI device character device + * @dev_minor: minor number of corresponding UBI device character device + * @type: volume type (%UBI_DYNAMIC_VOLUME or %UBI_STATIC_VOLUME) + * @alignment: alignemnt of this volume + * @data_bytes: how many data bytes are stored on this volume (equivalent to + *              @rsvd_bytes for dynamic volumes) + * @rsvd_bytes: how many bytes are reserved for this volume + * @rsvd_lebs: how many logical eraseblocks are reserved for this volume + * @leb_size: logical eraseblock size of this volume (may be less then + *           device's logical eraseblock size due to alignment) + * @corrupted: non-zero if the volume is corrupted + * @name: volume name (null-terminated) + */ +struct ubi_vol_info +{ +	int dev_num; +	int vol_id; +	int major; +	int minor; +	int dev_major; +	int dev_minor; +	int type; +	int alignment; +	long long data_bytes; +	long long rsvd_bytes; +	int rsvd_lebs; +	int leb_size; +	int corrupted; +	char name[UBI_VOL_NAME_MAX + 1]; +}; + +/** + * libubi_open - open UBI library. + * This function initializes and opens the UBI library and returns UBI library + * descriptor in case of success and %NULL in case of failure. + */ +libubi_t libubi_open(void); + +/** + * libubi_close - close UBI library. + * @desc UBI library descriptor + */ +void libubi_close(libubi_t desc); + +/** + * ubi_get_info - get general UBI information. + * @desc: UBI library descriptor + * @info: pointer to the &struct ubi_info object to fill + * + * This function fills the passed @info object with general UBI information and + * returns %0 in case of success and %-1 in case of failure. + */ +int ubi_get_info(libubi_t desc, struct ubi_info *info); + +/** + * ubi_attach_mtd - attach MTD device to UBI. + * @desc: UBI library descriptor + * @node: name of the UBI control character device node + * @req: MTD attach request. + * + * This function creates a new UBI device by attaching an MTD device as + * described by @req. Returns %0 in case of success and %-1 in case of failure. + * The newly created UBI device number is returned in @req->dev_num. + */ +int ubi_attach_mtd(libubi_t desc, const char *node, +		   struct ubi_attach_request *req); + +/** + * ubi_detach_mtd - detach an MTD device. + * @desc: UBI library descriptor + * @node: name of the UBI control character device node + * @mtd_num: MTD device number to detach + * + * This function detaches MTD device number @mtd_num from UBI, which means the + * corresponding UBI device is removed. Returns zero in case of success and %-1 + * in case of failure. + */ +int ubi_detach_mtd(libubi_t desc, const char *node, int mtd_num); + +/** + * ubi_remove_dev - remove an UBI device. + * @desc: UBI library descriptor + * @node: name of the UBI control character device node + * @ubi_dev: UBI device number to remove + * + * This function removes UBI device number @ubi_dev and returns zero in case of + * success and %-1 in case of failure. + */ +int ubi_remove_dev(libubi_t desc, const char *node, int ubi_dev); + +/** + * ubi_mkvol - create an UBI volume. + * @desc: UBI library descriptor + * @node: name of the UBI character device to create a volume at + * @req: UBI volume creation request + * + * This function creates a UBI volume as described at @req and returns %0 in + * case of success and %-1 in case of failure. The assigned volume ID is + * returned in @req->vol_id. + */ +int ubi_mkvol(libubi_t desc, const char *node, struct ubi_mkvol_request *req); + +/** + * ubi_rmvol - remove a UBI volume. + * @desc: UBI library descriptor + * @node: name of the UBI character device to remove a volume from + * @vol_id: ID of the volume to remove + * + * This function removes volume @vol_id from UBI device @node and returns %0 in + * case of success and %-1 in case of failure. + */ +int ubi_rmvol(libubi_t desc, const char *node, int vol_id); + +/** + * ubi_rsvol - re-size UBI volume. + * @desc: UBI library descriptor + * @node: name of the UBI character device owning the volume which should be + *        re-sized + * @vol_id: volume ID to re-size + * @bytes: new volume size in bytes + * + * This function returns %0 in case of success and %-1 in case of error. + */ +int ubi_rsvol(libubi_t desc, const char *node, int vol_id, long long bytes); + +/** + * ubi_node_type - test UBI node type. + * @desc: UBI library descriptor + * @node: the node to test + * + * This function tests whether @node is a UBI device or volume node and returns + * %1 if this is an UBI device node, %2 if this is a volume node, and %-1 if + * this is not an UBI node or if an error occurred (the latter is indicated by + * a non-zero errno). + */ +int ubi_node_type(libubi_t desc, const char *node); + +/** + * ubi_get_dev_info - get UBI device information. + * @desc: UBI library descriptor + * @node: name of the UBI character device to fetch information about + * @info: pointer to the &struct ubi_dev_info object to fill + * + * This function fills the passed @info object with UBI device information and + * returns %0 in case of success and %-1 in case of failure. + */ +int ubi_get_dev_info(libubi_t desc, const char *node, +		     struct ubi_dev_info *info); + +/** + * ubi_get_dev_info1 - get UBI device information. + * @desc: UBI library descriptor + * @dev_num: UBI device number to fetch information about + * @info: pointer to the &struct ubi_dev_info object to fill + * + * This function is identical to 'ubi_get_dev_info()' except that it accepts UBI + * device number, not UBI character device. + */ +int ubi_get_dev_info1(libubi_t desc, int dev_num, struct ubi_dev_info *info); + +/** + * ubi_get_vol_info - get UBI volume information. + * @desc: UBI library descriptor + * @node: name of the UBI volume character device to fetch information about + * @info: pointer to the &struct ubi_vol_info object to fill + * + * This function fills the passed @info object with UBI volume information and + * returns %0 in case of success and %-1 in case of failure. + */ +int ubi_get_vol_info(libubi_t desc, const char *node, +		     struct ubi_vol_info *info); + +/** + * ubi_get_vol_info1 - get UBI volume information. + * @desc: UBI library descriptor + * @dev_num: UBI device number + * @vol_id: ID of the UBI volume to fetch information about + * @info: pointer to the &struct ubi_vol_info object to fill + * + * This function is identical to 'ubi_get_vol_info()' except that it accepts UBI + * volume number, not UBI volume character device. + */ +int ubi_get_vol_info1(libubi_t desc, int dev_num, int vol_id, +		      struct ubi_vol_info *info); + +/** + * ubi_update_start - start UBI volume update. + * @desc: UBI library descriptor + * @fd: volume character devie file descriptor + * @bytes: how many bytes will be written to the volume + * + * This function initiates UBI volume update and returns %0 in case of success + * and %-1 in case of error. + */ +int ubi_update_start(libubi_t desc, int fd, long long bytes); + +#ifdef __cplusplus +} +#endif + +#endif /* !__LIBUBI_H__ */ diff --git a/ubi-utils/include/libubigen.h b/ubi-utils/include/libubigen.h new file mode 100644 index 0000000..66f5fb1 --- /dev/null +++ b/ubi-utils/include/libubigen.h @@ -0,0 +1,109 @@ +/* + * Copyright (c) International Business Machines Corp., 2006 + * Copyright (C) 2008 Nokia Corporation + * + * 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. + */ + +/* + * Authors: Frank Haverkamp + *          Artem Bityutskiy + */ + +#ifndef __LIBUBIGEN_H__ +#define __LIBUBIGEN_H__ + +#include <stdio.h> +#include <asm/byteorder.h> + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * struct ubigen_info - libubigen information. + * @leb_size: logical eraseblock size + * @peb_size: size of the physical eraseblock + * @min_io_size: minimum input/output unit size + * @vid_hdr_offs: offset of the VID header + * @data_offs: data offset + * @ubi_ver: UBI version + * @ec: initial erase counter + * @vtbl_size: volume table size + * @max_volumes: maximum amount of volumes + */ +struct ubigen_info +{ +	int leb_size; +	int peb_size; +	int min_io_size; +	int vid_hdr_offs; +	int data_offs; +	int ubi_ver; +	long long ec; +	int vtbl_size; +	int max_volumes; +}; + +/** + * struct ubigen_vol_info - information about a volume. + * @id: volume id + * @type: volume type (%UBI_VID_DYNAMIC or %UBI_VID_STATIC) + * @alignment: volume alignment + * @data_pad: how many bytes are unused at the end of the each physical + *            eraseblock to satisfy the requested alignment + * @usable_leb_size: LEB size accessible for volume users + * @name: volume name + * @name_len: volume name length + * @compat: compatibility of this volume (%0, %UBI_COMPAT_DELETE, + *          %UBI_COMPAT_IGNORE, %UBI_COMPAT_PRESERVE, or %UBI_COMPAT_REJECT) + * @used_ebs: total number of used logical eraseblocks in this volume (relevant + *            for static volumes only) + * @bytes: size of the volume contents in bytes (relevant for static volumes + *         only) + */ +struct ubigen_vol_info +{ +	int id; +	int type; +	int alignment; +	int data_pad; +	int usable_leb_size; +	const char *name; +	int name_len; +	int compat; +	int used_ebs; +	long long bytes; +}; + +void ubigen_info_init(struct ubigen_info *ui, int peb_size, int min_io_size, +		      int subpage_size, int vid_hdr_offs, int ubi_ver, +		      long long ec); +struct ubi_vtbl_record *ubigen_create_empty_vtbl(const struct ubigen_info *ui); +int ubigen_get_vtbl_size(const struct ubigen_info *ui); +int ubigen_add_volume(const struct ubigen_info *ui, +		      const struct ubigen_vol_info *vi, +		      struct ubi_vtbl_record *vtbl); +int ubigen_write_volume(const struct ubigen_info *ui, +			const struct ubigen_vol_info *vi, +			long long bytes, FILE *in, FILE *out); +int ubigen_write_layout_vol(const struct ubigen_info *ui, +			    struct ubi_vtbl_record *vtbl, FILE *out); + +#ifdef __cplusplus +} +#endif + +#endif /* !__LIBUBIGEN_H__ */  | 
