pam_pkcs11  0.6.8
scconf.h
Go to the documentation of this file.
00001 /*
00002  * $Id: scconf.h 233 2007-04-04 09:52:54Z ludovic.rousseau $
00003  *
00004  * Copyright (C) 2002
00005  *  Antti Tapaninen <aet@cc.hut.fi>
00006  *
00007  * Originally based on source by Timo Sirainen <tss@iki.fi>
00008  *
00009  * This library is free software; you can redistribute it and/or
00010  * modify it under the terms of the GNU Lesser General Public
00011  * License as published by the Free Software Foundation; either
00012  * version 2.1 of the License, or (at your option) any later version.
00013  *
00014  * This library is distributed in the hope that it will be useful,
00015  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00016  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00017  * Lesser General Public License for more details.
00018  *
00019  * You should have received a copy of the GNU Lesser General Public
00020  * License along with this library; if not, write to the Free Software
00021  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00022  */
00023 
00024 #ifndef _SC_CONF_H
00025 #define _SC_CONF_H
00026 
00027 #ifdef __cplusplus
00028 extern "C" {
00029 #endif
00030 
00031 typedef struct _scconf_entry {
00032         const char *name;
00033         unsigned int type;
00034         unsigned int flags;
00035         void *parm;
00036         void *arg;
00037 } scconf_entry;
00038 
00039 /* Entry flags */
00040 #define SCCONF_PRESENT          0x00000001
00041 #define SCCONF_MANDATORY        0x00000002
00042 #define SCCONF_ALLOC            0x00000004
00043 #define SCCONF_ALL_BLOCKS       0x00000008
00044 #define SCCONF_VERBOSE          0x00000010      /* For debugging purposes only */
00045 
00046 /* Entry types */
00047 #define SCCONF_CALLBACK         1
00048 #define SCCONF_BLOCK            2
00049 #define SCCONF_LIST             3
00050 
00051 #define SCCONF_BOOLEAN          11
00052 #define SCCONF_INTEGER          12
00053 #define SCCONF_STRING           13
00054 
00055 typedef struct _scconf_block scconf_block;
00056 
00057 typedef struct _scconf_list {
00058         struct _scconf_list *next;
00059         char *data;
00060 } scconf_list;
00061 
00062 #define SCCONF_ITEM_TYPE_COMMENT        0       /* key = NULL, comment */
00063 #define SCCONF_ITEM_TYPE_BLOCK          1       /* key = key, block */
00064 #define SCCONF_ITEM_TYPE_VALUE          2       /* key = key, list */
00065 
00066 typedef struct _scconf_item {
00067         struct _scconf_item *next;
00068         int type;
00069         char *key;
00070         union {
00071                 char *comment;
00072                 scconf_block *block;
00073                 scconf_list *list;
00074         } value;
00075 } scconf_item;
00076 
00077 struct _scconf_block {
00078         scconf_block *parent;
00079         scconf_list *name;
00080         scconf_item *items;
00081 };
00082 
00083 typedef struct {
00084         char *filename;
00085         int debug;
00086         scconf_block *root;
00087         char *errmsg;
00088 } scconf_context;
00089 
00090 /* Allocate scconf_context
00091  * The filename can be NULL
00092  */
00093 extern scconf_context *scconf_new(const char *filename);
00094 
00095 /* Free scconf_context
00096  */
00097 extern void scconf_free(scconf_context * config);
00098 
00099 /* Parse configuration
00100  * Returns 1 = ok, 0 = error, -1 = error opening config file
00101  */
00102 extern int scconf_parse(scconf_context * config);
00103 
00104 /* Parse a static configuration string
00105  * Returns 1 = ok, 0 = error
00106  */
00107 extern int scconf_parse_string(scconf_context * config, const char *string);
00108 
00109 /* Parse entries
00110  */
00111 extern int scconf_parse_entries(const scconf_context * config, const scconf_block * block, scconf_entry * entry);
00112 
00113 /* Write config to a file
00114  * If the filename is NULL, use the config->filename
00115  * Returns 0 = ok, else = errno
00116  */
00117 extern int scconf_write(scconf_context * config, const char *filename);
00118 
00119 /* Write configuration entries to block
00120  */
00121 extern int scconf_write_entries(scconf_context * config, scconf_block * block, scconf_entry * entry);
00122 
00123 /* Find a block by the item_name
00124  * If the block is NULL, the root block is used
00125  */
00126 extern const scconf_block *scconf_find_block(const scconf_context * config, const scconf_block * block, const char *item_name);
00127 
00128 /* Find blocks by the item_name
00129  * If the block is NULL, the root block is used
00130  * The key can be used to specify what the blocks first name should be
00131  */
00132 extern scconf_block **scconf_find_blocks(const scconf_context * config, const scconf_block * block, const char *item_name, const char *key);
00133 
00134 /* Get a list of values for option
00135  */
00136 extern const scconf_list *scconf_find_list(const scconf_block * block, const char *option);
00137 
00138 /* Return the first string of the option
00139  * If no option found, return def
00140  */
00141 extern const char *scconf_get_str(const scconf_block * block, const char *option, const char *def);
00142 
00143 /* Return the first value of the option as integer
00144  * If no option found, return def
00145  */
00146 extern int scconf_get_int(const scconf_block * block, const char *option, int def);
00147 
00148 /* Return the first value of the option as boolean
00149  * If no option found, return def
00150  */
00151 extern int scconf_get_bool(const scconf_block * block, const char *option, int def);
00152 
00153 /* Write value to a block as a string
00154  */
00155 extern const char *scconf_put_str(scconf_block * block, const char *option, const char *value);
00156 
00157 /* Write value to a block as an integer
00158  */
00159 extern int scconf_put_int(scconf_block * block, const char *option, int value);
00160 
00161 /* Write value to a block as a boolean
00162  */
00163 extern int scconf_put_bool(scconf_block * block, const char *option, int value);
00164 
00165 /* Add block structure
00166  * If the block is NULL, the root block is used
00167  */
00168 extern scconf_block *scconf_block_add(scconf_context * config, scconf_block * block, const char *key, const scconf_list *name);
00169 
00170 /* Copy block structure (recursive)
00171  */
00172 extern scconf_block *scconf_block_copy(const scconf_block * src, scconf_block ** dst);
00173 
00174 /* Free block structure (recursive)
00175  */
00176 extern void scconf_block_destroy(scconf_block * block);
00177 
00178 /* Add item to block structure
00179  * If the block is NULL, the root block is used
00180  */
00181 extern scconf_item *scconf_item_add(scconf_context * config, scconf_block * block, scconf_item * item, int type, const char *key, const void *data);
00182 
00183 /* Copy item structure (recursive)
00184  */
00185 extern scconf_item *scconf_item_copy(const scconf_item * src, scconf_item ** dst);
00186 
00187 /* Free item structure (recursive)
00188  */
00189 extern void scconf_item_destroy(scconf_item * item);
00190 
00191 /* Add a new value to the list
00192  */
00193 extern scconf_list *scconf_list_add(scconf_list ** list, const char *value);
00194 
00195 /* Copy list structure
00196  */
00197 extern scconf_list *scconf_list_copy(const scconf_list * src, scconf_list ** dst);
00198 
00199 /* Free list structure
00200  */
00201 extern void scconf_list_destroy(scconf_list * list);
00202 
00203 /* Return the length of an list array
00204  */
00205 extern int scconf_list_array_length(const scconf_list * list);
00206 
00207 /* Return the combined length of the strings on all arrays
00208  */
00209 extern int scconf_list_strings_length(const scconf_list * list);
00210 
00211 /* Return an allocated string that contains all
00212  * the strings in a list separated by the filler
00213  * The filler can be NULL
00214  */
00215 extern char *scconf_list_strdup(const scconf_list * list, const char *filler);
00216 
00217 /* Returns an allocated array of const char *pointers to
00218  * list elements.
00219  * Last pointer is NULL
00220  * Array must be freed, but pointers to strings belong to scconf_list
00221  */
00222 extern const char **scconf_list_toarray(const scconf_list * list);
00223 
00224 #ifdef __cplusplus
00225 }
00226 #endif
00227 #endif