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