/*
 *  read_config.h: reads configuration files for extensible sections.
 *
 */
#ifndef READ_CONFIG_H
#define READ_CONFIG_H

#ifdef __cplusplus
extern          "C" {
#endif

#define STRINGMAX 1024

#define NORMAL_CONFIG 0
#define PREMIB_CONFIG 1
#define EITHER_CONFIG 2



    /*
     * Defines a set of file types and the parse and free functions
     * which process the syntax following a given token in a given file.
     */
    struct config_files {
        char           *fileHeader;     /* Label for entire file. */
        struct config_line *start;
        struct config_files *next;
    };

    struct config_line {
        char           *config_token;   /* Label for each line parser
                                         * in the given file. */
        void            (*parse_line) (const char *, char *);
        void            (*free_func) (void);
        struct config_line *next;
        char            config_time;    /* {NORMAL,PREMIB,EITHER}_CONFIG */
        char           *help;
    };

    struct read_config_memory {
        char           *line;
        struct read_config_memory *next;
    };


    int             netsnmp_config(char *);     /* parse a simple line: token=values */
    void            netsnmp_config_remember(char *);    /* process later, during snmp_init() */
    void            netsnmp_config_process_memories(void);      /* run all memories through parser */
    void            read_config(const char *, struct config_line *, int);
    void            read_configs(void);
    void            read_premib_configs(void);
    void            read_config_files(int);
    void            free_config(void);
    void            config_perror(const char *);
    void            config_pwarn(const char *);
    char           *skip_white(char *);
    char           *skip_not_white(char *);
    char           *skip_token(char *);
    char           *copy_nword(char *, char *, int);
    char           *copy_word(char *, char *);  /* do not use */
    void            read_config_with_type(const char *, const char *);
    struct config_line *register_config_handler(const char *, const char *,
                                                void (*parser) (const char
                                                                *, char *),
                                                void (*releaser) (void),
                                                const char *);
    struct config_line *register_app_config_handler(const char *,
                                                    void (*parser) (const
                                                                    char *,
                                                                    char
                                                                    *),
                                                    void (*releaser)
                                                    (void), const char *);
    struct config_line *register_prenetsnmp_mib_handler(const char *,
                                                        const char *,
                                                        void (*parser)
                                                        (const char *,
                                                         char *),
                                                        void (*releaser)
                                                        (void),
                                                        const char *);
    struct config_line *register_app_prenetsnmp_mib_handler(const char *,
                                                            void (*parser)
                                                            (const char *,
                                                             char *),
                                                            void
                                                            (*releaser)
                                                            (void),
                                                            const char *);
    void            unregister_config_handler(const char *, const char *);
    void            unregister_app_config_handler(const char *);
    void            unregister_all_config_handlers(void);
    void            read_config_print_usage(const char *lead);
    char           *read_config_save_octet_string(char *saveto,
                                                  const u_char * str,
                                                  size_t len);
    char           *read_config_read_octet_string(char *readfrom,
                                                  u_char ** str,
                                                  size_t * len);
    char           *read_config_read_objid(char *readfrom, oid ** objid,
                                           size_t * len);
    char           *read_config_save_objid(char *saveto, oid * objid,
                                           size_t len);
    char           *read_config_read_data(int type, char *readfrom,
                                          void *dataptr, size_t * len);
    char           *read_config_read_memory(int type, char *readfrom,
                                            char *dataptr, size_t * len);
    char           *read_config_store_data(int type, char *storeto,
                                           void *dataptr, size_t * len);
    char           *read_config_store_data_prefix(char prefix, int type,
                                                  char *storeto,
                                                  void *dataptr, size_t len);
    void            read_config_store(const char *type, const char *line);
    void            read_app_config_store(const char *line);
    void            snmp_save_persistent(const char *type);
    void            snmp_clean_persistent(const char *type);
    struct config_line *read_config_get_handlers(const char *type);

    /*
     * external memory list handlers 
     */
    void            snmp_config_remember_in_list(char *line,
                                                 struct read_config_memory
                                                 **mem);
    void            snmp_config_process_memory_list(struct
                                                    read_config_memory
                                                    **mem, int, int);
    void            snmp_config_remember_free_list(struct
                                                   read_config_memory
                                                   **mem);

    void            set_configuration_directory(const char *dir);
    const char     *get_configuration_directory(void);
    void            set_persistent_directory(const char *dir);
    const char     *get_persistent_directory(void);
    void            set_temp_file_pattern(const char *pattern);
    const char     *get_temp_file_pattern(void);
    void            handle_long_opt(const char *myoptarg);

#ifdef __cplusplus
}
#endif
#endif                          /* READ_CONFIG_H */
