bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin/*
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * CDDL HEADER START
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin *
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 *
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * or http://www.opensolaris.org/os/licensing.
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * See the License for the specific language governing permissions
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * and limitations under the License.
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin *
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 *
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * CDDL HEADER END
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin/*
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 */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin/* All Rights Reserved */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin/*
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 *
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 */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin/* LINTLIBRARY */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin/* PROTOLIB1 */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin/*
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * NLM server
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin *
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * Most of this copied from ../nfsd/nfsd.c
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * and then s:NFS:NLM: applied, etc.
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin#include <sys/param.h>
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin#include <sys/types.h>
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin#include <sys/stat.h>
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin#include <syslog.h>
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin#include <tiuser.h>
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin#include <rpc/rpc.h>
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin#include <errno.h>
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin#include <thread.h>
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin#include <sys/time.h>
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin#include <sys/file.h>
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin#include <nfs/nfs.h>
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin#include <nfs/nfssys.h>
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin#include <stdio.h>
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin#include <stdio_ext.h>
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin#include <stdlib.h>
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin#include <signal.h>
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin#include <netconfig.h>
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin#include <netdir.h>
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin#include <string.h>
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin#include <unistd.h>
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin#include <stropts.h>
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin#include <sys/tihdr.h>
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin#include <poll.h>
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin#include <priv_utils.h>
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin#include <sys/tiuser.h>
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin#include <netinet/tcp.h>
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin#include <deflt.h>
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin#include <rpcsvc/daemon_utils.h>
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin#include <rpcsvc/nlm_prot.h>
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin#include <libintl.h>
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin#include <libscf.h>
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin#include <libshare.h>
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin#include "nfs_tbind.h"
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin#include "thrpool.h"
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin#include "smfcfg.h"
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin/* Option defaults. See nfssys.h */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchininstruct lm_svc_args lmargs = {
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin .version = LM_SVC_CUR_VERS,
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin /* fd, n_fmly, n_proto, n_rdev (below) */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin .debug = 0,
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin .timout = 5 * 60,
42cdb25977ffa6ebef76064b66ad665992fadee5Marcel Telka .grace = 90,
42cdb25977ffa6ebef76064b66ad665992fadee5Marcel Telka .retransmittimeout = 5
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin};
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchininint max_servers = 20;
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin#define RET_OK 0 /* return code for no error */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin#define RET_ERR 33 /* return code for error(s) */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchininstatic int nlmsvc(int fd, struct netbuf addrmask,
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin struct netconfig *nconf);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchininstatic int nlmsvcpool(int max_servers);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchininstatic void usage(void);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchininextern int _nfssys(int, void *);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchininstatic void sigterm_handler(void);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchininstatic void shutdown_lockd(void);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchininextern int daemonize_init(void);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchininextern void daemonize_fini(int fd);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchininstatic char *MyName;
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin/*
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 */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchininstatic NETSELDECL(defaultproviders)[] = {
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin "/dev/ticotsord",
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin "/dev/tcp",
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin "/dev/udp",
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin "/dev/tcp6",
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin "/dev/udp6",
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin NULL
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin};
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin/*
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * The following are all globals used by routines in nfs_tbind.c.
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin */
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
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchininint
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchininmain(int ac, char *av[])
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin{
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin char *propname = NULL;
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin char *dir = "/";
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin char *provider = (char *)NULL;
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin struct protob *protobp;
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin NETSELPDECL(providerp);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin sigset_t sgset;
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin int i, c, pid, ret, val;
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin int pipe_fd = -1;
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin struct sigaction act;
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin MyName = *av;
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin /*
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * Initializations that require more privileges than we need to run.
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin (void) _create_daemon_lock(LOCKD, DAEMON_UID, DAEMON_GID);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin svcsetprio();
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
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 " sufficient privileges\n", av[0]);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin exit(1);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin }
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin (void) enable_extended_FILE_stdio(-1, -1);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin /*
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 */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin /* How long to wait for clients to re-establish locks. */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin propname = "grace_period"; /* also -g */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin ret = nfs_smf_get_iprop(propname, &val,
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin DEFAULT_INSTANCE, SCF_TYPE_INTEGER, LOCKD);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin if (ret == SA_OK) {
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin if (val <= 0)
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin fprintf(stderr, gettext(
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin "Invalid %s from SMF"), propname);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin else
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin lmargs.grace = val;
42cdb25977ffa6ebef76064b66ad665992fadee5Marcel Telka } else {
42cdb25977ffa6ebef76064b66ad665992fadee5Marcel Telka syslog(LOG_ERR, "Reading of %s from SMF failed, using default "
42cdb25977ffa6ebef76064b66ad665992fadee5Marcel Telka "value", propname);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin }
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
42cdb25977ffa6ebef76064b66ad665992fadee5Marcel Telka propname = "lockd_listen_backlog"; /* also -l */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin ret = nfs_smf_get_iprop(propname, &val,
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin DEFAULT_INSTANCE, SCF_TYPE_INTEGER, LOCKD);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin if (ret == SA_OK) {
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin if (val <= 0)
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin fprintf(stderr, gettext(
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin "Invalid %s from SMF"), propname);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin else
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin listen_backlog = val;
42cdb25977ffa6ebef76064b66ad665992fadee5Marcel Telka } else {
42cdb25977ffa6ebef76064b66ad665992fadee5Marcel Telka syslog(LOG_ERR, "Reading of %s from SMF failed, using default "
42cdb25977ffa6ebef76064b66ad665992fadee5Marcel Telka "value", propname);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin }
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
42cdb25977ffa6ebef76064b66ad665992fadee5Marcel Telka propname = "lockd_servers"; /* also argv[1] */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin ret = nfs_smf_get_iprop(propname, &val,
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin DEFAULT_INSTANCE, SCF_TYPE_INTEGER, LOCKD);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin if (ret == SA_OK) {
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin if (val <= 0)
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin fprintf(stderr, gettext(
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin "Invalid %s from SMF"), propname);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin else
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin max_servers = val;
42cdb25977ffa6ebef76064b66ad665992fadee5Marcel Telka } else {
42cdb25977ffa6ebef76064b66ad665992fadee5Marcel Telka syslog(LOG_ERR, "Reading of %s from SMF failed, using default "
42cdb25977ffa6ebef76064b66ad665992fadee5Marcel Telka "value", propname);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin }
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
42cdb25977ffa6ebef76064b66ad665992fadee5Marcel Telka propname = "lockd_retransmit_timeout"; /* also -t */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin ret = nfs_smf_get_iprop(propname, &val,
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin DEFAULT_INSTANCE, SCF_TYPE_INTEGER, LOCKD);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin if (ret == SA_OK) {
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin if (val <= 0)
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin fprintf(stderr, gettext(
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin "Invalid %s from SMF"), propname);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin else
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin lmargs.retransmittimeout = val;
42cdb25977ffa6ebef76064b66ad665992fadee5Marcel Telka } else {
42cdb25977ffa6ebef76064b66ad665992fadee5Marcel Telka syslog(LOG_ERR, "Reading of %s from SMF failed, using default "
42cdb25977ffa6ebef76064b66ad665992fadee5Marcel Telka "value", propname);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin }
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
42cdb25977ffa6ebef76064b66ad665992fadee5Marcel Telka while ((c = getopt(ac, av, "c:d:g:l:t:")) != EOF)
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin switch (c) {
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin case 'c': /* max_connections */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin if ((val = atoi(optarg)) <= 0)
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin goto badval;
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin max_conns_allowed = val;
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin break;
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin case 'd': /* debug */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin lmargs.debug = atoi(optarg);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin break;
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin case 'g': /* grace_period */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin if ((val = atoi(optarg)) <= 0)
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin goto badval;
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin lmargs.grace = val;
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin break;
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin case 'l': /* listen_backlog */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin if ((val = atoi(optarg)) <= 0)
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin goto badval;
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin listen_backlog = val;
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin break;
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
42cdb25977ffa6ebef76064b66ad665992fadee5Marcel Telka case 't': /* retrans_timeout */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin if ((val = atoi(optarg)) <= 0)
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin goto badval;
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin lmargs.retransmittimeout = val;
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin break;
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin badval:
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin fprintf(stderr, gettext(
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin "Invalid -%c option value"), c);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin /* FALLTHROUGH */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin default:
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin usage();
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin /* NOTREACHED */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin }
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin /*
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * If there is exactly one more argument, it is the number of
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * servers.
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin if (optind < ac) {
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin val = atoi(av[optind]);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin if (val <= 0) {
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin fprintf(stderr, gettext(
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin "Invalid max_servers argument"));
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin usage();
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin }
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin max_servers = val;
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin optind++;
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin }
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin /*
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * If there are two or more arguments, then this is a usage error.
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin if (optind != ac)
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin usage();
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin if (lmargs.debug) {
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin printf("%s: debug= %d, conn_idle_timout= %d,"
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin " grace_period= %d, listen_backlog= %d,"
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin " max_connections= %d, max_servers= %d,"
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin " retrans_timeout= %d\n",
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin MyName, lmargs.debug, lmargs.timout,
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin lmargs.grace, listen_backlog,
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin max_conns_allowed, max_servers,
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin lmargs.retransmittimeout);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin }
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin /*
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * Set current dir to server root
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin if (chdir(dir) < 0) {
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin (void) fprintf(stderr, "%s: ", MyName);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin perror(dir);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin exit(1);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin }
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin /* Daemonize, if not debug. */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin if (lmargs.debug == 0)
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin pipe_fd = daemonize_init();
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin openlog(MyName, LOG_PID | LOG_NDELAY, LOG_DAEMON);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin /*
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 */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin pid = _enter_daemon_lock(LOCKD);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin switch (pid) {
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin case 0:
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin break;
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin case -1:
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin fprintf(stderr, "error locking for %s: %s", LOCKD,
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin strerror(errno));
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin exit(2);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin default:
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin /* daemon was already running */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin exit(0);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin }
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin /*
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * Block all signals till we spawn other
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * threads.
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin (void) sigfillset(&sgset);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin (void) thr_sigsetmask(SIG_BLOCK, &sgset, NULL);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin /* Unregister any previous versions. */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin for (i = NLM_VERS; i < NLM4_VERS; i++) {
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin svc_unreg(NLM_PROG, i);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin }
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin /*
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * Set up kernel RPC thread pool for the NLM server.
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin if (nlmsvcpool(max_servers)) {
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin fprintf(stderr, "Can't set up kernel NLM service: %s. Exiting",
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin strerror(errno));
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin exit(1);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin }
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin /*
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * Set up blocked thread to do LWP creation on behalf of the kernel.
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin if (svcwait(NLM_SVCPOOL_ID)) {
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin fprintf(stderr, "Can't set up NLM pool creator: %s. Exiting",
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin strerror(errno));
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin exit(1);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin }
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin /*
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * Install atexit and sigterm handlers
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin act.sa_handler = sigterm_handler;
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin act.sa_flags = 0;
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin (void) sigaction(SIGTERM, &act, NULL);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin (void) atexit(shutdown_lockd);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin /*
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * Now open up for signal delivery
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin (void) thr_sigsetmask(SIG_UNBLOCK, &sgset, NULL);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin /*
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * Build a protocol block list for registration.
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin protobp = (struct protob *)malloc(sizeof (struct protob));
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin protobp->serv = "NLM";
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin protobp->versmin = NLM_VERS;
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin protobp->versmax = NLM4_VERS;
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin protobp->program = NLM_PROG;
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin protobp->next = (struct protob *)NULL;
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin for (providerp = defaultproviders;
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin *providerp != NULL; providerp++) {
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin provider = *providerp;
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin do_one(provider, NULL, protobp, nlmsvc);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin }
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin free(protobp);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin if (num_fds == 0) {
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin fprintf(stderr, "Could not start NLM service for any protocol."
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin " Exiting");
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin exit(1);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin }
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin end_listen_fds = num_fds;
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin /*
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * lockd is up and running as far as we are concerned.
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin if (lmargs.debug == 0)
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin daemonize_fini(pipe_fd);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin /*
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * Get rid of unneeded privileges.
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin */
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
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin /*
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * Poll for non-data control events on the transport descriptors.
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin poll_for_action();
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin /*
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * If we get here, something failed in poll_for_action().
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin return (1);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin}
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchininstatic int
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchininnlmsvcpool(int maxservers)
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin{
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin struct svcpool_args npa;
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin npa.id = NLM_SVCPOOL_ID;
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin npa.maxthreads = maxservers;
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin npa.redline = 0;
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin npa.qsize = 0;
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin npa.timeout = 0;
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin npa.stksize = 0;
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin npa.max_same_xprt = 0;
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin return (_nfssys(SVCPOOL_CREATE, &npa));
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin}
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchininstatic int
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchininncfmly_to_lmfmly(const char *ncfmly)
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin{
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin if (0 == strcmp(ncfmly, NC_INET))
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin return (LM_INET);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin if (0 == strcmp(ncfmly, NC_INET6))
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin return (LM_INET6);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin if (0 == strcmp(ncfmly, NC_LOOPBACK))
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin return (LM_LOOPBACK);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin return (-1);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin}
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchininstatic int
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchininnctype_to_lmprot(uint_t semantics)
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin{
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin switch (semantics) {
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin case NC_TPI_CLTS:
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin return (LM_UDP);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin case NC_TPI_COTS_ORD:
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin return (LM_TCP);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin }
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin return (-1);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin}
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchininstatic dev_t
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchininncdev_to_rdev(const char *ncdev)
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin{
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin struct stat st;
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin if (stat(ncdev, &st) < 0)
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin return (NODEV);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin return (st.st_rdev);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin}
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchininstatic void
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchininsigterm_handler(void)
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin{
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin /* to call atexit handler */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin exit(0);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin}
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchininstatic void
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchininshutdown_lockd(void)
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin{
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin (void) _nfssys(KILL_LOCKMGR, NULL);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin}
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin/*
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin * Establish NLM service thread.
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchininstatic int
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchininnlmsvc(int fd, struct netbuf addrmask, struct netconfig *nconf)
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin{
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin struct lm_svc_args lma;
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin lma = lmargs; /* init by struct copy */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin /*
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 */
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin lma.fd = fd;
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin lma.n_fmly = ncfmly_to_lmfmly(nconf->nc_protofmly);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin lma.n_proto = nctype_to_lmprot(nconf->nc_semantics);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin lma.n_rdev = ncdev_to_rdev(nconf->nc_device);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin return (_nfssys(LM_SVC, &lma));
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin}
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchininstatic void
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchininusage(void)
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin{
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin (void) fprintf(stderr, gettext(
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin "usage: %s [options] [max_servers]\n"), MyName);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin (void) fprintf(stderr, gettext(
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-d debug_level\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");
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin exit(1);
bbaa8b60dd95d714741fc474adad3cf710ef4efdDan Kruchinin}