xref: /titanic_50/usr/src/cmd/vntsd/common.c (revision 823fe29b97090ae4962ebcc65cdaf0a757eb4851)
11ae08745Sheppo /*
21ae08745Sheppo  * CDDL HEADER START
31ae08745Sheppo  *
41ae08745Sheppo  * The contents of this file are subject to the terms of the
51ae08745Sheppo  * Common Development and Distribution License (the "License").
61ae08745Sheppo  * You may not use this file except in compliance with the License.
71ae08745Sheppo  *
81ae08745Sheppo  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
91ae08745Sheppo  * or http://www.opensolaris.org/os/licensing.
101ae08745Sheppo  * See the License for the specific language governing permissions
111ae08745Sheppo  * and limitations under the License.
121ae08745Sheppo  *
131ae08745Sheppo  * When distributing Covered Code, include this CDDL HEADER in each
141ae08745Sheppo  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
151ae08745Sheppo  * If applicable, add the following below this CDDL HEADER, with the
161ae08745Sheppo  * fields enclosed by brackets "[]" replaced with your own identifying
171ae08745Sheppo  * information: Portions Copyright [yyyy] [name of copyright owner]
181ae08745Sheppo  *
191ae08745Sheppo  * CDDL HEADER END
201ae08745Sheppo  */
211ae08745Sheppo 
221ae08745Sheppo /*
23*823fe29bSdtse  * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
241ae08745Sheppo  * Use is subject to license terms.
251ae08745Sheppo  */
261ae08745Sheppo 
271ae08745Sheppo #pragma ident	"%Z%%M%	%I%	%E% SMI"
281ae08745Sheppo 
291ae08745Sheppo /*
301ae08745Sheppo  * supporting modules.
311ae08745Sheppo  */
321ae08745Sheppo 
331ae08745Sheppo #include <stdio.h>
341ae08745Sheppo #include <sys/types.h>
351ae08745Sheppo #include <sys/ipc.h>
361ae08745Sheppo #include <stdlib.h>
371ae08745Sheppo #include <string.h>
381ae08745Sheppo #include <unistd.h>
391ae08745Sheppo #include <sys/socket.h>
401ae08745Sheppo #include <sys/ipc.h>
411ae08745Sheppo #include <sys/shm.h>
421ae08745Sheppo #include <sys/sem.h>
431ae08745Sheppo #include <sys/poll.h>
441ae08745Sheppo #include <wait.h>
451ae08745Sheppo #include <time.h>
461ae08745Sheppo #include <netinet/in.h>
471ae08745Sheppo #include <thread.h>
481ae08745Sheppo #include <signal.h>
491ae08745Sheppo #include <ctype.h>
501ae08745Sheppo #include <langinfo.h>
511ae08745Sheppo #include <libintl.h>
521ae08745Sheppo #include <syslog.h>
531ae08745Sheppo #include "vntsd.h"
541ae08745Sheppo #include "chars.h"
551ae08745Sheppo 
561ae08745Sheppo /*  vntsd_write_line() - write a line to TCP client */
571ae08745Sheppo int
581ae08745Sheppo vntsd_write_line(vntsd_client_t *clientp, char *line)
591ae08745Sheppo {
601ae08745Sheppo 	int rv;
611ae08745Sheppo 
621ae08745Sheppo 	rv = vntsd_write_client(clientp, line, strlen(line));
631ae08745Sheppo 	if (rv == VNTSD_SUCCESS) {
641ae08745Sheppo 		rv = vntsd_write_client(clientp, vntsd_eol, VNTSD_EOL_LEN);
651ae08745Sheppo 	}
661ae08745Sheppo 
671ae08745Sheppo 	return (rv);
681ae08745Sheppo }
691ae08745Sheppo 
701ae08745Sheppo /*  vntsd_write_lines() write one or more lines to client.  */
711ae08745Sheppo int
721ae08745Sheppo vntsd_write_lines(vntsd_client_t *clientp, char *lines)
731ae08745Sheppo {
741ae08745Sheppo 	char	*buf;
751ae08745Sheppo 	char	*line;
761ae08745Sheppo 	char 	*endofline;
771ae08745Sheppo 
781ae08745Sheppo 	buf = strdup(lines);
791ae08745Sheppo 	if (buf == NULL) {
801ae08745Sheppo 		return (VNTSD_ERR_NO_MEM);
811ae08745Sheppo 	}
821ae08745Sheppo 
831ae08745Sheppo 	line = buf;
841ae08745Sheppo 
851ae08745Sheppo 	while ((line != NULL) && (*line != '\0')) {
861ae08745Sheppo 
871ae08745Sheppo 		endofline = strchr(line, '\n');
881ae08745Sheppo 		if (endofline != NULL) {
891ae08745Sheppo 			*endofline = '\0';
901ae08745Sheppo 		}
911ae08745Sheppo 
921ae08745Sheppo 		(void) vntsd_write_line(clientp, line);
931ae08745Sheppo 
941ae08745Sheppo 		if (endofline != NULL)
951ae08745Sheppo 			line = endofline + 1;
961ae08745Sheppo 		else
971ae08745Sheppo 			line = NULL;
981ae08745Sheppo 	}
991ae08745Sheppo 
1001ae08745Sheppo 	free(buf);
1011ae08745Sheppo 	return (VNTSD_SUCCESS);
1021ae08745Sheppo }
1031ae08745Sheppo 
1041ae08745Sheppo /* vntsd_get_yes_no() -  read in a "y" or "n" */
1051ae08745Sheppo int
1061ae08745Sheppo vntsd_get_yes_no(vntsd_client_t *clientp, char *msg, int *yes_no)
1071ae08745Sheppo {
1081ae08745Sheppo 	char	c;
1091ae08745Sheppo 	char	yesno[8];
1101ae08745Sheppo 	int	rv;
1111ae08745Sheppo 
1121ae08745Sheppo 	/* create [y/n] prompt */
1131ae08745Sheppo 	(void) snprintf(yesno, sizeof (yesno), "[%c/%c] ",
1141ae08745Sheppo 	    *nl_langinfo(YESSTR), *nl_langinfo(NOSTR));
1151ae08745Sheppo 
1161ae08745Sheppo 	for (; ; ) {
1171ae08745Sheppo 		if ((rv = vntsd_write_client(clientp, msg, strlen(msg)))
1181ae08745Sheppo 		    != VNTSD_SUCCESS) {
1191ae08745Sheppo 			return (rv);
1201ae08745Sheppo 		}
1211ae08745Sheppo 
1221ae08745Sheppo 		if ((rv = vntsd_write_client(clientp, yesno, strlen(yesno))) !=
1231ae08745Sheppo 		    VNTSD_SUCCESS) {
1241ae08745Sheppo 			return (rv);
1251ae08745Sheppo 		}
1261ae08745Sheppo 
1271ae08745Sheppo 		if ((rv = vntsd_read_data(clientp, &c))
1281ae08745Sheppo 		    != VNTSD_SUCCESS) {
1291ae08745Sheppo 			return (rv);
1301ae08745Sheppo 		}
1311ae08745Sheppo 
1321ae08745Sheppo 		/* echo */
1331ae08745Sheppo 		if ((rv = vntsd_write_client(clientp, &c, 1)) !=
1341ae08745Sheppo 		    VNTSD_SUCCESS) {
1351ae08745Sheppo 			return (rv);
1361ae08745Sheppo 		}
1371ae08745Sheppo 
1381ae08745Sheppo 		if ((rv = vntsd_write_client(clientp, vntsd_eol,
1391ae08745Sheppo 			VNTSD_EOL_LEN)) !=
1401ae08745Sheppo 		    VNTSD_SUCCESS) {
1411ae08745Sheppo 			return (rv);
1421ae08745Sheppo 		}
1431ae08745Sheppo 
1441ae08745Sheppo 		c = tolower(c);
1451ae08745Sheppo 
1461ae08745Sheppo 		if (c == *nl_langinfo(YESSTR)) {
1471ae08745Sheppo 			*yes_no = B_TRUE;
1481ae08745Sheppo 			return (VNTSD_SUCCESS);
1491ae08745Sheppo 		}
1501ae08745Sheppo 
1511ae08745Sheppo 		if (c == *nl_langinfo(NOSTR)) {
1521ae08745Sheppo 			*yes_no = B_FALSE;
1531ae08745Sheppo 			return (VNTSD_SUCCESS);
1541ae08745Sheppo 		}
1551ae08745Sheppo 
1561ae08745Sheppo 		if ((rv = vntsd_write_line(clientp,
1571ae08745Sheppo 		    gettext("Invalid response. Try again.")))
1581ae08745Sheppo 		    != VNTSD_SUCCESS) {
1591ae08745Sheppo 			return (rv);
1601ae08745Sheppo 		}
1611ae08745Sheppo 	}
1621ae08745Sheppo 
1631ae08745Sheppo 	/*NOTREACHED*/
1641ae08745Sheppo 	return (0);
1651ae08745Sheppo }
1661ae08745Sheppo 
1671ae08745Sheppo /* vntsd_open_vcc()  -  open a vcc port */
1681ae08745Sheppo int
1691ae08745Sheppo vntsd_open_vcc(char *dev_name, uint_t cons_no)
1701ae08745Sheppo {
1711ae08745Sheppo 	int	drvfd;
1721ae08745Sheppo 	int	sz;
1731ae08745Sheppo 	char	*path;
1741ae08745Sheppo 	sz = strlen(VCC_DEVICE_PATH) + strlen(dev_name)+1;
1751ae08745Sheppo 
1761ae08745Sheppo 	path = calloc(sz, 1);
1771ae08745Sheppo 
1781ae08745Sheppo 	if (path == NULL) {
1791ae08745Sheppo 		return (-1);
1801ae08745Sheppo 	}
1811ae08745Sheppo 
1821ae08745Sheppo 	(void) snprintf(path, sz-1, VCC_DEVICE_PATH, dev_name);
1831ae08745Sheppo 
1841ae08745Sheppo 	for (; ; ) {
1851ae08745Sheppo 		drvfd = open(path, O_RDWR);
1861ae08745Sheppo 
1871ae08745Sheppo 		if ((drvfd < 0) && (errno == EAGAIN)) {
1881ae08745Sheppo 			if (vntsd_vcc_ioctl(VCC_FORCE_CLOSE, cons_no, &cons_no)
1891ae08745Sheppo 				!= VNTSD_SUCCESS) {
1901ae08745Sheppo 				break;
1911ae08745Sheppo 			    }
1921ae08745Sheppo 		} else {
1931ae08745Sheppo 			break;
1941ae08745Sheppo 		}
1951ae08745Sheppo 	}
1961ae08745Sheppo 
1971ae08745Sheppo 
1981ae08745Sheppo 	if (drvfd < 0) {
1991ae08745Sheppo 		D1(stderr, "t@%d open_vcc@%s exit\n", thr_self(), dev_name);
2001ae08745Sheppo 		free(path);
2011ae08745Sheppo 		return (-1);
2021ae08745Sheppo 	}
2031ae08745Sheppo 
2041ae08745Sheppo 	free(path);
2051ae08745Sheppo 	return (drvfd);
2061ae08745Sheppo }
2071ae08745Sheppo 
2081ae08745Sheppo /* vntsd_cons_by_consno() - match a console structure to cons no */
2091ae08745Sheppo boolean_t
2101ae08745Sheppo vntsd_cons_by_consno(vntsd_cons_t *consp, int *cons_id)
2111ae08745Sheppo {
2121ae08745Sheppo 	if (consp->status & VNTSD_CONS_DELETED) {
2131ae08745Sheppo 		return (B_FALSE);
2141ae08745Sheppo 	}
2151ae08745Sheppo 	return (consp->cons_no == *cons_id);
2161ae08745Sheppo }
2171ae08745Sheppo 
2181ae08745Sheppo /* vntsd_write_client() write to telnet client */
2191ae08745Sheppo int
2201ae08745Sheppo vntsd_write_client(vntsd_client_t *client, char *buffer, size_t sz)
2211ae08745Sheppo {
2221ae08745Sheppo 	int rv;
2231ae08745Sheppo 
2241ae08745Sheppo 
2251ae08745Sheppo 	/* write to client */
2261ae08745Sheppo 	rv = vntsd_write_fd(client->sockfd, buffer, sz);
2271ae08745Sheppo 
2281ae08745Sheppo 	/* client has output, reset timer */
2291ae08745Sheppo 	vntsd_reset_timer(client->cons_tid);
2301ae08745Sheppo 
2311ae08745Sheppo 	return (rv);
2321ae08745Sheppo }
2331ae08745Sheppo 
2341ae08745Sheppo /* vntsd_write_fd() write to tcp socket file descriptor  */
2351ae08745Sheppo int
2361ae08745Sheppo vntsd_write_fd(int fd, void *buf, size_t sz)
2371ae08745Sheppo {
2381ae08745Sheppo 	int n;
2391ae08745Sheppo 
2401ae08745Sheppo 	while (sz > 0) {
2411ae08745Sheppo 		n = write(fd, buf, sz);
2421ae08745Sheppo 		if (n < 0) {
2431ae08745Sheppo 			if (errno == EINTR) {
2441ae08745Sheppo 				return (VNTSD_STATUS_INTR);
2451ae08745Sheppo 			}
2461ae08745Sheppo 
2471ae08745Sheppo 			return (VNTSD_STATUS_CLIENT_QUIT);
2481ae08745Sheppo 		}
2491ae08745Sheppo 
2501ae08745Sheppo 		if (n == 0) {
2511ae08745Sheppo 			return (VNTSD_STATUS_CLIENT_QUIT);
2521ae08745Sheppo 		}
2531ae08745Sheppo 
2541ae08745Sheppo 		buf =  (caddr_t)buf + n;
2551ae08745Sheppo 		sz -= n;
2561ae08745Sheppo 	}
2571ae08745Sheppo 	return (VNTSD_SUCCESS);
2581ae08745Sheppo 
2591ae08745Sheppo }
2601ae08745Sheppo 
2611ae08745Sheppo /*
2621ae08745Sheppo  * vntsd_read_char() - read a char from TCP Clienti. Returns:
2631ae08745Sheppo  * VNTSD_SUCCESS, VNTSD_STATUS_CLIENT_QUIT or VNTSD_STATUS_INTR
2641ae08745Sheppo  */
2651ae08745Sheppo int
2661ae08745Sheppo vntsd_read_char(vntsd_client_t *clientp, char *c)
2671ae08745Sheppo {
2681ae08745Sheppo 	int		n;
2691ae08745Sheppo 	vntsd_timeout_t tmo;
2701ae08745Sheppo 	int		rv;
2711ae08745Sheppo 
2721ae08745Sheppo 	tmo.tid = thr_self();
2731ae08745Sheppo 	tmo.minutes = 0;
2741ae08745Sheppo 	tmo.clientp = clientp;
2751ae08745Sheppo 
2761ae08745Sheppo 	/* attach to timer */
2771ae08745Sheppo 	if ((rv = vntsd_attach_timer(&tmo)) != VNTSD_SUCCESS) {
2781ae08745Sheppo 		return (rv);
2791ae08745Sheppo 	}
2801ae08745Sheppo 
2811ae08745Sheppo 	n = read(clientp->sockfd, c, 1);
2821ae08745Sheppo 
2831ae08745Sheppo 	/* detach from timer */
2841ae08745Sheppo 	if ((rv = vntsd_detach_timer(&tmo)) != VNTSD_SUCCESS) {
2851ae08745Sheppo 		return (rv);
2861ae08745Sheppo 	}
2871ae08745Sheppo 
2881ae08745Sheppo 	if (n == 1) {
2891ae08745Sheppo 		return (VNTSD_SUCCESS);
2901ae08745Sheppo 	}
2911ae08745Sheppo 
2921ae08745Sheppo 	if (n == 0) {
2931ae08745Sheppo 		return (VNTSD_STATUS_CLIENT_QUIT);
2941ae08745Sheppo 	}
2951ae08745Sheppo 
2961ae08745Sheppo 	/*
2971ae08745Sheppo 	 * read error or wake up by signal, either console is being removed or
2981ae08745Sheppo 	 * timeout occurs.
2991ae08745Sheppo 	 */
3001ae08745Sheppo 	if (errno == EINTR) {
3011ae08745Sheppo 		return (VNTSD_STATUS_INTR);
3021ae08745Sheppo 	}
3031ae08745Sheppo 
3041ae08745Sheppo 	/* any other error, we close client */
3051ae08745Sheppo 	return (VNTSD_STATUS_CLIENT_QUIT);
3061ae08745Sheppo }
3071ae08745Sheppo 
3081ae08745Sheppo /*
3091ae08745Sheppo  * vntsd_read_data() -  handle special commands
3101ae08745Sheppo  * such as telnet, daemon and ctrl cmds. Returns:
3111ae08745Sheppo  * from vntsd_read_char:
3121ae08745Sheppo  *	    VNTSD_STATUS_CLIENT_QUIT
3131ae08745Sheppo  *	    VNTSD_STATUS_INTR
3141ae08745Sheppo  * from vnts_process_daemon_cmd:
3151ae08745Sheppo  *	    VNTSD_STATUS_RESELECT_CONS
3161ae08745Sheppo  *	    VNTSD_STATUS_MOV_CONS_FORWARD
3171ae08745Sheppo  *	    VNTSD_STATUS_MOV_CONS_BACKWARD
3181ae08745Sheppo  *	    VNTSD_STATUS_ACQURE_WRITER
3191ae08745Sheppo  *	    VNTSD_STATUS_CONTINUE
3201ae08745Sheppo  * from vntsd_telnet_cmd
3211ae08745Sheppo  *	    VNTSD_STATUS_CONTINUE
3221ae08745Sheppo  */
3231ae08745Sheppo int
3241ae08745Sheppo vntsd_read_data(vntsd_client_t *clientp, char *c)
3251ae08745Sheppo {
3261ae08745Sheppo 	int rv;
3271ae08745Sheppo 
3281ae08745Sheppo 	for (; ; ) {
3291ae08745Sheppo 		if ((rv = vntsd_read_char(clientp, c)) != VNTSD_SUCCESS) {
3301ae08745Sheppo 		    return (rv);
3311ae08745Sheppo 		}
3321ae08745Sheppo 
3331ae08745Sheppo 		/* daemon cmd? */
3341ae08745Sheppo 		rv = vntsd_process_daemon_cmd(clientp, *c);
3351ae08745Sheppo 
3361ae08745Sheppo 		if (rv == VNTSD_SUCCESS) {
3371ae08745Sheppo 			/* telnet cmd? */
3381ae08745Sheppo 			rv = vntsd_telnet_cmd(clientp, *c);
3391ae08745Sheppo 		}
3401ae08745Sheppo 
3411ae08745Sheppo 		if (rv == VNTSD_STATUS_CONTINUE) {
342*823fe29bSdtse 			/*
343*823fe29bSdtse 			 * either a daemon cmd or a telnet cmd
344*823fe29bSdtse 			 * was processed.
345*823fe29bSdtse 			 */
346*823fe29bSdtse 			clientp->prev_char = 0;
3471ae08745Sheppo 			continue;
3481ae08745Sheppo 		}
3491ae08745Sheppo 
3501ae08745Sheppo 		return (rv);
3511ae08745Sheppo 	}
3521ae08745Sheppo 
3531ae08745Sheppo 	/*NOTREACHED*/
3541ae08745Sheppo 	return (0);
3551ae08745Sheppo }
3561ae08745Sheppo /* vntsd_read_line() -  read a line from TCP client */
3571ae08745Sheppo int
3581ae08745Sheppo vntsd_read_line(vntsd_client_t *clientp, char *buf, int *in_sz)
3591ae08745Sheppo {
3601ae08745Sheppo 	char	c;
3611ae08745Sheppo 	int	rv;
3621ae08745Sheppo 	int	out_sz = 0;
3631ae08745Sheppo 
3641ae08745Sheppo 
3651ae08745Sheppo 	for (; ; ) {
3661ae08745Sheppo 
3671ae08745Sheppo 		if ((rv =  vntsd_read_data(clientp, &c)) !=  VNTSD_SUCCESS) {
3681ae08745Sheppo 		    return (rv);
3691ae08745Sheppo 		}
3701ae08745Sheppo 
3711ae08745Sheppo 		if (c == BS) {
3721ae08745Sheppo 			/* back */
3731ae08745Sheppo 			if ((rv = vntsd_write_client(clientp, &c, 1)) !=
3741ae08745Sheppo 			    VNTSD_SUCCESS) {
3751ae08745Sheppo 				return (rv);
3761ae08745Sheppo 			}
3771ae08745Sheppo 
3781ae08745Sheppo 			c = ' ';
3791ae08745Sheppo 			if ((rv = vntsd_write_client(clientp, &c, 1)) !=
3801ae08745Sheppo 			    VNTSD_SUCCESS) {
3811ae08745Sheppo 				return (rv);
3821ae08745Sheppo 			}
3831ae08745Sheppo 
3841ae08745Sheppo 			buf--;
3851ae08745Sheppo 			out_sz--;
3861ae08745Sheppo 			continue;
3871ae08745Sheppo 		}
3881ae08745Sheppo 		/* echo */
3891ae08745Sheppo 		if ((rv = vntsd_write_client(clientp, &c, 1)) !=
3901ae08745Sheppo 		    VNTSD_SUCCESS) {
3911ae08745Sheppo 			return (rv);
3921ae08745Sheppo 		}
3931ae08745Sheppo 
3941ae08745Sheppo 		*buf++ = c;
3951ae08745Sheppo 		out_sz++;
3961ae08745Sheppo 
3971ae08745Sheppo 		if (c == CR) {
3981ae08745Sheppo 			/* end of line */
3991ae08745Sheppo 			*in_sz = out_sz;
4001ae08745Sheppo 			return (VNTSD_SUCCESS);
4011ae08745Sheppo 		}
4021ae08745Sheppo 
4031ae08745Sheppo 		if (out_sz == *in_sz) {
4041ae08745Sheppo 			return (VNTSD_SUCCESS);
4051ae08745Sheppo 		}
4061ae08745Sheppo 	}
4071ae08745Sheppo 
4081ae08745Sheppo 	/*NOTREACHED*/
4091ae08745Sheppo 	return (0);
4101ae08745Sheppo }
4111ae08745Sheppo 
4121ae08745Sheppo /* free a client */
4131ae08745Sheppo void
4141ae08745Sheppo vntsd_free_client(vntsd_client_t *clientp)
4151ae08745Sheppo {
4161ae08745Sheppo 
4171ae08745Sheppo 	if (clientp->sockfd != -1) {
4181ae08745Sheppo 		(void) close(clientp->sockfd);
4191ae08745Sheppo 	}
4201ae08745Sheppo 
4211ae08745Sheppo 	(void) mutex_destroy(&clientp->lock);
4221ae08745Sheppo 
4231ae08745Sheppo 	free(clientp);
4241ae08745Sheppo }
4251ae08745Sheppo 
4261ae08745Sheppo 
4271ae08745Sheppo /* check if a vcc console port still ok */
4281ae08745Sheppo boolean_t
4291ae08745Sheppo vntsd_vcc_cons_alive(vntsd_cons_t *consp)
4301ae08745Sheppo {
4311ae08745Sheppo 	vcc_console_t	vcc_cons;
4321ae08745Sheppo 	int		rv;
4331ae08745Sheppo 
4341ae08745Sheppo 	assert(consp);
4351ae08745Sheppo 	assert(consp->group);
4361ae08745Sheppo 
4371ae08745Sheppo 	/* construct current configuration */
4381ae08745Sheppo 	(void) strncpy(vcc_cons.domain_name, consp->domain_name, MAXPATHLEN);
4391ae08745Sheppo 	(void) strncpy(vcc_cons.group_name, consp->group->group_name,
4401ae08745Sheppo 	    MAXPATHLEN);
4411ae08745Sheppo 	vcc_cons.tcp_port = consp->group->tcp_port;
4421ae08745Sheppo 	vcc_cons.cons_no   = consp->cons_no;
4431ae08745Sheppo 
4441ae08745Sheppo 	/* call vcc to verify */
4451ae08745Sheppo 	rv = vntsd_vcc_ioctl(VCC_CONS_STATUS, consp->cons_no, &vcc_cons);
4461ae08745Sheppo 	if (rv != VNTSD_SUCCESS) {
4471ae08745Sheppo 		return (B_FALSE);
4481ae08745Sheppo 	}
4491ae08745Sheppo 
4501ae08745Sheppo 	if (vcc_cons.cons_no == -1) {
4511ae08745Sheppo 		/* port is gone */
4521ae08745Sheppo 		return (B_FALSE);
4531ae08745Sheppo 	}
4541ae08745Sheppo 
4551ae08745Sheppo 	/* port is ok */
4561ae08745Sheppo 	return (B_TRUE);
4571ae08745Sheppo 
4581ae08745Sheppo }
4591ae08745Sheppo 
4601ae08745Sheppo /* add to total if a console is alive  */
4611ae08745Sheppo static boolean_t
4621ae08745Sheppo total_cons(vntsd_cons_t *consp, int *num_cons)
4631ae08745Sheppo {
4641ae08745Sheppo 	int rv;
4651ae08745Sheppo 
4661ae08745Sheppo 	assert(consp->group);
4671ae08745Sheppo 	rv = vntsd_vcc_err(consp);
4681ae08745Sheppo 	if (rv == VNTSD_STATUS_CONTINUE) {
4691ae08745Sheppo 		(*num_cons)++;
4701ae08745Sheppo 	}
4711ae08745Sheppo 	return (B_FALSE);
4721ae08745Sheppo }
4731ae08745Sheppo 
4741ae08745Sheppo 
4751ae08745Sheppo /* total alive consoles in a group  */
4761ae08745Sheppo int
4771ae08745Sheppo vntsd_chk_group_total_cons(vntsd_group_t *groupp)
4781ae08745Sheppo {
4791ae08745Sheppo 	uint_t num_cons = 0;
4801ae08745Sheppo 
4811ae08745Sheppo 	(void) vntsd_que_find(groupp->conspq, (compare_func_t)total_cons,
4821ae08745Sheppo 	    &num_cons);
4831ae08745Sheppo 	return (num_cons);
4841ae08745Sheppo }
4851ae08745Sheppo 
4861ae08745Sheppo /* vntsd_log() log function for errors */
4871ae08745Sheppo void
4881ae08745Sheppo vntsd_log(vntsd_status_t status, char *msg)
4891ae08745Sheppo {
4901ae08745Sheppo 	char	*status_msg = NULL;
4911ae08745Sheppo 	int	critical = 0;
4921ae08745Sheppo 
4931ae08745Sheppo 	switch (status) {
4941ae08745Sheppo 
4951ae08745Sheppo 	case VNTSD_SUCCESS:
4961ae08745Sheppo 		status_msg = "STATUS_OK";
4971ae08745Sheppo 		break;
4981ae08745Sheppo 
4991ae08745Sheppo 	case VNTSD_STATUS_CONTINUE:
5001ae08745Sheppo 		status_msg = "CONTINUE";
5011ae08745Sheppo 		break;
5021ae08745Sheppo 
5031ae08745Sheppo 	case VNTSD_STATUS_EXIT_SIG:
5041ae08745Sheppo 		critical = 1;
5051ae08745Sheppo 		status_msg = "KILL SIGNAL RECV";
5061ae08745Sheppo 		break;
5071ae08745Sheppo 
5081ae08745Sheppo 	case VNTSD_STATUS_SIG:
5091ae08745Sheppo 		status_msg = "SIG RECV";
5101ae08745Sheppo 		break;
5111ae08745Sheppo 
5121ae08745Sheppo 	case VNTSD_STATUS_NO_HOST_NAME:
5131ae08745Sheppo 		status_msg = "Warining NO HOST NAME";
5141ae08745Sheppo 		break;
5151ae08745Sheppo 
5161ae08745Sheppo 	case VNTSD_STATUS_CLIENT_QUIT:
5171ae08745Sheppo 		status_msg = "CLIENT CLOSED  GROUP CONNECTION";
5181ae08745Sheppo 		break;
5191ae08745Sheppo 
5201ae08745Sheppo 	case VNTSD_STATUS_RESELECT_CONS:
5211ae08745Sheppo 		status_msg = "CLIENT RESELECTS CONSOLE";
5221ae08745Sheppo 		break;
5231ae08745Sheppo 
5241ae08745Sheppo 	case VNTSD_STATUS_VCC_IO_ERR:
5251ae08745Sheppo 		status_msg = "CONSOLE WAS DELETED";
5261ae08745Sheppo 		break;
5271ae08745Sheppo 
5281ae08745Sheppo 	case VNTSD_STATUS_MOV_CONS_FORWARD:
5291ae08745Sheppo 		status_msg = "MOVE CONSOLE FORWARD";
5301ae08745Sheppo 		break;
5311ae08745Sheppo 
5321ae08745Sheppo 	case VNTSD_STATUS_MOV_CONS_BACKWARD:
5331ae08745Sheppo 		status_msg = "MOVE CONSOLE BACKWARD";
5341ae08745Sheppo 		break;
5351ae08745Sheppo 
5361ae08745Sheppo 	case VNTSD_STATUS_ACQUIRE_WRITER:
5371ae08745Sheppo 		status_msg = "FORCE CONSOLE WRITE";
5381ae08745Sheppo 		break;
5391ae08745Sheppo 
5401ae08745Sheppo 	case VNTSD_STATUS_INTR:
5411ae08745Sheppo 		status_msg = "RECV SIGNAL";
5421ae08745Sheppo 		break;
5431ae08745Sheppo 
5441ae08745Sheppo 	case VNTSD_STATUS_DISCONN_CONS:
5451ae08745Sheppo 		status_msg = "DELETING CONSOLE";
5461ae08745Sheppo 		break;
5471ae08745Sheppo 
5481ae08745Sheppo 	case VNTSD_STATUS_NO_CONS:
5497636cb21Slm66018 		status_msg = "All console(s) in the group have been deleted.";
5501ae08745Sheppo 		break;
5511ae08745Sheppo 
5521ae08745Sheppo 	case VNTSD_ERR_NO_MEM:
5531ae08745Sheppo 		critical = 1;
5541ae08745Sheppo 		status_msg = "NO MEMORY";
5551ae08745Sheppo 		break;
5561ae08745Sheppo 
5571ae08745Sheppo 	case VNTSD_ERR_NO_DRV:
5581ae08745Sheppo 		critical = 1;
5591ae08745Sheppo 		status_msg = "NO VCC DRIVER";
5601ae08745Sheppo 		break;
5611ae08745Sheppo 
5621ae08745Sheppo 	case VNTSD_ERR_WRITE_CLIENT:
5631ae08745Sheppo 		status_msg  =  "WRITE CLIENT ERR";
5641ae08745Sheppo 		break;
5651ae08745Sheppo 
5661ae08745Sheppo 	case VNTSD_ERR_EL_NOT_FOUND:
5671ae08745Sheppo 		critical = 1;
5681ae08745Sheppo 		status_msg = "ELEMENT_NOT_FOUND";
5691ae08745Sheppo 		break;
5701ae08745Sheppo 
5711ae08745Sheppo 	case VNTSD_ERR_VCC_CTRL_DATA:
5721ae08745Sheppo 		critical = 1;
5731ae08745Sheppo 		status_msg = "VCC CTRL DATA  ERROR";
5741ae08745Sheppo 		break;
5751ae08745Sheppo 
5761ae08745Sheppo 	case VNTSD_ERR_VCC_POLL:
5771ae08745Sheppo 		critical = 1;
5781ae08745Sheppo 		status_msg = "VCC POLL ERROR";
5791ae08745Sheppo 		break;
5801ae08745Sheppo 
5811ae08745Sheppo 	case VNTSD_ERR_VCC_IOCTL:
5821ae08745Sheppo 		critical = 1;
5831ae08745Sheppo 		status_msg = "VCC IOCTL ERROR";
5841ae08745Sheppo 		break;
5851ae08745Sheppo 
5861ae08745Sheppo 	case VNTSD_ERR_VCC_GRP_NAME:
5871ae08745Sheppo 		critical = 1;
5881ae08745Sheppo 		status_msg = "VCC GROUP NAME ERROR";
5891ae08745Sheppo 		break;
5901ae08745Sheppo 
5911ae08745Sheppo 	case VNTSD_ERR_CREATE_LISTEN_THR:
5921ae08745Sheppo 		critical = 1;
5931ae08745Sheppo 		status_msg = "FAIL TO CREATE LISTEN THREAD";
5941ae08745Sheppo 		break;
5951ae08745Sheppo 
5961ae08745Sheppo 	case VNTSD_ERR_CREATE_WR_THR:
5971ae08745Sheppo 		critical = 1;
5981ae08745Sheppo 		status_msg = "FAIL TO CREATE WRITE THREAD";
5991ae08745Sheppo 		break;
6001ae08745Sheppo 
6011ae08745Sheppo 	case VNTSD_ERR_ADD_CONS_FAILED:
6021ae08745Sheppo 		critical = 1;
6031ae08745Sheppo 		status_msg = "FAIL TO ADD A CONSOLE";
6041ae08745Sheppo 		break;
6051ae08745Sheppo 
6061ae08745Sheppo 	case VNTSD_ERR_LISTEN_SOCKET:
6071ae08745Sheppo 		critical = 1;
6081ae08745Sheppo 		status_msg = "LISTEN SOCKET ERROR";
6091ae08745Sheppo 		break;
6101ae08745Sheppo 
6111ae08745Sheppo 	case VNTSD_ERR_LISTEN_OPTS:
6121ae08745Sheppo 		critical = 1;
6131ae08745Sheppo 		status_msg = "SET SOCKET OPTIONS ERROR";
6141ae08745Sheppo 		break;
6151ae08745Sheppo 
6161ae08745Sheppo 	case VNTSD_ERR_LISTEN_BIND:
6171ae08745Sheppo 		critical = 1;
6181ae08745Sheppo 		status_msg = "BIND SOCKET ERROR";
6191ae08745Sheppo 		break;
6201ae08745Sheppo 
6211ae08745Sheppo 	case VNTSD_STATUS_ACCEPT_ERR:
6221ae08745Sheppo 		critical = 1;
6231ae08745Sheppo 		status_msg = "LISTEN ACCEPT ERROR";
6241ae08745Sheppo 		break;
6251ae08745Sheppo 
6261ae08745Sheppo 	case VNTSD_ERR_CREATE_CONS_THR:
6271ae08745Sheppo 		critical = 1;
6281ae08745Sheppo 		status_msg = "CREATE CONSOLE THREAD ERROR ";
6291ae08745Sheppo 		break;
6301ae08745Sheppo 
6311ae08745Sheppo 	case VNTSD_ERR_SIG:
6321ae08745Sheppo 		critical = 1;
6331ae08745Sheppo 		status_msg = "RECV UNKNOWN SIG";
6341ae08745Sheppo 		break;
6351ae08745Sheppo 
6361ae08745Sheppo 	case VNTSD_ERR_UNKNOWN_CMD:
6371ae08745Sheppo 		critical = 1;
6381ae08745Sheppo 		status_msg = "RECV UNKNOWN COMMAND";
6391ae08745Sheppo 		break;
6401ae08745Sheppo 
6411ae08745Sheppo 	case VNTSD_ERR_CLIENT_TIMEOUT:
6421ae08745Sheppo 		status_msg  =  "CLOSE CLIENT BECAUSE TIMEOUT";
6431ae08745Sheppo 		break;
6441ae08745Sheppo 	default:
6451ae08745Sheppo 		status_msg = "Unknown status recv";
6461ae08745Sheppo 		break;
6471ae08745Sheppo 	}
6481ae08745Sheppo 
6491ae08745Sheppo 
6501ae08745Sheppo 	if (critical) {
6511ae08745Sheppo 		syslog(LOG_ERR, "%s: thread[%d] %s\n", status_msg,
6521ae08745Sheppo 		    thr_self(), msg);
6531ae08745Sheppo 	}
6541ae08745Sheppo #ifdef DEBUG
6551ae08745Sheppo 	DERR(stderr, "%s: thread[%d] %s\n", status_msg,
6561ae08745Sheppo 		    thr_self(), msg);
6571ae08745Sheppo 	syslog(LOG_ERR, "%s: thread[%d] %s\n", status_msg, thr_self(), msg);
6581ae08745Sheppo #endif
6591ae08745Sheppo }
660