xref: /titanic_50/usr/src/cmd/vntsd/common.c (revision 1ae0874509b6811fdde1dfd46f0d93fd09867a3f)
1*1ae08745Sheppo /*
2*1ae08745Sheppo  * CDDL HEADER START
3*1ae08745Sheppo  *
4*1ae08745Sheppo  * The contents of this file are subject to the terms of the
5*1ae08745Sheppo  * Common Development and Distribution License (the "License").
6*1ae08745Sheppo  * You may not use this file except in compliance with the License.
7*1ae08745Sheppo  *
8*1ae08745Sheppo  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*1ae08745Sheppo  * or http://www.opensolaris.org/os/licensing.
10*1ae08745Sheppo  * See the License for the specific language governing permissions
11*1ae08745Sheppo  * and limitations under the License.
12*1ae08745Sheppo  *
13*1ae08745Sheppo  * When distributing Covered Code, include this CDDL HEADER in each
14*1ae08745Sheppo  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*1ae08745Sheppo  * If applicable, add the following below this CDDL HEADER, with the
16*1ae08745Sheppo  * fields enclosed by brackets "[]" replaced with your own identifying
17*1ae08745Sheppo  * information: Portions Copyright [yyyy] [name of copyright owner]
18*1ae08745Sheppo  *
19*1ae08745Sheppo  * CDDL HEADER END
20*1ae08745Sheppo  */
21*1ae08745Sheppo 
22*1ae08745Sheppo /*
23*1ae08745Sheppo  * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
24*1ae08745Sheppo  * Use is subject to license terms.
25*1ae08745Sheppo  */
26*1ae08745Sheppo 
27*1ae08745Sheppo #pragma ident	"%Z%%M%	%I%	%E% SMI"
28*1ae08745Sheppo 
29*1ae08745Sheppo /*
30*1ae08745Sheppo  * supporting modules.
31*1ae08745Sheppo  */
32*1ae08745Sheppo 
33*1ae08745Sheppo #include <stdio.h>
34*1ae08745Sheppo #include <sys/types.h>
35*1ae08745Sheppo #include <sys/ipc.h>
36*1ae08745Sheppo #include <stdlib.h>
37*1ae08745Sheppo #include <string.h>
38*1ae08745Sheppo #include <unistd.h>
39*1ae08745Sheppo #include <sys/socket.h>
40*1ae08745Sheppo #include <sys/ipc.h>
41*1ae08745Sheppo #include <sys/shm.h>
42*1ae08745Sheppo #include <sys/sem.h>
43*1ae08745Sheppo #include <sys/poll.h>
44*1ae08745Sheppo #include <wait.h>
45*1ae08745Sheppo #include <time.h>
46*1ae08745Sheppo #include <netinet/in.h>
47*1ae08745Sheppo #include <thread.h>
48*1ae08745Sheppo #include <signal.h>
49*1ae08745Sheppo #include <ctype.h>
50*1ae08745Sheppo #include <langinfo.h>
51*1ae08745Sheppo #include <libintl.h>
52*1ae08745Sheppo #include <syslog.h>
53*1ae08745Sheppo #include "vntsd.h"
54*1ae08745Sheppo #include "chars.h"
55*1ae08745Sheppo 
56*1ae08745Sheppo /*  vntsd_write_line() - write a line to TCP client */
57*1ae08745Sheppo int
58*1ae08745Sheppo vntsd_write_line(vntsd_client_t *clientp, char *line)
59*1ae08745Sheppo {
60*1ae08745Sheppo 	int rv;
61*1ae08745Sheppo 
62*1ae08745Sheppo 	rv = vntsd_write_client(clientp, line, strlen(line));
63*1ae08745Sheppo 	if (rv == VNTSD_SUCCESS) {
64*1ae08745Sheppo 		rv = vntsd_write_client(clientp, vntsd_eol, VNTSD_EOL_LEN);
65*1ae08745Sheppo 	}
66*1ae08745Sheppo 
67*1ae08745Sheppo 	return (rv);
68*1ae08745Sheppo }
69*1ae08745Sheppo 
70*1ae08745Sheppo /*  vntsd_write_lines() write one or more lines to client.  */
71*1ae08745Sheppo int
72*1ae08745Sheppo vntsd_write_lines(vntsd_client_t *clientp, char *lines)
73*1ae08745Sheppo {
74*1ae08745Sheppo 	char	*buf;
75*1ae08745Sheppo 	char	*line;
76*1ae08745Sheppo 	char 	*endofline;
77*1ae08745Sheppo 
78*1ae08745Sheppo 	buf = strdup(lines);
79*1ae08745Sheppo 	if (buf == NULL) {
80*1ae08745Sheppo 		return (VNTSD_ERR_NO_MEM);
81*1ae08745Sheppo 	}
82*1ae08745Sheppo 
83*1ae08745Sheppo 	line = buf;
84*1ae08745Sheppo 
85*1ae08745Sheppo 	while ((line != NULL) && (*line != '\0')) {
86*1ae08745Sheppo 
87*1ae08745Sheppo 		endofline = strchr(line, '\n');
88*1ae08745Sheppo 		if (endofline != NULL) {
89*1ae08745Sheppo 			*endofline = '\0';
90*1ae08745Sheppo 		}
91*1ae08745Sheppo 
92*1ae08745Sheppo 		(void) vntsd_write_line(clientp, line);
93*1ae08745Sheppo 
94*1ae08745Sheppo 		if (endofline != NULL)
95*1ae08745Sheppo 			line = endofline + 1;
96*1ae08745Sheppo 		else
97*1ae08745Sheppo 			line = NULL;
98*1ae08745Sheppo 	}
99*1ae08745Sheppo 
100*1ae08745Sheppo 	free(buf);
101*1ae08745Sheppo 	return (VNTSD_SUCCESS);
102*1ae08745Sheppo }
103*1ae08745Sheppo 
104*1ae08745Sheppo /* vntsd_get_yes_no() -  read in a "y" or "n" */
105*1ae08745Sheppo int
106*1ae08745Sheppo vntsd_get_yes_no(vntsd_client_t *clientp, char *msg, int *yes_no)
107*1ae08745Sheppo {
108*1ae08745Sheppo 	char	c;
109*1ae08745Sheppo 	char	yesno[8];
110*1ae08745Sheppo 	int	rv;
111*1ae08745Sheppo 
112*1ae08745Sheppo 	/* create [y/n] prompt */
113*1ae08745Sheppo 	(void) snprintf(yesno, sizeof (yesno), "[%c/%c] ",
114*1ae08745Sheppo 	    *nl_langinfo(YESSTR), *nl_langinfo(NOSTR));
115*1ae08745Sheppo 
116*1ae08745Sheppo 	for (; ; ) {
117*1ae08745Sheppo 		if ((rv = vntsd_write_client(clientp, msg, strlen(msg)))
118*1ae08745Sheppo 		    != VNTSD_SUCCESS) {
119*1ae08745Sheppo 			return (rv);
120*1ae08745Sheppo 		}
121*1ae08745Sheppo 
122*1ae08745Sheppo 		if ((rv = vntsd_write_client(clientp, yesno, strlen(yesno))) !=
123*1ae08745Sheppo 		    VNTSD_SUCCESS) {
124*1ae08745Sheppo 			return (rv);
125*1ae08745Sheppo 		}
126*1ae08745Sheppo 
127*1ae08745Sheppo 		if ((rv = vntsd_read_data(clientp, &c))
128*1ae08745Sheppo 		    != VNTSD_SUCCESS) {
129*1ae08745Sheppo 			return (rv);
130*1ae08745Sheppo 		}
131*1ae08745Sheppo 
132*1ae08745Sheppo 		/* echo */
133*1ae08745Sheppo 		if ((rv = vntsd_write_client(clientp, &c, 1)) !=
134*1ae08745Sheppo 		    VNTSD_SUCCESS) {
135*1ae08745Sheppo 			return (rv);
136*1ae08745Sheppo 		}
137*1ae08745Sheppo 
138*1ae08745Sheppo 		if ((rv = vntsd_write_client(clientp, vntsd_eol,
139*1ae08745Sheppo 			VNTSD_EOL_LEN)) !=
140*1ae08745Sheppo 		    VNTSD_SUCCESS) {
141*1ae08745Sheppo 			return (rv);
142*1ae08745Sheppo 		}
143*1ae08745Sheppo 
144*1ae08745Sheppo 		c = tolower(c);
145*1ae08745Sheppo 
146*1ae08745Sheppo 		if (c == *nl_langinfo(YESSTR)) {
147*1ae08745Sheppo 			*yes_no = B_TRUE;
148*1ae08745Sheppo 			return (VNTSD_SUCCESS);
149*1ae08745Sheppo 		}
150*1ae08745Sheppo 
151*1ae08745Sheppo 		if (c == *nl_langinfo(NOSTR)) {
152*1ae08745Sheppo 			*yes_no = B_FALSE;
153*1ae08745Sheppo 			return (VNTSD_SUCCESS);
154*1ae08745Sheppo 		}
155*1ae08745Sheppo 
156*1ae08745Sheppo 		if ((rv = vntsd_write_line(clientp,
157*1ae08745Sheppo 		    gettext("Invalid response. Try again.")))
158*1ae08745Sheppo 		    != VNTSD_SUCCESS) {
159*1ae08745Sheppo 			return (rv);
160*1ae08745Sheppo 		}
161*1ae08745Sheppo 	}
162*1ae08745Sheppo 
163*1ae08745Sheppo 	/*NOTREACHED*/
164*1ae08745Sheppo 	return (0);
165*1ae08745Sheppo }
166*1ae08745Sheppo 
167*1ae08745Sheppo /* vntsd_open_vcc()  -  open a vcc port */
168*1ae08745Sheppo int
169*1ae08745Sheppo vntsd_open_vcc(char *dev_name, uint_t cons_no)
170*1ae08745Sheppo {
171*1ae08745Sheppo 	int	drvfd;
172*1ae08745Sheppo 	int	sz;
173*1ae08745Sheppo 	char	*path;
174*1ae08745Sheppo 	sz = strlen(VCC_DEVICE_PATH) + strlen(dev_name)+1;
175*1ae08745Sheppo 
176*1ae08745Sheppo 	path = calloc(sz, 1);
177*1ae08745Sheppo 
178*1ae08745Sheppo 	if (path == NULL) {
179*1ae08745Sheppo 		return (-1);
180*1ae08745Sheppo 	}
181*1ae08745Sheppo 
182*1ae08745Sheppo 	(void) snprintf(path, sz-1, VCC_DEVICE_PATH, dev_name);
183*1ae08745Sheppo 
184*1ae08745Sheppo 	for (; ; ) {
185*1ae08745Sheppo 		drvfd = open(path, O_RDWR);
186*1ae08745Sheppo 
187*1ae08745Sheppo 		if ((drvfd < 0) && (errno == EAGAIN)) {
188*1ae08745Sheppo 			if (vntsd_vcc_ioctl(VCC_FORCE_CLOSE, cons_no, &cons_no)
189*1ae08745Sheppo 				!= VNTSD_SUCCESS) {
190*1ae08745Sheppo 				break;
191*1ae08745Sheppo 			    }
192*1ae08745Sheppo 		} else {
193*1ae08745Sheppo 			break;
194*1ae08745Sheppo 		}
195*1ae08745Sheppo 	}
196*1ae08745Sheppo 
197*1ae08745Sheppo 
198*1ae08745Sheppo 	if (drvfd < 0) {
199*1ae08745Sheppo 		D1(stderr, "t@%d open_vcc@%s exit\n", thr_self(), dev_name);
200*1ae08745Sheppo 		free(path);
201*1ae08745Sheppo 		return (-1);
202*1ae08745Sheppo 	}
203*1ae08745Sheppo 
204*1ae08745Sheppo 	free(path);
205*1ae08745Sheppo 	return (drvfd);
206*1ae08745Sheppo }
207*1ae08745Sheppo 
208*1ae08745Sheppo /* vntsd_cons_by_consno() - match a console structure to cons no */
209*1ae08745Sheppo boolean_t
210*1ae08745Sheppo vntsd_cons_by_consno(vntsd_cons_t *consp, int *cons_id)
211*1ae08745Sheppo {
212*1ae08745Sheppo 	if (consp->status & VNTSD_CONS_DELETED) {
213*1ae08745Sheppo 		return (B_FALSE);
214*1ae08745Sheppo 	}
215*1ae08745Sheppo 	return (consp->cons_no == *cons_id);
216*1ae08745Sheppo }
217*1ae08745Sheppo 
218*1ae08745Sheppo /* vntsd_write_client() write to telnet client */
219*1ae08745Sheppo int
220*1ae08745Sheppo vntsd_write_client(vntsd_client_t *client, char *buffer, size_t sz)
221*1ae08745Sheppo {
222*1ae08745Sheppo 	int rv;
223*1ae08745Sheppo 
224*1ae08745Sheppo 
225*1ae08745Sheppo 	/* write to client */
226*1ae08745Sheppo 	rv = vntsd_write_fd(client->sockfd, buffer, sz);
227*1ae08745Sheppo 
228*1ae08745Sheppo 	/* client has output, reset timer */
229*1ae08745Sheppo 	vntsd_reset_timer(client->cons_tid);
230*1ae08745Sheppo 
231*1ae08745Sheppo 	return (rv);
232*1ae08745Sheppo }
233*1ae08745Sheppo 
234*1ae08745Sheppo /* vntsd_write_fd() write to tcp socket file descriptor  */
235*1ae08745Sheppo int
236*1ae08745Sheppo vntsd_write_fd(int fd, void *buf, size_t sz)
237*1ae08745Sheppo {
238*1ae08745Sheppo 	int n;
239*1ae08745Sheppo 
240*1ae08745Sheppo 	while (sz > 0) {
241*1ae08745Sheppo 		n = write(fd, buf, sz);
242*1ae08745Sheppo 		if (n < 0) {
243*1ae08745Sheppo 			if (errno == EINTR) {
244*1ae08745Sheppo 				return (VNTSD_STATUS_INTR);
245*1ae08745Sheppo 			}
246*1ae08745Sheppo 
247*1ae08745Sheppo 			return (VNTSD_STATUS_CLIENT_QUIT);
248*1ae08745Sheppo 		}
249*1ae08745Sheppo 
250*1ae08745Sheppo 		if (n == 0) {
251*1ae08745Sheppo 			return (VNTSD_STATUS_CLIENT_QUIT);
252*1ae08745Sheppo 		}
253*1ae08745Sheppo 
254*1ae08745Sheppo 		buf =  (caddr_t)buf + n;
255*1ae08745Sheppo 		sz -= n;
256*1ae08745Sheppo 	}
257*1ae08745Sheppo 	return (VNTSD_SUCCESS);
258*1ae08745Sheppo 
259*1ae08745Sheppo }
260*1ae08745Sheppo 
261*1ae08745Sheppo /*
262*1ae08745Sheppo  * vntsd_read_char() - read a char from TCP Clienti. Returns:
263*1ae08745Sheppo  * VNTSD_SUCCESS, VNTSD_STATUS_CLIENT_QUIT or VNTSD_STATUS_INTR
264*1ae08745Sheppo  */
265*1ae08745Sheppo int
266*1ae08745Sheppo vntsd_read_char(vntsd_client_t *clientp, char *c)
267*1ae08745Sheppo {
268*1ae08745Sheppo 	int		n;
269*1ae08745Sheppo 	vntsd_timeout_t tmo;
270*1ae08745Sheppo 	int		rv;
271*1ae08745Sheppo 
272*1ae08745Sheppo 	tmo.tid = thr_self();
273*1ae08745Sheppo 	tmo.minutes = 0;
274*1ae08745Sheppo 	tmo.clientp = clientp;
275*1ae08745Sheppo 
276*1ae08745Sheppo 	/* attach to timer */
277*1ae08745Sheppo 	if ((rv = vntsd_attach_timer(&tmo)) != VNTSD_SUCCESS) {
278*1ae08745Sheppo 		return (rv);
279*1ae08745Sheppo 	}
280*1ae08745Sheppo 
281*1ae08745Sheppo 	n = read(clientp->sockfd, c, 1);
282*1ae08745Sheppo 
283*1ae08745Sheppo 	/* detach from timer */
284*1ae08745Sheppo 	if ((rv = vntsd_detach_timer(&tmo)) != VNTSD_SUCCESS) {
285*1ae08745Sheppo 		return (rv);
286*1ae08745Sheppo 	}
287*1ae08745Sheppo 
288*1ae08745Sheppo 	if (n == 1) {
289*1ae08745Sheppo 		return (VNTSD_SUCCESS);
290*1ae08745Sheppo 	}
291*1ae08745Sheppo 
292*1ae08745Sheppo 	if (n == 0) {
293*1ae08745Sheppo 		return (VNTSD_STATUS_CLIENT_QUIT);
294*1ae08745Sheppo 	}
295*1ae08745Sheppo 
296*1ae08745Sheppo 	/*
297*1ae08745Sheppo 	 * read error or wake up by signal, either console is being removed or
298*1ae08745Sheppo 	 * timeout occurs.
299*1ae08745Sheppo 	 */
300*1ae08745Sheppo 	if (errno == EINTR) {
301*1ae08745Sheppo 		return (VNTSD_STATUS_INTR);
302*1ae08745Sheppo 	}
303*1ae08745Sheppo 
304*1ae08745Sheppo 	/* any other error, we close client */
305*1ae08745Sheppo 	return (VNTSD_STATUS_CLIENT_QUIT);
306*1ae08745Sheppo }
307*1ae08745Sheppo 
308*1ae08745Sheppo /*
309*1ae08745Sheppo  * vntsd_read_data() -  handle special commands
310*1ae08745Sheppo  * such as telnet, daemon and ctrl cmds. Returns:
311*1ae08745Sheppo  * from vntsd_read_char:
312*1ae08745Sheppo  *	    VNTSD_STATUS_CLIENT_QUIT
313*1ae08745Sheppo  *	    VNTSD_STATUS_INTR
314*1ae08745Sheppo  * from vnts_process_daemon_cmd:
315*1ae08745Sheppo  *	    VNTSD_STATUS_RESELECT_CONS
316*1ae08745Sheppo  *	    VNTSD_STATUS_MOV_CONS_FORWARD
317*1ae08745Sheppo  *	    VNTSD_STATUS_MOV_CONS_BACKWARD
318*1ae08745Sheppo  *	    VNTSD_STATUS_ACQURE_WRITER
319*1ae08745Sheppo  *	    VNTSD_STATUS_CONTINUE
320*1ae08745Sheppo  * from vntsd_telnet_cmd
321*1ae08745Sheppo  *	    VNTSD_STATUS_CONTINUE
322*1ae08745Sheppo  */
323*1ae08745Sheppo int
324*1ae08745Sheppo vntsd_read_data(vntsd_client_t *clientp, char *c)
325*1ae08745Sheppo {
326*1ae08745Sheppo 	int rv;
327*1ae08745Sheppo 
328*1ae08745Sheppo 	for (; ; ) {
329*1ae08745Sheppo 		if ((rv = vntsd_read_char(clientp, c)) != VNTSD_SUCCESS) {
330*1ae08745Sheppo 		    return (rv);
331*1ae08745Sheppo 		}
332*1ae08745Sheppo 
333*1ae08745Sheppo 		/* daemon cmd? */
334*1ae08745Sheppo 		rv = vntsd_process_daemon_cmd(clientp, *c);
335*1ae08745Sheppo 
336*1ae08745Sheppo 		if (rv == VNTSD_SUCCESS) {
337*1ae08745Sheppo 			/* telnet cmd? */
338*1ae08745Sheppo 			rv = vntsd_telnet_cmd(clientp, *c);
339*1ae08745Sheppo 		}
340*1ae08745Sheppo 
341*1ae08745Sheppo 		if (rv == VNTSD_STATUS_CONTINUE) {
342*1ae08745Sheppo 			continue;
343*1ae08745Sheppo 		}
344*1ae08745Sheppo 
345*1ae08745Sheppo 		return (rv);
346*1ae08745Sheppo 	}
347*1ae08745Sheppo 
348*1ae08745Sheppo 	/*NOTREACHED*/
349*1ae08745Sheppo 	return (0);
350*1ae08745Sheppo }
351*1ae08745Sheppo /* vntsd_read_line() -  read a line from TCP client */
352*1ae08745Sheppo int
353*1ae08745Sheppo vntsd_read_line(vntsd_client_t *clientp, char *buf, int *in_sz)
354*1ae08745Sheppo {
355*1ae08745Sheppo 	char	c;
356*1ae08745Sheppo 	int	rv;
357*1ae08745Sheppo 	int	out_sz = 0;
358*1ae08745Sheppo 
359*1ae08745Sheppo 
360*1ae08745Sheppo 	for (; ; ) {
361*1ae08745Sheppo 
362*1ae08745Sheppo 		if ((rv =  vntsd_read_data(clientp, &c)) !=  VNTSD_SUCCESS) {
363*1ae08745Sheppo 		    return (rv);
364*1ae08745Sheppo 		}
365*1ae08745Sheppo 
366*1ae08745Sheppo 		if (c == BS) {
367*1ae08745Sheppo 			/* back */
368*1ae08745Sheppo 			if ((rv = vntsd_write_client(clientp, &c, 1)) !=
369*1ae08745Sheppo 			    VNTSD_SUCCESS) {
370*1ae08745Sheppo 				return (rv);
371*1ae08745Sheppo 			}
372*1ae08745Sheppo 
373*1ae08745Sheppo 			c = ' ';
374*1ae08745Sheppo 			if ((rv = vntsd_write_client(clientp, &c, 1)) !=
375*1ae08745Sheppo 			    VNTSD_SUCCESS) {
376*1ae08745Sheppo 				return (rv);
377*1ae08745Sheppo 			}
378*1ae08745Sheppo 
379*1ae08745Sheppo 			buf--;
380*1ae08745Sheppo 			out_sz--;
381*1ae08745Sheppo 			continue;
382*1ae08745Sheppo 		}
383*1ae08745Sheppo 		/* echo */
384*1ae08745Sheppo 		if ((rv = vntsd_write_client(clientp, &c, 1)) !=
385*1ae08745Sheppo 		    VNTSD_SUCCESS) {
386*1ae08745Sheppo 			return (rv);
387*1ae08745Sheppo 		}
388*1ae08745Sheppo 
389*1ae08745Sheppo 		*buf++ = c;
390*1ae08745Sheppo 		out_sz++;
391*1ae08745Sheppo 
392*1ae08745Sheppo 		if (c == CR) {
393*1ae08745Sheppo 			/* end of line */
394*1ae08745Sheppo 			*in_sz = out_sz;
395*1ae08745Sheppo 			return (VNTSD_SUCCESS);
396*1ae08745Sheppo 		}
397*1ae08745Sheppo 
398*1ae08745Sheppo 		if (out_sz == *in_sz) {
399*1ae08745Sheppo 			return (VNTSD_SUCCESS);
400*1ae08745Sheppo 		}
401*1ae08745Sheppo 	}
402*1ae08745Sheppo 
403*1ae08745Sheppo 	/*NOTREACHED*/
404*1ae08745Sheppo 	return (0);
405*1ae08745Sheppo }
406*1ae08745Sheppo 
407*1ae08745Sheppo /* free a client */
408*1ae08745Sheppo void
409*1ae08745Sheppo vntsd_free_client(vntsd_client_t *clientp)
410*1ae08745Sheppo {
411*1ae08745Sheppo 
412*1ae08745Sheppo 	if (clientp->sockfd != -1) {
413*1ae08745Sheppo 		(void) close(clientp->sockfd);
414*1ae08745Sheppo 	}
415*1ae08745Sheppo 
416*1ae08745Sheppo 	(void) mutex_destroy(&clientp->lock);
417*1ae08745Sheppo 
418*1ae08745Sheppo 	free(clientp);
419*1ae08745Sheppo }
420*1ae08745Sheppo 
421*1ae08745Sheppo 
422*1ae08745Sheppo /* check if a vcc console port still ok */
423*1ae08745Sheppo boolean_t
424*1ae08745Sheppo vntsd_vcc_cons_alive(vntsd_cons_t *consp)
425*1ae08745Sheppo {
426*1ae08745Sheppo 	vcc_console_t	vcc_cons;
427*1ae08745Sheppo 	int		rv;
428*1ae08745Sheppo 
429*1ae08745Sheppo 	assert(consp);
430*1ae08745Sheppo 	assert(consp->group);
431*1ae08745Sheppo 
432*1ae08745Sheppo 	/* construct current configuration */
433*1ae08745Sheppo 	(void) strncpy(vcc_cons.domain_name, consp->domain_name, MAXPATHLEN);
434*1ae08745Sheppo 	(void) strncpy(vcc_cons.group_name, consp->group->group_name,
435*1ae08745Sheppo 	    MAXPATHLEN);
436*1ae08745Sheppo 	vcc_cons.tcp_port = consp->group->tcp_port;
437*1ae08745Sheppo 	vcc_cons.cons_no   = consp->cons_no;
438*1ae08745Sheppo 
439*1ae08745Sheppo 	/* call vcc to verify */
440*1ae08745Sheppo 	rv = vntsd_vcc_ioctl(VCC_CONS_STATUS, consp->cons_no, &vcc_cons);
441*1ae08745Sheppo 	if (rv != VNTSD_SUCCESS) {
442*1ae08745Sheppo 		return (B_FALSE);
443*1ae08745Sheppo 	}
444*1ae08745Sheppo 
445*1ae08745Sheppo 	if (vcc_cons.cons_no == -1) {
446*1ae08745Sheppo 		/* port is gone */
447*1ae08745Sheppo 		return (B_FALSE);
448*1ae08745Sheppo 	}
449*1ae08745Sheppo 
450*1ae08745Sheppo 	/* port is ok */
451*1ae08745Sheppo 	return (B_TRUE);
452*1ae08745Sheppo 
453*1ae08745Sheppo }
454*1ae08745Sheppo 
455*1ae08745Sheppo /* add to total if a console is alive  */
456*1ae08745Sheppo static boolean_t
457*1ae08745Sheppo total_cons(vntsd_cons_t *consp, int *num_cons)
458*1ae08745Sheppo {
459*1ae08745Sheppo 	int rv;
460*1ae08745Sheppo 
461*1ae08745Sheppo 	assert(consp->group);
462*1ae08745Sheppo 	rv = vntsd_vcc_err(consp);
463*1ae08745Sheppo 	if (rv == VNTSD_STATUS_CONTINUE) {
464*1ae08745Sheppo 		(*num_cons)++;
465*1ae08745Sheppo 	}
466*1ae08745Sheppo 	return (B_FALSE);
467*1ae08745Sheppo }
468*1ae08745Sheppo 
469*1ae08745Sheppo 
470*1ae08745Sheppo /* total alive consoles in a group  */
471*1ae08745Sheppo int
472*1ae08745Sheppo vntsd_chk_group_total_cons(vntsd_group_t *groupp)
473*1ae08745Sheppo {
474*1ae08745Sheppo 	uint_t num_cons = 0;
475*1ae08745Sheppo 
476*1ae08745Sheppo 	(void) vntsd_que_find(groupp->conspq, (compare_func_t)total_cons,
477*1ae08745Sheppo 	    &num_cons);
478*1ae08745Sheppo 	return (num_cons);
479*1ae08745Sheppo }
480*1ae08745Sheppo 
481*1ae08745Sheppo /* vntsd_log() log function for errors */
482*1ae08745Sheppo void
483*1ae08745Sheppo vntsd_log(vntsd_status_t status, char *msg)
484*1ae08745Sheppo {
485*1ae08745Sheppo 	char	*status_msg = NULL;
486*1ae08745Sheppo 	int	critical = 0;
487*1ae08745Sheppo 
488*1ae08745Sheppo 	switch (status) {
489*1ae08745Sheppo 
490*1ae08745Sheppo 	case VNTSD_SUCCESS:
491*1ae08745Sheppo 		status_msg = "STATUS_OK";
492*1ae08745Sheppo 		break;
493*1ae08745Sheppo 
494*1ae08745Sheppo 	case VNTSD_STATUS_CONTINUE:
495*1ae08745Sheppo 		status_msg = "CONTINUE";
496*1ae08745Sheppo 		break;
497*1ae08745Sheppo 
498*1ae08745Sheppo 	case VNTSD_STATUS_EXIT_SIG:
499*1ae08745Sheppo 		critical = 1;
500*1ae08745Sheppo 		status_msg = "KILL SIGNAL RECV";
501*1ae08745Sheppo 		break;
502*1ae08745Sheppo 
503*1ae08745Sheppo 	case VNTSD_STATUS_SIG:
504*1ae08745Sheppo 		status_msg = "SIG RECV";
505*1ae08745Sheppo 		break;
506*1ae08745Sheppo 
507*1ae08745Sheppo 	case VNTSD_STATUS_NO_HOST_NAME:
508*1ae08745Sheppo 		status_msg = "Warining NO HOST NAME";
509*1ae08745Sheppo 		break;
510*1ae08745Sheppo 
511*1ae08745Sheppo 	case VNTSD_STATUS_CLIENT_QUIT:
512*1ae08745Sheppo 		status_msg = "CLIENT CLOSED  GROUP CONNECTION";
513*1ae08745Sheppo 		break;
514*1ae08745Sheppo 
515*1ae08745Sheppo 	case VNTSD_STATUS_RESELECT_CONS:
516*1ae08745Sheppo 		status_msg = "CLIENT RESELECTS CONSOLE";
517*1ae08745Sheppo 		break;
518*1ae08745Sheppo 
519*1ae08745Sheppo 	case VNTSD_STATUS_VCC_IO_ERR:
520*1ae08745Sheppo 		status_msg = "CONSOLE WAS DELETED";
521*1ae08745Sheppo 		break;
522*1ae08745Sheppo 
523*1ae08745Sheppo 	case VNTSD_STATUS_MOV_CONS_FORWARD:
524*1ae08745Sheppo 		status_msg = "MOVE CONSOLE FORWARD";
525*1ae08745Sheppo 		break;
526*1ae08745Sheppo 
527*1ae08745Sheppo 	case VNTSD_STATUS_MOV_CONS_BACKWARD:
528*1ae08745Sheppo 		status_msg = "MOVE CONSOLE BACKWARD";
529*1ae08745Sheppo 		break;
530*1ae08745Sheppo 
531*1ae08745Sheppo 	case VNTSD_STATUS_ACQUIRE_WRITER:
532*1ae08745Sheppo 		status_msg = "FORCE CONSOLE WRITE";
533*1ae08745Sheppo 		break;
534*1ae08745Sheppo 
535*1ae08745Sheppo 	case VNTSD_STATUS_INTR:
536*1ae08745Sheppo 		status_msg = "RECV SIGNAL";
537*1ae08745Sheppo 		break;
538*1ae08745Sheppo 
539*1ae08745Sheppo 	case VNTSD_STATUS_DISCONN_CONS:
540*1ae08745Sheppo 		status_msg = "DELETING CONSOLE";
541*1ae08745Sheppo 		break;
542*1ae08745Sheppo 
543*1ae08745Sheppo 	case VNTSD_STATUS_NO_CONS:
544*1ae08745Sheppo 		status_msg = "GROUP HAS NO CONSOLE";
545*1ae08745Sheppo 		break;
546*1ae08745Sheppo 
547*1ae08745Sheppo 	case VNTSD_ERR_NO_MEM:
548*1ae08745Sheppo 		critical = 1;
549*1ae08745Sheppo 		status_msg = "NO MEMORY";
550*1ae08745Sheppo 		break;
551*1ae08745Sheppo 
552*1ae08745Sheppo 	case VNTSD_ERR_NO_DRV:
553*1ae08745Sheppo 		critical = 1;
554*1ae08745Sheppo 		status_msg = "NO VCC DRIVER";
555*1ae08745Sheppo 		break;
556*1ae08745Sheppo 
557*1ae08745Sheppo 	case VNTSD_ERR_WRITE_CLIENT:
558*1ae08745Sheppo 		status_msg  =  "WRITE CLIENT ERR";
559*1ae08745Sheppo 		break;
560*1ae08745Sheppo 
561*1ae08745Sheppo 	case VNTSD_ERR_EL_NOT_FOUND:
562*1ae08745Sheppo 		critical = 1;
563*1ae08745Sheppo 		status_msg = "ELEMENT_NOT_FOUND";
564*1ae08745Sheppo 		break;
565*1ae08745Sheppo 
566*1ae08745Sheppo 	case VNTSD_ERR_VCC_CTRL_DATA:
567*1ae08745Sheppo 		critical = 1;
568*1ae08745Sheppo 		status_msg = "VCC CTRL DATA  ERROR";
569*1ae08745Sheppo 		break;
570*1ae08745Sheppo 
571*1ae08745Sheppo 	case VNTSD_ERR_VCC_POLL:
572*1ae08745Sheppo 		critical = 1;
573*1ae08745Sheppo 		status_msg = "VCC POLL ERROR";
574*1ae08745Sheppo 		break;
575*1ae08745Sheppo 
576*1ae08745Sheppo 	case VNTSD_ERR_VCC_IOCTL:
577*1ae08745Sheppo 		critical = 1;
578*1ae08745Sheppo 		status_msg = "VCC IOCTL ERROR";
579*1ae08745Sheppo 		break;
580*1ae08745Sheppo 
581*1ae08745Sheppo 	case VNTSD_ERR_VCC_GRP_NAME:
582*1ae08745Sheppo 		critical = 1;
583*1ae08745Sheppo 		status_msg = "VCC GROUP NAME ERROR";
584*1ae08745Sheppo 		break;
585*1ae08745Sheppo 
586*1ae08745Sheppo 	case VNTSD_ERR_CREATE_LISTEN_THR:
587*1ae08745Sheppo 		critical = 1;
588*1ae08745Sheppo 		status_msg = "FAIL TO CREATE LISTEN THREAD";
589*1ae08745Sheppo 		break;
590*1ae08745Sheppo 
591*1ae08745Sheppo 	case VNTSD_ERR_CREATE_WR_THR:
592*1ae08745Sheppo 		critical = 1;
593*1ae08745Sheppo 		status_msg = "FAIL TO CREATE WRITE THREAD";
594*1ae08745Sheppo 		break;
595*1ae08745Sheppo 
596*1ae08745Sheppo 	case VNTSD_ERR_ADD_CONS_FAILED:
597*1ae08745Sheppo 		critical = 1;
598*1ae08745Sheppo 		status_msg = "FAIL TO ADD A CONSOLE";
599*1ae08745Sheppo 		break;
600*1ae08745Sheppo 
601*1ae08745Sheppo 	case VNTSD_ERR_LISTEN_SOCKET:
602*1ae08745Sheppo 		critical = 1;
603*1ae08745Sheppo 		status_msg = "LISTEN SOCKET ERROR";
604*1ae08745Sheppo 		break;
605*1ae08745Sheppo 
606*1ae08745Sheppo 	case VNTSD_ERR_LISTEN_OPTS:
607*1ae08745Sheppo 		critical = 1;
608*1ae08745Sheppo 		status_msg = "SET SOCKET OPTIONS ERROR";
609*1ae08745Sheppo 		break;
610*1ae08745Sheppo 
611*1ae08745Sheppo 	case VNTSD_ERR_LISTEN_BIND:
612*1ae08745Sheppo 		critical = 1;
613*1ae08745Sheppo 		status_msg = "BIND SOCKET ERROR";
614*1ae08745Sheppo 		break;
615*1ae08745Sheppo 
616*1ae08745Sheppo 	case VNTSD_STATUS_ACCEPT_ERR:
617*1ae08745Sheppo 		critical = 1;
618*1ae08745Sheppo 		status_msg = "LISTEN ACCEPT ERROR";
619*1ae08745Sheppo 		break;
620*1ae08745Sheppo 
621*1ae08745Sheppo 	case VNTSD_ERR_CREATE_CONS_THR:
622*1ae08745Sheppo 		critical = 1;
623*1ae08745Sheppo 		status_msg = "CREATE CONSOLE THREAD ERROR ";
624*1ae08745Sheppo 		break;
625*1ae08745Sheppo 
626*1ae08745Sheppo 	case VNTSD_ERR_SIG:
627*1ae08745Sheppo 		critical = 1;
628*1ae08745Sheppo 		status_msg = "RECV UNKNOWN SIG";
629*1ae08745Sheppo 		break;
630*1ae08745Sheppo 
631*1ae08745Sheppo 	case VNTSD_ERR_UNKNOWN_CMD:
632*1ae08745Sheppo 		critical = 1;
633*1ae08745Sheppo 		status_msg = "RECV UNKNOWN COMMAND";
634*1ae08745Sheppo 		break;
635*1ae08745Sheppo 
636*1ae08745Sheppo 	case VNTSD_ERR_CLIENT_TIMEOUT:
637*1ae08745Sheppo 		status_msg  =  "CLOSE CLIENT BECAUSE TIMEOUT";
638*1ae08745Sheppo 		break;
639*1ae08745Sheppo 	default:
640*1ae08745Sheppo 		status_msg = "Unknown status recv";
641*1ae08745Sheppo 		break;
642*1ae08745Sheppo 	}
643*1ae08745Sheppo 
644*1ae08745Sheppo 
645*1ae08745Sheppo 	if (critical) {
646*1ae08745Sheppo 		syslog(LOG_ERR, "%s: thread[%d] %s\n", status_msg,
647*1ae08745Sheppo 		    thr_self(), msg);
648*1ae08745Sheppo 	}
649*1ae08745Sheppo #ifdef DEBUG
650*1ae08745Sheppo 	DERR(stderr, "%s: thread[%d] %s\n", status_msg,
651*1ae08745Sheppo 		    thr_self(), msg);
652*1ae08745Sheppo 	syslog(LOG_ERR, "%s: thread[%d] %s\n", status_msg, thr_self(), msg);
653*1ae08745Sheppo #endif
654*1ae08745Sheppo }
655