diff options
Diffstat (limited to 'usr/src/cmd/avs/ncall/ncalladm.c')
-rw-r--r-- | usr/src/cmd/avs/ncall/ncalladm.c | 558 |
1 files changed, 0 insertions, 558 deletions
diff --git a/usr/src/cmd/avs/ncall/ncalladm.c b/usr/src/cmd/avs/ncall/ncalladm.c deleted file mode 100644 index 1214b39c1a..0000000000 --- a/usr/src/cmd/avs/ncall/ncalladm.c +++ /dev/null @@ -1,558 +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 2008 Sun Microsystems, Inc. All rights reserved. - * Use is subject to license terms. - */ - -#include <sys/types.h> -#include <sys/stat.h> -#include <strings.h> -#include <stdlib.h> -#include <unistd.h> -#include <errno.h> -#include <stdio.h> -#include <locale.h> -#include <fcntl.h> -#include <libgen.h> - -#include <sys/nsctl/cfg.h> -#include <sys/ncall/ncall.h> - -static CFGFILE *cfg; -static int cfg_changed; -static char *progname; -static ncall_node_t *getnodelist(int, int *, int *); - - -static void -usage(int exitstat) -{ - (void) fprintf(stderr, gettext("usage:\n")); - (void) fprintf(stderr, gettext(" %s -d\n"), progname); - (void) fprintf(stderr, gettext(" %s -e\n"), progname); - (void) fprintf(stderr, gettext(" %s -h\n"), progname); -#ifdef DEBUG - (void) fprintf(stderr, gettext(" %s -c [nodeid <nodeid>]\n"), - progname); - (void) fprintf(stderr, gettext(" %s -i\n"), progname); - (void) fprintf(stderr, gettext(" %s -p <host>\n"), progname); -#endif - - (void) fprintf(stderr, gettext("where:\n")); - (void) fprintf(stderr, gettext(" -d disable ncall\n")); - (void) fprintf(stderr, gettext(" -e enable ncall core\n")); - (void) fprintf(stderr, gettext(" -h this help message\n")); -#ifdef DEBUG - (void) fprintf(stderr, - gettext(" -c set or print ncall configuration\n")); - (void) fprintf(stderr, gettext(" -i ncall information\n")); - (void) fprintf(stderr, gettext(" -p ncall ping <host>\n")); -#endif - - exit(exitstat); -} - - -static void -ncall_cfg_open(CFGLOCK lk) -{ - char hostid[32]; - - if (cfg != NULL) { - return; - } - - if (snprintf(hostid, sizeof (hostid), "%lx", gethostid()) >= - sizeof (hostid)) { - (void) fprintf(stderr, gettext("%s: hostid %lx too large\n"), - progname, gethostid()); - exit(1); - } - - if ((cfg = cfg_open(NULL)) == NULL) { - (void) fprintf(stderr, - gettext("%s: unable to access the configuration: %s\n"), - progname, cfg_error(NULL)); - exit(1); - } - - if (!cfg_lock(cfg, lk)) { - (void) fprintf(stderr, - gettext("%s: unable to lock the configuration: %s\n"), - progname, cfg_error(NULL)); - exit(1); - } - - cfg_resource(cfg, hostid); -} - - -static void -ncall_cfg_close(void) -{ - if (cfg_changed && cfg_commit(cfg) < 0) { - (void) fprintf(stderr, - gettext("%s: unable to update the configuration: %s\n"), - progname, cfg_error(NULL)); - exit(1); - } - - cfg_close(cfg); - cfg = NULL; -} - - -/* - * Get config from dscfg. - */ -static int -get_nodeid_from_cfg(int *nodeid) -{ - char buf[CFG_MAX_BUF]; - int ret = -1; - int rc; - - ncall_cfg_open(CFG_RDLOCK); - - if (cfg_get_cstring(cfg, "ncallcore.set1", buf, sizeof (buf)) >= 0) { - rc = sscanf(buf, "%d", nodeid); - if (rc == 1) { - ret = 0; - } - } - - ncall_cfg_close(); - - return (ret); -} - - -static void -ncall_print(void) -{ - int cfnodeid, clnodeid, rc; - - clnodeid = cfg_issuncluster(); - - rc = get_nodeid_from_cfg(&cfnodeid); - - if (rc < 0 && clnodeid > 0) { - (void) printf(gettext("%s: ncall is using the SunCluster " - "nodeid: %d\n"), progname, clnodeid); - } else if (rc < 0) { - (void) printf(gettext("%s: ncall is using the default " - "nodeid: %d\n"), progname, 0); - } else { - (void) printf(gettext("%s: current configuration:\n"), - progname); - /* deliberately not i18n'd - "nodeid" is a keyword */ - (void) printf("nodeid %d\n", cfnodeid); - } -} - - -static void -ncall_config(const int nodeid) -{ - char buf[CFG_MAX_BUF]; - - ncall_cfg_open(CFG_WRLOCK); - - if (cfg_get_cstring(cfg, "ncallcore.set1", buf, sizeof (buf)) >= 0) { - /* remove old config */ - if (cfg_put_cstring(cfg, "ncallcore.set1", NULL, 0) < 0) { - (void) fprintf(stderr, - gettext("%s: unable to update the configuration: " - "%s\n"), cfg_error(NULL)); - exit(1); - } - } - - if (snprintf(buf, sizeof (buf), "%d", nodeid) >= sizeof (buf)) { - (void) fprintf(stderr, - gettext("%s: unable to update configuration: " - "data too long\n"), progname); - exit(1); - } - - if (cfg_put_cstring(cfg, "ncallcore", buf, sizeof (buf)) < 0) { - (void) fprintf(stderr, - gettext("%s: unable to update the configuration: %s\n"), - cfg_error(NULL)); - exit(1); - } - - cfg_changed = 1; - ncall_cfg_close(); - - (void) printf(gettext("%s: configuration set to:\n"), progname); - /* deliberately not i18n'd - "nodeid" is a keyword */ - (void) printf("nodeid %d\n", nodeid); -} - -#ifdef lint -int -ncalladm_lintmain(int argc, char *argv[]) -#else -int -main(int argc, char *argv[]) -#endif -{ - const char *dev = "/dev/ncall"; - extern int optind, opterr; - ncall_node_t nodeinfo, *nodes; - int nsize; - int i; - int cflag, dflag, eflag, iflag, pflag; - int rc, fd, opt; - int clnodeid, cfnodeid; - int up; - char *cp, *ping; - int mnode; /* mirror nodeid */ - - (void) setlocale(LC_ALL, ""); - (void) textdomain("ncalladm"); - - opterr = 0; - cflag = dflag = eflag = iflag = pflag = 0; - ping = NULL; - - progname = basename(argv[0]); - - while ((opt = getopt(argc, argv, -#ifdef DEBUG - "cip:" -#endif - "deh")) != -1) { - switch (opt) { - case 'c': - cflag = 1; - break; - - case 'd': - dflag = 1; - break; - - case 'e': - eflag = 1; - break; - - case 'h': - usage(0); - break; - - case 'i': - iflag = 1; - break; - - case 'p': - ping = optarg; - pflag = 1; - break; - - default: - (void) fprintf(stderr, gettext("%s: unknown option\n"), - progname); - usage(1); - break; - } - } - - if (!(cflag || dflag || eflag || iflag || pflag)) { - usage(1); - } - - if (argc != optind) { - if (!cflag || - (argc - optind) != 2 || - strcmp(argv[optind], "nodeid") != 0) { - usage(1); - } - } - - if ((cflag + dflag + eflag + iflag + pflag) > 1) { - (void) fprintf(stderr, - gettext("%s: multiple options are not supported\n"), - progname); - usage(1); - } - - if (!cflag) { - fd = open(dev, O_RDONLY); - if (fd < 0) { - (void) fprintf(stderr, - gettext("%s: unable to open %s: %s\n"), - progname, dev, strerror(errno)); - exit(1); - } - } - - if (dflag) { - /* ioctl stop into kernel */ - if (ioctl(fd, NC_IOC_STOP, 0) < 0) { - (void) fprintf(stderr, - gettext("%s: unable to disable ncall: %s\n"), - progname, strerror(errno)); - exit(1); - } - } else if (eflag) { - bzero(&nodeinfo, sizeof (nodeinfo)); - - clnodeid = cfg_issuncluster(); - cfnodeid = 0; - - /* get node info */ - rc = gethostname(nodeinfo.nc_nodename, - sizeof (nodeinfo.nc_nodename)); - if (rc < 0) { - (void) fprintf(stderr, - gettext("%s: unable to determine hostname: %s\n"), - progname, strerror(errno)); - exit(1); - } - - rc = get_nodeid_from_cfg(&cfnodeid); - - if (clnodeid > 0 && rc == 0) { - /* - * check that the nodeids from the cf file and - * cluster match. - */ - if (clnodeid != cfnodeid) { - (void) fprintf(stderr, - gettext("%s: nodeid from configuration " - "(%d) != cluster nodeid (%d)\n"), - progname, cfnodeid, clnodeid); - exit(1); - } - } - - if (rc == 0) { - nodeinfo.nc_nodeid = cfnodeid; - } else if (clnodeid > 0) { - nodeinfo.nc_nodeid = clnodeid; - } else { - nodeinfo.nc_nodeid = 0; - } - - /* ioctl node info into kernel and start ncall */ - rc = ioctl(fd, NC_IOC_START, &nodeinfo); - if (rc < 0) { - (void) fprintf(stderr, - gettext("%s: unable to enable ncall: %s\n"), - progname, strerror(errno)); - exit(1); - } - } - - if (iflag || pflag) { - nodes = getnodelist(fd, &nsize, &mnode); - - if (nodes == NULL) { - (void) fprintf(stderr, - gettext("%s: unable to get node info\n"), - progname); - exit(1); - } - } - - if (iflag) { - char *mname; - char *pnodestr; - - (void) printf(gettext("Self Node Name: %s\n"), - nodes[0].nc_nodename); - (void) printf(gettext("Self Node ID: %d\n"), - nodes[0].nc_nodeid); - /* - * determine which slot is the mirror node. - */ - if (mnode != -1) { - for (i = 1; i < nsize; i++) { - if (nodes[i].nc_nodeid == mnode) { - mname = nodes[i].nc_nodename; - break; - } - } - } - if ((mnode == -1) || (i >= nsize)) { - mname = gettext("unknown"); - mnode = -1; - } - - (void) printf(gettext("Mirror Node Name: %s\n"), mname); - (void) printf(gettext("Mirror Node ID: %d\n"), mnode); - /* - * See if we need to translate the node strings. - */ - if (nsize > 1) { - pnodestr = gettext("Node Name: %s\nNode ID: %d\n"); - for (i = 1; i < nsize; i++) { - /* - * Don't print the mirror twice. - */ - if (nodes[i].nc_nodeid != mnode) { - (void) printf(pnodestr, - nodes[i].nc_nodename, - nodes[i].nc_nodeid); - } - } - } - } - - if (pflag) { - if (strlen(ping) >= sizeof (nodeinfo.nc_nodename)) { - (void) fprintf(stderr, - gettext("%s: hostname '%s' is too long\n"), - progname, ping); - exit(1); - } - up = 0; - if (strcmp(nodes[0].nc_nodename, ping) == 0) { - up = 1; /* self */ - } else { - /* not self, so ask kernel */ - bzero(&nodeinfo, sizeof (nodeinfo)); - /* strlen(ping) checked above */ - (void) strcpy(nodeinfo.nc_nodename, ping); - up = ioctl(fd, NC_IOC_PING, nodeinfo); - } - - /* model the ping messages on ping(1m) */ - - if (up < 0) { - (void) fprintf(stderr, - gettext("%s: unable to ping host '%s': %s\n"), - progname, ping, strerror(errno)); - exit(1); - } else if (up > 0) { - (void) printf(gettext("%s is alive\n"), ping); - } else { - (void) printf(gettext("no answer from %s\n"), ping); - exit(1); - } - } - - if (iflag || pflag) { - free(nodes); - } - - if (cflag) { - if (argc == optind) { - ncall_print(); - return (0); - } - - cp = NULL; - cfnodeid = (int)strtol(argv[optind+1], &cp, 0); - if (cp != NULL && *cp != '\0') { - (void) fprintf(stderr, - gettext("%s: nodeid \"%s\" is not an " - "integer number\n"), progname, argv[optind+1]); - exit(1); - } - - clnodeid = cfg_issuncluster(); - if (clnodeid > 0 && cfnodeid != clnodeid) { - (void) fprintf(stderr, - gettext("%s: nodeid from command line " - "(%d) != cluster nodeid (%d)\n"), - progname, cfnodeid, clnodeid); - exit(1); - } - - ncall_config(cfnodeid); - } - - if (!cflag) { - (void) close(fd); - } - - return (0); -} - - -/* - * return a pointer to a list of currently configured - * nodes. - * Return the number of nodes via the nodesizep pointer. - * Return the mirror nodeid via the mirrorp pointer. - * Return NULL on errors. - */ -static ncall_node_t * -getnodelist(int ifd, int *nodesizep, int *mirrorp) -{ - int maxsize; - int cnt; - ncall_node_t *noderet = NULL; - ncall_node_t *nodelist; - ncall_node_t thisnode; - int mirror; - int nonet; - - /* - * Get this host info and mirror nodeid. - */ - mirror = ioctl(ifd, NC_IOC_GETNODE, &thisnode); - - if (mirror < 0) { - return (NULL); - } - - /* - * See if we need to allocate the buffer. - */ - nonet = 0; - maxsize = ioctl(ifd, NC_IOC_GETNETNODES, 0); - if (maxsize < 1) { - maxsize = 1; - nonet = 1; - } - nodelist = malloc(sizeof (*nodelist) * maxsize); - if (nodelist) { - if (nonet == 0) { - /* - * fetch the node data. - */ - cnt = ioctl(ifd, NC_IOC_GETNETNODES, nodelist); - if (cnt > 0) { - *nodesizep = cnt; - noderet = nodelist; - *mirrorp = mirror; - } else { - *nodesizep = 0; - free(nodelist); - } - } else { - (void) memcpy(nodelist, &thisnode, sizeof (*nodelist)); - *nodesizep = 1; - noderet = nodelist; - /* - * Although we know the mirror nodeid, there - * is no point in returning it as we have - * no information about any other hosts. - */ - *mirrorp = -1; - } - } - return (noderet); -} |