summaryrefslogtreecommitdiff
path: root/usr/src/cmd/avs/rdc/sndrsubr.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/cmd/avs/rdc/sndrsubr.c')
-rw-r--r--usr/src/cmd/avs/rdc/sndrsubr.c463
1 files changed, 0 insertions, 463 deletions
diff --git a/usr/src/cmd/avs/rdc/sndrsubr.c b/usr/src/cmd/avs/rdc/sndrsubr.c
deleted file mode 100644
index 3f3e30b307..0000000000
--- a/usr/src/cmd/avs/rdc/sndrsubr.c
+++ /dev/null
@@ -1,463 +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 <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 <sys/stat.h>
-#include <signal.h>
-
-#include <locale.h>
-#include <langinfo.h>
-#include <libintl.h>
-#include <stdarg.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/unistat/spcs_s.h>
-#include <sys/unistat/spcs_s_u.h>
-#include <sys/unistat/spcs_errors.h>
-
-#include "rdcadm.h"
-
-
-int maxqfbas = MAXQFBAS;
-int maxqitems = MAXQITEMS;
-int autosync = AUTOSYNC;
-int asyncthr = ASYNCTHR;
-int qblock = QBLOCK;
-
-int
-mounted(char *device)
-{
- char target[NSC_MAXPATH];
- struct mnttab mntref;
- struct mnttab mntent;
- FILE *mntfp;
- int rdsk;
- char *s;
- int i;
-
- rdsk = i = 0;
- for (s = target; i < NSC_MAXPATH && (*s = *device++); i++) {
- if (*s == 'r' && rdsk == 0 && strncmp(device, "dsk/", 4) == 0)
- rdsk = 1;
- else
- s++;
- }
- *s = '\0';
-
- mntref.mnt_special = target;
- mntref.mnt_mountp = NULL;
- mntref.mnt_fstype = NULL;
- mntref.mnt_mntopts = NULL;
- mntref.mnt_time = NULL;
-
- mntfp = fopen(MNTTAB, "r");
-
- if (mntfp == NULL) {
- rdc_warn(NULL,
- gettext("can not check volume %s against mount table"),
- mntref.mnt_special);
- /* Assume the worst, that it is mounted */
- return (1);
- }
-
- if (getmntany(mntfp, &mntent, &mntref) != -1) {
- /* found something before EOF */
- (void) fclose(mntfp);
- return (1);
- }
-
- (void) fclose(mntfp);
- return (0);
-}
-
-
-/* Needs to match parsing code in rdcboot.c and rdcadm.c */
-char *
-rdc_decode_flag(int flag, int options)
-{
- static char str[32];
-
- switch (flag) {
- case (RDC_CMD_COPY):
- if (options & RDC_OPT_FULL)
- (void) strcpy(str, "-m");
- else
- (void) strcpy(str, "-u");
- if (options & RDC_OPT_REVERSE)
- (void) strcat(str, " -r");
- break;
-
- case (RDC_CMD_DISABLE):
- (void) strcpy(str, "-d");
- break;
-
- case (RDC_CMD_ENABLE):
- if (options & RDC_OPT_SETBMP)
- (void) strcpy(str, "-e");
- else
- (void) strcpy(str, "-E");
- break;
-
- case (RDC_CMD_LOG):
- (void) strcpy(str, "-l");
- break;
-
- case (RDC_CMD_HEALTH):
- (void) strcpy(str, "-H");
- break;
-
- case (RDC_CMD_WAIT):
- (void) strcpy(str, "-w");
- break;
-
- case (RDC_CMD_RECONFIG):
- (void) strcpy(str, "-R ...");
- break;
-
- case (RDC_CMD_TUNABLE):
- (void) strcpy(str, "");
- if (maxqfbas != MAXQFBAS)
- (void) strcat(str, " -F");
- if (maxqitems != MAXQITEMS)
- (void) strcat(str, " -W");
- if (autosync != AUTOSYNC)
- (void) strcat(str, " -a");
- if (asyncthr != ASYNCTHR)
- (void) strcat(str, " -A");
- if (qblock != QBLOCK)
- (void) strcat(str, " -D");
- break;
-
- case (RDC_CMD_SUSPEND):
- (void) strcpy(str, "-s");
- break;
-
- case (RDC_CMD_RESUME):
- (void) strcpy(str, "-r");
- break;
-
- case (RDC_CMD_RESET):
- (void) strcpy(str, "-R");
- break;
-
- case (RDC_CMD_ADDQ):
- (void) strcpy(str, "-q a");
- break;
-
- case (RDC_CMD_REMQ):
- (void) strcpy(str, "-q d");
- break;
-
- case (RDC_CMD_REPQ):
- (void) strcpy(str, "-q r");
- break;
-
- default:
- (void) strcpy(str, gettext("unknown"));
- break;
- }
-
- return (str);
-}
-
-
-static void
-rdc_msg(char *prefix, spcs_s_info_t *status, char *string, va_list ap)
-{
- if (status) {
- (void) fprintf(stderr, "Remote Mirror: %s\n", prefix);
- spcs_s_report(*status, stderr);
- } else {
- (void) fprintf(stderr, "%s: %s: ", program, prefix);
- }
-
- if (string && *string != '\0') {
- (void) vfprintf(stderr, string, ap);
- }
-
- (void) fprintf(stderr, "\n");
-}
-
-void
-rdc_err(spcs_s_info_t *status, char *string, ...)
-{
- va_list ap;
- va_start(ap, string);
-
- rdc_msg(gettext("Error"), status, string, ap);
-
- va_end(ap);
- exit(1);
-}
-
-void
-rdc_warn(spcs_s_info_t *status, char *string, ...)
-{
- va_list ap;
- va_start(ap, string);
-
- rdc_msg(gettext("warning"), status, string, ap);
-
- va_end(ap);
-}
-
-int
-rdc_get_maxsets(void)
-{
- rdc_status_t rdc_status;
- spcs_s_info_t ustatus;
- int rc;
-
- rdc_status.nset = 0;
- ustatus = spcs_s_ucreate();
-
- rc = RDC_IOCTL(RDC_STATUS, &rdc_status, 0, 0, 0, 0, ustatus);
- if (rc == SPCS_S_ERROR) {
- rdc_err(&ustatus, gettext("statistics error"));
- }
-
- spcs_s_ufree(&ustatus);
- return (rdc_status.maxsets);
-}
-
-/*
- * Look up a set in libcfg to find the setnumber.
- *
- * ASSUMPTIONS:
- * - a valid cfg handle
- *
- * INPUTS:
- * cfg - cfg handle
- * tohost - secondary hostname
- * tofile - secondary volume
- *
- * OUTPUTS:
- * set number if found, otherwise -1 for an error
- */
-int
-find_setnumber_in_libcfg(CFGFILE *cfg, char *ctag, char *tohost, char *tofile)
-{
- int setnumber;
- int entries, rc;
- char *buf, *secondary, *shost;
- char **entry;
- char *cnode;
- int offset = 0;
-
- if (cfg == NULL) {
-#ifdef DEBUG
- rdc_warn(NULL, "cfg is NULL while looking up set number");
-#endif
- return (-1);
- }
-
- entries = cfg_get_section(cfg, &entry, "sndr");
-
- rc = -1;
- for (setnumber = 1; setnumber <= entries; setnumber++) {
- buf = entry[setnumber - 1];
-
- (void) strtok(buf, " "); /* phost */
- (void) strtok(NULL, " "); /* primary */
- (void) strtok(NULL, " "); /* pbitmap */
- shost = strtok(NULL, " ");
- secondary = strtok(NULL, " ");
-
- if (ctag && *ctag) {
- (void) strtok(NULL, " "); /* sbitmap */
- (void) strtok(NULL, " "); /* type */
- (void) strtok(NULL, " "); /* mode */
- (void) strtok(NULL, " "); /* group */
- cnode = strtok(NULL, " ");
-
- if (ctag && strcmp(cnode, ctag) != 0) {
- /* filter this out */
- ++offset;
- continue;
- }
- }
-
- /* Check secondary volume name first, will get less hits */
- if (strcmp(secondary, tofile) != 0) {
- free(buf);
- continue;
- }
-
- if (strcmp(shost, tohost) == 0) {
- free(buf);
- rc = setnumber - offset;
- break;
- }
-
- free(buf);
- }
-
- while (setnumber < entries)
- free(entry[setnumber++]);
- if (entries)
- free(entry);
-
- return (rc);
-}
-
-void
-get_group_diskq(CFGFILE *cfg, char *group, char *diskq)
-{
- int i;
- char key[CFG_MAX_KEY];
- char buf[CFG_MAX_BUF];
-
- if (*group == '\0')
- return;
- for (i = 1; ; i++) {
- bzero(&key, sizeof (key));
- bzero(&buf, sizeof (buf));
- (void) sprintf(key, "sndr.set%d.group", i);
- if (cfg_get_cstring(cfg, key, &buf, sizeof (buf)) < 0)
- break;
- if (strncmp(group, buf, sizeof (buf)) == 0) {
- (void) sprintf(key, "sndr.set%d.diskq", i);
- if (cfg_get_cstring(cfg, key, diskq, CFG_MAX_BUF) < 0) {
- rdc_warn(NULL, gettext("unable to retrieve "
- "group %s's disk queue"), group);
- }
- }
- }
-}
-
-int
-get_cfg_setid(CFGFILE *cfg, char *ctag, char *tohost, char *tofile)
-{
- int setnum = 0;
- int close_cfg = 0;
- char key[CFG_MAX_KEY];
- char setid[64];
-
- if (cfg == NULL) {
- close_cfg = 1;
- if ((cfg = cfg_open(NULL)) == NULL) {
- return (-1); /* message printed by caller */
- }
- if (!cfg_lock(cfg, CFG_RDLOCK)) {
- cfg_close(cfg);
- return (-1);
- }
- }
- setnum = find_setnumber_in_libcfg(cfg, ctag, tohost, tofile);
- if (setnum < 0)
- return (setnum);
-
- (void) snprintf(key, CFG_MAX_KEY, "sndr.set%d.options", setnum);
- if (cfg_get_single_option(cfg, CFG_SEC_CONF, key, "setid",
- setid, sizeof (setid)) < 0) {
- if (close_cfg)
- cfg_close(cfg);
-
- spcs_log("sndr", NULL,
- gettext("%s unable to get unique setid "
- "for %s:%s"), program, tohost, tofile);
- return (-1);
-
- }
- if (close_cfg)
- cfg_close(cfg);
-
- return (atoi(setid));
-
-}
-
-int
-get_new_cfg_setid(CFGFILE *cfg)
-{
- int setid;
- char buf[CFG_MAX_BUF];
- 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");
- }
-
- if (cfg_get_cstring(cfg, "setid.set1.value", buf, CFG_MAX_BUF) < 0) {
- setid = 1;
- if (cfg_put_cstring(cfg, "setid", "1", CFG_MAX_BUF) < 0) {
- rdc_err(NULL, "Unable to store new setid");
- }
- } else {
- setid = atoi(buf);
- setid++;
- if (setid <= 0) {
- setid = 1;
- }
- }
-
- bzero(&buf, CFG_MAX_BUF);
- (void) snprintf(buf, sizeof (buf), "%d", setid);
- if (cfg_put_cstring(cfg, "setid.set1.value", buf, CFG_MAX_BUF) < 0) {
- rdc_err(NULL, "Unable to store new setid");
- }
-
- /* Restore old ctag if in a Sun Cluster */
- if (ctag) {
- cfg_resource(cfg, ctag);
- free(ctag);
- }
-
- return (setid);
-}
-
-sigset_t origmask;
-
-void
-block_sigs(void)
-{
- sigset_t allsigs;
-
- (void) sigfillset(&allsigs);
- if (sigprocmask(SIG_BLOCK, &allsigs, &origmask) < 0)
- rdc_warn(NULL, gettext("Unable to block signals"));
-}
-
-void
-unblock_sigs(void)
-{
- if (sigprocmask(SIG_SETMASK, &origmask, NULL) < 0)
- rdc_warn(NULL, gettext("Unable to unblock signals"));
-
-}