4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai/*
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * CDDL HEADER START
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai *
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * The contents of this file are subject to the terms of the
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * Common Development and Distribution License (the "License").
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * You may not use this file except in compliance with the License.
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai *
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * or http://www.opensolaris.org/os/licensing.
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * See the License for the specific language governing permissions
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * and limitations under the License.
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai *
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * When distributing Covered Code, include this CDDL HEADER in each
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * If applicable, add the following below this CDDL HEADER, with the
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * fields enclosed by brackets "[]" replaced with your own identifying
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * information: Portions Copyright [yyyy] [name of copyright owner]
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai *
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * CDDL HEADER END
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai */
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai/*
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * Use is subject to license terms.
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai */
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai/*
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * bridged - bridging control daemon.
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai */
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai#include <assert.h>
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai#include <stdio.h>
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai#include <stdlib.h>
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai#include <unistd.h>
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai#include <pthread.h>
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai#include <string.h>
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai#include <signal.h>
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai#include <sys/stat.h>
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai#include <sys/types.h>
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai#include <sys/wait.h>
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai#include <syslog.h>
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai#include <locale.h>
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai#include <stropts.h>
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai#include "global.h"
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavaiboolean_t debugging;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavaiuint32_t tablemax;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavaiconst char *instance_name = "default";
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavaistruct pollfd *fdarray;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavaidladm_handle_t dlhandle;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavaiboolean_t shutting_down;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavaistatic pthread_t sighand;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai/*
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * engine_lock is held while the main loop is busy calling librstp functions.
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * Door threads take the lock to protect the library from reentrancy.
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai */
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavaistatic pthread_mutex_t engine_lock = PTHREAD_MUTEX_INITIALIZER;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai/*
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * These wrapper functions allow the other components in the daemon to remain
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * ignorant of pthreads details.
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai */
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavaiint
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavailock_engine(void)
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai{
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai return (pthread_mutex_lock(&engine_lock));
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai}
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavaivoid
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavaiunlock_engine(void)
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai{
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai (void) pthread_mutex_unlock(&engine_lock);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai}
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai/*
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * Utility function for STREAMS ioctls.
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai */
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavaissize_t
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavaistrioctl(int fd, int cmd, void *buf, size_t buflen)
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai{
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai int retv;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai struct strioctl ic;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai ic.ic_cmd = cmd;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai ic.ic_timout = 0;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai ic.ic_dp = buf;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai ic.ic_len = buflen;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai if ((retv = ioctl(fd, I_STR, &ic)) != 0)
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai return (retv);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai else
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai return (ic.ic_len);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai}
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavaistatic void
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavaidaemonize(void)
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai{
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai pid_t pid;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai /*
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * A little bit of magic here. By the first fork+setsid, we
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * disconnect from our current controlling terminal and become
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * a session group leader. By forking again without calling
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * setsid again, we make certain that we are not the session
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * group leader and can never reacquire a controlling terminal.
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai */
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai if ((pid = fork()) == (pid_t)-1) {
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai syslog(LOG_ERR, "fork 1 failed");
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai exit(EXIT_FAILURE);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai }
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai if (pid != 0) {
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai (void) wait(NULL);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai _exit(EXIT_SUCCESS);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai }
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai if (setsid() == (pid_t)-1) {
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai syslog(LOG_ERR, "setsid");
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai exit(EXIT_FAILURE);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai }
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai if ((pid = fork()) == (pid_t)-1) {
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai syslog(LOG_ERR, "fork 2 failed");
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai exit(EXIT_FAILURE);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai }
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai if (pid != 0)
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai _exit(EXIT_SUCCESS);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai (void) chdir("/");
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai (void) umask(022);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai}
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavaistatic void *
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavaisighandler(void *arg)
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai{
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai sigset_t sigset;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai int sig;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai int sigfd = (int)(uintptr_t)arg;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai (void) sigfillset(&sigset);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai for (;;) {
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai sig = sigwait(&sigset);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai switch (sig) {
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai case SIGHUP:
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai (void) write(sigfd, "", 1);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai break;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai default:
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai if (debugging)
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai syslog(LOG_NOTICE, "%s signal, shutting down",
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai strsignal(sig));
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai shutting_down = B_TRUE;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai break;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai }
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai /* if we're shutting down, exit this thread */
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai if (shutting_down)
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai return (NULL);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai }
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai}
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavaistatic void
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavaiinit_signalhandling(void)
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai{
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai pthread_attr_t attr;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai int err;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai sigset_t new;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai int fildes[2];
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai if ((fdarray = malloc(FDOFFSET * sizeof (struct pollfd))) == NULL) {
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai syslog(LOG_ERR, "unable to allocate fdarray: %m");
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai exit(EXIT_FAILURE);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai }
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai if (pipe(fildes) != 0) {
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai syslog(LOG_ERR, "unable to create signal pipe: %m");
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai exit(EXIT_FAILURE);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai }
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai fdarray[0].fd = fildes[0];
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai fdarray[0].events = POLLIN;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai assert(control_fd != -1);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai fdarray[1].fd = control_fd;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai fdarray[1].events = POLLIN;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai (void) sigfillset(&new);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai (void) pthread_sigmask(SIG_BLOCK, &new, NULL);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai (void) pthread_attr_init(&attr);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai (void) pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai err = pthread_create(&sighand, &attr, sighandler,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai (void *)(uintptr_t)fildes[1]);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai if (err != 0) {
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai syslog(LOG_ERR, "cannot create signal handling thread: %s",
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai strerror(err));
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai exit(EXIT_FAILURE);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai }
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai (void) pthread_attr_destroy(&attr);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai}
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavaiint
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavaimain(int argc, char **argv)
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai{
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai dladm_status_t status;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai char buf[DLADM_STRSIZE];
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai (void) setlocale(LC_ALL, "");
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai (void) textdomain(TEXT_DOMAIN);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai shutting_down = B_FALSE;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai openlog("bridged", LOG_PID | LOG_NDELAY, LOG_DAEMON);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai if (argc != 2) {
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai syslog(LOG_ERR, "instance name is required");
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai exit(EXIT_FAILURE);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai }
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai instance_name = argv[1];
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai if ((status = dladm_open(&dlhandle)) != DLADM_STATUS_OK) {
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai syslog(LOG_ERR, "%s: unable to open datalink control: %s",
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai instance_name, dladm_status2str(status, buf));
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai exit(EXIT_FAILURE);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai }
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai status = dladm_bridge_get_privprop(instance_name, &debugging,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai &tablemax);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai if (status != DLADM_STATUS_OK) {
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai syslog(LOG_ERR, "%s: unable to read properties: %s",
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai instance_name, dladm_status2str(status, buf));
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai exit(EXIT_FAILURE);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai }
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai /* Get the properties once so that we have the right initial values */
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai rstp_init();
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai open_bridge_control();
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai daemonize();
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai init_signalhandling();
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai init_door();
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai if (debugging)
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai syslog(LOG_INFO, "bridged started: instance %s", instance_name);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai event_loop();
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai (void) pthread_cancel(sighand);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai (void) pthread_join(sighand, NULL);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai return (0);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai}