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_CLUSTER_H
  27 #define _CFG_CLUSTER_H
  28 
  29 #ifdef  __cplusplus
  30 extern "C" {
  31 #endif
  32 
  33 /*
  34  * This file is a combination of interfaces culled from scstat.h,
  35  * scconf.h and the header files that they include.
  36  *
  37  * It exposes a subset of the interfaces defined in PSARC/2001/261
  38  * for use in NWS software.
  39  */
  40 
  41 #include <sys/errno.h>
  42 #include <sys/types.h>
  43 
  44 /*
  45  * From sc_syslog_msg.h
  46  */
  47 
  48 typedef enum sc_state_code_enum {
  49         ONLINE = 1,     /* resource is running */
  50         OFFLINE,        /* resource is stopped due to user action */
  51         FAULTED,        /* resource is stopped due to a failure */
  52         DEGRADED,       /* resource is running but has a minor problem */
  53         WAIT,           /* resource is in transition from a state to another */
  54 
  55         /*
  56          * resource is monitored but state of the resource is
  57          * not known because either the monitor went down or
  58          * the monitor cannot report resource state temporarily.
  59          */
  60         UNKNOWN,
  61 
  62         NOT_MONITORED   /* There is no monitor to check state of the resource */
  63 } sc_state_code_t;
  64 
  65 /*
  66  * End sc_syslog_msg.h
  67  */
  68 
  69 
  70 /*
  71  * From scstat.h
  72  */
  73 
  74 #define SCSTAT_MAX_STRING_LEN   1024
  75 
  76 /* Error codes returned by scstat functions. */
  77 /* This definition is covered by PSARC/2001/261.  DO NOT change it. */
  78 typedef enum scstat_errno {
  79         SCSTAT_ENOERR,          /* normal return - no error */
  80         SCSTAT_EUSAGE,          /* syntax error */
  81         SCSTAT_ENOMEM,          /* not enough memory */
  82         SCSTAT_ENOTCLUSTER,     /* not a cluster node */
  83         SCSTAT_ENOTCONFIGURED,  /* not found in CCR */
  84         SCSTAT_ESERVICENAME,    /* dcs: invalid service name */
  85         SCSTAT_EINVAL,          /* scconf: invalid argument */
  86         SCSTAT_EPERM,           /* not root */
  87         SCSTAT_ECLUSTERRECONFIG, /* cluster is reconfiguring */
  88         SCSTAT_ERGRECONFIG,     /* RG is reconfiguring */
  89         SCSTAT_EOBSOLETE,       /* Resource/RG has been updated */
  90         SCSTAT_EUNEXPECTED      /* internal or unexpected error */
  91 } scstat_errno_t;
  92 
  93 /* States a resource can be in */
  94 /* This definition is covered by PSARC/2001/261.  DO NOT change it. */
  95 typedef enum scstat_state_code {
  96         SCSTAT_ONLINE = ONLINE,         /* resource is running */
  97         SCSTAT_OFFLINE = OFFLINE, /* resource stopped due to user action */
  98         SCSTAT_FAULTED = FAULTED, /* resource stopped due to a failure */
  99         SCSTAT_DEGRADED = DEGRADED, /* resource running with a minor problem */
 100         SCSTAT_WAIT = WAIT,             /* resource is in transition */
 101         SCSTAT_UNKNOWN = UNKNOWN,       /* resource state is unknown */
 102         SCSTAT_NOTMONITORED = NOT_MONITORED     /* resource is not monitored */
 103 } scstat_state_code_t;
 104 
 105 /* States a replica of a resource can be in */
 106 /* This definition is covered by PSARC/2001/261.  DO NOT change it. */
 107 typedef enum scstat_node_pref {
 108         SCSTAT_PRIMARY,         /* replica is a primary */
 109         SCSTAT_SECONDARY,       /* replica is a secondary */
 110         SCSTAT_SPARE,           /* replica is a spare */
 111         SCSTAT_INACTIVE,        /* replica is inactive */
 112         SCSTAT_TRANSITION,      /* replica is changing state */
 113         SCSTAT_INVALID          /* replica is in an invalid state */
 114 } scstat_node_pref_t;
 115 
 116 /* component name */
 117 typedef char *scstat_name_t;
 118 typedef scstat_name_t scstat_cluster_name_t;    /* cluster name */
 119 typedef scstat_name_t scstat_node_name_t;       /* node name */
 120 typedef scstat_name_t scstat_adapter_name_t;    /* adapter name */
 121 typedef scstat_name_t scstat_path_name_t;       /* path name */
 122 typedef scstat_name_t scstat_ds_name_t;         /* device service name */
 123 typedef scstat_name_t scstat_quorumdev_name_t;  /* quorum device name */
 124 typedef scstat_name_t scstat_rs_name_t;         /* resource name */
 125 typedef scstat_name_t scstat_rg_name_t;         /* rg name */
 126 
 127 /* status string */
 128 typedef char *scstat_statstr_t;
 129 typedef scstat_statstr_t scstat_node_statstr_t;         /* node status */
 130 typedef scstat_statstr_t scstat_path_statstr_t;         /* path status */
 131 typedef scstat_statstr_t scstat_ds_statstr_t;           /* DS status */
 132 typedef scstat_statstr_t scstat_node_quorum_statstr_t;  /* node quorum status */
 133 typedef scstat_statstr_t scstat_quorumdev_statstr_t;    /* quorum device stat */
 134 
 135 /* ha device node status list */
 136 /* This definition is covered by PSARC/2001/261.  DO NOT change it. */
 137 typedef struct scstat_ds_node_state_struct {
 138         /* node name */
 139         scstat_node_name_t                      scstat_node_name;
 140         /* node status */
 141         scstat_node_pref_t                      scstat_node_state;
 142         /* next */
 143         struct scstat_ds_node_state_struct      *scstat_node_next;
 144 } scstat_ds_node_state_t;
 145 
 146 /* Cluster node status */
 147 /* This definition is covered by PSARC/2001/261.  DO NOT change it. */
 148 typedef struct scstat_node_struct {
 149         scstat_node_name_t      scstat_node_name;       /* node name */
 150         scstat_state_code_t     scstat_node_status;     /* cluster membership */
 151         scstat_node_statstr_t   scstat_node_statstr;    /* node status string */
 152         void                    *pad;                   /* Padding for */
 153                                                         /* PSARC/2001/261. */
 154         struct scstat_node_struct *scstat_node_next;    /* next */
 155 } scstat_node_t;
 156 
 157 /* Cluster ha device status */
 158 /* This definition is covered by PSARC/2001/261.  DO NOT change it. */
 159 typedef struct scstat_ds_struct {
 160         /* ha device name */
 161         scstat_ds_name_t                scstat_ds_name;
 162         /* ha device status */
 163         scstat_state_code_t             scstat_ds_status;
 164         /* ha device statstr */
 165         scstat_ds_statstr_t             scstat_ds_statstr;
 166         /* node preference list */
 167         scstat_ds_node_state_t          *scstat_node_state_list;
 168         /* next */
 169         struct scstat_ds_struct         *scstat_ds_next;
 170 } scstat_ds_t;
 171 
 172 /*
 173  * scstat_strerr
 174  *
 175  * Map scstat_errno_t to a string.
 176  *
 177  * The supplied "errbuffer" should be of at least SCSTAT_MAX_STRING_LEN
 178  * in length.
 179  */
 180 /* This definition is covered by PSARC/2001/261.  DO NOT change it. */
 181 void scstat_strerr(scstat_errno_t, char *);
 182 
 183 /*
 184  * Upon success, a list of objects of scstat_node_t are returned.
 185  * The caller is responsible for freeing the space.
 186  *
 187  * Possible return values:
 188  *
 189  *      SCSTAT_NOERR            - success
 190  *      SCSTAT_ENOMEM           - not enough memory
 191  *      SCSTAT_EPERM            - not root
 192  *      SCSTAT_ENOTCLUSTER      - there is no cluster
 193  *      SCCONF_EINVAL           - invalid argument
 194  *      SCSTAT_EUNEXPECTED      - internal or unexpected error
 195  */
 196 /* This definition is covered by PSARC/2001/261.  DO NOT change it. */
 197 scstat_errno_t scstat_get_nodes(scstat_node_t **pplnodes);
 198 
 199 /*
 200  * Free all memory associated with a scstat_node_t structure.
 201  */
 202 /* This definition is covered by PSARC/2001/261.  DO NOT change it. */
 203 void scstat_free_nodes(scstat_node_t *plnodes);
 204 
 205 /*
 206  * If the device service name passed in is NULL, then this function returns
 207  * the status of all device services, otherwise it returns the status of the
 208  * device service specified.
 209  * The caller is responsible for freeing the space.
 210  *
 211  * Possible return values:
 212  *
 213  *      SCSTAT_ENOERR           - success
 214  *      SCSTAT_ENOMEM           - not enough memory
 215  *      SCSTAT_EPERM            - not root
 216  *      SCSTAT_ENOTCLUSTER      - there is no cluster
 217  *      SCCONF_EINVAL           - invalid argument
 218  *      SCSTAT_ESERVICENAME     - invalid device group name
 219  *      SCSTAT_EUNEXPECTED      - internal or unexpected error
 220  */
 221 /* This definition is covered by PSARC/2001/261.  DO NOT change it. */
 222 scstat_errno_t scstat_get_ds_status(scstat_ds_name_t *dsname,
 223     scstat_ds_t **dsstatus);
 224 
 225 /*
 226  * Free memory associated with a scstat_ds_t structure.
 227  */
 228 /* This definition is covered by PSARC/2001/261.  DO NOT change it. */
 229 void scstat_free_ds_status(scstat_ds_t *dsstatus);
 230 
 231 /*
 232  * End scstat.h
 233  */
 234 
 235 /*
 236  * From scconf.h
 237  */
 238 
 239 /* Maximum message string length */
 240 #define SCCONF_MAXSTRINGLEN     1024
 241 
 242 /* This definition is covered by PSARC/2001/261.  DO NOT change it. */
 243 typedef enum scconf_errno {
 244         SCCONF_NOERR = 0,               /* normal return - no error */
 245         SCCONF_EPERM = 1,               /* permission denied */
 246         SCCONF_EEXIST = 2,              /* object already exists */
 247         SCCONF_ENOEXIST = 3,            /* object does not exist */
 248         SCCONF_ESTALE = 4,              /* object or handle is stale */
 249         SCCONF_EUNKNOWN = 5,            /* unkown type */
 250         SCCONF_ENOCLUSTER = 6,          /* cluster does not exist */
 251         SCCONF_ENODEID = 7,             /* ID used in place of node name */
 252         SCCONF_EINVAL = 8,              /* invalid argument */
 253         SCCONF_EUSAGE = 9,              /* command usage error */
 254         SCCONF_ETIMEDOUT = 10,          /* call timed out */
 255         SCCONF_EINUSE = 11,             /* already in use */
 256         SCCONF_EBUSY = 12,              /* busy, try again later */
 257         SCCONF_EINSTALLMODE = 13,       /* install mode */
 258         SCCONF_ENOMEM = 14,             /* not enough memory */
 259         SCCONF_ESETUP = 15,             /* setup attempt failed */
 260         SCCONF_EUNEXPECTED = 16,        /* internal or unexpected error */
 261         SCCONF_EBADVALUE = 17,          /* bad ccr table value */
 262         SCCONF_EOVERFLOW = 18,          /* message buffer overflow */
 263         SCCONF_EQUORUM = 19,            /* operation would compromise quorum */
 264         SCCONF_TM_EBADOPTS = 20,        /* bad transport TM "options" */
 265         SCCONF_TM_EINVAL = 21,          /* other transport TM error */
 266         SCCONF_DS_ESUSPENDED = 22,      /* Device service in suspended state */
 267         SCCONF_DS_ENODEINVAL = 23,      /* Node specified is not in cluster */
 268         SCCONF_EAUTH = 24,              /* authentication error */
 269         SCCONF_DS_EINVAL = 25,          /* Device service in an invalid state */
 270         SCCONF_EIO = 26                 /* IO error */
 271 } scconf_errno_t;
 272 
 273 /* IDs */
 274 /* This definition is covered by PSARC/2001/261.  DO NOT change it. */
 275 typedef uint_t scconf_id_t;
 276 
 277 /* This definition is covered by PSARC/2001/261.  DO NOT change it. */
 278 typedef scconf_id_t scconf_nodeid_t;            /* node ID */
 279 
 280 /* Cluster transport handle */
 281 /* This definition is covered by PSARC/2001/261.  DO NOT change it. */
 282 typedef void *          scconf_cltr_handle_t;
 283 
 284 /* This definition is covered by PSARC/2001/261.  DO NOT change it. */
 285 extern scconf_errno_t scconf_get_nodeid(char *nodename,
 286     scconf_nodeid_t *nodeidp);
 287 
 288 /*
 289  * Get the name of a node from its "nodeid".  Upon success,
 290  * a pointer to the nodename is left in "nodenamep".
 291  *
 292  * It is the caller's responsibility to free memory allocated
 293  * for "nodename" using free(3C).
 294  *
 295  * Possible return values:
 296  *
 297  *      SCCONF_NOERR            - success
 298  *      SCCONF_EPERM            - not root
 299  *      SCCONF_ENOCLUSTER       - there is no cluster
 300  *      SCCONF_ENOMEM           - not enough memory
 301  *      SCCONF_EINVAL           - invalid argument
 302  *      SCCONF_EUNEXPECTED      - internal or unexpected error
 303  */
 304 /* This definition is covered by PSARC/2001/261.  DO NOT change it. */
 305 extern scconf_errno_t scconf_get_nodename(scconf_nodeid_t nodeid,
 306     char **nodenamep);
 307 
 308 /*
 309  * Map scconf_errno_t to a string.
 310  *
 311  * The supplied "errbuffer" should be of at least SCCONF_MAXSTRINGLEN
 312  * in length.
 313  */
 314 /* This definition is covered by PSARC/2001/261.  DO NOT change it. */
 315 extern void scconf_strerr(char *errbuffer, scconf_errno_t err);
 316 
 317 /*
 318  * Given a dev_t value, return the name of device service that contains this
 319  * device.
 320  *
 321  * The caller is responsible for freeing the memory returned in "name".
 322  *
 323  * Possible return values:
 324  *
 325  *      SCCONF_NOERR            - success
 326  *      SCCONF_EPERM            - not root
 327  *      SCCONF_ENOEXIST         - the given device is not configured
 328  *      SCCONF_ENOMEM           - not enough memory
 329  *      SCCONF_ENOCLUSTER       - cluster config does not exist
 330  *      SCCONF_EUNEXPECTED      - internal or unexpected error
 331  */
 332 /* This definition is covered by PSARC/2001/261.  DO NOT change it. */
 333 extern scconf_errno_t scconf_get_ds_by_devt(major_t maj, minor_t min,
 334     char **dsname);
 335 
 336 /*
 337  * End scconf.h
 338  */
 339 
 340 #ifdef  __cplusplus
 341 }
 342 #endif
 343 
 344 #endif /* _CFG_CLUSTER_H */