Annotation of embedaddon/libpdel/config/app_config.h, revision 1.1

1.1     ! misho       1: 
        !             2: /*
        !             3:  * Copyright (c) 2001-2002 Packet Design, LLC.
        !             4:  * All rights reserved.
        !             5:  * 
        !             6:  * Subject to the following obligations and disclaimer of warranty,
        !             7:  * use and redistribution of this software, in source or object code
        !             8:  * forms, with or without modifications are expressly permitted by
        !             9:  * Packet Design; provided, however, that:
        !            10:  * 
        !            11:  *    (i)  Any and all reproductions of the source or object code
        !            12:  *         must include the copyright notice above and the following
        !            13:  *         disclaimer of warranties; and
        !            14:  *    (ii) No rights are granted, in any manner or form, to use
        !            15:  *         Packet Design trademarks, including the mark "PACKET DESIGN"
        !            16:  *         on advertising, endorsements, or otherwise except as such
        !            17:  *         appears in the above copyright notice or in the software.
        !            18:  * 
        !            19:  * THIS SOFTWARE IS BEING PROVIDED BY PACKET DESIGN "AS IS", AND
        !            20:  * TO THE MAXIMUM EXTENT PERMITTED BY LAW, PACKET DESIGN MAKES NO
        !            21:  * REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, REGARDING
        !            22:  * THIS SOFTWARE, INCLUDING WITHOUT LIMITATION, ANY AND ALL IMPLIED
        !            23:  * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE,
        !            24:  * OR NON-INFRINGEMENT.  PACKET DESIGN DOES NOT WARRANT, GUARANTEE,
        !            25:  * OR MAKE ANY REPRESENTATIONS REGARDING THE USE OF, OR THE RESULTS
        !            26:  * OF THE USE OF THIS SOFTWARE IN TERMS OF ITS CORRECTNESS, ACCURACY,
        !            27:  * RELIABILITY OR OTHERWISE.  IN NO EVENT SHALL PACKET DESIGN BE
        !            28:  * LIABLE FOR ANY DAMAGES RESULTING FROM OR ARISING OUT OF ANY USE
        !            29:  * OF THIS SOFTWARE, INCLUDING WITHOUT LIMITATION, ANY DIRECT,
        !            30:  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE, OR CONSEQUENTIAL
        !            31:  * DAMAGES, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, LOSS OF
        !            32:  * USE, DATA OR PROFITS, HOWEVER CAUSED AND UNDER ANY THEORY OF
        !            33:  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
        !            34:  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
        !            35:  * THE USE OF THIS SOFTWARE, EVEN IF PACKET DESIGN IS ADVISED OF
        !            36:  * THE POSSIBILITY OF SUCH DAMAGE.
        !            37:  *
        !            38:  * Author: Archie Cobbs <archie@freebsd.org>
        !            39:  */
        !            40: 
        !            41: #ifndef _PDEL_CONFIG_APP_CONFIG_H_
        !            42: #define _PDEL_CONFIG_APP_CONFIG_H_
        !            43: 
        !            44: /************************************************************************
        !            45:                                DEFINITIONS
        !            46: ************************************************************************/
        !            47: 
        !            48: struct app_subsystem;
        !            49: struct app_config_ctx;
        !            50: struct pevent_ctx;
        !            51: 
        !            52: /* XML document tag for app_config configurations */
        !            53: #define APP_CONFIG_XML_TAG     "config"
        !            54: 
        !            55: /* Methods exported by a subsystem */
        !            56: typedef int    app_ss_startup_t(struct app_config_ctx *ctx,
        !            57:                        const struct app_subsystem *ss, const void *config);
        !            58: typedef void   app_ss_shutdown_t(struct app_config_ctx *ctx,
        !            59:                        const struct app_subsystem *ss, const void *config);
        !            60: typedef int    app_ss_willrun_t(struct app_config_ctx *ctx,
        !            61:                        const struct app_subsystem *ss, const void *config);
        !            62: typedef int    app_ss_changed_t(struct app_config_ctx *ctx,
        !            63:                        const struct app_subsystem *ss, const void *config1,
        !            64:                        const void *config2);
        !            65: 
        !            66: /* Descriptor for a subsystem */
        !            67: struct app_subsystem {
        !            68:        const char              *name;          /* name, null to end list */
        !            69:        void                    *arg;           /* opaque subsystem argument */
        !            70:        app_ss_startup_t        *start;         /* start subsystem */
        !            71:        app_ss_shutdown_t       *stop;          /* stop subsystem */
        !            72:        app_ss_willrun_t        *willrun;       /* will subsystem run? */
        !            73:        app_ss_changed_t        *changed;       /* subsystem config changed? */
        !            74:        const char              **deplist;      /* config items dependent on */
        !            75: };
        !            76: 
        !            77: /*
        !            78:  * Methods exported by an application:
        !            79:  *
        !            80:  * init                Initialize a config structure. The structure will already
        !            81:  *             be initialized with the values provided by the structs type.
        !            82:  *             This method is so any other default values can be applied.
        !            83:  *
        !            84:  * getnew      This is used when no existing configuration is found for
        !            85:  *             the system (i.e., after a factory reset). The argument
        !            86:  *             provided is a configuration structure already initialized
        !            87:  *             using the "init" method. The "getnew" method should apply
        !            88:  *             any further initialization needed for this specific system.
        !            89:  *
        !            90:  * checker     This method is the gatekeeper for applying new configurations.
        !            91:  *             If this method returns zero, the configuration is rejected.
        !            92:  *             An appropriate error message may be put in "errbuf". Make
        !            93:  *             sure your application does not automatically generate any
        !            94:  *             configurations that fail to pass this method, otherwise
        !            95:  *             you get into a stuck state.
        !            96:  *
        !            97:  * normalize   Configurations may contain redundant and/or derived info.
        !            98:  *             This method (if defined) can be used to normalize a config
        !            99:  *             struture. This method is called before "checker".
        !           100:  *
        !           101:  * upgrade     When the configuration structure changes, and you still
        !           102:  *             want to be able to read in XML created from the older
        !           103:  *             versions of the configuration structure, defining this
        !           104:  *             method gives you a way to specify how to upgrade information
        !           105:  *             the old format to the new one.
        !           106:  */
        !           107: typedef int    app_config_init_t(struct app_config_ctx *ctx, void *config);
        !           108: typedef int    app_config_getnew_t(struct app_config_ctx *ctx, void *config);
        !           109: typedef int    app_config_checker_t(struct app_config_ctx *ctx,
        !           110:                        const void *config, char *errbuf, size_t ebufsize);
        !           111: typedef void   app_config_normalize_t(struct app_config_ctx *ctx,
        !           112:                        void *config);
        !           113: typedef int    app_config_upgrade_t(struct app_config_ctx *ctx,
        !           114:                        const void *old_conf, u_int old_version,
        !           115:                        void *new_conf);
        !           116: 
        !           117: /*
        !           118:  * Descriptor for an application's configuration information.
        !           119:  *
        !           120:  * Automatic configuration upgrade feature:
        !           121:  *
        !           122:  * types[version] is a structs type for the applications configuration
        !           123:  * information structure. All previous pointers in the types[] array point
        !           124:  * to types for older versions of the configuration structure. When an
        !           125:  * older version is encountered in an XML file, it is read in using the
        !           126:  * corresponding old structs type and converted to the current version
        !           127:  * using the "upgrade" method. So versions are numbered 0, 1, .... Each
        !           128:  * time the configuration structure is changed, "version" should be
        !           129:  * bumped and the new type added to the "types" array. Version numbers
        !           130:  * are not allowed to go backwards.
        !           131:  */
        !           132: struct app_config {
        !           133:        u_int                           version;/* current config version # */
        !           134:        const struct structs_type       **types;/* types for all versions */
        !           135:        const struct app_subsystem      **slist;/* list of subsystems */
        !           136:        app_config_init_t               *init;  /* initialize config defaults */
        !           137:        app_config_getnew_t             *getnew;/* generate new config */
        !           138:        app_config_checker_t            *checker;/* validate a config struct */
        !           139:        app_config_normalize_t          *normalize; /* normalize a config */
        !           140:        app_config_upgrade_t            *upgrade;/* upgrade a config */
        !           141: };
        !           142: 
        !           143: /************************************************************************
        !           144:                            BUILT-IN SUBSYSTEMS
        !           145: ************************************************************************/
        !           146: 
        !           147: __BEGIN_DECLS
        !           148: 
        !           149: /*
        !           150:  * PID file subsystem template.
        !           151:  *
        !           152:  * Copy this structure and set arg to be a const char * pointing to the
        !           153:  * name of the item in the config structure containing the pathname to
        !           154:  * the PID file. If this pathname is NULL/empty, no PID file is created.
        !           155:  */
        !           156: extern const struct app_subsystem      app_config_pidfile_subsystem;
        !           157: 
        !           158: /*
        !           159:  * Directory subsystem template.
        !           160:  *
        !           161:  * Copy this structure and set arg to be a const char * pointing to the
        !           162:  * name of the item in the config structure containing the directory to
        !           163:  * chdir(2) into. If this pathname is NULL/empty, no change is made.
        !           164:  */
        !           165: extern const struct app_subsystem      app_config_directory_subsystem;
        !           166: 
        !           167: /*
        !           168:  * "Curconf" subsystem template.
        !           169:  *
        !           170:  * Copy this structure and set arg to be a 'struct my_config **' pointer
        !           171:  * pointing to the application's 'curconf' variable, which at all times
        !           172:  * points to a (read-only) copy of the currently active configuration object.
        !           173:  * This subsystem should usually be first in the subsystem list.
        !           174:  */
        !           175: extern const struct app_subsystem      app_config_curconf_subsystem;
        !           176: 
        !           177: __END_DECLS
        !           178: 
        !           179: /*
        !           180:  * Alog logging subsystem template.
        !           181:  *
        !           182:  * Copy this structure and set arg to be a pointer to an instance
        !           183:  * of the structure below.
        !           184:  */
        !           185: struct app_config_alog_info {
        !           186:        const char      *name;          /* name of alog_channel_config_type */
        !           187:        int             channel;        /* alog channel */
        !           188: };
        !           189: 
        !           190: __BEGIN_DECLS
        !           191: extern const struct app_subsystem      app_config_alog_subsystem;
        !           192: __END_DECLS
        !           193: 
        !           194: /************************************************************************
        !           195:                                FUNCTIONS
        !           196: ************************************************************************/
        !           197: 
        !           198: __BEGIN_DECLS
        !           199: 
        !           200: /*
        !           201:  * Initialize the application's configuration type and list of subsystems.
        !           202:  * Also sets the XML tag for reading and writing the configuration and
        !           203:  * the user application cookie.
        !           204:  *
        !           205:  * This must be called first.
        !           206:  */
        !           207: extern struct  app_config_ctx *app_config_init(struct pevent_ctx *ctx,
        !           208:                        const struct app_config *info, void *cookie);
        !           209: 
        !           210: /*
        !           211:  * Reverse the effects of app_config_init().
        !           212:  *
        !           213:  * All subsystems must be shutdown and no new configurations
        !           214:  * may be pending.
        !           215:  */
        !           216: extern int     app_config_uninit(struct app_config_ctx **ctxp);
        !           217: 
        !           218: /*
        !           219:  * Get application cookie.
        !           220:  */
        !           221: extern void    *app_config_get_cookie(struct app_config_ctx *ctx);
        !           222: 
        !           223: /*
        !           224:  * Initialize application configuration from an XML file.
        !           225:  *
        !           226:  * This reads in the configuration and then calls app_config_set()
        !           227:  * with a delay of one millisecond.
        !           228:  *
        !           229:  * If "writeback" is zero, no writebacks will ever occur.
        !           230:  */
        !           231: extern int     app_config_load(struct app_config_ctx *ctx,
        !           232:                        const char *path, int allow_writeback);
        !           233: 
        !           234: /*
        !           235:  * Re-read the XML file passed to app_config_load() and reconfigure
        !           236:  * as appropriate.
        !           237:  *
        !           238:  * This reads in the configuration and then calls app_config_set()
        !           239:  * with a delay of one millisecond.
        !           240:  */
        !           241: extern int     app_config_reload(struct app_config_ctx *c);
        !           242: 
        !           243: /*
        !           244:  * Function to create a configuration structure. This structure will
        !           245:  * have the application "default" values.
        !           246:  */
        !           247: extern void    *app_config_new(struct app_config_ctx *c);
        !           248: 
        !           249: /*
        !           250:  * Change the application's current configuration to be a copy of "config"
        !           251:  * after a delay of at most "delay" milliseconds.
        !           252:  *
        !           253:  * A NULL configuration shuts everything down. Any configs passed to
        !           254:  * app_config_set() subsequent to passing a NULL config, but before
        !           255:  * the shutdown operation has completed, are ignored. This guarantees
        !           256:  * that a shutdown really does shut everything down.
        !           257:  *
        !           258:  * If an app_config_load() was previously called with "allow_writeback" true,
        !           259:  * then a non-NULL configuration will be written back out to the XML file.
        !           260:  *
        !           261:  * If the configuration is invalid, -1 is returned with errno == EINVAL
        !           262:  * and the buffer (if not NULL) is filled in with the reason.
        !           263:  */
        !           264: extern int     app_config_set(struct app_config_ctx *ctx,
        !           265:                        const void *config, u_long delay, char *ebuf, int emax);
        !           266: 
        !           267: /*
        !           268:  * Get a copy of the application's current or pending configuration.
        !           269:  */
        !           270: extern void    *app_config_get(struct app_config_ctx *ctx, int pending);
        !           271: 
        !           272: /*
        !           273:  * Get the configuration object type.
        !           274:  */
        !           275: extern const   struct structs_type *app_config_get_type(
        !           276:                        struct app_config_ctx *ctx);
        !           277: 
        !           278: /*
        !           279:  * Get a copy of a configuration.
        !           280:  */
        !           281: extern void    *app_config_copy(struct app_config_ctx *ctx,
        !           282:                        const void *config);
        !           283: 
        !           284: /*
        !           285:  * Free a configuration.
        !           286:  */
        !           287: extern void    app_config_free(struct app_config_ctx *ctx, void **configp);
        !           288: 
        !           289: __END_DECLS
        !           290: 
        !           291: #endif /* _PDEL_CONFIG_APP_CONFIG_H_ */
        !           292: 

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>