bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * CDDL HEADER START
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * The contents of this file are subject to the terms of the
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * Common Development and Distribution License (the "License").
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * You may not use this file except in compliance with the License.
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * See the License for the specific language governing permissions
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * and limitations under the License.
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * When distributing Covered Code, include this CDDL HEADER in each
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * If applicable, add the following below this CDDL HEADER, with the
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * fields enclosed by brackets "[]" replaced with your own identifying
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * information: Portions Copyright [yyyy] [name of copyright owner]
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * CDDL HEADER END
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * Copyright (c) 1989, 2010, Oracle and/or its affiliates. All rights reserved.
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * Copyright (c) 2012 by Delphix. All rights reserved.
42cdb25977ffa6ebef76064b66ad665992fadee5Marcel Telka * Copyright 2014 Nexenta Systems, Inc. All rights reserved.
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin/* All Rights Reserved */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * University Copyright- Copyright (c) 1982, 1986, 1988
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * The Regents of the University of California
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * All Rights Reserved
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * University Acknowledgment- Portions of this document are derived from
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * software developed by the University of California, Berkeley, and its
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * contributors.
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin/* LINTLIBRARY */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin/* PROTOLIB1 */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * Most of this copied from ../nfsd/nfsd.c
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * and then s:NFS:NLM: applied, etc.
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin/* Option defaults. See nfssys.h */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin /* fd, n_fmly, n_proto, n_rdev (below) */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin#define RET_OK 0 /* return code for no error */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin#define RET_ERR 33 /* return code for error(s) */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchininstatic int nlmsvc(int fd, struct netbuf addrmask,
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchininstatic void usage(void);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchininextern int _nfssys(int, void *);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchininstatic void sigterm_handler(void);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchininstatic void shutdown_lockd(void);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchininextern int daemonize_init(void);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * We want to bind to these TLI providers, and in this order,
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * because the kernel NLM needs the loopback first for its
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * initialization. (It uses it to talk to statd.)
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * The following are all globals used by routines in nfs_tbind.c.
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchininsize_t end_listen_fds; /* used by conn_close_oldest() */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchininsize_t num_fds = 0; /* used by multiple routines */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchininint listen_backlog = 32; /* used by bind_to_{provider,proto}() */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchininint (*Mysvc)(int, struct netbuf, struct netconfig *) = nlmsvc;
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin /* used by cots_listen_event() */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchininint max_conns_allowed = -1; /* used by cots_listen_event() */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * Initializations that require more privileges than we need to run.
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin (void) _create_daemon_lock(LOCKD, DAEMON_UID, DAEMON_GID);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin if (__init_daemon_priv(PU_RESETGROUPS|PU_CLEARLIMITSET,
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin DAEMON_UID, DAEMON_GID, PRIV_SYS_NFS, NULL) == -1) {
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin (void) fprintf(stderr, "%s should be run with"
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * Read in the values from SMF first before we check
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * command line options so the options override SMF values.
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin /* How long to wait for clients to re-establish locks. */
42cdb25977ffa6ebef76064b66ad665992fadee5Marcel Telka syslog(LOG_ERR, "Reading of %s from SMF failed, using default "
42cdb25977ffa6ebef76064b66ad665992fadee5Marcel Telka propname = "lockd_listen_backlog"; /* also -l */
42cdb25977ffa6ebef76064b66ad665992fadee5Marcel Telka syslog(LOG_ERR, "Reading of %s from SMF failed, using default "
42cdb25977ffa6ebef76064b66ad665992fadee5Marcel Telka syslog(LOG_ERR, "Reading of %s from SMF failed, using default "
42cdb25977ffa6ebef76064b66ad665992fadee5Marcel Telka propname = "lockd_retransmit_timeout"; /* also -t */
42cdb25977ffa6ebef76064b66ad665992fadee5Marcel Telka syslog(LOG_ERR, "Reading of %s from SMF failed, using default "
42cdb25977ffa6ebef76064b66ad665992fadee5Marcel Telka while ((c = getopt(ac, av, "c:d:g:l:t:")) != EOF)
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin "Invalid -%c option value"), c);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin /* FALLTHROUGH */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin /* NOTREACHED */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * If there is exactly one more argument, it is the number of
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin "Invalid max_servers argument"));
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * If there are two or more arguments, then this is a usage error.
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin " grace_period= %d, listen_backlog= %d,"
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin " max_connections= %d, max_servers= %d,"
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin " retrans_timeout= %d\n",
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * Set current dir to server root
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin /* Daemonize, if not debug. */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin openlog(MyName, LOG_PID | LOG_NDELAY, LOG_DAEMON);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * establish our lock on the lock file and write our pid to it.
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * exit if some other process holds the lock, or if there's any
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * error in writing/locking the file.
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin fprintf(stderr, "error locking for %s: %s", LOCKD,
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin /* daemon was already running */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * Block all signals till we spawn other
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin (void) thr_sigsetmask(SIG_BLOCK, &sgset, NULL);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin /* Unregister any previous versions. */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * Set up kernel RPC thread pool for the NLM server.
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin fprintf(stderr, "Can't set up kernel NLM service: %s. Exiting",
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * Set up blocked thread to do LWP creation on behalf of the kernel.
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin fprintf(stderr, "Can't set up NLM pool creator: %s. Exiting",
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * Install atexit and sigterm handlers
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * Now open up for signal delivery
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin (void) thr_sigsetmask(SIG_UNBLOCK, &sgset, NULL);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * Build a protocol block list for registration.
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin protobp = (struct protob *)malloc(sizeof (struct protob));
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin fprintf(stderr, "Could not start NLM service for any protocol."
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * lockd is up and running as far as we are concerned.
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * Get rid of unneeded privileges.
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin __fini_daemon_priv(PRIV_PROC_FORK, PRIV_PROC_EXEC, PRIV_PROC_SESSION,
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin PRIV_FILE_LINK_ANY, PRIV_PROC_INFO, (char *)NULL);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * Poll for non-data control events on the transport descriptors.
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * If we get here, something failed in poll_for_action().
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin /* to call atexit handler */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * Establish NLM service thread.
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchininnlmsvc(int fd, struct netbuf addrmask, struct netconfig *nconf)
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * The kernel code needs to reconstruct a complete
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * knetconfig from n_fmly, n_proto. We use these
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * two fields to convey the family and semantics.
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin lma.n_fmly = ncfmly_to_lmfmly(nconf->nc_protofmly);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin lma.n_proto = nctype_to_lmprot(nconf->nc_semantics);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin "usage: %s [options] [max_servers]\n"), MyName);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin "options: (see SMF property descriptions)\n"));
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin /* Note: don't translate these */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin (void) fprintf(stderr, "\t-c max_connections\n");
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin (void) fprintf(stderr, "\t-g grace_period\n");
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin (void) fprintf(stderr, "\t-l listen_backlog\n");
42cdb25977ffa6ebef76064b66ad665992fadee5Marcel Telka (void) fprintf(stderr, "\t-t retransmit_timeout\n");