summaryrefslogtreecommitdiff
path: root/usr/src/cmd/avs/rdc/sndrboot.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/cmd/avs/rdc/sndrboot.c')
-rw-r--r--usr/src/cmd/avs/rdc/sndrboot.c881
1 files changed, 0 insertions, 881 deletions
diff --git a/usr/src/cmd/avs/rdc/sndrboot.c b/usr/src/cmd/avs/rdc/sndrboot.c
deleted file mode 100644
index fcdb59899b..0000000000
--- a/usr/src/cmd/avs/rdc/sndrboot.c
+++ /dev/null
@@ -1,881 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License (the "License").
- * You may not use this file except in compliance with the License.
- *
- * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
- * or http://www.opensolaris.org/os/licensing.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information: Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- */
-
-/*
- * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
- */
-
-
-#include <sys/types.h>
-#include <sys/wait.h>
-#include <stdio.h>
-#include <sys/mnttab.h>
-#include <errno.h>
-#include <limits.h>
-#include <fcntl.h>
-#include <strings.h>
-#include <stdlib.h>
-#include <unistd.h>
-
-#include <locale.h>
-#include <langinfo.h>
-#include <libintl.h>
-#include <stdarg.h>
-#include <netdb.h>
-#include <ctype.h>
-#include <sys/utsname.h>
-
-#include <sys/nsctl/rdc_io.h>
-#include <sys/nsctl/rdc_ioctl.h>
-#include <sys/nsctl/rdc_prot.h>
-
-#include <sys/nsctl/cfg.h>
-#include <sys/nsctl/cfg_cluster.h>
-
-#include <sys/unistat/spcs_s.h>
-#include <sys/unistat/spcs_s_u.h>
-#include <sys/unistat/spcs_errors.h>
-
-#include "rdcadm.h"
-
-/*
- * Special re-use of sndrboot to fix SNDR set IDs during post-patch processing
- */
-#define RDC_CMD_FIXSETIDS 0xFEEDFACE
-
-/*
- * config file user level Dual copy pair structure
- */
-typedef struct _sd_dual_pair {
- char fhost[MAX_RDC_HOST_SIZE]; /* Hostname for primary device */
- char fnetaddr[RDC_MAXADDR]; /* Host netaddr for primary device */
- char ffile[NSC_MAXPATH]; /* Primary device */
- char fbitmap[NSC_MAXPATH]; /* Primary bitmap device */
- char thost[MAX_RDC_HOST_SIZE]; /* Hostname for secondary device */
- char tnetaddr[RDC_MAXADDR]; /* Host netaddr for secondary device */
- char tfile[NSC_MAXPATH]; /* Secondary device */
- char tbitmap[NSC_MAXPATH]; /* Secondary bitmap device */
- char directfile[NSC_MAXPATH]; /* Local FCAL direct IO volume */
- char diskqueue[NSC_MAXPATH]; /* Disk Queue volume */
- char group[NSC_MAXPATH]; /* Group name */
- char lhost[MAX_RDC_HOST_SIZE]; /* Logical hostname for cluster */
- int doasync; /* Device is in sync/async mode */
- int setid; /* unique setid of this set */
-} _sd_dual_pair_t;
-
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-#include <netinet/tcp.h>
-#include <rpc/rpc_com.h>
-#include <rpc/rpc.h>
-
-#include <sys/nsctl/librdc.h>
-
-char *ctag = NULL;
-
-int parseopts(int, char **, int *);
-static int rdc_operation(char *, char *, char *, char *, char *, char *, int,
- char *, char *, char *, int, char *, int setid);
-static int read_libcfg(int);
-static void usage(void);
-
-extern char *basename(char *);
-
-int rdc_maxsets;
-static _sd_dual_pair_t *pair_list;
-char *program;
-
-struct netbuf svaddr;
-struct netbuf *svp;
-struct netconfig nconf;
-struct netconfig *conf;
-struct knetconfig knconf;
-static int clustered = 0;
-static int proto_test = 0;
-
-#ifdef lint
-int
-sndrboot_lintmain(int argc, char *argv[])
-#else
-int
-main(int argc, char *argv[])
-#endif
-{
- char fromhost[MAX_RDC_HOST_SIZE];
- char tohost[MAX_RDC_HOST_SIZE];
- char fromfile[NSC_MAXPATH];
- char tofile[NSC_MAXPATH];
- char frombitmap[NSC_MAXPATH];
- char tobitmap[NSC_MAXPATH];
- char directfile[NSC_MAXPATH];
- char diskqueue[NSC_MAXPATH];
- char group[NSC_MAXPATH];
- char lhost[MAX_RDC_HOST_SIZE];
- int pairs;
- int pid;
- int flag = 0;
- int doasync;
- int rc;
- char *required;
- int setid;
-
- (void) setlocale(LC_ALL, "");
- (void) textdomain("rdc");
-
- program = basename(argv[0]);
-
- rc = rdc_check_release(&required);
- if (rc < 0) {
- rdc_err(NULL,
- gettext("unable to determine the current "
- "Solaris release: %s\n"), strerror(errno));
- } else if (rc == FALSE) {
- rdc_err(NULL,
- gettext("incorrect Solaris release (requires %s)\n"),
- required);
- }
-
- rdc_maxsets = rdc_get_maxsets();
- if (rdc_maxsets == -1) {
- spcs_log("sndr", NULL,
- gettext("%s unable to get maxsets value from kernel"),
- program);
-
- rdc_err(NULL,
- gettext("unable to get maxsets value from kernel"));
- }
-
- pair_list = calloc(rdc_maxsets, sizeof (*pair_list));
- if (pair_list == NULL) {
- rdc_err(NULL,
- gettext(
- "unable to allocate pair_list"
- " array for %d sets"),
- rdc_maxsets);
- }
-
- if (parseopts(argc, argv, &flag))
- return (1);
- pairs = read_libcfg(flag);
-
- if (flag == RDC_CMD_FIXSETIDS) {
- if (pairs) {
- spcs_log("sndr", NULL, gettext("Fixed %d Remote Mirror"
- " set IDs"), pairs);
-#ifdef DEBUG
- rdc_warn(NULL, gettext("Fixed %d Remote Mirror set "
- "IDs"), pairs);
-#endif
- }
- return (0);
- }
-
- if (pairs == 0) {
-#ifdef DEBUG
- rdc_err(NULL,
- gettext("Config contains no dual copy sets"));
-#else
- return (0);
-#endif
- }
-
- while (pairs--) {
- pid = fork();
- if (pid == -1) { /* error forking */
- perror("fork");
- continue;
- }
-
- if (pid > 0) /* this is parent process */
- continue;
-
-/*
- * At this point, this is the child process. Do the operation
- */
-
- (void) strncpy(fromfile,
- pair_list[pairs].ffile, NSC_MAXPATH);
- (void) strncpy(tofile,
- pair_list[pairs].tfile, NSC_MAXPATH);
- (void) strncpy(frombitmap,
- pair_list[pairs].fbitmap, NSC_MAXPATH);
- (void) strncpy(fromhost,
- pair_list[pairs].fhost, MAX_RDC_HOST_SIZE);
- (void) strncpy(tohost,
- pair_list[pairs].thost, MAX_RDC_HOST_SIZE);
- (void) strncpy(tobitmap,
- pair_list[pairs].tbitmap, NSC_MAXPATH);
- (void) strncpy(directfile,
- pair_list[pairs].directfile, NSC_MAXPATH);
- (void) strncpy(diskqueue,
- pair_list[pairs].diskqueue, NSC_MAXPATH);
- (void) strncpy(group,
- pair_list[pairs].group, NSC_MAXPATH);
- (void) strncpy(lhost,
- pair_list[pairs].lhost, MAX_RDC_HOST_SIZE);
-
- doasync = pair_list[pairs].doasync;
- setid = pair_list[pairs].setid;
- if (rdc_operation(fromhost, fromfile, frombitmap,
- tohost, tofile, tobitmap, flag, directfile, group,
- diskqueue, doasync, lhost, setid)
- < 0) {
- exit(255);
- }
-
- exit(0);
- }
-
- while ((wait((int *)0) > 0))
- ;
- return (0);
-}
-
-static int
-rdc_operation(fromhost, fromfile, frombitmap, tohost, tofile,
- tobitmap, flag, directfile, group, diskqueue, doasync,
- lhost, setid)
-char *fromhost, *fromfile, *frombitmap;
-char *tohost, *tofile, *tobitmap;
-int flag, doasync;
-char *directfile;
-char *group, *diskqueue;
-int setid;
-char *lhost;
-{
- const int getaddr = (flag == RDC_CMD_RESUME);
- const int rpcbind = !getaddr;
- rdc_config_t parms;
- int ret;
- spcs_s_info_t ustatus;
- struct hostent *hp;
- char fromname[MAXHOSTNAMELEN], toname[MAXHOSTNAMELEN];
- struct t_info tinfo;
- int i;
-
- conf = &nconf;
- bzero(&fromname, MAXHOSTNAMELEN);
- bzero(&toname, MAXHOSTNAMELEN);
-
- hp = gethost_byname(fromhost);
- if (hp == NULL) {
- spcs_log("sndr", NULL,
- gettext("%s gethost_byname failed for %s"),
- program, fromhost);
- }
- if (strcmp(hp->h_name, fromhost) == 0)
- (void) strncpy(fromname, hp->h_name, MAXHOSTNAMELEN);
- else {
- for (i = 0; hp->h_aliases[i] != NULL; i++) {
- if (strcmp(hp->h_aliases[i], fromhost) == 0)
- (void) strncpy(fromname, hp->h_aliases[i],
- MAXHOSTNAMELEN);
- }
- }
- if (fromname[0] == '\0') {
- spcs_log("sndr", NULL,
- gettext("%s host %s is not local"),
- program, fromhost);
- rdc_err(NULL, gettext("Host %s is not local"),
- fromhost);
- }
- hp = gethost_byname(tohost);
- if (hp == NULL) {
- spcs_log("sndr", NULL,
- gettext("%s gethost_byname failed for %s"),
- program, tohost);
- }
- if (strcmp(hp->h_name, tohost) == 0)
- (void) strncpy(toname, hp->h_name, MAXHOSTNAMELEN);
- else {
- for (i = 0; hp->h_aliases[i] != NULL; i++) {
- if (strcmp(hp->h_aliases[i], tohost) == 0)
- (void) strncpy(toname, hp->h_aliases[i],
- MAXHOSTNAMELEN);
- }
- }
- if (toname[0] == '\0') {
- spcs_log("sndr", NULL,
- gettext("%s host %s is not local"),
- program, tohost);
- rdc_err(NULL, gettext("Host %s is not local"),
- tohost);
- }
-
- if (self_check(fromname) && self_check(toname)) {
- spcs_log("sndr", NULL,
- gettext("%s Both %s and %s are local"),
- program, fromhost, tohost);
- rdc_err(NULL, gettext("Both %s and %s are local"),
- fromhost, tohost);
- }
-
- /*
- * Now build up the address for each host including port and transport
- */
- if (getaddr) {
- svp = get_addr(toname, RDC_PROGRAM, RDC_VERS_MIN,
- &conf, proto_test?NC_UDP: NULL, "rdc", &tinfo, rpcbind);
-
- if (svp == NULL) {
-#ifdef DEBUG
- (void) printf("get_addr failed for Ver 4 %s\n", toname);
-#endif
- spcs_log("sndr", NULL,
- gettext("%s get_addr failed for Ver 4"),
- program);
- return (-1);
- }
- svaddr = *svp;
- } else {
- bzero(&svaddr, sizeof (svaddr));
- }
-
- parms.rdc_set->secondary.addr.len = svaddr.len;
- parms.rdc_set->secondary.addr.maxlen = svaddr.maxlen;
- parms.rdc_set->secondary.addr.buf = (void *)svaddr.buf;
-
-#ifdef DEBUG_ADDR
- (void) fprintf(stderr,
- "secondary buf %x len %d\n", svaddr.buf, svaddr.len);
-
- for (i = 0; i < svaddr.len; i++)
- (void) printf("%u ", svaddr.buf[i]);
- (void) printf("\n");
-#endif
-
- if (getaddr) {
- svp = get_addr(fromname, RDC_PROGRAM, RDC_VERS_MIN,
- &conf, proto_test?NC_UDP: NULL, "rdc", &tinfo, rpcbind);
- if (svp == NULL) {
-#ifdef DEBUG
- (void) printf("get_addr failed for Ver 4 %s\n",
- fromname);
-#endif
- return (-1);
- }
- svaddr = *svp;
- } else {
- ;
- /*EMPTY*/
- }
- parms.rdc_set->primary.addr.len = svaddr.len;
- parms.rdc_set->primary.addr.maxlen = svaddr.maxlen;
- parms.rdc_set->primary.addr.buf =
- (void *)svaddr.buf;
-
-#ifdef DEBUG_ADDR
- (void) fprintf(stderr, "primary buf %x len %d\n",
- svaddr.buf, svaddr.len);
- for (i = 0; i < svaddr.len; i++)
- (void) printf("%u ", svaddr.buf[i]);
- (void) printf("\n");
-#endif
-
- if (getaddr) {
- (void) convert_nconf_to_knconf(conf, &knconf);
-#ifdef DEBUG_ADDR
- (void) printf("knconf %x %s %s %x\n", knconf.knc_semantics,
- knconf.knc_protofmly, knconf.knc_proto, knconf.knc_rdev);
-#endif
- parms.rdc_set->netconfig = &knconf;
- } else {
- parms.rdc_set->netconfig = NULL;
- }
- if (!clustered && !self_check(fromname) && !self_check(toname)) {
- spcs_log("sndr", NULL,
- gettext("%s Neither %s nor %s is local"),
- program, fromhost, tohost);
- rdc_err(NULL, gettext("Neither %s nor %s is local"),
- fromhost, tohost);
- }
- (void) strncpy(parms.rdc_set->primary.intf, fromhost,
- MAX_RDC_HOST_SIZE);
- (void) strncpy(parms.rdc_set->primary.file, fromfile, NSC_MAXPATH);
- (void) strncpy(parms.rdc_set->primary.bitmap, frombitmap, NSC_MAXPATH);
-
- (void) strncpy(parms.rdc_set->secondary.intf, tohost,
- MAX_RDC_HOST_SIZE);
- (void) strncpy(parms.rdc_set->secondary.file, tofile, NSC_MAXPATH);
- (void) strncpy(parms.rdc_set->secondary.bitmap, tobitmap, NSC_MAXPATH);
-
- (void) strncpy(parms.rdc_set->group_name, group, NSC_MAXPATH);
- (void) strncpy(parms.rdc_set->disk_queue, diskqueue, NSC_MAXPATH);
-
- parms.rdc_set->maxqfbas = maxqfbas;
- parms.rdc_set->maxqitems = maxqitems;
- parms.rdc_set->autosync = autosync;
- parms.rdc_set->asyncthr = asyncthr;
- parms.rdc_set->setid = setid;
-
- /* gethostid(3c) is defined to return a 32bit value */
- parms.rdc_set->syshostid = (int32_t)gethostid();
-
- parms.command = 0;
- parms.options = 0;
- parms.command = flag;
-
- if (flag == RDC_CMD_RESUME) {
- if (doasync)
- parms.options |= RDC_OPT_ASYNC;
- else
- parms.options |= RDC_OPT_SYNC;
- }
- if (clustered) {
- if (!ctag)
- goto noconfig;
- if (strcmp(ctag, "-") == 0)
- goto noconfig;
-
-#ifdef DEBUG
- (void) fprintf(stderr, "logical hostname: %s\n", lhost);
-#endif
-
- if (strcmp(lhost, fromname) == 0) {
- parms.options |= RDC_OPT_PRIMARY;
- (void) strncpy(parms.rdc_set->direct_file, directfile,
- NSC_MAXPATH);
-
- } else {
- parms.options |= RDC_OPT_SECONDARY;
- parms.rdc_set->direct_file[0] = 0; /* no fcal direct */
- }
- } else {
-noconfig:
- /*
- * If not clustered, don't resume sndr sets with lhost
- */
- if ((flag == RDC_CMD_RESUME) && lhost && strlen(lhost))
- return (0);
-
- if (self_check(fromname)) {
- parms.options |= RDC_OPT_PRIMARY;
- (void) strncpy(parms.rdc_set->direct_file, directfile,
- NSC_MAXPATH);
- } else {
- parms.options |= RDC_OPT_SECONDARY;
- parms.rdc_set->direct_file[0] = 0; /* no fcal direct */
- }
- }
-
- ustatus = spcs_s_ucreate();
-
- errno = 0;
- ret = RDC_IOCTL(RDC_CONFIG, &parms, NULL, 0, 0, 0, ustatus);
- if (ret != SPCS_S_OK) {
-
- /* Surpress error messages for suspend on cluster elements */
- if ((flag == RDC_CMD_SUSPEND) && (errno == RDC_EALREADY) &&
- !clustered && lhost && strlen(lhost)) {
- spcs_s_ufree(&ustatus);
- return (0);
- }
-
- (void) fprintf(stderr,
- gettext("Remote Mirror: %s %s %s %s %s %s\n"),
- fromhost, fromfile,
- frombitmap, tohost, tofile, tobitmap);
-
- if (errno == RDC_EEINVAL) {
- spcs_log("sndr", NULL,
- gettext("%s %s %s %s %s %s %s %s\n%s"),
- program, rdc_decode_flag(flag, parms.options),
- fromhost, fromfile, frombitmap,
- tohost, tofile, tobitmap,
- gettext("invalid command option"));
- rdc_err(&ustatus,
- gettext("Remote Mirror: invalid command option "
- "'%s'"), rdc_decode_flag(flag,
- parms.options));
- } else {
- spcs_log("sndr", &ustatus,
- gettext("%s %s %s %s %s %s %s %s"),
- program, rdc_decode_flag(flag, parms.options),
- fromhost, fromfile, frombitmap,
- tohost, tofile, tobitmap);
- rdc_err(&ustatus, 0);
- }
- }
-
- spcs_log("sndr", NULL,
- gettext("%s %s %s %s %s %s %s %s\nSuccessful"),
- program, rdc_decode_flag(flag, parms.options),
- fromhost, fromfile, frombitmap, tohost, tofile, tobitmap);
-
- spcs_s_ufree(&ustatus);
- return (0);
-}
-/*
- * assign setid's to any existing
- * sets without setids, making sure of course NOT to re-use a setid
- */
-int
-update_setids(CFGFILE *cfg, int *no_id, int highest)
-{
- int setid;
- char buf[CFG_MAX_BUF];
- char key[CFG_MAX_KEY];
- char *ctag;
-
- /* If in a Sun Cluster, SetIDs need to have a ctag */
- if ((ctag = cfg_get_resource(cfg)) != NULL) {
- ctag = strdup(ctag);
- cfg_resource(cfg, "setid-ctag");
- }
-
- /*
- * Paranoia. IF there are any sets with setids, we don't
- * want to re-use their number.
- */
- if (highest > get_new_cfg_setid(cfg)) {
- bzero(&buf, sizeof (buf));
- (void) sprintf(buf, "%d", highest);
- if (cfg_put_cstring(cfg, "setid.set1.value", buf,
- sizeof (buf)) < 0)
- rdc_warn(NULL, gettext("sndrboot: Unable to store "
- "new setid"));
- }
-
- for (setid = 0; no_id[setid]; setid++) {
- bzero(&buf, sizeof (buf));
- bzero(&key, sizeof (key));
- (void) sprintf(buf, "%d", get_new_cfg_setid(cfg));
- (void) sprintf(key, "sndr.set%d.options", no_id[setid]);
- if (cfg_put_options(cfg, CFG_SEC_CONF, key, "setid", buf) < 0)
- rdc_warn(NULL, gettext("sndrboot: Unable to store "
- "unique setid"));
-
- pair_list[no_id[setid] - 1].setid = atoi(buf);
- }
-
- /* Restore old ctag if in a Sun Cluster */
- if (ctag) {
- cfg_resource(cfg, ctag);
- free(ctag);
- }
-
- if (cfg_commit(cfg) < 0)
- rdc_err(NULL, gettext("sndrboot: Failed to commit setids"));
-
- return (setid);
-}
-
-/*
- * this is called when the option lghn is no available in libdscfg
- * that should only happen on an upgrade.
- * cfg write lock must be held across this function
- */
-char *
-get_lghn(CFGFILE *cfg, char *ctag, int setnum, int flag)
-{
- FILE *pipe;
- char rsgrp[SCCONF_MAXSTRINGLEN];
- char cmd[SCCONF_MAXSTRINGLEN];
- static char lhostname[MAX_RDC_HOST_SIZE];
- char key[CFG_MAX_KEY];
- int rc;
-
- if (ctag == NULL)
- goto fail;
-
- bzero(&lhostname, sizeof (lhostname));
-
- (void) sprintf(rsgrp, "%s-stor-rg", ctag);
-/* BEGIN CSTYLED */
- rc = snprintf(cmd, SCCONF_MAXSTRINGLEN,
- "/usr/cluster/bin/scrgadm -pvv | fgrep HostnameList \
-| fgrep %s | fgrep value | awk -F: '{ print $4 }'", rsgrp);
-/* END CSTYLED */
-
- if (rc < 0) {
- rdc_err(NULL, gettext("Error getting scrgadm output"));
- }
-
- pipe = popen(cmd, "r");
-
- if (pipe == NULL) {
- rdc_err(NULL, gettext("Error opening pipe"));
- }
- rc = fscanf(pipe, "%s", lhostname);
- (void) pclose(pipe);
-
- if (rc != 1) {
- rdc_err(NULL, gettext("Unable to get logical host"));
- }
-
- /* not really failing, but suspend does not have the config lock */
- if (flag == RDC_CMD_SUSPEND)
- goto fail;
-
- bzero(&key, sizeof (key));
- (void) snprintf(key, sizeof (key), "sndr.set%d.options", setnum);
- if (cfg_put_options(cfg, CFG_SEC_CONF, key, "lghn", lhostname) < 0)
- rdc_warn(NULL, gettext("sndrboot: Unable to store logical "
- "host name in configuration database"));
-
- if (cfg_commit(cfg) < 0)
- rdc_err(NULL,
- gettext("sndrboot: Failed to commit logical host name"));
-
-fail:
- return (lhostname);
-
-}
-
-/*
- * read_libcfg()
- *
- * DESCRIPTION: Read the relevant config info via libcfg
- *
- * Outputs:
- * int i Number of pairs of devices
- *
- * Side Effects: The 0 to i-1 entries in the pair_list are filled.
- *
- */
-static int
-read_libcfg(int flag)
-{
- char fromhost[MAX_RDC_HOST_SIZE];
- char fromfile[NSC_MAXPATH];
- char frombitmap[NSC_MAXPATH];
- char tohost[MAX_RDC_HOST_SIZE];
- char tofile[NSC_MAXPATH];
- char tobitmap[NSC_MAXPATH];
- char directfile[NSC_MAXPATH];
- char diskqueue[NSC_MAXPATH];
- char group[NSC_MAXPATH];
- char lhost[MAX_RDC_HOST_SIZE];
- char sync[16];
- char setid[64];
- int doasync;
- CFGFILE *cfg;
- int i, j = 0;
- int rc;
- char buf[CFG_MAX_BUF];
- char key[CFG_MAX_KEY];
- char dummy[NSC_MAXPATH];
- int setnumber;
- int numsets;
- int highest = 0;
- char lghn[5];
- int *no_id;
-
-
- if ((cfg = cfg_open("")) == NULL)
- rdc_err(NULL, gettext("Error opening config"));
-
- /*
- * If RDC_CMD_FIXSETIDS, we were called during post-patch install
- * Acquire a write-lock on the cfg_lock(), so the code can attempt
- * to fix setIDs
- */
- if (flag == RDC_CMD_FIXSETIDS) {
- if (!cfg_lock(cfg, CFG_WRLOCK))
- rdc_err(NULL, gettext("Error write locking config"));
- cfg_resource(cfg, NULL);
- } else {
- if (!cfg_lock(cfg, CFG_RDLOCK))
- rdc_err(NULL, gettext("Error locking config"));
- cfg_resource(cfg, ctag);
- }
-
- if ((numsets = cfg_get_num_entries(cfg, "sndr")) < 0)
- rdc_err(NULL, gettext("Unable to get set info from config"));
-
- no_id = (int *)calloc(numsets + 1, sizeof (int));
- if (!no_id)
- rdc_err(NULL, gettext("No memory"));
-
-
- (void) snprintf(lghn, sizeof (lghn), "lghn");
-
- for (i = 0; i < rdc_maxsets; i++) {
- setnumber = i + 1;
-
- bzero(buf, CFG_MAX_BUF);
- (void) snprintf(key, sizeof (key), "sndr.set%d", setnumber);
- if (cfg_get_cstring(cfg, key, buf, CFG_MAX_BUF) < 0)
- break;
-
- rc = sscanf(buf, "%s %s %s %s %s %s %s %s %s %s %s %s",
- fromhost, fromfile, frombitmap, tohost, tofile, tobitmap,
- directfile, sync, group, dummy, dummy, diskqueue);
- if (rc != 12)
- rdc_err(NULL, gettext("cfg input error (%d)"), rc);
-
- if (strcmp(directfile, "ip") == 0)
- (void) strcpy(directfile, "");
-
- if (strcmp(group, "-") == 0)
- (void) strcpy(group, "");
-
- if (strcmp(diskqueue, "-") == 0)
- (void) strcpy(diskqueue, "");
-
- (void) snprintf(key, sizeof (key),
- "sndr.set%d.options", setnumber);
-
- if (cfg_get_single_option(cfg, CFG_SEC_CONF, key,
- lghn, lhost, MAX_RDC_HOST_SIZE) < 0)
- (void) strcpy(lhost,
- get_lghn(cfg, ctag, setnumber, flag));
-
- if (strcmp(sync, "sync") == 0)
- doasync = 0;
- else if (strcmp(sync, "async") == 0)
- doasync = 1;
- else {
- cfg_close(cfg);
- rdc_err(NULL,
- gettext("Set %s:%s neither sync nor async"),
- tohost, tofile);
- }
-
- (void) strncpy(pair_list[i].fhost, fromhost,
- MAX_RDC_HOST_SIZE);
- (void) strncpy(pair_list[i].ffile, fromfile, NSC_MAXPATH);
- (void) strncpy(pair_list[i].fbitmap, frombitmap, NSC_MAXPATH);
- (void) strncpy(pair_list[i].thost, tohost, MAX_RDC_HOST_SIZE);
- (void) strncpy(pair_list[i].tfile, tofile, NSC_MAXPATH);
- (void) strncpy(pair_list[i].tbitmap, tobitmap, NSC_MAXPATH);
- (void) strncpy(pair_list[i].directfile, directfile,
- NSC_MAXPATH);
- (void) strncpy(pair_list[i].diskqueue, diskqueue,
- NSC_MAXPATH);
- (void) strncpy(pair_list[i].group, group, NSC_MAXPATH);
- (void) strncpy(pair_list[i].lhost, lhost, MAX_RDC_HOST_SIZE);
- pair_list[i].doasync = doasync;
-
- if (cfg_get_single_option(cfg, CFG_SEC_CONF, key, "setid",
- setid, sizeof (setid)) < 0) {
- no_id[j++] = setnumber;
- }
- pair_list[i].setid = atoi(setid);
-
- if (pair_list[i].setid > highest)
- highest = pair_list[i].setid;
-
- if (gethost_netaddrs(fromhost, tohost,
- (char *)pair_list[i].fnetaddr,
- (char *)pair_list[i].tnetaddr) < 0) {
- cfg_close(cfg);
- spcs_log("sndr", NULL,
- gettext("%s unable to determine IP addresses "
- "for hosts %s %s"), program, fromhost, tohost);
- rdc_err(NULL, gettext("unable to determine IP "
- "addresses for hosts %s, %s"), fromhost, tohost);
- }
- }
- /*
- * fix any lost set ids if possible, also deal with upgrade
- */
- if (j > 0 && flag == RDC_CMD_FIXSETIDS) {
- (void) update_setids(cfg, no_id, highest);
- i = j; /* Set number of fixups */
- }
- free(no_id);
- cfg_close(cfg);
- return (i);
-}
-
-
-int
-parseopts(argc, argv, flag)
-int argc;
-char **argv;
-int *flag;
-{
- int errflag = 0;
- char c;
- char inval = 0;
-#ifdef DEBUG
- while ((c = getopt(argc, argv, "C:Urs")) != -1) {
-#else
- while ((c = getopt(argc, argv, "C:rs")) != -1) {
-#endif
- switch (c) {
- case 'C':
- clustered = TRUE;
- ctag = optarg;
- break;
-#ifdef DEBUG
- case 'U':
- proto_test = 1;
- break;
-#endif
- case 'r':
- if (*flag)
- inval = 1;
- *flag = RDC_CMD_RESUME;
- break;
- case 's':
- if (*flag)
- inval = 1;
- *flag = RDC_CMD_SUSPEND;
- break;
- case '?':
- errflag++;
- }
- }
-
- /*
- * Special fix to address no SetIds in AVS 3.1 to 3.2 install + patch
- * Adjust set IDs, if someone invokes the following invalid command
- *
- * /use/sbin/sndrboot -C post-patch-setids -r -s
- *
- * Command will be called in post-install of the patch containing fix
- *
- */
- if (clustered && (strcmp(ctag, "post-patch-setids") == 0) &&
- *flag && inval) {
- *flag = RDC_CMD_FIXSETIDS;
- return (0);
- }
-
- if (inval) {
- rdc_warn(NULL, gettext("Invalid argument combination"));
- errflag = 1;
- }
-
- if (!*flag || errflag) {
- usage();
- return (-1);
- }
-
- return (0);
-}
-
-static void
-usage()
-{
- (void) fprintf(stderr, gettext("usage:\n"));
- (void) fprintf(stderr,
- gettext("\t%s -r [-C tag]\t\t"
- "resume\n"), program);
-
- (void) fprintf(stderr,
- gettext("\t%s -s [-C tag]\t\t"
- "suspend\n"), program);
-}