1fcf3ce44SJohn Forte /* 2fcf3ce44SJohn Forte * CDDL HEADER START 3fcf3ce44SJohn Forte * 4fcf3ce44SJohn Forte * The contents of this file are subject to the terms of the 5fcf3ce44SJohn Forte * Common Development and Distribution License (the "License"). 6fcf3ce44SJohn Forte * You may not use this file except in compliance with the License. 7fcf3ce44SJohn Forte * 8fcf3ce44SJohn Forte * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9fcf3ce44SJohn Forte * or http://www.opensolaris.org/os/licensing. 10fcf3ce44SJohn Forte * See the License for the specific language governing permissions 11fcf3ce44SJohn Forte * and limitations under the License. 12fcf3ce44SJohn Forte * 13fcf3ce44SJohn Forte * When distributing Covered Code, include this CDDL HEADER in each 14fcf3ce44SJohn Forte * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15fcf3ce44SJohn Forte * If applicable, add the following below this CDDL HEADER, with the 16fcf3ce44SJohn Forte * fields enclosed by brackets "[]" replaced with your own identifying 17fcf3ce44SJohn Forte * information: Portions Copyright [yyyy] [name of copyright owner] 18fcf3ce44SJohn Forte * 19fcf3ce44SJohn Forte * CDDL HEADER END 20fcf3ce44SJohn Forte */ 21fcf3ce44SJohn Forte 22fcf3ce44SJohn Forte /* 23*3f1da666Swl202157@icefox * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 24fcf3ce44SJohn Forte * Use is subject to license terms. 25fcf3ce44SJohn Forte */ 26fcf3ce44SJohn Forte 27fcf3ce44SJohn Forte #include <sys/types.h> 28fcf3ce44SJohn Forte #include <unistd.h> 29fcf3ce44SJohn Forte #include <stdio.h> 30fcf3ce44SJohn Forte #include <stdlib.h> 31fcf3ce44SJohn Forte #include <sys/stat.h> 32fcf3ce44SJohn Forte #include <fcntl.h> 33fcf3ce44SJohn Forte #include <pthread.h> 34fcf3ce44SJohn Forte #include <errno.h> 35fcf3ce44SJohn Forte #include <libscf.h> 36fcf3ce44SJohn Forte #ifdef DEBUG 37fcf3ce44SJohn Forte #include <time.h> 38fcf3ce44SJohn Forte #endif 39fcf3ce44SJohn Forte #include <signal.h> 40fcf3ce44SJohn Forte #include <semaphore.h> 41fcf3ce44SJohn Forte #include <sys/wait.h> 42fcf3ce44SJohn Forte 43fcf3ce44SJohn Forte #include "isns_server.h" 44fcf3ce44SJohn Forte #include "isns_dseng.h" 45fcf3ce44SJohn Forte #include "isns_msgq.h" 46fcf3ce44SJohn Forte #include "isns_log.h" 47fcf3ce44SJohn Forte #include "isns_cfg.h" 48fcf3ce44SJohn Forte #include "isns_utils.h" 49fcf3ce44SJohn Forte #include "isns_cache.h" 50fcf3ce44SJohn Forte #include "isns_obj.h" 51fcf3ce44SJohn Forte #include "isns_dd.h" 52fcf3ce44SJohn Forte #include "isns_scn.h" 53fcf3ce44SJohn Forte #include "isns_sched.h" 54fcf3ce44SJohn Forte #include "isns_esi.h" 55fcf3ce44SJohn Forte #include "isns_mgmt.h" 56fcf3ce44SJohn Forte 57fcf3ce44SJohn Forte /* 58fcf3ce44SJohn Forte * iSNS Server administrative settings. 59fcf3ce44SJohn Forte */ 60fcf3ce44SJohn Forte uint8_t daemonlize = 0; 61fcf3ce44SJohn Forte int dbg_level = 7; 62fcf3ce44SJohn Forte uint64_t esi_threshold; 63fcf3ce44SJohn Forte uint8_t mgmt_scn; 64fcf3ce44SJohn Forte ctrl_node_t *control_nodes = NULL; 65fcf3ce44SJohn Forte pthread_mutex_t ctrl_node_mtx = PTHREAD_MUTEX_INITIALIZER; 66fcf3ce44SJohn Forte char data_store[MAXPATHLEN]; 67fcf3ce44SJohn Forte 68fcf3ce44SJohn Forte 69fcf3ce44SJohn Forte /* semaphore for handling exit */ 70fcf3ce44SJohn Forte static sem_t isns_child_sem; 71fcf3ce44SJohn Forte static int isns_child_smf_exit_code; 72fcf3ce44SJohn Forte static pid_t isns_child_pid; 73fcf3ce44SJohn Forte 74fcf3ce44SJohn Forte #if !defined(SMF_EXIT_ERR_OTHER) 75fcf3ce44SJohn Forte #define SMF_EXIT_ERR_OTHER -1 76fcf3ce44SJohn Forte #endif 77fcf3ce44SJohn Forte 78fcf3ce44SJohn Forte /* 79fcf3ce44SJohn Forte * Globals for singal handling. time_to_exit is set by sig_handle() 80fcf3ce44SJohn Forte * when set the main thread(daemon) and othere threads should exit. 81fcf3ce44SJohn Forte * 82fcf3ce44SJohn Forte * semaphone is used to make sure all threads that are created 83fcf3ce44SJohn Forte * by isns_port_watcher and esi. 84fcf3ce44SJohn Forte */ 85fcf3ce44SJohn Forte boolean_t time_to_exit = B_FALSE; 86fcf3ce44SJohn Forte static uint32_t thr_ref_count; 87fcf3ce44SJohn Forte static pthread_mutex_t thr_count_mtx = PTHREAD_MUTEX_INITIALIZER; 88fcf3ce44SJohn Forte #define MAX_RETRY_COUNT 10 /* for checking remaining threads before exit. */ 89fcf3ce44SJohn Forte 90fcf3ce44SJohn Forte /* 91*3f1da666Swl202157@icefox * Door creation flag. 92*3f1da666Swl202157@icefox */ 93*3f1da666Swl202157@icefox boolean_t door_created = B_FALSE; 94*3f1da666Swl202157@icefox 95*3f1da666Swl202157@icefox /* 96fcf3ce44SJohn Forte * global system message queue 97fcf3ce44SJohn Forte */ 98fcf3ce44SJohn Forte msg_queue_t *sys_q = NULL; 99fcf3ce44SJohn Forte msg_queue_t *scn_q = NULL; 100fcf3ce44SJohn Forte 101fcf3ce44SJohn Forte #ifdef DEBUG 102fcf3ce44SJohn Forte extern void *cli_test(void *argv); 103fcf3ce44SJohn Forte extern dump_db(void); 104fcf3ce44SJohn Forte #endif 105fcf3ce44SJohn Forte 106fcf3ce44SJohn Forte extern void sigalrm(int); 107fcf3ce44SJohn Forte 108fcf3ce44SJohn Forte /* 109fcf3ce44SJohn Forte * sigusr2_handler -- SIGUSR2 Handler 110fcf3ce44SJohn Forte * sigusr2 is exepected only when child is running okay. 111fcf3ce44SJohn Forte */ 112fcf3ce44SJohn Forte /* ARGSUSED */ 113fcf3ce44SJohn Forte static void 114fcf3ce44SJohn Forte sigusr2_handler( 115fcf3ce44SJohn Forte int sig 116fcf3ce44SJohn Forte ) 117fcf3ce44SJohn Forte { 118fcf3ce44SJohn Forte /* post okay status. */ 119fcf3ce44SJohn Forte isnslog(LOG_DEBUG, "sigusr2_handler", 120fcf3ce44SJohn Forte "SIGUSR@ is received. Parent is existing..."); 121fcf3ce44SJohn Forte isns_child_smf_exit_code = SMF_EXIT_OK; 122fcf3ce44SJohn Forte 123fcf3ce44SJohn Forte (void) sem_post(&isns_child_sem); 124fcf3ce44SJohn Forte } 125fcf3ce44SJohn Forte 126fcf3ce44SJohn Forte /* 127fcf3ce44SJohn Forte * sigchld_handler -- SIGCHLD Handler 128fcf3ce44SJohn Forte * sigchld is exepected only when there is an error. 129fcf3ce44SJohn Forte */ 130fcf3ce44SJohn Forte /* ARGSUSED */ 131fcf3ce44SJohn Forte static void 132fcf3ce44SJohn Forte sigchld_handler( 133fcf3ce44SJohn Forte int sig 134fcf3ce44SJohn Forte ) 135fcf3ce44SJohn Forte { 136fcf3ce44SJohn Forte int status; 137fcf3ce44SJohn Forte pid_t ret_pid; 138fcf3ce44SJohn Forte 139fcf3ce44SJohn Forte /* This is the default code. */ 140fcf3ce44SJohn Forte isns_child_smf_exit_code = SMF_EXIT_ERR_OTHER; 141fcf3ce44SJohn Forte 142fcf3ce44SJohn Forte ret_pid = waitpid(isns_child_pid, &status, WNOHANG); 143fcf3ce44SJohn Forte 144fcf3ce44SJohn Forte if (ret_pid == isns_child_pid) { 145fcf3ce44SJohn Forte if (WIFEXITED(status)) { 146fcf3ce44SJohn Forte isns_child_smf_exit_code = WEXITSTATUS(status); 147fcf3ce44SJohn Forte } 148fcf3ce44SJohn Forte } 149fcf3ce44SJohn Forte (void) sem_post(&isns_child_sem); 150fcf3ce44SJohn Forte } 151fcf3ce44SJohn Forte 152fcf3ce44SJohn Forte /* ARGSUSED */ 153fcf3ce44SJohn Forte static void 154fcf3ce44SJohn Forte sighup_handler( 155fcf3ce44SJohn Forte int sig 156fcf3ce44SJohn Forte ) 157fcf3ce44SJohn Forte { 158fcf3ce44SJohn Forte 159fcf3ce44SJohn Forte isnslog(LOG_DEBUG, "sighup_handle", 160fcf3ce44SJohn Forte "SIGHUP is received. Reloading config..."); 161fcf3ce44SJohn Forte (void) queue_msg_set(sys_q, CONFIG_RELOAD, NULL); 162fcf3ce44SJohn Forte } 163fcf3ce44SJohn Forte 164fcf3ce44SJohn Forte /* ARGSUSED */ 165fcf3ce44SJohn Forte static void 166fcf3ce44SJohn Forte sigexit_handler( 167fcf3ce44SJohn Forte int sig 168fcf3ce44SJohn Forte ) 169fcf3ce44SJohn Forte { 170fcf3ce44SJohn Forte isnslog(LOG_DEBUG, "sigexit_handler", 171fcf3ce44SJohn Forte "Signal: %d received and sending server exit.", sig); 172fcf3ce44SJohn Forte shutdown_server(); 173fcf3ce44SJohn Forte } 174fcf3ce44SJohn Forte 175fcf3ce44SJohn Forte void 176fcf3ce44SJohn Forte inc_thr_count( 177fcf3ce44SJohn Forte ) 178fcf3ce44SJohn Forte { 179fcf3ce44SJohn Forte (void) pthread_mutex_lock(&thr_count_mtx); 180fcf3ce44SJohn Forte 181fcf3ce44SJohn Forte isnslog(LOG_DEBUG, "inc_thr_count", 182fcf3ce44SJohn Forte "increase thread reference count(%d).", thr_ref_count); 183fcf3ce44SJohn Forte 184fcf3ce44SJohn Forte thr_ref_count++; 185fcf3ce44SJohn Forte 186fcf3ce44SJohn Forte (void) pthread_mutex_unlock(&thr_count_mtx); 187fcf3ce44SJohn Forte } 188fcf3ce44SJohn Forte 189fcf3ce44SJohn Forte void 190fcf3ce44SJohn Forte dec_thr_count( 191fcf3ce44SJohn Forte ) 192fcf3ce44SJohn Forte { 193fcf3ce44SJohn Forte (void) pthread_mutex_lock(&thr_count_mtx); 194fcf3ce44SJohn Forte 195fcf3ce44SJohn Forte isnslog(LOG_DEBUG, "dec_thr_count", 196fcf3ce44SJohn Forte "decrease thread reference count(%d).", thr_ref_count); 197fcf3ce44SJohn Forte 198fcf3ce44SJohn Forte thr_ref_count--; 199fcf3ce44SJohn Forte 200fcf3ce44SJohn Forte (void) pthread_mutex_unlock(&thr_count_mtx); 201fcf3ce44SJohn Forte } 202fcf3ce44SJohn Forte 203fcf3ce44SJohn Forte uint32_t 204fcf3ce44SJohn Forte get_thr_count( 205fcf3ce44SJohn Forte ) 206fcf3ce44SJohn Forte { 207fcf3ce44SJohn Forte uint32_t ref; 208fcf3ce44SJohn Forte 209fcf3ce44SJohn Forte (void) pthread_mutex_lock(&thr_count_mtx); 210fcf3ce44SJohn Forte 211fcf3ce44SJohn Forte ref = thr_ref_count; 212fcf3ce44SJohn Forte 213fcf3ce44SJohn Forte (void) pthread_mutex_unlock(&thr_count_mtx); 214fcf3ce44SJohn Forte 215fcf3ce44SJohn Forte isnslog(LOG_DEBUG, "get_thr_count", 216fcf3ce44SJohn Forte "checking thread reference count %d.", ref); 217fcf3ce44SJohn Forte 218fcf3ce44SJohn Forte return (ref); 219fcf3ce44SJohn Forte } 220fcf3ce44SJohn Forte 221fcf3ce44SJohn Forte void 222fcf3ce44SJohn Forte shutdown_server( 223fcf3ce44SJohn Forte ) 224fcf3ce44SJohn Forte { 225fcf3ce44SJohn Forte isnslog(LOG_DEBUG, "shutdown", "raise exit flag."); 226fcf3ce44SJohn Forte time_to_exit = B_TRUE; 227fcf3ce44SJohn Forte (void) queue_msg_set(sys_q, SERVER_EXIT, NULL); 228fcf3ce44SJohn Forte } 229fcf3ce44SJohn Forte 230fcf3ce44SJohn Forte int 231fcf3ce44SJohn Forte main( 232fcf3ce44SJohn Forte /* LINTED E_FUNC_ARG_UNUSED */ 233fcf3ce44SJohn Forte int argc, 234fcf3ce44SJohn Forte /* LINTED E_FUNC_ARG_UNUSED */ 235fcf3ce44SJohn Forte char *argv[] 236fcf3ce44SJohn Forte ) 237fcf3ce44SJohn Forte { 238fcf3ce44SJohn Forte int opt_i = 0; 239fcf3ce44SJohn Forte pthread_t port_tid, esi_tid, scn_tid; 240fcf3ce44SJohn Forte uint32_t thr_cnt; 241fcf3ce44SJohn Forte int i; 242fcf3ce44SJohn Forte 243fcf3ce44SJohn Forte #ifdef DEBUG 244fcf3ce44SJohn Forte time_t t; 245fcf3ce44SJohn Forte clock_t c; 246fcf3ce44SJohn Forte #endif 247fcf3ce44SJohn Forte 248fcf3ce44SJohn Forte #ifdef DEBUG 249fcf3ce44SJohn Forte if (getopt(argc, argv, "i") == 'i') { 250fcf3ce44SJohn Forte opt_i = 1; /* interactive mode */ 251fcf3ce44SJohn Forte } 252fcf3ce44SJohn Forte #endif 253fcf3ce44SJohn Forte 254fcf3ce44SJohn Forte /* set locale */ 255fcf3ce44SJohn Forte openlog(ISNS_DAEMON_SYSLOG_PP, LOG_PID | LOG_CONS, LOG_DAEMON); 256fcf3ce44SJohn Forte 257fcf3ce44SJohn Forte /* load administative settings. pick up data location. */ 258fcf3ce44SJohn Forte if (load_config(B_TRUE) != 0) { 259fcf3ce44SJohn Forte isnslog(LOG_ERR, "main", "administrative settings load error."); 260fcf3ce44SJohn Forte exit(SMF_EXIT_ERR_OTHER); 261fcf3ce44SJohn Forte } 262fcf3ce44SJohn Forte 263fcf3ce44SJohn Forte /* A signal handler is set for SIGCHLD. */ 264fcf3ce44SJohn Forte (void) signal(SIGCHLD, sigchld_handler); 265fcf3ce44SJohn Forte (void) signal(SIGUSR2, sigusr2_handler); 266fcf3ce44SJohn Forte (void) sigset(SIGALRM, sigalrm); 267fcf3ce44SJohn Forte 268fcf3ce44SJohn Forte #ifdef DEBUG 269fcf3ce44SJohn Forte printf("start daemon\n"); 270fcf3ce44SJohn Forte #endif 271fcf3ce44SJohn Forte if (opt_i == 0 || daemonlize) { 272fcf3ce44SJohn Forte isnslog(LOG_DEBUG, "main", "now forking... pid %d", getpid()); 273fcf3ce44SJohn Forte daemonlize = 1; 274fcf3ce44SJohn Forte /* daemonlize */ 275fcf3ce44SJohn Forte isns_child_pid = fork(); 276fcf3ce44SJohn Forte if (isns_child_pid < 0) { 277fcf3ce44SJohn Forte /* 278fcf3ce44SJohn Forte * cannot fork(), terminate the server. 279fcf3ce44SJohn Forte */ 280fcf3ce44SJohn Forte exit(SMF_EXIT_ERR_CONFIG); 281fcf3ce44SJohn Forte } 282fcf3ce44SJohn Forte if (isns_child_pid > 0) { 283fcf3ce44SJohn Forte /* 284fcf3ce44SJohn Forte * terminate parent. 285fcf3ce44SJohn Forte */ 286fcf3ce44SJohn Forte (void) sem_wait(&isns_child_sem); 287fcf3ce44SJohn Forte (void) sem_destroy(&isns_child_sem); 288fcf3ce44SJohn Forte isnslog(LOG_DEBUG, "main", "exiting with %d", 289fcf3ce44SJohn Forte isns_child_smf_exit_code); 290fcf3ce44SJohn Forte exit(isns_child_smf_exit_code); 291fcf3ce44SJohn Forte } 292fcf3ce44SJohn Forte 293fcf3ce44SJohn Forte /* 294fcf3ce44SJohn Forte * redirect stdout, and stderr to /dev/null. 295fcf3ce44SJohn Forte */ 296fcf3ce44SJohn Forte i = open("/dev/null", O_RDWR); 297fcf3ce44SJohn Forte (void) dup2(i, 1); 298fcf3ce44SJohn Forte (void) dup2(i, 2); 299fcf3ce44SJohn Forte } /* end of daemonlize */ 300fcf3ce44SJohn Forte 301fcf3ce44SJohn Forte #ifdef DEBUG 302fcf3ce44SJohn Forte printf("calling cache init\n"); 303fcf3ce44SJohn Forte #endif 304fcf3ce44SJohn Forte /* initialize object hash table */ 305fcf3ce44SJohn Forte if (cache_init() != 0) { 306fcf3ce44SJohn Forte isnslog(LOG_ERR, "main", 307fcf3ce44SJohn Forte "object hash table initialization error."); 308fcf3ce44SJohn Forte exit(SMF_EXIT_ERR_OTHER); 309fcf3ce44SJohn Forte } 310fcf3ce44SJohn Forte 311fcf3ce44SJohn Forte /* initialize event list */ 312fcf3ce44SJohn Forte if (el_init(10, 60, 6) != 0) { 313fcf3ce44SJohn Forte isnslog(LOG_ERR, "main", 314fcf3ce44SJohn Forte "ESI event list initialization error."); 315fcf3ce44SJohn Forte exit(SMF_EXIT_ERR_OTHER); 316fcf3ce44SJohn Forte } 317fcf3ce44SJohn Forte 318fcf3ce44SJohn Forte /* initialize iSNS database */ 319fcf3ce44SJohn Forte if (init_data() != 0) { 320fcf3ce44SJohn Forte isnslog(LOG_ERR, "main", 321fcf3ce44SJohn Forte "internal database initialization error"); 322fcf3ce44SJohn Forte exit(SMF_EXIT_ERR_OTHER); 323fcf3ce44SJohn Forte } 324fcf3ce44SJohn Forte 325fcf3ce44SJohn Forte #ifdef DEBUG 326fcf3ce44SJohn Forte printf("calling load_data\n"); 327fcf3ce44SJohn Forte t = time(NULL); 328fcf3ce44SJohn Forte c = clock(); 329fcf3ce44SJohn Forte #endif 330fcf3ce44SJohn Forte 331fcf3ce44SJohn Forte if (load_data() != 0) { 332fcf3ce44SJohn Forte isnslog(LOG_ERR, "main", "loading data store failed"); 333fcf3ce44SJohn Forte exit(SMF_EXIT_ERR_OTHER); 334fcf3ce44SJohn Forte } 335fcf3ce44SJohn Forte 336fcf3ce44SJohn Forte #ifdef DEBUG 337fcf3ce44SJohn Forte t = time(NULL) - t; 338fcf3ce44SJohn Forte c = clock() - c; 339fcf3ce44SJohn Forte printf("time %d clock %.4lf -loading data\n", 340fcf3ce44SJohn Forte t, c / (double)CLOCKS_PER_SEC); 341fcf3ce44SJohn Forte #endif 342fcf3ce44SJohn Forte 343fcf3ce44SJohn Forte #ifdef DEBUG 344fcf3ce44SJohn Forte printf("sys queue creating...\n"); 345fcf3ce44SJohn Forte #endif 346fcf3ce44SJohn Forte /* create a message queue for system control */ 347fcf3ce44SJohn Forte sys_q = queue_calloc(); 348fcf3ce44SJohn Forte if (!sys_q) { 349fcf3ce44SJohn Forte exit(SMF_EXIT_ERR_OTHER); 350fcf3ce44SJohn Forte } 351fcf3ce44SJohn Forte 352fcf3ce44SJohn Forte /* create a message queue for scn thread */ 353fcf3ce44SJohn Forte scn_q = queue_calloc(); 354fcf3ce44SJohn Forte if (!scn_q) { 355fcf3ce44SJohn Forte exit(SMF_EXIT_ERR_OTHER); 356fcf3ce44SJohn Forte } 357fcf3ce44SJohn Forte 358fcf3ce44SJohn Forte /* create scn thread */ 359fcf3ce44SJohn Forte /* Check for Default DD/DD-set existence and */ 360fcf3ce44SJohn Forte /* create them if they are not there. */ 361fcf3ce44SJohn Forte if (verify_ddd() != 0) { 362fcf3ce44SJohn Forte exit(SMF_EXIT_ERR_OTHER); 363fcf3ce44SJohn Forte } 364fcf3ce44SJohn Forte 365fcf3ce44SJohn Forte /* setup and verify the portal(s) for scn(s) */ 366fcf3ce44SJohn Forte /* after scn registry is loaded from data store. */ 367fcf3ce44SJohn Forte if (verify_scn_portal() != 0) { 368fcf3ce44SJohn Forte exit(SMF_EXIT_ERR_OTHER); 369fcf3ce44SJohn Forte } 370fcf3ce44SJohn Forte 371fcf3ce44SJohn Forte /* setup and verify the portal(s) for esi(s) */ 372fcf3ce44SJohn Forte /* after esi list is loaded from data store. */ 373fcf3ce44SJohn Forte if (verify_esi_portal() != 0) { 374fcf3ce44SJohn Forte exit(SMF_EXIT_ERR_OTHER); 375fcf3ce44SJohn Forte } 376fcf3ce44SJohn Forte 377fcf3ce44SJohn Forte #ifdef DEBUG 378fcf3ce44SJohn Forte printf("scn queue creating...\n"); 379fcf3ce44SJohn Forte #endif 380fcf3ce44SJohn Forte 381fcf3ce44SJohn Forte (void) sigset(SIGHUP, sighup_handler); 382fcf3ce44SJohn Forte (void) sigset(SIGINT, sigexit_handler); 383fcf3ce44SJohn Forte (void) sigset(SIGTERM, sigexit_handler); 384fcf3ce44SJohn Forte (void) sigset(SIGQUIT, sigexit_handler); 385fcf3ce44SJohn Forte 386fcf3ce44SJohn Forte /* create scn thread */ 387fcf3ce44SJohn Forte if (pthread_create(&scn_tid, NULL, scn_proc, NULL) != 0) { 388fcf3ce44SJohn Forte isnslog(LOG_ERR, "main", "SCN thread creating error."); 389fcf3ce44SJohn Forte exit(SMF_EXIT_ERR_OTHER); 390fcf3ce44SJohn Forte } 391fcf3ce44SJohn Forte 392fcf3ce44SJohn Forte /* setup a door for management interface */ 393fcf3ce44SJohn Forte if (setup_mgmt_door(sys_q) != 0) { 394fcf3ce44SJohn Forte exit(SMF_EXIT_ERR_OTHER); 395fcf3ce44SJohn Forte } 396fcf3ce44SJohn Forte 397fcf3ce44SJohn Forte /* create server port watcher */ 398fcf3ce44SJohn Forte if (pthread_create(&port_tid, NULL, 399fcf3ce44SJohn Forte isns_port_watcher, (void *)sys_q) != 0) { 400fcf3ce44SJohn Forte isnslog(LOG_ERR, "main", "iSNS port thread creating error."); 401fcf3ce44SJohn Forte exit(SMF_EXIT_ERR_OTHER); 402fcf3ce44SJohn Forte } 403fcf3ce44SJohn Forte 404fcf3ce44SJohn Forte /* create entity status inquiry thread */ 405fcf3ce44SJohn Forte if (pthread_create(&esi_tid, NULL, 406fcf3ce44SJohn Forte esi_proc, NULL) != 0) { 407fcf3ce44SJohn Forte isnslog(LOG_ERR, "main", "ESI thread creating error."); 408fcf3ce44SJohn Forte exit(SMF_EXIT_ERR_OTHER); 409fcf3ce44SJohn Forte } 410fcf3ce44SJohn Forte 411fcf3ce44SJohn Forte #ifdef DEBUG 412fcf3ce44SJohn Forte if (!daemonlize) { 413fcf3ce44SJohn Forte (void) pthread_create(&tid, 414fcf3ce44SJohn Forte NULL, 415fcf3ce44SJohn Forte cli_test, 416fcf3ce44SJohn Forte (void *)sys_q); 417fcf3ce44SJohn Forte } 418fcf3ce44SJohn Forte #endif 419fcf3ce44SJohn Forte if (opt_i == 0 || daemonlize) { 420fcf3ce44SJohn Forte isnslog(LOG_DEBUG, "main", "issuing SIGUSR2.. parent pid %d", 421fcf3ce44SJohn Forte getppid()); 422fcf3ce44SJohn Forte (void) kill(getppid(), SIGUSR2); 423fcf3ce44SJohn Forte } 424fcf3ce44SJohn Forte 425fcf3ce44SJohn Forte /* pause */ 426fcf3ce44SJohn Forte for (;;) { 427fcf3ce44SJohn Forte msg_text_t *msg = queue_msg_get(sys_q); 428fcf3ce44SJohn Forte switch (msg->id) { 429fcf3ce44SJohn Forte case DATA_ADD: 430fcf3ce44SJohn Forte case DATA_UPDATE: 431fcf3ce44SJohn Forte case DATA_DELETE: 432fcf3ce44SJohn Forte case DATA_DELETE_ASSOC: 433fcf3ce44SJohn Forte case DATA_COMMIT: 434fcf3ce44SJohn Forte case DATA_RETREAT: 435fcf3ce44SJohn Forte break; 436fcf3ce44SJohn Forte case REG_EXP: 437fcf3ce44SJohn Forte /* registration expiring */ 438fcf3ce44SJohn Forte reg_expiring(msg->data); 439fcf3ce44SJohn Forte break; 440fcf3ce44SJohn Forte case DEAD_PORTAL: 441fcf3ce44SJohn Forte portal_dies((uint32_t)msg->data); 442fcf3ce44SJohn Forte break; 443fcf3ce44SJohn Forte case SERVER_EXIT: 444fcf3ce44SJohn Forte /* graceful exit. */ 445fcf3ce44SJohn Forte (void) queue_msg_free(msg); 446fcf3ce44SJohn Forte isnslog(LOG_DEBUG, "main", 447fcf3ce44SJohn Forte "wake up ESI and stop it."); 448fcf3ce44SJohn Forte (void) get_stopwatch(1); 449fcf3ce44SJohn Forte isnslog(LOG_DEBUG, "main", 450fcf3ce44SJohn Forte "sending SCN stop msg."); 451fcf3ce44SJohn Forte (void) queue_msg_set(scn_q, SCN_STOP, NULL); 452*3f1da666Swl202157@icefox if (door_created) { 453*3f1da666Swl202157@icefox isnslog(LOG_DEBUG, "main", 454*3f1da666Swl202157@icefox "closing the door."); 455fcf3ce44SJohn Forte (void) fdetach(ISNS_DOOR_NAME); 456*3f1da666Swl202157@icefox } 457fcf3ce44SJohn Forte (void) pthread_join(esi_tid, NULL); 458fcf3ce44SJohn Forte isnslog(LOG_DEBUG, "main", 459fcf3ce44SJohn Forte "esi thread %d exited.", esi_tid); 460fcf3ce44SJohn Forte (void) pthread_join(port_tid, NULL); 461fcf3ce44SJohn Forte isnslog(LOG_DEBUG, "main", 462fcf3ce44SJohn Forte "port watcher thread %d exited.", port_tid); 463fcf3ce44SJohn Forte (void) pthread_join(scn_tid, NULL); 464fcf3ce44SJohn Forte isnslog(LOG_DEBUG, "main", 465fcf3ce44SJohn Forte "scn thread %d exited.", scn_tid); 466fcf3ce44SJohn Forte 467fcf3ce44SJohn Forte /* now check any remaining threads. */ 468fcf3ce44SJohn Forte i = 0; 469fcf3ce44SJohn Forte do { 470fcf3ce44SJohn Forte thr_cnt = get_thr_count(); 471fcf3ce44SJohn Forte if (thr_cnt == 0) { 472fcf3ce44SJohn Forte isnslog(LOG_DEBUG, "main", 473fcf3ce44SJohn Forte "main thread %d is done.", 474fcf3ce44SJohn Forte pthread_self()); 475fcf3ce44SJohn Forte exit(1); 476fcf3ce44SJohn Forte } else { 477fcf3ce44SJohn Forte (void) sleep(1); 478fcf3ce44SJohn Forte i++; 479fcf3ce44SJohn Forte } 480fcf3ce44SJohn Forte } while (MAX_RETRY_COUNT > i); 481fcf3ce44SJohn Forte isnslog(LOG_DEBUG, "main", 482fcf3ce44SJohn Forte "main thread %d existing ...", 483fcf3ce44SJohn Forte pthread_self()); 484fcf3ce44SJohn Forte exit(1); 485fcf3ce44SJohn Forte break; 486fcf3ce44SJohn Forte case CONFIG_RELOAD: 487fcf3ce44SJohn Forte /* load config again. don't pick data store. */ 488fcf3ce44SJohn Forte (void) load_config(B_FALSE); 489fcf3ce44SJohn Forte break; 490fcf3ce44SJohn Forte case SYS_QUIT_OK: 491fcf3ce44SJohn Forte (void) queue_msg_free(msg); 492fcf3ce44SJohn Forte exit(0); 493fcf3ce44SJohn Forte default: 494fcf3ce44SJohn Forte break; 495fcf3ce44SJohn Forte } 496fcf3ce44SJohn Forte (void) queue_msg_free(msg); 497fcf3ce44SJohn Forte } 498fcf3ce44SJohn Forte 499fcf3ce44SJohn Forte /* LINTED E_STMT_NOT_REACHED */ 500fcf3ce44SJohn Forte return (0); 501fcf3ce44SJohn Forte } 502