e2fsprogs/lib/evms/options.h

316 lines
14 KiB
C

/*
*
* Copyright (c) International Business Machines Corp., 2001
* Copyright (C) 1997-1999 David Mosberger-Tang and Andreas Beck
*
* 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* Module: options.h
*/
#ifndef EVMS_OPTIONS_H_INCLUDED
#define EVMS_OPTIONS_H_INCLUDED 1
#include <common.h>
/*
* Dear Reader,
*
* Yes, some of the structures look a lot like the ones the SANE
* (Scanner Access Now Easy) folks use for negotiating options
* between a frontend and backend. In fact, some of the structures
* here were derived from their solution with some tweaks for EVMS.
*
* Kindest regards and most humble apologies to the SANE folks for
* borrowing their solution.
*/
/*
* Task API typedefs
*/
typedef u_int32_t task_handle_t;
/*
* Task actions correspond to the low-level API available to frontends.
* The task API allows binding of action, plugin, target objects, and
* plugin-specific options. This allows for interaction with the backend
* to validate the correctness of parameters and options necessary to
* fulfill the requirements of the low-level API which eventually is invoked.
*/
typedef enum {
EVMS_Task_Create = 0,
EVMS_Task_Create_Container,
EVMS_Task_Assign_Plugin,
EVMS_Task_Expand_Container,
EVMS_Task_Set_Info,
EVMS_Task_Expand,
EVMS_Task_Shrink,
EVMS_Task_Slide,
EVMS_Task_Move,
EVMS_Task_mkfs,
EVMS_Task_fsck,
EVMS_Task_defrag,
EVMS_Task_Message,
EVMS_Task_Add_Feature,
EVMS_Task_Plugin_Function = 0x1000 /* Base number for plug-in funtions */
} task_action_t;
typedef struct function_info_s {
task_action_t function; /* Plugin function number */
char * title; /* Short title for the function */
/* e.g. "Add a spare" */
/* Example usage: A UI might put this in */
/* a menu of functions to select. */
char * verb; /* One or two action words for the function */
/* e.g. "Add" */
/* Example usage: A GUI may use this on an */
/* action button for the function. */
char * help; /* Full help text */
/* e.g. "Use this function to add a spare blah blah blah..." */
} function_info_t;
typedef struct function_info_array_s {
uint count;
function_info_t info[1];
} function_info_array_t;
/*
* Object API typedefs
*/
typedef struct declined_handle_s {
object_handle_t handle; /* Handle of object declined */
int reason; /* Reason for being declined */
} declined_handle_t;
typedef struct declined_handle_array_s {
uint count;
declined_handle_t declined[1];
} declined_handle_array_t;
/*
* Option API typedefs and constants
*/
typedef enum {
EVMS_Type_String = 1, /* char* */
EVMS_Type_Boolean, /* BOOLEAN */
EVMS_Type_Char, /* char */
EVMS_Type_Unsigned_Char, /* unsigned char */
EVMS_Type_Real32, /* float */
EVMS_Type_Real64, /* double */
EVMS_Type_Int, /* int */
EVMS_Type_Int8, /* int8_t */
EVMS_Type_Int16, /* int16_t */
EVMS_Type_Int32, /* int32_t */
EVMS_Type_Int64, /* int64_t */
EVMS_Type_Unsigned_Int, /* uint */
EVMS_Type_Unsigned_Int8, /* u_int8_t */
EVMS_Type_Unsigned_Int16, /* u_int16_t */
EVMS_Type_Unsigned_Int32, /* u_int32_t */
EVMS_Type_Unsigned_Int64 /* u_int64_t */
} value_type_t;
typedef enum {
EVMS_Unit_None = 0,
EVMS_Unit_Disks,
EVMS_Unit_Sectors,
EVMS_Unit_Segments,
EVMS_Unit_Regions,
EVMS_Unit_Percent,
EVMS_Unit_Milliseconds,
EVMS_Unit_Microseconds,
EVMS_Unit_Bytes,
EVMS_Unit_Kilobytes,
EVMS_Unit_Megabytes,
EVMS_Unit_Gigabytes,
EVMS_Unit_Terabytes,
EVMS_Unit_Petabytes
} value_unit_t;
typedef enum {
EVMS_Collection_None = 0, /* No collection */
EVMS_Collection_List, /* Use a value_list_t structure */
EVMS_Collection_Range /* Use a value_range_t structure */
} collection_type_t;
typedef enum {
EVMS_Format_Normal = 0,
EVMS_Format_Hex,
EVMS_Format_Ascii,
EVMS_Format_Binary
} value_format_t;
typedef union {
char c; /* one character, e.g. 'C' */
char *s; /* string pointer */
u_char uc;
int bool;
int i;
int8_t i8;
int16_t i16;
int32_t i32;
int64_t i64;
u_int ui;
u_int8_t ui8;
u_int16_t ui16;
u_int32_t ui32;
u_int64_t ui64;
float r32;
double r64;
struct value_list_s *list;
} value_t;
/*
* The struct key_value_pair_s allows some generic passing
* of a key/value pair for some basic data type values. The
* key can be a name (a string) or a number. The sending
* and receiving ends denote, through the is_number_based flag,
* which key should be looked at for identification purposes.
*/
typedef struct key_value_pair_s {
char *name; /* Key if name-based */
u_int16_t number; /* Key if number-based */
BOOLEAN is_number_based; /* TRUE if number-based */
value_type_t type; /* Value type */
value_t value; /* Union of basic data types */
} key_value_pair_t;
/*
* Some frontends may supply plugin-specific data as "options" through
* the API functions, e.g. evms_create(), available to a frontend.
* Options are essentially key/value pairs where the key and value types
* are known ahead-of-time or were interrogated through the option
* descriptor API.
*/
typedef struct option_array_s {
u_int count;
key_value_pair_t option[1];
} option_array_t;
typedef struct value_list_s {
u_int count;
value_t value[1];
} value_list_t;
typedef struct value_range_s {
value_t min; /* Minimum value */
value_t max; /* Maximum value */
value_t increment; /* Step or increment for changes in-between */
} value_range_t;
typedef union {
value_list_t *list; /* Array of values of the same type */
value_range_t *range; /* Range of values for numeric types */
} value_collection_t;
typedef struct group_info_s {
u_int32_t group_number; /* group number, 0 if not grouped */
u_int32_t group_level; /* possibly used for indenting, or sub fields */
char *group_name; /* name of group */
} group_info_t;
typedef struct option_descriptor_s {
char *name; /* Option name/key */
char *title; /* One or two word description of option */
char *tip; /* Multi-sentence description of option for tip */
char *help; /* Multi-paragraph detailed option help */
value_type_t type; /* Defines option data type */
value_unit_t unit; /* Defines unit value */
#ifdef ABI_EVMS_1_0
u_int32_t size; /* Maximum size (in bytes) of option value */
#else
value_format_t format; /* Suggested format for display of values */
u_int32_t min_len; /* Minimum length for string types */
u_int32_t max_len; /* Maximum length for string types */
#endif
u_int64_t flags; /* Option flags (defined below) */
collection_type_t constraint_type; /* Constraint type (none, range, list) */
value_collection_t constraint; /* Either a list or range of valid input values */
value_t value; /* Initial/current value */
group_info_t group; /* Group information for display purposes */
} option_descriptor_t;
/*
* option_descriptor_t flags bitset
*/
#define EVMS_OPTION_FLAGS_NOT_REQUIRED (1 << 0) /* A key_value_pair_t for this option can be provided */
/* but is not absolutely required by the plug-in */
#define EVMS_OPTION_FLAGS_NO_INITIAL_VALUE (1 << 1) /* The plug-in has not provided an initial value */
#define EVMS_OPTION_FLAGS_AUTOMATIC (1 << 2) /* Backend is capable of selecting reasonable value */
#define EVMS_OPTION_FLAGS_INACTIVE (1 << 3) /* Option exists but is neither optional or required */
#define EVMS_OPTION_FLAGS_ADVANCED (1 << 4) /* Option is an "advanced user option" */
#define EVMS_OPTION_FLAGS_VALUE_IS_LIST (1 << 5) /* Value is/is expected to be a pointer to value_list_t */
#define EVMS_OPTION_FLAGS_NO_UNIT_CONVERSION (1 << 6) /* Don't convert unit measurements, e.g. I really mean */
/* to have the user specify/see sectors not KB or MB */
#define EVMS_OPTION_IS_ACTIVE(flags) (((flags) & EVMS_OPTION_FLAGS_INACTIVE) == 0)
#define EVMS_OPTION_IS_REQUIRED(flags) (((flags) & EVMS_OPTION_FLAGS_NOT_REQUIRED) == 0)
#define EVMS_OPTION_HAS_VALUE(flags) (((flags) & EVMS_OPTION_FLAGS_NO_INITIAL_VALUE) == 0)
#define EVMS_OPTION_VALUE_IS_LIST(flags) (((flags) & EVMS_OPTION_FLAGS_VALUE_IS_LIST) != 0)
/*
* Following bitset indicating additional information of
* the outcome of a set_object or a set action on a option value.
*/
typedef enum {
EVMS_Effect_Inexact = (1 << 0), /* Option value was adjusted by backend */
EVMS_Effect_Reload_Options = (1 << 1), /* Setting of an object or option has affected */
/* the value or availability of other options */
EVMS_Effect_Reload_Objects = (1 << 2) /* Setting of an object or option has affected */
/* the acceptable and/or selected objects */
/* or the limits of objects selected. */
} task_effect_t;
/*
* Extended information structure. Plug-ins generate an
* array of these to supply plugin-specific information.
* They are similar to option descriptors but lighter.
*/
typedef struct extended_info_s {
char *name; /* Info field name */
char *title; /* One or two word description of info field */
char *desc; /* Multi-sentence description of info field */
value_type_t type; /* Defines info data type */
value_unit_t unit; /* Defines info unit value */
value_format_t format; /* Suggested format for display of values */
value_t value; /* Single value if not a collection */
collection_type_t collection_type; /* Defines if either a list or range of values */
value_collection_t collection; /* Either a list or range of values of value_type_t */
group_info_t group; /* Group information for display purposes */
u_int16_t flags; /* Extended info flags (defined below) */
} extended_info_t;
#define EVMS_EINFO_FLAGS_NO_UNIT_CONVERSION (1 << 0) /* Don't convert unit measurements, e.g. I really */
/* mean the user to see sectors not KB or MB */
#define EVMS_EINFO_FLAGS_MORE_INFO_AVAILABLE (1 << 1)/* This entry has more information if */
/* queried by name. */
typedef struct extended_info_array_s {
u_int count; /* Count of extended_info_t structs in array */
extended_info_t info[1]; /* Info descriptors */
} extended_info_array_t;
#endif