1*fcf3ce44SJohn Forte /* 2*fcf3ce44SJohn Forte * CDDL HEADER START 3*fcf3ce44SJohn Forte * 4*fcf3ce44SJohn Forte * The contents of this file are subject to the terms of the 5*fcf3ce44SJohn Forte * Common Development and Distribution License (the "License"). 6*fcf3ce44SJohn Forte * You may not use this file except in compliance with the License. 7*fcf3ce44SJohn Forte * 8*fcf3ce44SJohn Forte * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9*fcf3ce44SJohn Forte * or http://www.opensolaris.org/os/licensing. 10*fcf3ce44SJohn Forte * See the License for the specific language governing permissions 11*fcf3ce44SJohn Forte * and limitations under the License. 12*fcf3ce44SJohn Forte * 13*fcf3ce44SJohn Forte * When distributing Covered Code, include this CDDL HEADER in each 14*fcf3ce44SJohn Forte * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15*fcf3ce44SJohn Forte * If applicable, add the following below this CDDL HEADER, with the 16*fcf3ce44SJohn Forte * fields enclosed by brackets "[]" replaced with your own identifying 17*fcf3ce44SJohn Forte * information: Portions Copyright [yyyy] [name of copyright owner] 18*fcf3ce44SJohn Forte * 19*fcf3ce44SJohn Forte * CDDL HEADER END 20*fcf3ce44SJohn Forte */ 21*fcf3ce44SJohn Forte /* 22*fcf3ce44SJohn Forte * Copyright 2008 Sun Microsystems, Inc. All rights reserved. 23*fcf3ce44SJohn Forte * Use is subject to license terms. 24*fcf3ce44SJohn Forte */ 25*fcf3ce44SJohn Forte 26*fcf3ce44SJohn Forte #include <stdio.h> 27*fcf3ce44SJohn Forte #include <sys/types.h> 28*fcf3ce44SJohn Forte #include <sys/wait.h> 29*fcf3ce44SJohn Forte #include <sys/vtoc.h> 30*fcf3ce44SJohn Forte #include <sys/stat.h> 31*fcf3ce44SJohn Forte #include <stdio.h> 32*fcf3ce44SJohn Forte #include <sys/mnttab.h> 33*fcf3ce44SJohn Forte #include <errno.h> 34*fcf3ce44SJohn Forte #include <limits.h> 35*fcf3ce44SJohn Forte #include <fcntl.h> 36*fcf3ce44SJohn Forte #include <string.h> 37*fcf3ce44SJohn Forte #include <strings.h> 38*fcf3ce44SJohn Forte #include <stdlib.h> 39*fcf3ce44SJohn Forte #include <unistd.h> 40*fcf3ce44SJohn Forte #include <time.h> 41*fcf3ce44SJohn Forte 42*fcf3ce44SJohn Forte #include <locale.h> 43*fcf3ce44SJohn Forte #include <langinfo.h> 44*fcf3ce44SJohn Forte #include <libintl.h> 45*fcf3ce44SJohn Forte #include <stdarg.h> 46*fcf3ce44SJohn Forte #include <netdb.h> 47*fcf3ce44SJohn Forte #include <ctype.h> 48*fcf3ce44SJohn Forte #include <assert.h> 49*fcf3ce44SJohn Forte 50*fcf3ce44SJohn Forte #include <sys/nsctl/cfg_impl.h> 51*fcf3ce44SJohn Forte #include <sys/nsctl/cfg.h> 52*fcf3ce44SJohn Forte 53*fcf3ce44SJohn Forte #include <sys/unistat/spcs_s.h> 54*fcf3ce44SJohn Forte #include <sys/unistat/spcs_s_u.h> 55*fcf3ce44SJohn Forte #include <sys/unistat/spcs_errors.h> 56*fcf3ce44SJohn Forte 57*fcf3ce44SJohn Forte #ifdef DEBUG 58*fcf3ce44SJohn Forte #include <sys/nsctl/dsw.h> 59*fcf3ce44SJohn Forte #endif 60*fcf3ce44SJohn Forte 61*fcf3ce44SJohn Forte #define DEFAULT_PARSER_LOC "/etc/dscfg_format" 62*fcf3ce44SJohn Forte 63*fcf3ce44SJohn Forte int Cflg; 64*fcf3ce44SJohn Forte int Dflg; 65*fcf3ce44SJohn Forte int Lflg; 66*fcf3ce44SJohn Forte int aflg; 67*fcf3ce44SJohn Forte int iflg; 68*fcf3ce44SJohn Forte int lflg; 69*fcf3ce44SJohn Forte int nflg; 70*fcf3ce44SJohn Forte int pflg; 71*fcf3ce44SJohn Forte int rflg; 72*fcf3ce44SJohn Forte int sflg; 73*fcf3ce44SJohn Forte int uflg; 74*fcf3ce44SJohn Forte 75*fcf3ce44SJohn Forte int verbose; 76*fcf3ce44SJohn Forte int noflags; 77*fcf3ce44SJohn Forte int errflg; 78*fcf3ce44SJohn Forte int mustcommit; 79*fcf3ce44SJohn Forte char *locname; /* config location from cfg_location */ 80*fcf3ce44SJohn Forte char *cmdname; 81*fcf3ce44SJohn Forte 82*fcf3ce44SJohn Forte #define MAX_FILENAME 80 83*fcf3ce44SJohn Forte 84*fcf3ce44SJohn Forte char output_file[MAX_FILENAME]; /* specified output file */ 85*fcf3ce44SJohn Forte char altroot[MAX_FILENAME]; /* specifed root location */ 86*fcf3ce44SJohn Forte char config_file[MAX_FILENAME]; /* specified configuration file */ 87*fcf3ce44SJohn Forte char input_file[MAX_FILENAME]; /* specified input file */ 88*fcf3ce44SJohn Forte char logical_host[MAX_FILENAME]; /* specified cluster node */ 89*fcf3ce44SJohn Forte char device_group[MAX_FILENAME]; /* specified device group name */ 90*fcf3ce44SJohn Forte 91*fcf3ce44SJohn Forte #define IS_NOT_CLUSTER 1 92*fcf3ce44SJohn Forte #define IS_CLUSTER 2 93*fcf3ce44SJohn Forte 94*fcf3ce44SJohn Forte void cfg_invalidate_hsizes(int, const char *); 95*fcf3ce44SJohn Forte static int check_cluster(); 96*fcf3ce44SJohn Forte 97*fcf3ce44SJohn Forte void 98*fcf3ce44SJohn Forte usage(char *errmsg) 99*fcf3ce44SJohn Forte { 100*fcf3ce44SJohn Forte if (errmsg) 101*fcf3ce44SJohn Forte (void) fprintf(stderr, "%s: %s\n", cmdname, errmsg); 102*fcf3ce44SJohn Forte (void) fprintf(stderr, 103*fcf3ce44SJohn Forte gettext("dscfg \t\t\t\tDisplay location of " 104*fcf3ce44SJohn Forte "local configuration database\n")); 105*fcf3ce44SJohn Forte (void) fprintf(stderr, gettext("dscfg -l -s path\t\t" 106*fcf3ce44SJohn Forte "List contents of configuration database\n")); 107*fcf3ce44SJohn Forte (void) fprintf(stderr, gettext( 108*fcf3ce44SJohn Forte "\t\t\t\tlocated at path specified\n")); 109*fcf3ce44SJohn Forte (void) fprintf(stderr, gettext("dscfg -i\t\t\t" 110*fcf3ce44SJohn Forte "Initialize configuration database\n")); 111*fcf3ce44SJohn Forte (void) fprintf(stderr, 112*fcf3ce44SJohn Forte gettext("dscfg -i -p " 113*fcf3ce44SJohn Forte #ifdef DEBUG 114*fcf3ce44SJohn Forte "[-n] " 115*fcf3ce44SJohn Forte #endif 116*fcf3ce44SJohn Forte "/etc/dscfg_format\tFormat configuration database\n")); 117*fcf3ce44SJohn Forte (void) fprintf(stderr, 118*fcf3ce44SJohn Forte gettext("dscfg -a file\t\t\tRestore configuration " 119*fcf3ce44SJohn Forte "database from file\n")); 120*fcf3ce44SJohn Forte (void) fprintf(stderr, gettext("\t\t\t\tspecified\n")); 121*fcf3ce44SJohn Forte (void) fprintf(stderr, 122*fcf3ce44SJohn Forte gettext("dscfg -l\t\t\tList contents of configuration database" 123*fcf3ce44SJohn Forte "\n")); 124*fcf3ce44SJohn Forte (void) fprintf(stderr, 125*fcf3ce44SJohn Forte gettext("dscfg -L\t\t\tDisplay configuration database's\n")); 126*fcf3ce44SJohn Forte (void) fprintf(stderr, gettext("\t\t\t\tlock status\n")); 127*fcf3ce44SJohn Forte (void) fprintf(stderr, gettext("dscfg -h\t\t\tUsage message\n")); 128*fcf3ce44SJohn Forte if (check_cluster() != IS_NOT_CLUSTER) { 129*fcf3ce44SJohn Forte (void) fprintf(stderr, gettext("\nSun Cluster Usage\n")); 130*fcf3ce44SJohn Forte (void) fprintf(stderr, gettext("******************\n")); 131*fcf3ce44SJohn Forte (void) fprintf(stderr, 132*fcf3ce44SJohn Forte gettext("dscfg -s path\t\t\tSet cluster " 133*fcf3ce44SJohn Forte "configuration database at DID\n")); 134*fcf3ce44SJohn Forte (void) fprintf(stderr, gettext("\t\t\t\tpath specified\n")); 135*fcf3ce44SJohn Forte (void) fprintf(stderr, gettext("dscfg -D device_group\t\t" 136*fcf3ce44SJohn Forte "Check status of cluster device group\n")); 137*fcf3ce44SJohn Forte (void) fprintf(stderr, gettext("dscfg -C -\t\t\t" 138*fcf3ce44SJohn Forte "Display location of cluster configuration\n")); 139*fcf3ce44SJohn Forte (void) fprintf(stderr, gettext("\t\t\t\tdatabase\n")); 140*fcf3ce44SJohn Forte (void) fprintf(stderr, gettext("dscfg -l -s DID_device\t\tList " 141*fcf3ce44SJohn Forte "the contents of cluster configuration\n")); 142*fcf3ce44SJohn Forte (void) fprintf(stderr, gettext("\t\t\t\tdatabase\n")); 143*fcf3ce44SJohn Forte (void) fprintf(stderr, gettext("dscfg -C - -i\t\t\tInitialize " 144*fcf3ce44SJohn Forte "cluster configuration database\n")); 145*fcf3ce44SJohn Forte (void) fprintf(stderr, gettext("dscfg -C - -i -p " 146*fcf3ce44SJohn Forte "/etc/dscfg_format Format cluster configuration database\n")); 147*fcf3ce44SJohn Forte (void) fprintf(stderr, gettext("dscfg -C - -a file\t\t" 148*fcf3ce44SJohn Forte "Restore cluster configuration database from\n")); 149*fcf3ce44SJohn Forte (void) fprintf(stderr, gettext("\t\t\t\tfile specified\n")); 150*fcf3ce44SJohn Forte (void) fprintf(stderr, gettext("dscfg -C - -l\t\t\t" 151*fcf3ce44SJohn Forte "List contents of local configuration database\n")); 152*fcf3ce44SJohn Forte (void) fprintf(stderr, gettext("dscfg -C device_group -l\t" 153*fcf3ce44SJohn Forte "List configuration database by device group\n")); 154*fcf3ce44SJohn Forte (void) fprintf(stderr, gettext("dscfg -C \"-\" -l\t\t\t" 155*fcf3ce44SJohn Forte "List configuration database excluding\n")); 156*fcf3ce44SJohn Forte (void) fprintf(stderr, gettext("\t\t\t\tdevice groups\n")); 157*fcf3ce44SJohn Forte } 158*fcf3ce44SJohn Forte } 159*fcf3ce44SJohn Forte 160*fcf3ce44SJohn Forte int 161*fcf3ce44SJohn Forte parse_parse_config(CFGFILE *cfg) 162*fcf3ce44SJohn Forte { 163*fcf3ce44SJohn Forte FILE *fp; 164*fcf3ce44SJohn Forte char inbuf[CFG_MAX_BUF]; 165*fcf3ce44SJohn Forte char *buff; 166*fcf3ce44SJohn Forte int rc; 167*fcf3ce44SJohn Forte 168*fcf3ce44SJohn Forte /* 169*fcf3ce44SJohn Forte * Open parser config file, use default if none specified 170*fcf3ce44SJohn Forte */ 171*fcf3ce44SJohn Forte buff = (input_file[0]) ? input_file : DEFAULT_PARSER_LOC; 172*fcf3ce44SJohn Forte if ((fp = fopen(buff, "r")) == NULL) { 173*fcf3ce44SJohn Forte (void) fprintf(stderr, 174*fcf3ce44SJohn Forte gettext("parser config file (%s) not found\n"), buff); 175*fcf3ce44SJohn Forte return (-1); 176*fcf3ce44SJohn Forte } 177*fcf3ce44SJohn Forte 178*fcf3ce44SJohn Forte /* 179*fcf3ce44SJohn Forte * start at begining of configration database 180*fcf3ce44SJohn Forte */ 181*fcf3ce44SJohn Forte cfg_rewind(cfg, CFG_SEC_ALL); 182*fcf3ce44SJohn Forte 183*fcf3ce44SJohn Forte while (((buff = fgets(inbuf, (sizeof (inbuf) - 1), fp)) != NULL)) { 184*fcf3ce44SJohn Forte if (*buff == '#' || *buff == '%') 185*fcf3ce44SJohn Forte continue; 186*fcf3ce44SJohn Forte /* overwrite newline */ 187*fcf3ce44SJohn Forte buff[strlen(buff) - 1] = '\0'; 188*fcf3ce44SJohn Forte rc = cfg_update_parser_config(cfg, buff, CFG_PARSE_CONF); 189*fcf3ce44SJohn Forte if (rc < 0) { 190*fcf3ce44SJohn Forte (void) fprintf(stderr, 191*fcf3ce44SJohn Forte gettext("update parser config rc %d key %s\n"), 192*fcf3ce44SJohn Forte rc, buff); 193*fcf3ce44SJohn Forte (void) fclose(fp); 194*fcf3ce44SJohn Forte return (-1); 195*fcf3ce44SJohn Forte } 196*fcf3ce44SJohn Forte } 197*fcf3ce44SJohn Forte (void) fclose(fp); 198*fcf3ce44SJohn Forte return (1); 199*fcf3ce44SJohn Forte } 200*fcf3ce44SJohn Forte 201*fcf3ce44SJohn Forte void 202*fcf3ce44SJohn Forte parse_text_config(CFGFILE *cfg) 203*fcf3ce44SJohn Forte { 204*fcf3ce44SJohn Forte FILE *fp; 205*fcf3ce44SJohn Forte char inbuf[CFG_MAX_BUF]; 206*fcf3ce44SJohn Forte char *buff; 207*fcf3ce44SJohn Forte char *key; 208*fcf3ce44SJohn Forte char *p; 209*fcf3ce44SJohn Forte int rc; 210*fcf3ce44SJohn Forte 211*fcf3ce44SJohn Forte if ((fp = fopen(input_file, "r")) == NULL) { 212*fcf3ce44SJohn Forte (void) fprintf(stderr, 213*fcf3ce44SJohn Forte gettext("Unable to open text config %s\n"), 214*fcf3ce44SJohn Forte input_file); 215*fcf3ce44SJohn Forte exit(2); 216*fcf3ce44SJohn Forte } 217*fcf3ce44SJohn Forte bzero(inbuf, sizeof (inbuf)); 218*fcf3ce44SJohn Forte cfg_rewind(cfg, CFG_SEC_CONF); 219*fcf3ce44SJohn Forte while (((buff = fgets(inbuf, (sizeof (inbuf) - 1), fp)) != NULL)) { 220*fcf3ce44SJohn Forte if (*buff == '#') 221*fcf3ce44SJohn Forte continue; 222*fcf3ce44SJohn Forte /* overwrite newline */ 223*fcf3ce44SJohn Forte buff[strlen(buff) - 1] = '\0'; 224*fcf3ce44SJohn Forte key = strtok(buff, ":"); 225*fcf3ce44SJohn Forte if (!key) { 226*fcf3ce44SJohn Forte continue; 227*fcf3ce44SJohn Forte } 228*fcf3ce44SJohn Forte p = &buff[strlen(key)+2]; 229*fcf3ce44SJohn Forte while (*p && isspace(*p)) { 230*fcf3ce44SJohn Forte ++p; 231*fcf3ce44SJohn Forte } 232*fcf3ce44SJohn Forte if (!*p) { 233*fcf3ce44SJohn Forte continue; 234*fcf3ce44SJohn Forte } 235*fcf3ce44SJohn Forte rc = cfg_put_cstring(cfg, key, p, strlen(p)); 236*fcf3ce44SJohn Forte if (rc < 0) { 237*fcf3ce44SJohn Forte (void) fprintf(stderr, 238*fcf3ce44SJohn Forte gettext("update text config failed rc %d key %s"), 239*fcf3ce44SJohn Forte rc, buff); 240*fcf3ce44SJohn Forte return; 241*fcf3ce44SJohn Forte } 242*fcf3ce44SJohn Forte bzero(inbuf, sizeof (inbuf)); 243*fcf3ce44SJohn Forte } 244*fcf3ce44SJohn Forte (void) fclose(fp); 245*fcf3ce44SJohn Forte } 246*fcf3ce44SJohn Forte void 247*fcf3ce44SJohn Forte dump_status(CFGFILE *cfg) 248*fcf3ce44SJohn Forte { 249*fcf3ce44SJohn Forte cfp_t *cfp = FP_SUN_CLUSTER(cfg); 250*fcf3ce44SJohn Forte 251*fcf3ce44SJohn Forte /* 252*fcf3ce44SJohn Forte * WARNING will robinson 253*fcf3ce44SJohn Forte * The following is using a non-exported internal interface 254*fcf3ce44SJohn Forte * to libcfg 255*fcf3ce44SJohn Forte * You may not use any of the following fields in MS software 256*fcf3ce44SJohn Forte */ 257*fcf3ce44SJohn Forte if (!locname) 258*fcf3ce44SJohn Forte exit(2); 259*fcf3ce44SJohn Forte if (!verbose) 260*fcf3ce44SJohn Forte (void) printf("%s\n", locname); 261*fcf3ce44SJohn Forte else { 262*fcf3ce44SJohn Forte #ifdef DEBUG 263*fcf3ce44SJohn Forte (void) printf(gettext("Configuration location: %s\n"), locname); 264*fcf3ce44SJohn Forte (void) printf( 265*fcf3ce44SJohn Forte gettext("Header info:\n\t\t\tmagic: %x\tstate: %x\n"), 266*fcf3ce44SJohn Forte cfp->cf_head->h_magic, cfp->cf_head->h_state); 267*fcf3ce44SJohn Forte (void) printf( 268*fcf3ce44SJohn Forte gettext("Parser section:\t\t" 269*fcf3ce44SJohn Forte "Start: %x\tsize: %d offset: %d\n"), 270*fcf3ce44SJohn Forte cfp->cf_mapped, cfp->cf_head->h_parsesize, 271*fcf3ce44SJohn Forte cfp->cf_head->h_parseoff); 272*fcf3ce44SJohn Forte (void) printf( 273*fcf3ce44SJohn Forte gettext("Config section:\t\t" 274*fcf3ce44SJohn Forte "Start: %x\tsize:%d\tacsize: %d\n"), 275*fcf3ce44SJohn Forte cfp->cf_head->h_cparse, cfp->cf_head->h_csize, 276*fcf3ce44SJohn Forte cfp->cf_head->h_acsize); 277*fcf3ce44SJohn Forte (void) printf("\t\t\tccopy1: %s\tccopy2: %s\n", 278*fcf3ce44SJohn Forte cfp->cf_head->h_ccopy1, 279*fcf3ce44SJohn Forte cfp->cf_head->h_ccopy2); 280*fcf3ce44SJohn Forte (void) printf( 281*fcf3ce44SJohn Forte gettext("Sequence:\t\tseq1: %d\t\tseq2: %d\n"), 282*fcf3ce44SJohn Forte cfp->cf_head->h_seq1, cfp->cf_head->h_seq2); 283*fcf3ce44SJohn Forte #endif 284*fcf3ce44SJohn Forte } 285*fcf3ce44SJohn Forte } 286*fcf3ce44SJohn Forte 287*fcf3ce44SJohn Forte void 288*fcf3ce44SJohn Forte dump_lockstat(CFGFILE *cfg) 289*fcf3ce44SJohn Forte { 290*fcf3ce44SJohn Forte pid_t pid; 291*fcf3ce44SJohn Forte CFGLOCK lock; 292*fcf3ce44SJohn Forte char ps_str[1024]; 293*fcf3ce44SJohn Forte 294*fcf3ce44SJohn Forte if (cfg_get_lock(cfg, &lock, &pid) == TRUE) { 295*fcf3ce44SJohn Forte (void) printf("%s %ld\n", 296*fcf3ce44SJohn Forte lock == CFG_RDLOCK ? 297*fcf3ce44SJohn Forte gettext("Read locked by process id") : 298*fcf3ce44SJohn Forte gettext("Write locked by process id"), 299*fcf3ce44SJohn Forte pid); 300*fcf3ce44SJohn Forte (void) sprintf(ps_str, "ps -p %ld", pid); 301*fcf3ce44SJohn Forte system(ps_str); 302*fcf3ce44SJohn Forte } else 303*fcf3ce44SJohn Forte (void) printf("%s\n", gettext("Not locked.")); 304*fcf3ce44SJohn Forte } 305*fcf3ce44SJohn Forte 306*fcf3ce44SJohn Forte 307*fcf3ce44SJohn Forte /* 308*fcf3ce44SJohn Forte * dump current configuration section to stdout 309*fcf3ce44SJohn Forte */ 310*fcf3ce44SJohn Forte 311*fcf3ce44SJohn Forte void 312*fcf3ce44SJohn Forte print_config(CFGFILE *cfg) 313*fcf3ce44SJohn Forte { 314*fcf3ce44SJohn Forte time_t tloc = 0; 315*fcf3ce44SJohn Forte int set = 0; 316*fcf3ce44SJohn Forte char pconfig[CFG_MAX_BUF]; 317*fcf3ce44SJohn Forte char key[CFG_MAX_KEY]; 318*fcf3ce44SJohn Forte char buf[CFG_MAX_BUF]; 319*fcf3ce44SJohn Forte char *cp, pbuf[CFG_MAX_BUF]; 320*fcf3ce44SJohn Forte FILE *fp; 321*fcf3ce44SJohn Forte int rc; 322*fcf3ce44SJohn Forte int end; 323*fcf3ce44SJohn Forte 324*fcf3ce44SJohn Forte (void) snprintf(pconfig, sizeof (pconfig), 325*fcf3ce44SJohn Forte "%s%s", altroot, DEFAULT_PARSER_LOC); 326*fcf3ce44SJohn Forte if ((fp = fopen(pconfig, "r")) == NULL) { 327*fcf3ce44SJohn Forte (void) fprintf(stderr, 328*fcf3ce44SJohn Forte gettext("dscfg: unable to open " 329*fcf3ce44SJohn Forte "parser configuration (%s): %s\n"), 330*fcf3ce44SJohn Forte pconfig, strerror(errno)); 331*fcf3ce44SJohn Forte exit(1); 332*fcf3ce44SJohn Forte } 333*fcf3ce44SJohn Forte 334*fcf3ce44SJohn Forte (void) time(&tloc); 335*fcf3ce44SJohn Forte (void) printf(gettext("# Consolidated Dataservice Configuration\n")); 336*fcf3ce44SJohn Forte (void) printf(gettext("# Do not edit out whitespace or dashes\n")); 337*fcf3ce44SJohn Forte (void) printf(gettext("# File created on: %s"), ctime(&tloc)); 338*fcf3ce44SJohn Forte 339*fcf3ce44SJohn Forte while (fgets(pbuf, (sizeof (pbuf) - 1), fp) != NULL) { 340*fcf3ce44SJohn Forte if (pbuf[0] == '#') { 341*fcf3ce44SJohn Forte /* comment */ 342*fcf3ce44SJohn Forte continue; 343*fcf3ce44SJohn Forte } 344*fcf3ce44SJohn Forte /* force a NULL terminator */ 345*fcf3ce44SJohn Forte pbuf[sizeof (pbuf) - 1] = '\0'; 346*fcf3ce44SJohn Forte 347*fcf3ce44SJohn Forte if (pbuf[0] == '%') { 348*fcf3ce44SJohn Forte /* 349*fcf3ce44SJohn Forte * descriptive text 350*fcf3ce44SJohn Forte * - print it (with comment leader) and move on 351*fcf3ce44SJohn Forte */ 352*fcf3ce44SJohn Forte (void) printf("#%s", &pbuf[1]); 353*fcf3ce44SJohn Forte continue; 354*fcf3ce44SJohn Forte } 355*fcf3ce44SJohn Forte 356*fcf3ce44SJohn Forte /* 357*fcf3ce44SJohn Forte * truncate the parser config in pbuf[] to just the tag 358*fcf3ce44SJohn Forte */ 359*fcf3ce44SJohn Forte cp = strchr(pbuf, '.'); 360*fcf3ce44SJohn Forte if (cp != NULL) { 361*fcf3ce44SJohn Forte *cp = '\0'; 362*fcf3ce44SJohn Forte } 363*fcf3ce44SJohn Forte 364*fcf3ce44SJohn Forte set = 1; 365*fcf3ce44SJohn Forte /*CONSTCOND*/ 366*fcf3ce44SJohn Forte while (1) { 367*fcf3ce44SJohn Forte bzero(buf, CFG_MAX_BUF); 368*fcf3ce44SJohn Forte (void) snprintf(key, 369*fcf3ce44SJohn Forte sizeof (key), "%s.set%d", pbuf, set); 370*fcf3ce44SJohn Forte rc = cfg_get_cstring(cfg, key, buf, CFG_MAX_BUF); 371*fcf3ce44SJohn Forte if (rc < 0) { 372*fcf3ce44SJohn Forte break; 373*fcf3ce44SJohn Forte } 374*fcf3ce44SJohn Forte /* trim trailing space if necessary */ 375*fcf3ce44SJohn Forte end = strlen(buf) - 1; 376*fcf3ce44SJohn Forte if (buf[end] == ' ') 377*fcf3ce44SJohn Forte buf[end] = '\0'; 378*fcf3ce44SJohn Forte 379*fcf3ce44SJohn Forte (void) printf("%s:%s\n", pbuf, buf); 380*fcf3ce44SJohn Forte set++; 381*fcf3ce44SJohn Forte } 382*fcf3ce44SJohn Forte } 383*fcf3ce44SJohn Forte 384*fcf3ce44SJohn Forte (void) fclose(fp); 385*fcf3ce44SJohn Forte } 386*fcf3ce44SJohn Forte 387*fcf3ce44SJohn Forte int 388*fcf3ce44SJohn Forte make_new_config(const char *fileloc) 389*fcf3ce44SJohn Forte { 390*fcf3ce44SJohn Forte int fd; 391*fcf3ce44SJohn Forte int rc; 392*fcf3ce44SJohn Forte int skip; 393*fcf3ce44SJohn Forte 394*fcf3ce44SJohn Forte char buf[CFG_MAX_BUF]; 395*fcf3ce44SJohn Forte /*CONSTCOND*/ 396*fcf3ce44SJohn Forte assert((sizeof (buf) % 512) == 0); 397*fcf3ce44SJohn Forte 398*fcf3ce44SJohn Forte bzero(buf, CFG_MAX_BUF); 399*fcf3ce44SJohn Forte 400*fcf3ce44SJohn Forte if ((fd = open(fileloc, O_RDWR | O_CREAT, 0640)) == -1) { 401*fcf3ce44SJohn Forte return (-1); 402*fcf3ce44SJohn Forte } 403*fcf3ce44SJohn Forte 404*fcf3ce44SJohn Forte /* if this is a device, we may have to skip the vtoc */ 405*fcf3ce44SJohn Forte if ((skip = cfg_shldskip_vtoc(fd, fileloc)) == -1) { 406*fcf3ce44SJohn Forte (void) fprintf(stderr, 407*fcf3ce44SJohn Forte gettext("dscfg: unable to read vtoc on (%s)\n"), 408*fcf3ce44SJohn Forte fileloc); 409*fcf3ce44SJohn Forte return (-1); 410*fcf3ce44SJohn Forte } else if (skip) { 411*fcf3ce44SJohn Forte do { 412*fcf3ce44SJohn Forte rc = lseek(fd, CFG_VTOC_SKIP, SEEK_SET); 413*fcf3ce44SJohn Forte } while (rc == -1 && errno == EINTR); 414*fcf3ce44SJohn Forte 415*fcf3ce44SJohn Forte if (rc == -1) { 416*fcf3ce44SJohn Forte (void) fprintf(stderr, gettext("dscfg: seek error")); 417*fcf3ce44SJohn Forte return (-1); 418*fcf3ce44SJohn Forte } 419*fcf3ce44SJohn Forte } 420*fcf3ce44SJohn Forte 421*fcf3ce44SJohn Forte do { 422*fcf3ce44SJohn Forte rc = write(fd, buf, sizeof (buf)); 423*fcf3ce44SJohn Forte } while (rc == -1 && errno == EINTR); 424*fcf3ce44SJohn Forte 425*fcf3ce44SJohn Forte close(fd); 426*fcf3ce44SJohn Forte 427*fcf3ce44SJohn Forte return ((rc < 0) ? 0 : 1); 428*fcf3ce44SJohn Forte } 429*fcf3ce44SJohn Forte 430*fcf3ce44SJohn Forte /* 431*fcf3ce44SJohn Forte * dscfg 432*fcf3ce44SJohn Forte * configure or return dataservice persistent configuration 433*fcf3ce44SJohn Forte * 434*fcf3ce44SJohn Forte * options 435*fcf3ce44SJohn Forte * -i initialize file for first time 436*fcf3ce44SJohn Forte * -l dump current configuration to stdout in ascii 437*fcf3ce44SJohn Forte * -a add 438*fcf3ce44SJohn Forte * -C node Set resource filter 439*fcf3ce44SJohn Forte * -p parser config specified input file 440*fcf3ce44SJohn Forte * -s set partition location or filename in default location 441*fcf3ce44SJohn Forte * -L print configuration lock status 442*fcf3ce44SJohn Forte * -u upgrade 443*fcf3ce44SJohn Forte * -r prepend bootdir to beginning of path for cfg_open 444*fcf3ce44SJohn Forte * no options status 445*fcf3ce44SJohn Forte * 446*fcf3ce44SJohn Forte * 447*fcf3ce44SJohn Forte */ 448*fcf3ce44SJohn Forte #ifdef lint 449*fcf3ce44SJohn Forte int 450*fcf3ce44SJohn Forte dscfg_lintmain(int argc, char *argv[]) 451*fcf3ce44SJohn Forte #else 452*fcf3ce44SJohn Forte int 453*fcf3ce44SJohn Forte main(int argc, char *argv[]) 454*fcf3ce44SJohn Forte #endif 455*fcf3ce44SJohn Forte { 456*fcf3ce44SJohn Forte CFGFILE *cfg; 457*fcf3ce44SJohn Forte extern char *optarg; 458*fcf3ce44SJohn Forte char *loc; 459*fcf3ce44SJohn Forte int offset = 0; 460*fcf3ce44SJohn Forte int rc; 461*fcf3ce44SJohn Forte char c; 462*fcf3ce44SJohn Forte int local; 463*fcf3ce44SJohn Forte int action_counts = 0; 464*fcf3ce44SJohn Forte 465*fcf3ce44SJohn Forte bzero(input_file, sizeof (input_file)); 466*fcf3ce44SJohn Forte (void) setlocale(LC_ALL, ""); 467*fcf3ce44SJohn Forte (void) textdomain("dscfg"); 468*fcf3ce44SJohn Forte logical_host[0] = '\0'; 469*fcf3ce44SJohn Forte cmdname = argv[0]; 470*fcf3ce44SJohn Forte #ifdef DEBUG 471*fcf3ce44SJohn Forte while ((c = getopt(argc, argv, "a:C:dD:ilLp:r:s:hvn")) != EOF) { 472*fcf3ce44SJohn Forte #else 473*fcf3ce44SJohn Forte while ((c = getopt(argc, argv, "a:C:dD:ilLp:r:s:h")) != EOF) { 474*fcf3ce44SJohn Forte #endif 475*fcf3ce44SJohn Forte switch (c) { 476*fcf3ce44SJohn Forte case 'a': 477*fcf3ce44SJohn Forte aflg++; 478*fcf3ce44SJohn Forte strcpy(input_file, optarg); 479*fcf3ce44SJohn Forte mustcommit++; 480*fcf3ce44SJohn Forte action_counts++; 481*fcf3ce44SJohn Forte break; 482*fcf3ce44SJohn Forte case 'C': 483*fcf3ce44SJohn Forte Cflg++; 484*fcf3ce44SJohn Forte strcpy(logical_host, optarg); 485*fcf3ce44SJohn Forte if (logical_host && *logical_host == '-') 486*fcf3ce44SJohn Forte if (argc == 3) 487*fcf3ce44SJohn Forte action_counts++; 488*fcf3ce44SJohn Forte break; 489*fcf3ce44SJohn Forte case 'D': 490*fcf3ce44SJohn Forte Dflg++; 491*fcf3ce44SJohn Forte strcpy(device_group, optarg); 492*fcf3ce44SJohn Forte action_counts++; 493*fcf3ce44SJohn Forte break; 494*fcf3ce44SJohn Forte case 'i': 495*fcf3ce44SJohn Forte iflg++; 496*fcf3ce44SJohn Forte mustcommit++; 497*fcf3ce44SJohn Forte action_counts++; 498*fcf3ce44SJohn Forte break; 499*fcf3ce44SJohn Forte case 'l': 500*fcf3ce44SJohn Forte lflg++; 501*fcf3ce44SJohn Forte action_counts++; 502*fcf3ce44SJohn Forte break; 503*fcf3ce44SJohn Forte case 'L': 504*fcf3ce44SJohn Forte Lflg++; 505*fcf3ce44SJohn Forte action_counts++; 506*fcf3ce44SJohn Forte break; 507*fcf3ce44SJohn Forte case 'p': 508*fcf3ce44SJohn Forte pflg++; 509*fcf3ce44SJohn Forte strcpy(input_file, optarg); 510*fcf3ce44SJohn Forte mustcommit++; 511*fcf3ce44SJohn Forte break; 512*fcf3ce44SJohn Forte case 's': 513*fcf3ce44SJohn Forte sflg++; 514*fcf3ce44SJohn Forte strcpy(config_file, optarg); 515*fcf3ce44SJohn Forte action_counts++; 516*fcf3ce44SJohn Forte break; 517*fcf3ce44SJohn Forte case 'h': 518*fcf3ce44SJohn Forte usage(NULL); 519*fcf3ce44SJohn Forte exit(0); 520*fcf3ce44SJohn Forte /*NOTREACHED*/ 521*fcf3ce44SJohn Forte #ifdef DEBUG 522*fcf3ce44SJohn Forte case 'v': 523*fcf3ce44SJohn Forte verbose++; 524*fcf3ce44SJohn Forte action_counts++; 525*fcf3ce44SJohn Forte break; 526*fcf3ce44SJohn Forte #endif 527*fcf3ce44SJohn Forte #ifdef UPGRADE 528*fcf3ce44SJohn Forte case 'u': 529*fcf3ce44SJohn Forte uflg++; 530*fcf3ce44SJohn Forte action_counts++; 531*fcf3ce44SJohn Forte break; 532*fcf3ce44SJohn Forte #endif 533*fcf3ce44SJohn Forte 534*fcf3ce44SJohn Forte case 'r': 535*fcf3ce44SJohn Forte rflg++; 536*fcf3ce44SJohn Forte strcpy(altroot, optarg); 537*fcf3ce44SJohn Forte break; 538*fcf3ce44SJohn Forte 539*fcf3ce44SJohn Forte case 'n': 540*fcf3ce44SJohn Forte nflg++; 541*fcf3ce44SJohn Forte break; 542*fcf3ce44SJohn Forte 543*fcf3ce44SJohn Forte default: 544*fcf3ce44SJohn Forte usage(NULL); 545*fcf3ce44SJohn Forte exit(1); 546*fcf3ce44SJohn Forte break; 547*fcf3ce44SJohn Forte }; 548*fcf3ce44SJohn Forte } 549*fcf3ce44SJohn Forte 550*fcf3ce44SJohn Forte switch (action_counts) { 551*fcf3ce44SJohn Forte case 0: 552*fcf3ce44SJohn Forte if (argc > 1) { 553*fcf3ce44SJohn Forte if (pflg) 554*fcf3ce44SJohn Forte usage(gettext( 555*fcf3ce44SJohn Forte "-p option must be used in conjunction with -i")); 556*fcf3ce44SJohn Forte else 557*fcf3ce44SJohn Forte usage(gettext("must specify an action flag")); 558*fcf3ce44SJohn Forte exit(1); 559*fcf3ce44SJohn Forte } 560*fcf3ce44SJohn Forte break; 561*fcf3ce44SJohn Forte case 1: 562*fcf3ce44SJohn Forte break; 563*fcf3ce44SJohn Forte case 2: 564*fcf3ce44SJohn Forte if (lflg && sflg) 565*fcf3ce44SJohn Forte break; 566*fcf3ce44SJohn Forte else { 567*fcf3ce44SJohn Forte usage(gettext("too many action flags")); 568*fcf3ce44SJohn Forte exit(1); 569*fcf3ce44SJohn Forte break; 570*fcf3ce44SJohn Forte } 571*fcf3ce44SJohn Forte default: 572*fcf3ce44SJohn Forte usage(gettext("too many action flags")); 573*fcf3ce44SJohn Forte exit(1); 574*fcf3ce44SJohn Forte break; 575*fcf3ce44SJohn Forte } 576*fcf3ce44SJohn Forte 577*fcf3ce44SJohn Forte if (argc == 1 || (argc == 2 && verbose) || (argc == 3 && (rflg|Cflg))) 578*fcf3ce44SJohn Forte noflags++; 579*fcf3ce44SJohn Forte 580*fcf3ce44SJohn Forte if (Dflg) { 581*fcf3ce44SJohn Forte /* 582*fcf3ce44SJohn Forte * Determine if the value specified is a device group 583*fcf3ce44SJohn Forte * that is active on this node 584*fcf3ce44SJohn Forte */ 585*fcf3ce44SJohn Forte char *other_node; 586*fcf3ce44SJohn Forte if ((cfg_issuncluster() > 0) && (strlen(device_group) > 0)) { 587*fcf3ce44SJohn Forte local = cfg_dgname_islocal(device_group, &other_node); 588*fcf3ce44SJohn Forte if (local == 0) 589*fcf3ce44SJohn Forte (void) fprintf(stderr, gettext( 590*fcf3ce44SJohn Forte "Device group %s active on %s\n"), 591*fcf3ce44SJohn Forte device_group, other_node); 592*fcf3ce44SJohn Forte else if (local == 1) 593*fcf3ce44SJohn Forte (void) fprintf(stderr, gettext( 594*fcf3ce44SJohn Forte "Device group %s active on this node\n"), 595*fcf3ce44SJohn Forte device_group); 596*fcf3ce44SJohn Forte else 597*fcf3ce44SJohn Forte (void) fprintf(stderr, gettext( 598*fcf3ce44SJohn Forte "Device group %s not found\n"), device_group); 599*fcf3ce44SJohn Forte return (local); 600*fcf3ce44SJohn Forte } else { 601*fcf3ce44SJohn Forte (void) fprintf(stderr, gettext( 602*fcf3ce44SJohn Forte "dscfg -D is only allowed in " 603*fcf3ce44SJohn Forte "Sun Cluster OE\n")); 604*fcf3ce44SJohn Forte return (0); 605*fcf3ce44SJohn Forte } 606*fcf3ce44SJohn Forte } 607*fcf3ce44SJohn Forte 608*fcf3ce44SJohn Forte if (sflg && !lflg) { 609*fcf3ce44SJohn Forte /* 610*fcf3ce44SJohn Forte * Only allow setting location on a non-sun cluster system 611*fcf3ce44SJohn Forte * if the cluster reference file is already present. 612*fcf3ce44SJohn Forte */ 613*fcf3ce44SJohn Forte struct stat dscfg_stat = {0}; 614*fcf3ce44SJohn Forte if (cfg_issuncluster() <= 0) { 615*fcf3ce44SJohn Forte if (stat(CFG_CLUSTER_LOCATION, &dscfg_stat) != 0) { 616*fcf3ce44SJohn Forte if (dscfg_stat.st_blocks == 0) { 617*fcf3ce44SJohn Forte (void) fprintf(stderr, gettext( 618*fcf3ce44SJohn Forte "dscfg -s is only allowed in " 619*fcf3ce44SJohn Forte "Sun Cluster OE\n")); 620*fcf3ce44SJohn Forte exit(1); 621*fcf3ce44SJohn Forte } 622*fcf3ce44SJohn Forte } 623*fcf3ce44SJohn Forte } 624*fcf3ce44SJohn Forte 625*fcf3ce44SJohn Forte spcs_log("dscfg", NULL, gettext("dscfg -s %s"), config_file); 626*fcf3ce44SJohn Forte locname = cfg_location(config_file, CFG_LOC_SET_CLUSTER, 627*fcf3ce44SJohn Forte rflg ? altroot : NULL); 628*fcf3ce44SJohn Forte if (locname == NULL) { 629*fcf3ce44SJohn Forte (void) fprintf(stderr, gettext("dscfg: %s\n"), 630*fcf3ce44SJohn Forte cfg_error(NULL)); 631*fcf3ce44SJohn Forte exit(1); 632*fcf3ce44SJohn Forte } else 633*fcf3ce44SJohn Forte exit(0); 634*fcf3ce44SJohn Forte 635*fcf3ce44SJohn Forte } else if (sflg && lflg) { 636*fcf3ce44SJohn Forte /* s used with l for temporarily peeking at a dscfg database */ 637*fcf3ce44SJohn Forte loc = config_file; 638*fcf3ce44SJohn Forte } else { 639*fcf3ce44SJohn Forte locname = cfg_location(NULL, 640*fcf3ce44SJohn Forte Cflg ? CFG_LOC_GET_CLUSTER : CFG_LOC_GET_LOCAL, 641*fcf3ce44SJohn Forte rflg ? altroot : NULL); 642*fcf3ce44SJohn Forte if (Cflg && (locname == NULL)) { 643*fcf3ce44SJohn Forte (void) fprintf(stderr, gettext( 644*fcf3ce44SJohn Forte "dscfg: cluster config not set: %s\n"), 645*fcf3ce44SJohn Forte cfg_error(NULL)); 646*fcf3ce44SJohn Forte return (1); 647*fcf3ce44SJohn Forte } 648*fcf3ce44SJohn Forte loc = rflg ? locname : NULL; 649*fcf3ce44SJohn Forte } 650*fcf3ce44SJohn Forte 651*fcf3ce44SJohn Forte /* 652*fcf3ce44SJohn Forte * the following hack forces the configuration file to initialize 653*fcf3ce44SJohn Forte */ 654*fcf3ce44SJohn Forte if (iflg && !pflg) { 655*fcf3ce44SJohn Forte int fild; 656*fcf3ce44SJohn Forte int c; 657*fcf3ce44SJohn Forte char buf[CFG_MAX_BUF] = {0}; 658*fcf3ce44SJohn Forte cfp_t *cfp; 659*fcf3ce44SJohn Forte 660*fcf3ce44SJohn Forte if (!nflg) { 661*fcf3ce44SJohn Forte (void) printf( 662*fcf3ce44SJohn Forte gettext("WARNING: This option will erase your " 663*fcf3ce44SJohn Forte "Availability Suite configuration\n")); 664*fcf3ce44SJohn Forte (void) printf( 665*fcf3ce44SJohn Forte gettext("Do you want to continue? (Y/N) [N] ")); 666*fcf3ce44SJohn Forte 667*fcf3ce44SJohn Forte c = getchar(); 668*fcf3ce44SJohn Forte switch (c) { 669*fcf3ce44SJohn Forte case 'y': 670*fcf3ce44SJohn Forte case 'Y': break; 671*fcf3ce44SJohn Forte case 'n': 672*fcf3ce44SJohn Forte case 'N': 673*fcf3ce44SJohn Forte case '\n': 674*fcf3ce44SJohn Forte (void) fprintf(stderr, gettext( 675*fcf3ce44SJohn Forte "dscfg: configuration not initialized\n")); 676*fcf3ce44SJohn Forte exit(1); 677*fcf3ce44SJohn Forte default: 678*fcf3ce44SJohn Forte (void) fprintf(stderr, gettext( 679*fcf3ce44SJohn Forte "dscfg: %d is not a valid response\n"), c); 680*fcf3ce44SJohn Forte exit(1); 681*fcf3ce44SJohn Forte } 682*fcf3ce44SJohn Forte } 683*fcf3ce44SJohn Forte 684*fcf3ce44SJohn Forte spcs_log("dscfg", NULL, gettext("dscfg -i")); 685*fcf3ce44SJohn Forte 686*fcf3ce44SJohn Forte if ((cfg = cfg_open(loc)) == NULL) { 687*fcf3ce44SJohn Forte /* this is not a good config, or non-existent so.. */ 688*fcf3ce44SJohn Forte if (!make_new_config(locname)) { 689*fcf3ce44SJohn Forte (void) fprintf(stderr, gettext("dscfg: %s\n"), 690*fcf3ce44SJohn Forte cfg_error(NULL)); 691*fcf3ce44SJohn Forte exit(1); 692*fcf3ce44SJohn Forte } 693*fcf3ce44SJohn Forte if ((cfg = cfg_open(loc)) == NULL) { 694*fcf3ce44SJohn Forte (void) fprintf(stderr, gettext("dscfg: %s\n"), 695*fcf3ce44SJohn Forte cfg_error(NULL)); 696*fcf3ce44SJohn Forte exit(1); 697*fcf3ce44SJohn Forte } 698*fcf3ce44SJohn Forte } 699*fcf3ce44SJohn Forte 700*fcf3ce44SJohn Forte /* 701*fcf3ce44SJohn Forte * Set cluster node if specified 702*fcf3ce44SJohn Forte */ 703*fcf3ce44SJohn Forte if (Cflg) 704*fcf3ce44SJohn Forte cfg_resource(cfg, logical_host); 705*fcf3ce44SJohn Forte 706*fcf3ce44SJohn Forte if (cfg_is_cfg(cfg) != 1) { 707*fcf3ce44SJohn Forte if (!make_new_config(locname)) { 708*fcf3ce44SJohn Forte (void) fprintf(stderr, gettext("dscfg: unable " 709*fcf3ce44SJohn Forte " to create new config \n")); 710*fcf3ce44SJohn Forte exit(1); 711*fcf3ce44SJohn Forte } 712*fcf3ce44SJohn Forte } 713*fcf3ce44SJohn Forte 714*fcf3ce44SJohn Forte if (!cfg_lock(cfg, CFG_WRLOCK)) { 715*fcf3ce44SJohn Forte (void) fprintf(stderr, gettext("dscfg: %s\n"), 716*fcf3ce44SJohn Forte cfg_error(NULL)); 717*fcf3ce44SJohn Forte exit(1); 718*fcf3ce44SJohn Forte } 719*fcf3ce44SJohn Forte 720*fcf3ce44SJohn Forte cfp = FP_SUN_CLUSTER(cfg); 721*fcf3ce44SJohn Forte if ((fild = cfp->cf_fd) == 0) { 722*fcf3ce44SJohn Forte (void) fprintf(stderr, 723*fcf3ce44SJohn Forte gettext("dscfg: failure to access %s " 724*fcf3ce44SJohn Forte "configuration database: %s\n"), 725*fcf3ce44SJohn Forte (Cflg) ? gettext("cluster") : gettext("local"), 726*fcf3ce44SJohn Forte cfg_error(NULL)); 727*fcf3ce44SJohn Forte exit(1); 728*fcf3ce44SJohn Forte } 729*fcf3ce44SJohn Forte 730*fcf3ce44SJohn Forte if (cfg_shldskip_vtoc(fild, locname) > 0) 731*fcf3ce44SJohn Forte offset += CFG_VTOC_SKIP; 732*fcf3ce44SJohn Forte 733*fcf3ce44SJohn Forte lseek(fild, offset, SEEK_SET); 734*fcf3ce44SJohn Forte write(fild, buf, sizeof (buf)); 735*fcf3ce44SJohn Forte cfg_invalidate_hsizes(fild, locname); 736*fcf3ce44SJohn Forte 737*fcf3ce44SJohn Forte cfg_close(cfg); 738*fcf3ce44SJohn Forte exit(0); 739*fcf3ce44SJohn Forte } 740*fcf3ce44SJohn Forte 741*fcf3ce44SJohn Forte if (pflg && !iflg) { 742*fcf3ce44SJohn Forte usage(gettext("-p option must be used in conjunction with -i")); 743*fcf3ce44SJohn Forte exit(1); 744*fcf3ce44SJohn Forte 745*fcf3ce44SJohn Forte } 746*fcf3ce44SJohn Forte 747*fcf3ce44SJohn Forte if (uflg) { 748*fcf3ce44SJohn Forte char cmd[CFG_MAX_BUF]; 749*fcf3ce44SJohn Forte if (rflg) 750*fcf3ce44SJohn Forte (void) snprintf(cmd, sizeof (cmd), 751*fcf3ce44SJohn Forte "%s/usr/sbin/dscfg -r %s -l >" 752*fcf3ce44SJohn Forte " %s/var/tmp/.dscfg.bak", altroot, 753*fcf3ce44SJohn Forte altroot, altroot); 754*fcf3ce44SJohn Forte else 755*fcf3ce44SJohn Forte (void) snprintf(cmd, sizeof (cmd), 756*fcf3ce44SJohn Forte "/usr/sbin/dscfg -l >" 757*fcf3ce44SJohn Forte " /var/tmp/.dscfg.bak"); 758*fcf3ce44SJohn Forte 759*fcf3ce44SJohn Forte if (system(cmd) != 0) { 760*fcf3ce44SJohn Forte (void) fprintf(stderr, 761*fcf3ce44SJohn Forte "dscfg: unable to create backup\n"); 762*fcf3ce44SJohn Forte exit(1); 763*fcf3ce44SJohn Forte } 764*fcf3ce44SJohn Forte 765*fcf3ce44SJohn Forte if ((cfg = cfg_open(loc)) == NULL) { 766*fcf3ce44SJohn Forte (void) fprintf(stderr, gettext("dscfg: %s\n"), 767*fcf3ce44SJohn Forte cfg_error(NULL)); 768*fcf3ce44SJohn Forte exit(2); 769*fcf3ce44SJohn Forte } 770*fcf3ce44SJohn Forte 771*fcf3ce44SJohn Forte if (!cfg_lock(cfg, CFG_UPGRADE)) { 772*fcf3ce44SJohn Forte (void) fprintf(stderr, 773*fcf3ce44SJohn Forte gettext("dscfg: upgrade failed\n")); 774*fcf3ce44SJohn Forte cfg_close(cfg); 775*fcf3ce44SJohn Forte exit(1); 776*fcf3ce44SJohn Forte } 777*fcf3ce44SJohn Forte 778*fcf3ce44SJohn Forte cfg_close(cfg); 779*fcf3ce44SJohn Forte exit(0); 780*fcf3ce44SJohn Forte } 781*fcf3ce44SJohn Forte 782*fcf3ce44SJohn Forte if ((cfg = cfg_open(loc)) == NULL) { 783*fcf3ce44SJohn Forte (void) fprintf(stderr, gettext("dscfg: %s\n"), cfg_error(NULL)); 784*fcf3ce44SJohn Forte exit(2); 785*fcf3ce44SJohn Forte } 786*fcf3ce44SJohn Forte 787*fcf3ce44SJohn Forte /* 788*fcf3ce44SJohn Forte * Set cluster node if specified 789*fcf3ce44SJohn Forte */ 790*fcf3ce44SJohn Forte if (Cflg) 791*fcf3ce44SJohn Forte cfg_resource(cfg, logical_host); 792*fcf3ce44SJohn Forte 793*fcf3ce44SJohn Forte if ((!pflg) && (!noflags)) { 794*fcf3ce44SJohn Forte if (cfg_is_cfg(cfg) != 1) { 795*fcf3ce44SJohn Forte (void) fprintf(stderr, 796*fcf3ce44SJohn Forte gettext("dscfg: %s\n"), cfg_error(NULL)); 797*fcf3ce44SJohn Forte cfg_close(cfg); 798*fcf3ce44SJohn Forte exit(1); 799*fcf3ce44SJohn Forte } 800*fcf3ce44SJohn Forte } 801*fcf3ce44SJohn Forte 802*fcf3ce44SJohn Forte if (Lflg) { 803*fcf3ce44SJohn Forte dump_lockstat(cfg); 804*fcf3ce44SJohn Forte cfg_close(cfg); 805*fcf3ce44SJohn Forte exit(0); 806*fcf3ce44SJohn Forte } 807*fcf3ce44SJohn Forte 808*fcf3ce44SJohn Forte if (noflags) { 809*fcf3ce44SJohn Forte dump_status(cfg); 810*fcf3ce44SJohn Forte cfg_close(cfg); 811*fcf3ce44SJohn Forte exit(0); 812*fcf3ce44SJohn Forte } 813*fcf3ce44SJohn Forte 814*fcf3ce44SJohn Forte if (!cfg_lock(cfg, mustcommit? CFG_WRLOCK : CFG_RDLOCK)) { 815*fcf3ce44SJohn Forte (void) fprintf(stderr, gettext("cfg_lock: lock failed\n")); 816*fcf3ce44SJohn Forte cfg_close(cfg); 817*fcf3ce44SJohn Forte exit(1); 818*fcf3ce44SJohn Forte } 819*fcf3ce44SJohn Forte 820*fcf3ce44SJohn Forte if (lflg) { 821*fcf3ce44SJohn Forte print_config(cfg); 822*fcf3ce44SJohn Forte cfg_close(cfg); 823*fcf3ce44SJohn Forte exit(0); 824*fcf3ce44SJohn Forte } 825*fcf3ce44SJohn Forte 826*fcf3ce44SJohn Forte /* 827*fcf3ce44SJohn Forte * initialize configuration 828*fcf3ce44SJohn Forte */ 829*fcf3ce44SJohn Forte if (iflg) { 830*fcf3ce44SJohn Forte spcs_log("dscfg", NULL, gettext("dscfg -i -p %s"), input_file); 831*fcf3ce44SJohn Forte 832*fcf3ce44SJohn Forte if (!pflg) { 833*fcf3ce44SJohn Forte (void) fprintf(stderr, 834*fcf3ce44SJohn Forte gettext("dscfg: cannot init without " 835*fcf3ce44SJohn Forte "parser configuration file\n")); 836*fcf3ce44SJohn Forte cfg_close(cfg); 837*fcf3ce44SJohn Forte exit(1); 838*fcf3ce44SJohn Forte } else if (parse_parse_config(cfg) < 0) { 839*fcf3ce44SJohn Forte (void) fprintf(stderr, gettext("dscfg: cannot load " 840*fcf3ce44SJohn Forte "parser configuration file\n")); 841*fcf3ce44SJohn Forte cfg_close(cfg); 842*fcf3ce44SJohn Forte exit(1); 843*fcf3ce44SJohn Forte } 844*fcf3ce44SJohn Forte } 845*fcf3ce44SJohn Forte 846*fcf3ce44SJohn Forte /* 847*fcf3ce44SJohn Forte * read asci config file and write 848*fcf3ce44SJohn Forte */ 849*fcf3ce44SJohn Forte if (aflg) { 850*fcf3ce44SJohn Forte spcs_log("dscfg", NULL, gettext("dscfg -a %s"), input_file); 851*fcf3ce44SJohn Forte parse_text_config(cfg); 852*fcf3ce44SJohn Forte } 853*fcf3ce44SJohn Forte 854*fcf3ce44SJohn Forte if (mustcommit) { 855*fcf3ce44SJohn Forte rc = cfg_commit(cfg); 856*fcf3ce44SJohn Forte if (rc < 0) { 857*fcf3ce44SJohn Forte int sev = 0; 858*fcf3ce44SJohn Forte (void) fprintf(stderr, gettext("dscfg: %s\n"), 859*fcf3ce44SJohn Forte cfg_error(&sev)); 860*fcf3ce44SJohn Forte if (sev == CFG_EFATAL) { 861*fcf3ce44SJohn Forte cfg_close(cfg); 862*fcf3ce44SJohn Forte exit(2); 863*fcf3ce44SJohn Forte } 864*fcf3ce44SJohn Forte } 865*fcf3ce44SJohn Forte } 866*fcf3ce44SJohn Forte 867*fcf3ce44SJohn Forte cfg_close(cfg); 868*fcf3ce44SJohn Forte return (0); 869*fcf3ce44SJohn Forte } 870*fcf3ce44SJohn Forte 871*fcf3ce44SJohn Forte static int 872*fcf3ce44SJohn Forte check_cluster() 873*fcf3ce44SJohn Forte { 874*fcf3ce44SJohn Forte static int is_cluster = -1; 875*fcf3ce44SJohn Forte int rc; 876*fcf3ce44SJohn Forte 877*fcf3ce44SJohn Forte if (is_cluster != -1) 878*fcf3ce44SJohn Forte return (is_cluster); 879*fcf3ce44SJohn Forte rc = cfg_iscluster(); 880*fcf3ce44SJohn Forte if (rc > 0) { 881*fcf3ce44SJohn Forte is_cluster = IS_CLUSTER; 882*fcf3ce44SJohn Forte return (is_cluster); 883*fcf3ce44SJohn Forte } else if (rc == 0) { 884*fcf3ce44SJohn Forte is_cluster = IS_NOT_CLUSTER; 885*fcf3ce44SJohn Forte return (is_cluster); 886*fcf3ce44SJohn Forte } else { 887*fcf3ce44SJohn Forte (void) fprintf(stderr, 888*fcf3ce44SJohn Forte gettext("dscfg: unable to determin environment\n")); 889*fcf3ce44SJohn Forte /*NOTREACHED*/ 890*fcf3ce44SJohn Forte } 891*fcf3ce44SJohn Forte 892*fcf3ce44SJohn Forte /* gcc */ 893*fcf3ce44SJohn Forte return (is_cluster); 894*fcf3ce44SJohn Forte } 895