1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo/*
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * CDDL HEADER START
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo *
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * The contents of this file are subject to the terms of the
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * Common Development and Distribution License (the "License").
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * You may not use this file except in compliance with the License.
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo *
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * or http://www.opensolaris.org/os/licensing.
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * See the License for the specific language governing permissions
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * and limitations under the License.
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo *
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * When distributing Covered Code, include this CDDL HEADER in each
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * If applicable, add the following below this CDDL HEADER, with the
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * fields enclosed by brackets "[]" replaced with your own identifying
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * information: Portions Copyright [yyyy] [name of copyright owner]
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo *
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * CDDL HEADER END
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo/*
3c96341aef2b4da56c902941f089284b52bd573fnarayan * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * Use is subject to license terms.
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#pragma ident "%Z%%M% %I% %E% SMI"
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo/*
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * Configuration and setup interface to vcc driver.
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * At intialization time, vntsd opens vcc ctrl port and read initial
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * configuratioa. It manages console groups, creates the listen thread,
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * dynamically adds and removes virtual console within a group.
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#include <syslog.h>
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#include <stdio.h>
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#include <sys/types.h>
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#include <sys/ipc.h>
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#include <stdlib.h>
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#include <string.h>
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#include <unistd.h>
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#include <sys/socket.h>
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#include <sys/ipc.h>
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#include <sys/shm.h>
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#include <sys/sem.h>
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#include <wait.h>
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#include <time.h>
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#include <synch.h>
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#include <netinet/in.h>
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#include <thread.h>
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#include <signal.h>
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#include "vntsd.h"
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo/* signal all clients that console has been deleted */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppoboolean_t
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppovntsd_notify_client_cons_del(vntsd_client_t *clientp)
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo{
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo (void) mutex_lock(&clientp->lock);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo clientp->status |= VNTSD_CLIENT_CONS_DELETED;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo (void) thr_kill(clientp->cons_tid, SIGUSR1);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo (void) mutex_unlock(&clientp->lock);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo return (B_FALSE);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo}
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo/* free console structure */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppostatic void
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppofree_cons(vntsd_cons_t *consp)
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo{
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo assert(consp);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo (void) mutex_destroy(&consp->lock);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo (void) cond_destroy(&consp->cvp);
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg if (consp->vcc_fd != -1)
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg (void) close(consp->vcc_fd);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo free(consp);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo}
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg/* free group structure */
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sgstatic void
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sgfree_group(vntsd_group_t *groupp)
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg{
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg assert(groupp);
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg (void) mutex_destroy(&groupp->lock);
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg (void) cond_destroy(&groupp->cvp);
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg if (groupp->sockfd != -1)
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg (void) close(groupp->sockfd);
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg free(groupp);
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg}
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo/*
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * all clients connected to a console must disconnect before
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * removing a console.
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppostatic void
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppocleanup_cons(vntsd_cons_t *consp)
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo{
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo vntsd_group_t *groupp;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo timestruc_t to;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo assert(consp);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo D1(stderr, "t@%d vntsd_disconn_clients@%d\n", thr_self(),
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo consp->cons_no);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo groupp = consp->group;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo assert(groupp);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo (void) mutex_lock(&consp->lock);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo /* wait for all clients disconnect from the console */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo while (consp->clientpq != NULL) {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo consp->status |= VNTSD_CONS_SIG_WAIT;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo /* signal client to disconnect the console */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo (void) vntsd_que_walk(consp->clientpq,
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo (el_func_t)vntsd_notify_client_cons_del);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo (void) thr_kill(consp->wr_tid, SIGUSR1);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo to.tv_sec = VNTSD_CV_WAIT_DELTIME;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo to.tv_nsec = 0;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo /* wait for clients to disconnect */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo (void) cond_reltimedwait(&consp->cvp, &consp->lock, &to);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo }
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
3af08d828975d7e2581b6829e0eecff14d87a483lm /* reduce console count in the group */
3af08d828975d7e2581b6829e0eecff14d87a483lm (void) mutex_lock(&groupp->lock);
3af08d828975d7e2581b6829e0eecff14d87a483lm assert(groupp->num_cons > 0);
3af08d828975d7e2581b6829e0eecff14d87a483lm groupp->num_cons--;
3af08d828975d7e2581b6829e0eecff14d87a483lm (void) mutex_unlock(&groupp->lock);
3af08d828975d7e2581b6829e0eecff14d87a483lm
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo (void) mutex_unlock(&consp->lock);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo free_cons(consp);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo}
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo/* search for a group whose console is being deleted */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppostatic boolean_t
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppofind_clean_cons_group(vntsd_group_t *groupp)
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo{
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo if (groupp->status & VNTSD_GROUP_CLEAN_CONS) {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo return (B_TRUE);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo } else {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo return (B_FALSE);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo }
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo}
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo/* search for a console that is being deleted */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppostatic boolean_t
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppofind_clean_cons(vntsd_cons_t *consp)
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo{
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo if (consp->status & VNTSD_CONS_DELETED) {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo return (B_TRUE);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo } else {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo return (B_FALSE);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo }
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo}
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo/* delete a console */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppovoid
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppovntsd_delete_cons(vntsd_t *vntsdp)
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo{
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo vntsd_group_t *groupp;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo vntsd_cons_t *consp;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo for (; ; ) {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo /* get the group contains deleted console */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo (void) mutex_lock(&vntsdp->lock);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo groupp = vntsd_que_walk(vntsdp->grouppq,
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo (el_func_t)find_clean_cons_group);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo if (groupp == NULL) {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo /* no more group has console deleted */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo (void) mutex_unlock(&vntsdp->lock);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo return;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo }
7636cb21f250f0485ca6052ffadc80ace93e6358lm (void) mutex_lock(&groupp->lock);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo groupp->status &= ~VNTSD_GROUP_CLEAN_CONS;
7636cb21f250f0485ca6052ffadc80ace93e6358lm (void) mutex_unlock(&groupp->lock);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo (void) mutex_unlock(&vntsdp->lock);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo for (; ; ) {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo /* get the console to be deleted */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo (void) mutex_lock(&groupp->lock);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg /* clean up any deleted console in the group */
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg if (groupp->conspq != NULL) {
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg consp = vntsd_que_walk(groupp->conspq,
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg (el_func_t)find_clean_cons);
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg if (consp == NULL) {
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg /* no more cons to delete */
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg (void) mutex_unlock(&groupp->lock);
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg break;
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg }
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg /* remove console from the group */
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg (void) vntsd_que_rm(&groupp->conspq, consp);
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg (void) mutex_unlock(&groupp->lock);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg /* clean up the console */
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg cleanup_cons(consp);
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg }
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo /* delete group? */
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg if (groupp->conspq == NULL) {
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg /* no more console in the group delete group */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo assert(groupp->vntsd);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo (void) mutex_lock(&groupp->vntsd->lock);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo (void) vntsd_que_rm(&groupp->vntsd->grouppq,
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo groupp);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo (void) mutex_unlock(&groupp->vntsd->lock);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo /* clean up the group */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo vntsd_clean_group(groupp);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo break;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo }
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo }
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo }
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo}
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo/* clean up a group */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppovoid
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppovntsd_clean_group(vntsd_group_t *groupp)
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo{
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo timestruc_t to;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo D1(stderr, "t@%d clean_group() group=%s tcp=%lld\n", thr_self(),
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo groupp->group_name, groupp->tcp_port);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo (void) mutex_lock(&groupp->lock);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo /* prevent from reentry */
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg if (groupp->status & VNTSD_GROUP_IN_CLEANUP) {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo (void) mutex_unlock(&groupp->lock);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo return;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo }
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg groupp->status |= VNTSD_GROUP_IN_CLEANUP;
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg /* mark group waiting for listen thread to exits */
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg groupp->status |= VNTSD_GROUP_SIG_WAIT;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo (void) mutex_unlock(&groupp->lock);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
3af08d828975d7e2581b6829e0eecff14d87a483lm vntsd_free_que(&groupp->conspq, (clean_func_t)cleanup_cons);
3af08d828975d7e2581b6829e0eecff14d87a483lm
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg (void) mutex_lock(&groupp->lock);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo /* walk through no cons client queue */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo while (groupp->no_cons_clientpq != NULL) {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo (void) vntsd_que_walk(groupp->no_cons_clientpq,
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo (el_func_t)vntsd_notify_client_cons_del);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo to.tv_sec = VNTSD_CV_WAIT_DELTIME;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo to.tv_nsec = 0;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo (void) cond_reltimedwait(&groupp->cvp, &groupp->lock, &to);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo }
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg /* waiting for listen thread to exit */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo while (groupp->status & VNTSD_GROUP_SIG_WAIT) {
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg /* signal listen thread to exit */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo (void) thr_kill(groupp->listen_tid, SIGUSR1);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo to.tv_sec = VNTSD_CV_WAIT_DELTIME;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo to.tv_nsec = 0;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo /* wait listen thread to exit */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo (void) cond_reltimedwait(&groupp->cvp, &groupp->lock, &to);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo }
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo (void) mutex_unlock(&groupp->lock);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo (void) thr_join(groupp->listen_tid, NULL, NULL);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo /* free group */
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg free_group(groupp);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo}
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo/* allocate and initialize console structure */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppostatic vntsd_cons_t *
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppoalloc_cons(vntsd_group_t *groupp, vcc_console_t *consolep)
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo{
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo vntsd_cons_t *consp;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo int rv;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo /* allocate console */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo consp = (vntsd_cons_t *)malloc(sizeof (vntsd_cons_t));
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo if (consp == NULL) {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo vntsd_log(VNTSD_ERR_NO_MEM, "alloc_cons");
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo return (NULL);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo }
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo /* intialize console */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo bzero(consp, sizeof (vntsd_cons_t));
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo (void) mutex_init(&consp->lock, USYNC_THREAD|LOCK_ERRORCHECK, NULL);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo (void) cond_init(&consp->cvp, USYNC_THREAD, NULL);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo consp->cons_no = consolep->cons_no;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo (void) strlcpy(consp->domain_name, consolep->domain_name, MAXPATHLEN);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo (void) strlcpy(consp->dev_name, consolep->dev_name, MAXPATHLEN);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo consp->wr_tid = (thread_t)-1;
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg consp->vcc_fd = -1;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo /* join the group */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo (void) mutex_lock(&groupp->lock);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo if ((rv = vntsd_que_append(&groupp->conspq, consp)) !=
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo VNTSD_SUCCESS) {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo (void) mutex_unlock(&groupp->lock);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo vntsd_log(rv, "alloc_cons");
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo free_cons(consp);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo return (NULL);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo }
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo groupp->num_cons++;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo consp->group = groupp;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo (void) mutex_unlock(&groupp->lock);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo D1(stderr, "t@%d alloc_cons@%d %s %s\n", thr_self(),
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo consp->cons_no, consp->domain_name, consp->dev_name);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo return (consp);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo}
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo/* compare tcp with group->tcp */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppostatic boolean_t
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppogrp_by_tcp(vntsd_group_t *groupp, uint64_t *tcp_port)
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo{
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo assert(groupp);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo assert(tcp_port);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo return (groupp->tcp_port == *tcp_port);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo}
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo/* allocate and initialize group */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppostatic vntsd_group_t *
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppoalloc_group(vntsd_t *vntsdp, char *group_name, uint64_t tcp_port)
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo{
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo vntsd_group_t *groupp;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo /* allocate group */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo groupp = (vntsd_group_t *)malloc(sizeof (vntsd_group_t));
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo if (groupp == NULL) {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo vntsd_log(VNTSD_ERR_NO_MEM, "alloc_group");
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo return (NULL);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo }
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo /* initialize group */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo bzero(groupp, sizeof (vntsd_group_t));
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo (void) mutex_init(&groupp->lock, USYNC_THREAD|LOCK_ERRORCHECK, NULL);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo (void) cond_init(&groupp->cvp, USYNC_THREAD, NULL);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo if (group_name != NULL) {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo (void) memcpy(groupp->group_name, group_name, MAXPATHLEN);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo }
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo groupp->tcp_port = tcp_port;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo groupp->listen_tid = (thread_t)-1;
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg groupp->sockfd = -1;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo groupp->vntsd = vntsdp;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo D1(stderr, "t@%d alloc_group@%lld:%s\n", thr_self(), groupp->tcp_port,
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo groupp->group_name);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo return (groupp);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo}
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg/* mark a deleted console */
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sgboolean_t
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sgvntsd_mark_deleted_cons(vntsd_cons_t *consp)
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg{
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg (void) mutex_lock(&consp->lock);
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg consp->status |= VNTSD_CONS_DELETED;
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg (void) mutex_unlock(&consp->lock);
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg return (B_FALSE);
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg}
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo/*
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * Initialize a console, if console is associated with with a
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * new group, intialize the group.
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppostatic int
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppoalloc_cons_with_group(vntsd_t *vntsdp, vcc_console_t *consp,
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo vntsd_group_t **new_groupp)
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo{
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo vntsd_group_t *groupp = NULL;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo int rv;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo *new_groupp = NULL;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo /* match group by tcp port */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo (void) mutex_lock(&vntsdp->lock);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo groupp = vntsd_que_find(vntsdp->grouppq,
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo (compare_func_t)grp_by_tcp, (void *)&(consp->tcp_port));
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg if (groupp != NULL)
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg (void) mutex_lock(&groupp->lock);
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo (void) mutex_unlock(&vntsdp->lock);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo if (groupp != NULL) {
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg /*
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg * group with same tcp port found.
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg * if there is no console in the group, the
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg * group should be removed and the tcp port can
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg * be used for tne new group.
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg * This is possible, when there is tight loop of
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg * creating/deleting domains. When a vcc port is
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg * removed, a read thread will have an I/O error because
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg * vcc has closed the port. The read thread then marks
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg * the console is removed and notify main thread to
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg * remove the console.
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg * Meanwhile, the same port and its group (with same
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg * tcp port and group name) is created. Vcc notify
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg * vntsd that new console is added.
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg * Main thread now have two events. If main thread polls
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg * out vcc notification first, it will find that there is
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg * a group has no console.
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg */
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg if (vntsd_chk_group_total_cons(groupp) == 0) {
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg /* all consoles in the group have been removed */
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg (void) vntsd_que_walk(groupp->conspq,
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg (el_func_t)vntsd_mark_deleted_cons);
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg groupp->status |= VNTSD_GROUP_CLEAN_CONS;
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg (void) mutex_unlock(&groupp->lock);
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg groupp = NULL;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg } else if (strcmp(groupp->group_name, consp->group_name)) {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo /* conflict group name */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo vntsd_log(VNTSD_ERR_VCC_GRP_NAME,
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo "group name is different from existing group");
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg (void) mutex_unlock(&groupp->lock);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo return (VNTSD_ERR_VCC_CTRL_DATA);
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg } else {
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg /* group already existed */
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg (void) mutex_unlock(&groupp->lock);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo }
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg }
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg if (groupp == NULL) {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo /* new group */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo groupp = alloc_group(vntsdp, consp->group_name,
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo consp->tcp_port);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo if (groupp == NULL) {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo return (VNTSD_ERR_NO_MEM);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo }
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo assert(groupp->conspq == NULL);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo /* queue group to vntsdp */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo (void) mutex_lock(&vntsdp->lock);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo rv = vntsd_que_append(&vntsdp->grouppq, groupp);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo (void) mutex_unlock(&vntsdp->lock);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo if (rv != VNTSD_SUCCESS) {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo return (rv);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo }
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo *new_groupp = groupp;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo }
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo /* intialize console */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo if (alloc_cons(groupp, consp) == NULL) {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo /* no memory */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo if (new_groupp != NULL) {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo /* clean up new group */
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg free_group(groupp);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo }
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo return (VNTSD_ERR_NO_MEM);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo }
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo return (VNTSD_SUCCESS);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo}
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo/* create listen thread */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppostatic boolean_t
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppocreate_listen_thread(vntsd_group_t *groupp)
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo{
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo char err_msg[VNTSD_LINE_LEN];
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo int rv;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo assert(groupp);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo (void) mutex_lock(&groupp->lock);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo assert(groupp->num_cons);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo D1(stderr, "t@%d create_listen:%lld\n", thr_self(), groupp->tcp_port);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo if ((rv = thr_create(NULL, 0, (thr_func_t)vntsd_listen_thread,
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo (void *)groupp, THR_DETACHED, &groupp->listen_tid))
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo != 0) {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo (void) (void) snprintf(err_msg, sizeof (err_msg),
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo "Can not create listen thread for"
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo "group %s tcp %llx\n", groupp->group_name,
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo groupp->tcp_port);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo vntsd_log(VNTSD_ERR_CREATE_LISTEN_THR, err_msg);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo /* clean up group queue */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo vntsd_free_que(&groupp->conspq, (clean_func_t)free_cons);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo groupp->listen_tid = (thread_t)-1;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo }
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo (void) mutex_unlock(&groupp->lock);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo return (rv != 0);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo}
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg/* find deleted console by console no */
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sgstatic boolean_t
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sgdeleted_cons_by_consno(vntsd_cons_t *consp, int *cons_no)
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg{
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg vntsd_client_t *clientp;
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg assert(consp);
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg if (consp->cons_no != *cons_no)
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg return (B_FALSE);
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg /* has console marked as deleted? */
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg if ((consp->status & VNTSD_CONS_DELETED) == 0)
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg return (B_TRUE);
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg
3c96341aef2b4da56c902941f089284b52bd573fnarayan if (consp->clientpq == NULL)
3c96341aef2b4da56c902941f089284b52bd573fnarayan /* there is no client for this console */
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg return (B_TRUE);
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg
3c96341aef2b4da56c902941f089284b52bd573fnarayan /* need to notify clients of console ? */
3c96341aef2b4da56c902941f089284b52bd573fnarayan clientp = (vntsd_client_t *)consp->clientpq->handle;
3c96341aef2b4da56c902941f089284b52bd573fnarayan
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg if (clientp->status & VNTSD_CLIENT_CONS_DELETED)
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg /* clients of console have notified */
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg return (B_FALSE);
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg return (B_TRUE);
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg}
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg/* find group structure from console no */
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sgstatic boolean_t
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sgfind_cons_group_by_cons_no(vntsd_group_t *groupp, uint_t *cons_no)
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg{
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg vntsd_cons_t *consp;
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg consp = vntsd_que_find(groupp->conspq,
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg (compare_func_t)deleted_cons_by_consno, cons_no);
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg return (consp != NULL);
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg}
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo/* delete a console if the console exists in the vntsd */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppostatic void
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sgdelete_cons_before_add(vntsd_t *vntsdp, uint_t cons_no)
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo{
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo vntsd_group_t *groupp;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo vntsd_cons_t *consp;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo /* group exists? */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo (void) mutex_lock(&vntsdp->lock);
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg groupp = vntsd_que_find(vntsdp->grouppq,
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg (compare_func_t)find_cons_group_by_cons_no,
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg &cons_no);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo (void) mutex_unlock(&vntsdp->lock);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo if (groupp == NULL) {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo /* no such group */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo return;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo }
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo /* group exists, if console exists? */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo (void) mutex_lock(&groupp->lock);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo consp = vntsd_que_find(groupp->conspq,
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg (compare_func_t)deleted_cons_by_consno, &cons_no);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo if (consp == NULL) {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo /* no such console */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo (void) mutex_unlock(&groupp->lock);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo return;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo }
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
3c96341aef2b4da56c902941f089284b52bd573fnarayan /* console exists - mark console for main thread to delete it */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo (void) mutex_lock(&consp->lock);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
3c96341aef2b4da56c902941f089284b52bd573fnarayan if (consp->status & VNTSD_CONS_DELETED) {
3c96341aef2b4da56c902941f089284b52bd573fnarayan /* already marked */
3c96341aef2b4da56c902941f089284b52bd573fnarayan (void) mutex_unlock(&consp->lock);
3c96341aef2b4da56c902941f089284b52bd573fnarayan (void) mutex_unlock(&groupp->lock);
3c96341aef2b4da56c902941f089284b52bd573fnarayan return;
3c96341aef2b4da56c902941f089284b52bd573fnarayan }
3c96341aef2b4da56c902941f089284b52bd573fnarayan
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo consp->status |= VNTSD_CONS_DELETED;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo groupp->status |= VNTSD_GROUP_CLEAN_CONS;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo (void) mutex_unlock(&consp->lock);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo (void) mutex_unlock(&groupp->lock);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo}
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo/* add a console */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppostatic void
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppodo_add_cons(vntsd_t *vntsdp, int cons_no)
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo{
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo vcc_console_t console;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo vntsd_group_t *groupp;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo int rv;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo char err_msg[VNTSD_LINE_LEN];
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo (void) snprintf(err_msg, sizeof (err_msg),
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo "do_add_cons():Can not add console=%d", cons_no);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo /* get console configuration from vcc */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo if ((rv = vntsd_vcc_ioctl(VCC_CONS_INFO, cons_no, (void *)&console))
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo != VNTSD_SUCCESS) {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo vntsd_log(rv, err_msg);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo return;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo }
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo /* clean up the console if console was deleted and added again */
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg delete_cons_before_add(vntsdp, console.cons_no);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo /* initialize console */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo if ((rv = alloc_cons_with_group(vntsdp, &console, &groupp)) !=
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo VNTSD_SUCCESS) {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo /* no memory to add this new console */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo vntsd_log(rv, err_msg);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo return;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo }
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo if (groupp != NULL) {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo /* new group */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo /* create listen thread for this console */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo if (create_listen_thread(groupp)) {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo vntsd_log(VNTSD_ERR_CREATE_LISTEN_THR, err_msg);
4d39be2b45b5ac811d28452e6eb629ac64aebfc4sg free_group(groupp);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo }
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo }
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo}
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo/* daemon wake up */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppovoid
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppovntsd_daemon_wakeup(vntsd_t *vntsdp)
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo{
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo vcc_response_t inq_data;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo /* reason to wake up */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo if (vntsd_vcc_ioctl(VCC_INQUIRY, 0, (void *)&inq_data) !=
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo VNTSD_SUCCESS) {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo vntsd_log(VNTSD_ERR_VCC_IOCTL, "vntsd_daemon_wakeup()");
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo return;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo }
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo D1(stderr, "t@%d vntsd_daemon_wakup:msg %d port %x\n", thr_self(),
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo inq_data.reason, inq_data.cons_no);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo switch (inq_data.reason) {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo case VCC_CONS_ADDED:
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo do_add_cons(vntsdp, inq_data.cons_no);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo break;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
7636cb21f250f0485ca6052ffadc80ace93e6358lm case VCC_CONS_MISS_ADDED:
7636cb21f250f0485ca6052ffadc80ace93e6358lm /* an added port was deleted before vntsd can process it */
7636cb21f250f0485ca6052ffadc80ace93e6358lm return;
7636cb21f250f0485ca6052ffadc80ace93e6358lm
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo default:
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo DERR(stderr, "t@%d daemon_wakeup:ioctl_unknown %d\n",
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo thr_self(), inq_data.reason);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo vntsd_log(VNTSD_ERR_UNKNOWN_CMD, "from vcc\n");
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo break;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo }
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo}
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo/* initial console configuration */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppovoid
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppovntsd_get_config(vntsd_t *vntsdp)
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo{
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo int i;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo int num_cons;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo vcc_console_t *consp;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo vntsd_group_t *groupp;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo /* num of consoles */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo num_cons = 0;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo if (vntsd_vcc_ioctl(VCC_NUM_CONSOLE, 0, (void *)&num_cons) !=
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo VNTSD_SUCCESS) {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo vntsd_log(VNTSD_ERR_VCC_IOCTL, "VCC_NUM_CONSOLE failed\n");
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo return;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo }
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo D3(stderr, "get_config:num_cons=%d", num_cons);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo if (num_cons == 0) {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo return;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo }
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo /* allocate memory for all consoles */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo consp = malloc(num_cons*sizeof (vcc_console_t));
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo if (consp == NULL) {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo vntsd_log(VNTSD_ERR_NO_MEM, "for console table.");
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo return;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo }
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo /* get console table */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo if (vntsd_vcc_ioctl(VCC_CONS_TBL, 0, (void *)consp) != VNTSD_SUCCESS) {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo vntsd_log(VNTSD_ERR_VCC_IOCTL, " VCC_CONS_TBL "
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo "for console table\n");
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo return;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo }
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo /* intialize groups and consoles */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo for (i = 0; i < num_cons; i++) {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo if (alloc_cons_with_group(vntsdp, &consp[i], &groupp)
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo != VNTSD_SUCCESS) {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo vntsd_log(VNTSD_ERR_ADD_CONS_FAILED, "get_config");
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo }
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo }
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo /* create listen thread for each group */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo (void) mutex_lock(&vntsdp->lock);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo for (; ; ) {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo groupp = vntsd_que_walk(vntsdp->grouppq,
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo (el_func_t)create_listen_thread);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo if (groupp == NULL) {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo break;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo }
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo vntsd_log(VNTSD_ERR_CREATE_LISTEN_THR, "get config()");
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo }
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo (void) mutex_unlock(&vntsdp->lock);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo}