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