1 /*
   2  * CDDL HEADER START
   3  *
   4  * The contents of this file are subject to the terms of the
   5  * Common Development and Distribution License (the "License").
   6  * You may not use this file except in compliance with the License.
   7  *
   8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   9  * or http://www.opensolaris.org/os/licensing.
  10  * See the License for the specific language governing permissions
  11  * and limitations under the License.
  12  *
  13  * When distributing Covered Code, include this CDDL HEADER in each
  14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15  * If applicable, add the following below this CDDL HEADER, with the
  16  * fields enclosed by brackets "[]" replaced with your own identifying
  17  * information: Portions Copyright [yyyy] [name of copyright owner]
  18  *
  19  * CDDL HEADER END
  20  */
  21 /*
  22  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
  23  * Use is subject to license terms.
  24  */
  25 
  26 #ifndef _CFG_H
  27 #define _CFG_H
  28 
  29 #ifdef  __cplusplus
  30 extern "C" {
  31 #endif
  32 
  33 #include <sys/nsctl/nsctl.h>
  34 
  35 #define CFG_MAX_BUF     1024    /* maximum buffer size for cfg_get_?string() */
  36 #define CFG_MAX_KEY     256     /* maximum key size for cfg_get_?string() */
  37 
  38 #ifndef _CFG_IMPL_H
  39 /*
  40  * These are really declared in cfg_impl.h, declare as dummy's here to
  41  * allow clients to compile without including cfg_impl.h.
  42  */
  43 typedef struct cfgfile CFGFILE;
  44 typedef struct cfp cfp_t;
  45 
  46 #endif  /* _CFG_IMPL_H */
  47 
  48 int cfg_get_cstring(CFGFILE *cfg, const char *key, void *value, int value_len);
  49 int cfg_put_cstring(CFGFILE *cfg, const char *key, void *value, int value_len);
  50 int cfg_find_cstring(CFGFILE *cfg, const char *target, const char *section,
  51     int numflds, ...);
  52 int cfg_get_options(CFGFILE *cfg, int section, const char *basekey,
  53                                 char *tag, int tag_len, char *val, int val_len);
  54 int cfg_put_options(CFGFILE *cfg, int section, const char *basekey,
  55                                 char *tag, char *val);
  56 int cfg_get_single_option(CFGFILE *, int, const char *, char *, char *, int);
  57 int cfg_del_option(CFGFILE *, int, const char *, char *);
  58 
  59 int cfg_get_num_entries(CFGFILE *cfg, char *section);
  60 
  61 int cfg_get_tags(CFGFILE *cfg, char ***taglist);
  62 
  63 int cfg_cfg_isempty(CFGFILE *cfg);
  64 int cfg_get_section(CFGFILE *cfg, char ***buf, const char *section);
  65 CFGFILE *cfg_open(char *filename);
  66 void cfg_rewind(CFGFILE *cfg, int section);
  67 int cfg_is_cfg(CFGFILE *cfg);
  68 int cfg_shldskip_vtoc(int fd, const char *loc);
  69 int cfg_get_srtdsec(CFGFILE *cfg, char ***list,
  70         const char *sec, const char *field);
  71 void cfg_free_section(char ***, int);
  72 
  73 
  74 /*
  75  * Handle cluster configuration
  76  */
  77 #define FP_SUN_CLUSTER(x) \
  78         (((x->cf_node) && (x->cf[1].cf_fd)) ? &x->cf[1] : &x->cf[0])
  79 
  80 /*
  81  * rewind sections
  82  */
  83 #define CFG_SEC_CONF    0       /* configuration section */
  84 #define CFG_SEC_PERS    1       /* persistent section */
  85 #define CFG_SEC_ALL     2       /* rewind both sections */
  86 
  87 int cfg_update_parser_config(CFGFILE *, const char *key, int section);
  88 /*
  89  * parser sections
  90  */
  91 #define CFG_PARSE_CONF  0       /* config section key */
  92 #define CFG_PARSE_PERS  1       /* persistent section key */
  93 
  94 char *cfg_error(int *severity);
  95 /*
  96  * error codes
  97  */
  98 #define CFG_ENONFATAL   0       /* non fatal error */
  99 #define CFG_EFATAL      1       /* fatal error exit */
 100 
 101 /*
 102  * some error strings
 103  */
 104 #define CFG_NOTLOCKED   "Configuration not locked"
 105 #define CFG_RDFAILED    "Unable to read configuration"
 106 #define CFG_EINVAL      "Invalid Argument"
 107 #define CFG_EGENERIC    "Generic cfg failure"
 108 
 109 
 110 char *cfg_location(char *location, int mode, char *altroot);
 111 
 112 /*
 113  * location modes
 114  */
 115 #define CFG_LOC_SET_LOCAL       0
 116 #define CFG_LOC_GET_LOCAL       1
 117 #define CFG_LOC_SET_CLUSTER     2
 118 #define CFG_LOC_GET_CLUSTER     3
 119 
 120 /*
 121  * location strings
 122  */
 123 #define CFG_LOCAL_LOCATION      "/etc/dscfg_local"
 124 #define CFG_CLUSTER_LOCATION    "/etc/dscfg_cluster"
 125 
 126 void cfg_close(CFGFILE *);
 127 
 128 /*
 129  * lock mode
 130  */
 131 typedef enum {
 132         CFG_RDLOCK,
 133         CFG_WRLOCK,
 134         CFG_UPGRADE
 135 } CFGLOCK;
 136 
 137 int cfg_lock(CFGFILE *, CFGLOCK);       /* lock the configuration */
 138 void cfp_unlock(cfp_t *);               /* unlock the configuration */
 139 void cfg_unlock(CFGFILE *);
 140 int cfg_get_lock(CFGFILE *, CFGLOCK *, pid_t *);        /* get config lock */
 141 
 142 int cfg_commit(CFGFILE *);
 143 void cfg_resource(CFGFILE *, const char *);     /* Set/clear cluster node */
 144 char *cfg_get_resource(CFGFILE *);              /* get current cluster node */
 145 char *cfg_dgname(const char *, char *, size_t); /* parse dg from pathname */
 146 char *cfg_l_dgname(const char *, char *, size_t); /* parse dg from pathname */
 147 int cfg_dgname_islocal(char *, char **);        /* find locality of dg */
 148 int cfg_iscluster(void);                        /* running in a cluster? */
 149 int cfg_issuncluster(void);                     /* running in a Sun Cluster? */
 150 void cfg_invalidate_sizes(int);
 151 
 152 /*
 153  * add/rem result codes
 154  */
 155 #define CFG_USER_ERR 1
 156 #define CFG_USER_OK 2
 157 #define CFG_USER_FIRST 3
 158 #define CFG_USER_LAST 4
 159 #define CFG_USER_GONE 5
 160 #define CFG_USER_REPEAT 6
 161 
 162 int cfg_add_user(CFGFILE *, char *, char *, char *);    /* add volume user */
 163 int cfg_rem_user(CFGFILE *, char *, char *, char *);    /* remove vol user */
 164 int cfg_vol_enable(CFGFILE *, char *, char *, char *);  /* enable volume */
 165 int cfg_vol_disable(CFGFILE *, char *, char *, char *); /* disable volume */
 166 
 167 int cfg_load_dsvols(CFGFILE *);         /* load dsvol: section */
 168 void cfg_unload_dsvols();               /* unload dsvol: section */
 169 int cfg_load_svols(CFGFILE *);          /* load sv: section */
 170 void cfg_unload_svols();                /* unload sv: section */
 171 int cfg_load_shadows(CFGFILE *);        /* load shadows & bitmaps from ii: */
 172 void cfg_unload_shadows();              /* unload ii: */
 173 
 174 int cfg_get_canonical_name(CFGFILE *, const char *, char **);
 175 
 176 #ifdef  __cplusplus
 177 }
 178 #endif
 179 
 180 #endif /* _CFG_H */