usr/src/cmd/fs.d/nfs/mountd/mountd.c
author th199096
Mon, 02 Apr 2007 21:38:04 -0700
changeset 3957 86c9dda5df37
parent 3701 fec29e0d1d48
child 4971 b721af044177
permissions -rw-r--r--
PSARC/2007/052 In-kernel Sharetab 6371468 /etc/dfs/sharetab should be a mntfs style file
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     1
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     2
 * CDDL HEADER START
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     3
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     4
 * The contents of this file are subject to the terms of the
1610
3436e82414c8 6344186 NFSv3 needs to support .zfs (like NFSv4 already does)
thurlow
parents: 249
diff changeset
     5
 * Common Development and Distribution License (the "License").
3436e82414c8 6344186 NFSv3 needs to support .zfs (like NFSv4 already does)
thurlow
parents: 249
diff changeset
     6
 * You may not use this file except in compliance with the License.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     7
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     8
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     9
 * or http://www.opensolaris.org/os/licensing.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    10
 * See the License for the specific language governing permissions
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    11
 * and limitations under the License.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    12
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    13
 * When distributing Covered Code, include this CDDL HEADER in each
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    14
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    15
 * If applicable, add the following below this CDDL HEADER, with the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    16
 * fields enclosed by brackets "[]" replaced with your own identifying
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    17
 * information: Portions Copyright [yyyy] [name of copyright owner]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    18
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    19
 * CDDL HEADER END
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    20
 */
3957
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents: 3701
diff changeset
    21
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    22
/*
3701
fec29e0d1d48 6508208 File not closed on error path in mountd
th199096
parents: 2140
diff changeset
    23
 * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    24
 * Use is subject to license terms.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    25
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    26
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    27
/*	Copyright (c) 1983, 1984, 1985, 1986, 1987, 1988, 1989 AT&T	*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    28
/*	  All Rights Reserved  	*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    29
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    30
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    31
 * Portions of this source code were derived from Berkeley 4.3 BSD
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    32
 * under license from the Regents of the University of California.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    33
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    34
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    35
#pragma ident	"%Z%%M%	%I%	%E% SMI"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    36
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    37
#include <stdio.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    38
#include <stdlib.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    39
#include <ctype.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    40
#include <sys/types.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    41
#include <string.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    42
#include <syslog.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    43
#include <sys/param.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    44
#include <rpc/rpc.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    45
#include <sys/stat.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    46
#include <netconfig.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    47
#include <netdir.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    48
#include <sys/file.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    49
#include <sys/time.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    50
#include <sys/errno.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    51
#include <rpcsvc/mount.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    52
#include <sys/pathconf.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    53
#include <sys/systeminfo.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    54
#include <sys/utsname.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    55
#include <signal.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    56
#include <locale.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    57
#include <unistd.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    58
#include <errno.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    59
#include <sys/socket.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    60
#include <netinet/in.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    61
#include <arpa/inet.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    62
#include <netdb.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    63
#include <thread.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    64
#include <assert.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    65
#include <priv_utils.h>
2140
043bd360aabc 6417056 nfssrv should use doors/xdr as its IPC mech to mountd(1m)
rmesta
parents: 1676
diff changeset
    66
#include <nfs/auth.h>
043bd360aabc 6417056 nfssrv should use doors/xdr as its IPC mech to mountd(1m)
rmesta
parents: 1676
diff changeset
    67
#include <nfs/nfssys.h>
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    68
#include <nfs/nfs.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    69
#include <nfs/nfs_sec.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    70
#include <rpcsvc/daemon_utils.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    71
#include <deflt.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    72
#include "../../fslib.h"
3957
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents: 3701
diff changeset
    73
#include <sharefs/share.h>
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents: 3701
diff changeset
    74
#include <sharefs/sharetab.h>
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    75
#include "../lib/sharetab.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    76
#include "mountd.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    77
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    78
struct sh_list *share_list;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    79
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    80
rwlock_t sharetab_lock;		/* lock to protect the cached sharetab */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    81
static mutex_t mnttab_lock;	/* prevent concurrent mnttab readers */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    82
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    83
static struct share *find_lofsentry(char *, int *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    84
static void getclientsnames(SVCXPRT *, struct netbuf **,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    85
					struct nd_hostservlist **);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    86
static int getclientsflavors_old(struct share *, struct netbuf *,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    87
	struct nd_hostservlist *, int *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    88
static int getclientsflavors_new(struct share *, struct netbuf *,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    89
	struct nd_hostservlist *, int *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    90
static int check_client_old(struct share *, struct netbuf *,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    91
    struct nd_hostservlist *, int);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    92
static int check_client_new(struct share *, struct netbuf *,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    93
	struct nd_hostservlist *, int);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    94
static int  in_access_list(struct netbuf *, struct nd_hostservlist *, char *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    95
static void mnt(struct svc_req *, SVCXPRT *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    96
static void mnt_pathconf(struct svc_req *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    97
static void mount(struct svc_req *r);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    98
static void sh_free(struct sh_list *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    99
static void umount(struct svc_req *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   100
static void umountall(struct svc_req *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   101
static int netmatch(struct netbuf *, char *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   102
static void sigexit(int);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   103
static int newopts(char *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   104
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   105
static int verbose;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   106
static int rejecting;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   107
static int mount_vers_min = MOUNTVERS;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   108
static int mount_vers_max = MOUNTVERS3;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   109
2140
043bd360aabc 6417056 nfssrv should use doors/xdr as its IPC mech to mountd(1m)
rmesta
parents: 1676
diff changeset
   110
thread_t	nfsauth_thread;
043bd360aabc 6417056 nfssrv should use doors/xdr as its IPC mech to mountd(1m)
rmesta
parents: 1676
diff changeset
   111
043bd360aabc 6417056 nfssrv should use doors/xdr as its IPC mech to mountd(1m)
rmesta
parents: 1676
diff changeset
   112
/* ARGSUSED */
043bd360aabc 6417056 nfssrv should use doors/xdr as its IPC mech to mountd(1m)
rmesta
parents: 1676
diff changeset
   113
static void *
043bd360aabc 6417056 nfssrv should use doors/xdr as its IPC mech to mountd(1m)
rmesta
parents: 1676
diff changeset
   114
nfsauth_svc(void *arg)
043bd360aabc 6417056 nfssrv should use doors/xdr as its IPC mech to mountd(1m)
rmesta
parents: 1676
diff changeset
   115
{
043bd360aabc 6417056 nfssrv should use doors/xdr as its IPC mech to mountd(1m)
rmesta
parents: 1676
diff changeset
   116
	int	doorfd = -1;
043bd360aabc 6417056 nfssrv should use doors/xdr as its IPC mech to mountd(1m)
rmesta
parents: 1676
diff changeset
   117
	uint_t	darg;
043bd360aabc 6417056 nfssrv should use doors/xdr as its IPC mech to mountd(1m)
rmesta
parents: 1676
diff changeset
   118
#ifdef DEBUG
043bd360aabc 6417056 nfssrv should use doors/xdr as its IPC mech to mountd(1m)
rmesta
parents: 1676
diff changeset
   119
	int	dfd;
043bd360aabc 6417056 nfssrv should use doors/xdr as its IPC mech to mountd(1m)
rmesta
parents: 1676
diff changeset
   120
#endif
043bd360aabc 6417056 nfssrv should use doors/xdr as its IPC mech to mountd(1m)
rmesta
parents: 1676
diff changeset
   121
043bd360aabc 6417056 nfssrv should use doors/xdr as its IPC mech to mountd(1m)
rmesta
parents: 1676
diff changeset
   122
	if ((doorfd = door_create(nfsauth_func, NULL,
043bd360aabc 6417056 nfssrv should use doors/xdr as its IPC mech to mountd(1m)
rmesta
parents: 1676
diff changeset
   123
	    DOOR_REFUSE_DESC | DOOR_NO_CANCEL)) == -1) {
043bd360aabc 6417056 nfssrv should use doors/xdr as its IPC mech to mountd(1m)
rmesta
parents: 1676
diff changeset
   124
		syslog(LOG_ERR, "Unable to create door: %m\n");
043bd360aabc 6417056 nfssrv should use doors/xdr as its IPC mech to mountd(1m)
rmesta
parents: 1676
diff changeset
   125
		exit(10);
043bd360aabc 6417056 nfssrv should use doors/xdr as its IPC mech to mountd(1m)
rmesta
parents: 1676
diff changeset
   126
	}
043bd360aabc 6417056 nfssrv should use doors/xdr as its IPC mech to mountd(1m)
rmesta
parents: 1676
diff changeset
   127
043bd360aabc 6417056 nfssrv should use doors/xdr as its IPC mech to mountd(1m)
rmesta
parents: 1676
diff changeset
   128
#ifdef DEBUG
043bd360aabc 6417056 nfssrv should use doors/xdr as its IPC mech to mountd(1m)
rmesta
parents: 1676
diff changeset
   129
	/*
043bd360aabc 6417056 nfssrv should use doors/xdr as its IPC mech to mountd(1m)
rmesta
parents: 1676
diff changeset
   130
	 * Create a file system path for the door
043bd360aabc 6417056 nfssrv should use doors/xdr as its IPC mech to mountd(1m)
rmesta
parents: 1676
diff changeset
   131
	 */
043bd360aabc 6417056 nfssrv should use doors/xdr as its IPC mech to mountd(1m)
rmesta
parents: 1676
diff changeset
   132
	if ((dfd = open(MOUNTD_DOOR, O_RDWR|O_CREAT|O_TRUNC,
043bd360aabc 6417056 nfssrv should use doors/xdr as its IPC mech to mountd(1m)
rmesta
parents: 1676
diff changeset
   133
	    S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH)) == -1) {
043bd360aabc 6417056 nfssrv should use doors/xdr as its IPC mech to mountd(1m)
rmesta
parents: 1676
diff changeset
   134
		syslog(LOG_ERR, "Unable to open %s: %m\n", MOUNTD_DOOR);
043bd360aabc 6417056 nfssrv should use doors/xdr as its IPC mech to mountd(1m)
rmesta
parents: 1676
diff changeset
   135
		(void) close(doorfd);
043bd360aabc 6417056 nfssrv should use doors/xdr as its IPC mech to mountd(1m)
rmesta
parents: 1676
diff changeset
   136
		exit(11);
043bd360aabc 6417056 nfssrv should use doors/xdr as its IPC mech to mountd(1m)
rmesta
parents: 1676
diff changeset
   137
	}
043bd360aabc 6417056 nfssrv should use doors/xdr as its IPC mech to mountd(1m)
rmesta
parents: 1676
diff changeset
   138
043bd360aabc 6417056 nfssrv should use doors/xdr as its IPC mech to mountd(1m)
rmesta
parents: 1676
diff changeset
   139
	/*
043bd360aabc 6417056 nfssrv should use doors/xdr as its IPC mech to mountd(1m)
rmesta
parents: 1676
diff changeset
   140
	 * Clean up any stale namespace associations
043bd360aabc 6417056 nfssrv should use doors/xdr as its IPC mech to mountd(1m)
rmesta
parents: 1676
diff changeset
   141
	 */
043bd360aabc 6417056 nfssrv should use doors/xdr as its IPC mech to mountd(1m)
rmesta
parents: 1676
diff changeset
   142
	(void) fdetach(MOUNTD_DOOR);
043bd360aabc 6417056 nfssrv should use doors/xdr as its IPC mech to mountd(1m)
rmesta
parents: 1676
diff changeset
   143
043bd360aabc 6417056 nfssrv should use doors/xdr as its IPC mech to mountd(1m)
rmesta
parents: 1676
diff changeset
   144
	/*
043bd360aabc 6417056 nfssrv should use doors/xdr as its IPC mech to mountd(1m)
rmesta
parents: 1676
diff changeset
   145
	 * Register in namespace to pass to the kernel to door_ki_open
043bd360aabc 6417056 nfssrv should use doors/xdr as its IPC mech to mountd(1m)
rmesta
parents: 1676
diff changeset
   146
	 */
043bd360aabc 6417056 nfssrv should use doors/xdr as its IPC mech to mountd(1m)
rmesta
parents: 1676
diff changeset
   147
	if (fattach(doorfd, MOUNTD_DOOR) == -1) {
043bd360aabc 6417056 nfssrv should use doors/xdr as its IPC mech to mountd(1m)
rmesta
parents: 1676
diff changeset
   148
		syslog(LOG_ERR, "Unable to fattach door: %m\n");
043bd360aabc 6417056 nfssrv should use doors/xdr as its IPC mech to mountd(1m)
rmesta
parents: 1676
diff changeset
   149
		(void) close(dfd);
043bd360aabc 6417056 nfssrv should use doors/xdr as its IPC mech to mountd(1m)
rmesta
parents: 1676
diff changeset
   150
		(void) close(doorfd);
043bd360aabc 6417056 nfssrv should use doors/xdr as its IPC mech to mountd(1m)
rmesta
parents: 1676
diff changeset
   151
		exit(12);
043bd360aabc 6417056 nfssrv should use doors/xdr as its IPC mech to mountd(1m)
rmesta
parents: 1676
diff changeset
   152
	}
043bd360aabc 6417056 nfssrv should use doors/xdr as its IPC mech to mountd(1m)
rmesta
parents: 1676
diff changeset
   153
	(void) close(dfd);
043bd360aabc 6417056 nfssrv should use doors/xdr as its IPC mech to mountd(1m)
rmesta
parents: 1676
diff changeset
   154
#endif
043bd360aabc 6417056 nfssrv should use doors/xdr as its IPC mech to mountd(1m)
rmesta
parents: 1676
diff changeset
   155
043bd360aabc 6417056 nfssrv should use doors/xdr as its IPC mech to mountd(1m)
rmesta
parents: 1676
diff changeset
   156
	/*
043bd360aabc 6417056 nfssrv should use doors/xdr as its IPC mech to mountd(1m)
rmesta
parents: 1676
diff changeset
   157
	 * Must pass the doorfd down to the kernel.
043bd360aabc 6417056 nfssrv should use doors/xdr as its IPC mech to mountd(1m)
rmesta
parents: 1676
diff changeset
   158
	 */
043bd360aabc 6417056 nfssrv should use doors/xdr as its IPC mech to mountd(1m)
rmesta
parents: 1676
diff changeset
   159
	darg = doorfd;
043bd360aabc 6417056 nfssrv should use doors/xdr as its IPC mech to mountd(1m)
rmesta
parents: 1676
diff changeset
   160
	(void) _nfssys(MOUNTD_ARGS, &darg);
043bd360aabc 6417056 nfssrv should use doors/xdr as its IPC mech to mountd(1m)
rmesta
parents: 1676
diff changeset
   161
043bd360aabc 6417056 nfssrv should use doors/xdr as its IPC mech to mountd(1m)
rmesta
parents: 1676
diff changeset
   162
	/*
043bd360aabc 6417056 nfssrv should use doors/xdr as its IPC mech to mountd(1m)
rmesta
parents: 1676
diff changeset
   163
	 * Wait for incoming calls
043bd360aabc 6417056 nfssrv should use doors/xdr as its IPC mech to mountd(1m)
rmesta
parents: 1676
diff changeset
   164
	 */
043bd360aabc 6417056 nfssrv should use doors/xdr as its IPC mech to mountd(1m)
rmesta
parents: 1676
diff changeset
   165
	/*CONSTCOND*/
043bd360aabc 6417056 nfssrv should use doors/xdr as its IPC mech to mountd(1m)
rmesta
parents: 1676
diff changeset
   166
	for (;;)
043bd360aabc 6417056 nfssrv should use doors/xdr as its IPC mech to mountd(1m)
rmesta
parents: 1676
diff changeset
   167
		(void) pause();
043bd360aabc 6417056 nfssrv should use doors/xdr as its IPC mech to mountd(1m)
rmesta
parents: 1676
diff changeset
   168
043bd360aabc 6417056 nfssrv should use doors/xdr as its IPC mech to mountd(1m)
rmesta
parents: 1676
diff changeset
   169
	/*NOTREACHED*/
043bd360aabc 6417056 nfssrv should use doors/xdr as its IPC mech to mountd(1m)
rmesta
parents: 1676
diff changeset
   170
	syslog(LOG_ERR, gettext("Door server exited"));
043bd360aabc 6417056 nfssrv should use doors/xdr as its IPC mech to mountd(1m)
rmesta
parents: 1676
diff changeset
   171
	return (NULL);
043bd360aabc 6417056 nfssrv should use doors/xdr as its IPC mech to mountd(1m)
rmesta
parents: 1676
diff changeset
   172
}
043bd360aabc 6417056 nfssrv should use doors/xdr as its IPC mech to mountd(1m)
rmesta
parents: 1676
diff changeset
   173
249
6233bc9dd306 6271088 gcc and cmd/fs.d/autofs don't get along
jwahlig
parents: 199
diff changeset
   174
int
6233bc9dd306 6271088 gcc and cmd/fs.d/autofs don't get along
jwahlig
parents: 199
diff changeset
   175
main(int argc, char *argv[])
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   176
{
2140
043bd360aabc 6417056 nfssrv should use doors/xdr as its IPC mech to mountd(1m)
rmesta
parents: 1676
diff changeset
   177
	int	pid;
043bd360aabc 6417056 nfssrv should use doors/xdr as its IPC mech to mountd(1m)
rmesta
parents: 1676
diff changeset
   178
	int	c;
043bd360aabc 6417056 nfssrv should use doors/xdr as its IPC mech to mountd(1m)
rmesta
parents: 1676
diff changeset
   179
	int	rpc_svc_mode = RPC_SVC_MT_AUTO;
043bd360aabc 6417056 nfssrv should use doors/xdr as its IPC mech to mountd(1m)
rmesta
parents: 1676
diff changeset
   180
	int	maxthreads;
043bd360aabc 6417056 nfssrv should use doors/xdr as its IPC mech to mountd(1m)
rmesta
parents: 1676
diff changeset
   181
	int	maxrecsz = RPC_MAXDATASIZE;
043bd360aabc 6417056 nfssrv should use doors/xdr as its IPC mech to mountd(1m)
rmesta
parents: 1676
diff changeset
   182
	bool_t	exclbind = TRUE;
043bd360aabc 6417056 nfssrv should use doors/xdr as its IPC mech to mountd(1m)
rmesta
parents: 1676
diff changeset
   183
	bool_t	can_do_mlp;
043bd360aabc 6417056 nfssrv should use doors/xdr as its IPC mech to mountd(1m)
rmesta
parents: 1676
diff changeset
   184
	long	thr_flags = (THR_NEW_LWP|THR_DAEMON);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   185
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   186
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   187
	 * Mountd requires uid 0 for:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   188
	 *	/etc/rmtab updates (we could chown it to daemon)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   189
	 *	/etc/dfs/dfstab reading (it wants to lock out share which
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   190
	 *		doesn't do any locking before first truncate;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   191
	 *		NFS share does; should use fcntl locking instead)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   192
	 *	Needed privileges:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   193
	 *		auditing
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   194
	 *		nfs syscall
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   195
	 *		file dac search (so it can stat all files)
1676
37f4a3e2bd99 PSARC/2002/762 Layered Trusted Solaris
jpk
parents: 1610
diff changeset
   196
	 *	Optional privileges:
37f4a3e2bd99 PSARC/2002/762 Layered Trusted Solaris
jpk
parents: 1610
diff changeset
   197
	 *		MLP
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   198
	 */
1676
37f4a3e2bd99 PSARC/2002/762 Layered Trusted Solaris
jpk
parents: 1610
diff changeset
   199
	can_do_mlp = priv_ineffect(PRIV_NET_BINDMLP);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   200
	if (__init_daemon_priv(PU_RESETGROUPS|PU_CLEARLIMITSET, -1, -1,
1676
37f4a3e2bd99 PSARC/2002/762 Layered Trusted Solaris
jpk
parents: 1610
diff changeset
   201
	    PRIV_SYS_NFS, PRIV_PROC_AUDIT, PRIV_FILE_DAC_SEARCH,
37f4a3e2bd99 PSARC/2002/762 Layered Trusted Solaris
jpk
parents: 1610
diff changeset
   202
	    can_do_mlp ? PRIV_NET_BINDMLP : NULL, NULL) == -1) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   203
		(void) fprintf(stderr,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   204
			"%s must be run as with sufficient privileges\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   205
			argv[0]);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   206
		exit(1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   207
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   208
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   209
	maxthreads = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   210
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   211
	while ((c = getopt(argc, argv, "vrm:")) != EOF) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   212
		switch (c) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   213
		case 'v':
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   214
			verbose++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   215
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   216
		case 'r':
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   217
			rejecting = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   218
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   219
		case 'm':
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   220
			maxthreads = atoi(optarg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   221
			if (maxthreads < 1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   222
				(void) fprintf(stderr,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   223
	"%s: must specify positive maximum threads count, using default\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   224
						argv[0]);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   225
				maxthreads = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   226
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   227
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   228
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   229
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   230
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   231
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   232
	 * Read in the NFS version values from config file.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   233
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   234
	if ((defopen(NFSADMIN)) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   235
		char *defval;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   236
		int defvers;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   237
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   238
		if ((defval = defread("NFS_SERVER_VERSMIN=")) != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   239
			errno = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   240
			defvers = strtol(defval, (char **)NULL, 10);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   241
			if (errno == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   242
				mount_vers_min = defvers;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   243
				/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   244
				 * special because NFSv2 is
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   245
				 * supported by mount v1 & v2
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   246
				 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   247
				if (defvers == NFS_VERSION)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   248
					mount_vers_min = MOUNTVERS;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   249
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   250
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   251
		if ((defval = defread("NFS_SERVER_VERSMAX=")) != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   252
			errno = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   253
			defvers = strtol(defval, (char **)NULL, 10);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   254
			if (errno == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   255
				mount_vers_max = defvers;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   256
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   257
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   258
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   259
		/* close defaults file */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   260
		defopen(NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   261
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   262
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   263
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   264
	 * Sanity check versions,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   265
	 * even though we may get versions > MOUNTVERS3, we still need
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   266
	 * to start nfsauth service, so continue on regardless of values.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   267
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   268
	if (mount_vers_min > mount_vers_max) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   269
		syslog(LOG_NOTICE, "NFS_SERVER_VERSMIN > NFS_SERVER_VERSMAX");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   270
		mount_vers_max = mount_vers_min;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   271
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   272
	(void) setlocale(LC_ALL, "");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   273
	(void) rwlock_init(&sharetab_lock, USYNC_THREAD, NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   274
	(void) mutex_init(&mnttab_lock, USYNC_THREAD, NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   275
	netgroup_init();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   276
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   277
#if !defined(TEXT_DOMAIN)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   278
#define	TEXT_DOMAIN "SYS_TEST"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   279
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   280
	(void) textdomain(TEXT_DOMAIN);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   281
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   282
	/* Don't drop core if the NFS module isn't loaded. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   283
	(void) signal(SIGSYS, SIG_IGN);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   284
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   285
	(void) signal(SIGHUP, sigexit);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   286
	(void) signal(SIGCLD, sigexit);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   287
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   288
	switch (fork()) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   289
	case 0:		/* child */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   290
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   291
	case -1:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   292
		perror("mountd: can't fork");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   293
		exit(1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   294
	default:	/* parent */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   295
		for (;;)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   296
			(void) pause();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   297
		/* NOTREACHED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   298
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   299
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   300
	(void) signal(SIGHUP, SIG_DFL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   301
	(void) signal(SIGCLD, SIG_DFL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   302
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   303
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   304
	 * If we coredump it'll be in /core
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   305
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   306
	if (chdir("/") < 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   307
		syslog(LOG_ERR, "chdir /: %m");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   308
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   309
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   310
	 * Close existing file descriptors, open "/dev/null" as
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   311
	 * standard input, output, and error, and detach from
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   312
	 * controlling terminal.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   313
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   314
	closefrom(0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   315
	(void) open("/dev/null", O_RDONLY);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   316
	(void) open("/dev/null", O_WRONLY);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   317
	(void) dup(1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   318
	(void) setsid();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   319
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   320
	openlog("mountd", LOG_PID, LOG_DAEMON);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   321
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   322
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   323
	 * establish our lock on the lock file and write our pid to it.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   324
	 * exit if some other process holds the lock, or if there's any
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   325
	 * error in writing/locking the file.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   326
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   327
	pid = _enter_daemon_lock(MOUNTD);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   328
	switch (pid) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   329
	case 0:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   330
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   331
	case -1:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   332
		syslog(LOG_ERR, "error locking for %s: %s", MOUNTD,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   333
		    strerror(errno));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   334
		exit(2);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   335
	default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   336
		/* daemon was already running */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   337
		exit(0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   338
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   339
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   340
	audit_mountd_setup();	/* BSM */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   341
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   342
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   343
	 * Tell RPC that we want automatic thread mode.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   344
	 * A new thread will be spawned for each request.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   345
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   346
	if (!rpc_control(RPC_SVC_MTMODE_SET, &rpc_svc_mode)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   347
		syslog(LOG_ERR, "unable to set automatic MT mode");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   348
		exit(1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   349
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   350
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   351
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   352
	 * Enable non-blocking mode and maximum record size checks for
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   353
	 * connection oriented transports.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   354
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   355
	if (!rpc_control(RPC_SVC_CONNMAXREC_SET, &maxrecsz)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   356
		syslog(LOG_INFO, "unable to set RPC max record size");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   357
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   358
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   359
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   360
	 * Prevent our non-priv udp and tcp ports bound w/wildcard addr
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   361
	 * from being hijacked by a bind to a more specific addr.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   362
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   363
	if (!rpc_control(__RPC_SVC_EXCLBIND_SET, &exclbind)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   364
		syslog(LOG_INFO,  "warning: unable to set udp/tcp EXCLBIND");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   365
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   366
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   367
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   368
	 * If the -m argument was specified, then set the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   369
	 * maximum number of threads to the value specified.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   370
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   371
	if (maxthreads > 0 && !rpc_control(RPC_SVC_THRMAX_SET, &maxthreads)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   372
		syslog(LOG_ERR, "unable to set maxthreads");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   373
		exit(1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   374
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   375
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   376
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   377
	 * Make sure to unregister any previous versions in case the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   378
	 * user is reconfiguring the server in interesting ways.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   379
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   380
	svc_unreg(MOUNTPROG, MOUNTVERS);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   381
	svc_unreg(MOUNTPROG, MOUNTVERS_POSIX);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   382
	svc_unreg(MOUNTPROG, MOUNTVERS3);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   383
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   384
	/*
2140
043bd360aabc 6417056 nfssrv should use doors/xdr as its IPC mech to mountd(1m)
rmesta
parents: 1676
diff changeset
   385
	 * Create the nfsauth thread with same signal disposition
043bd360aabc 6417056 nfssrv should use doors/xdr as its IPC mech to mountd(1m)
rmesta
parents: 1676
diff changeset
   386
	 * as the main thread. We need to create a separate thread
043bd360aabc 6417056 nfssrv should use doors/xdr as its IPC mech to mountd(1m)
rmesta
parents: 1676
diff changeset
   387
	 * since mountd() will be both an RPC server (for remote
043bd360aabc 6417056 nfssrv should use doors/xdr as its IPC mech to mountd(1m)
rmesta
parents: 1676
diff changeset
   388
	 * traffic) _and_ a doors server (for kernel upcalls).
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   389
	 */
2140
043bd360aabc 6417056 nfssrv should use doors/xdr as its IPC mech to mountd(1m)
rmesta
parents: 1676
diff changeset
   390
	if (thr_create(NULL, 0, nfsauth_svc, 0, thr_flags, &nfsauth_thread)) {
043bd360aabc 6417056 nfssrv should use doors/xdr as its IPC mech to mountd(1m)
rmesta
parents: 1676
diff changeset
   391
		syslog(LOG_ERR, gettext("Failed to create NFSAUTH svc thread"));
043bd360aabc 6417056 nfssrv should use doors/xdr as its IPC mech to mountd(1m)
rmesta
parents: 1676
diff changeset
   392
		exit(2);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   393
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   394
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   395
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   396
	 * Create datagram and connection oriented services
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   397
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   398
	if (mount_vers_max >= MOUNTVERS) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   399
		if (svc_create(mnt, MOUNTPROG, MOUNTVERS, "datagram_v") == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   400
			syslog(LOG_ERR,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   401
				"couldn't register datagram_v MOUNTVERS");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   402
			exit(1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   403
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   404
		if (svc_create(mnt, MOUNTPROG, MOUNTVERS, "circuit_v") == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   405
			syslog(LOG_ERR,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   406
				"couldn't register circuit_v MOUNTVERS");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   407
			exit(1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   408
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   409
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   410
	if (mount_vers_max >= MOUNTVERS_POSIX) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   411
		if (svc_create(mnt, MOUNTPROG, MOUNTVERS_POSIX,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   412
							"datagram_v") == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   413
			syslog(LOG_ERR,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   414
				"couldn't register datagram_v MOUNTVERS_POSIX");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   415
			exit(1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   416
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   417
		if (svc_create(mnt, MOUNTPROG, MOUNTVERS_POSIX,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   418
							"circuit_v") == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   419
			syslog(LOG_ERR,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   420
				"couldn't register circuit_v MOUNTVERS_POSIX");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   421
			exit(1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   422
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   423
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   424
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   425
	if (mount_vers_max >= MOUNTVERS3) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   426
		if (svc_create(mnt, MOUNTPROG, MOUNTVERS3, "datagram_v") == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   427
			syslog(LOG_ERR,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   428
				"couldn't register datagram_v MOUNTVERS3");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   429
			exit(1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   430
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   431
		if (svc_create(mnt, MOUNTPROG, MOUNTVERS3, "circuit_v") == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   432
			syslog(LOG_ERR,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   433
				"couldn't register circuit_v MOUNTVERS3");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   434
			exit(1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   435
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   436
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   437
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   438
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   439
	 * Start serving
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   440
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   441
	rmtab_load();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   442
	(void) kill(getppid(), SIGHUP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   443
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   444
	/* Get rid of the most dangerous basic privileges. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   445
	__fini_daemon_priv(PRIV_PROC_EXEC, PRIV_PROC_INFO, PRIV_PROC_SESSION,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   446
	    (char *)NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   447
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   448
	svc_run();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   449
	syslog(LOG_ERR, "Error: svc_run shouldn't have returned");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   450
	abort();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   451
	/* NOTREACHED */
249
6233bc9dd306 6271088 gcc and cmd/fs.d/autofs don't get along
jwahlig
parents: 199
diff changeset
   452
	return (0);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   453
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   454
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   455
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   456
 * Server procedure switch routine
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   457
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   458
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   459
mnt(struct svc_req *rqstp, SVCXPRT *transp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   460
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   461
	switch (rqstp->rq_proc) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   462
	case NULLPROC:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   463
		errno = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   464
		if (!svc_sendreply(transp, xdr_void, (char *)0))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   465
			log_cant_reply(transp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   466
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   467
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   468
	case MOUNTPROC_MNT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   469
		mount(rqstp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   470
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   471
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   472
	case MOUNTPROC_DUMP:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   473
		mntlist_send(transp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   474
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   475
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   476
	case MOUNTPROC_UMNT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   477
		umount(rqstp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   478
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   479
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   480
	case MOUNTPROC_UMNTALL:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   481
		umountall(rqstp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   482
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   483
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   484
	case MOUNTPROC_EXPORT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   485
	case MOUNTPROC_EXPORTALL:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   486
		export(rqstp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   487
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   488
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   489
	case MOUNTPROC_PATHCONF:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   490
		if (rqstp->rq_vers == MOUNTVERS_POSIX)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   491
			mnt_pathconf(rqstp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   492
		else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   493
			svcerr_noproc(transp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   494
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   495
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   496
	default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   497
		svcerr_noproc(transp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   498
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   499
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   500
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   501
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   502
/* Set up anonymous client */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   503
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   504
struct nd_hostservlist *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   505
anon_client(char *host)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   506
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   507
	struct nd_hostservlist *anon_hsl;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   508
	struct nd_hostserv *anon_hs;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   509
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   510
	anon_hsl = malloc(sizeof (*anon_hsl));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   511
	if (anon_hsl == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   512
		return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   513
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   514
	anon_hs = malloc(sizeof (*anon_hs));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   515
	if (anon_hs == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   516
		free(anon_hsl);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   517
		return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   518
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   519
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   520
	if (host == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   521
		anon_hs->h_host = strdup("(anon)");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   522
	else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   523
		anon_hs->h_host = strdup(host);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   524
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   525
	if (anon_hs->h_host == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   526
		free(anon_hs);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   527
		free(anon_hsl);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   528
		return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   529
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   530
	anon_hs->h_serv = '\0';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   531
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   532
	anon_hsl->h_cnt = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   533
	anon_hsl->h_hostservs = anon_hs;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   534
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   535
	return (anon_hsl);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   536
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   537
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   538
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   539
 * Get the client's hostname from the transport handle
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   540
 * If the name is not available then return "(anon)".
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   541
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   542
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   543
getclientsnames(SVCXPRT *transp, struct netbuf **nbuf,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   544
    struct nd_hostservlist **serv)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   545
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   546
	struct netconfig *nconf;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   547
	char tmp[MAXIPADDRLEN];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   548
	char *host = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   549
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   550
	nconf = getnetconfigent(transp->xp_netid);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   551
	if (nconf == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   552
		syslog(LOG_ERR, "%s: getnetconfigent failed",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   553
			transp->xp_netid);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   554
		*serv = anon_client(host);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   555
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   556
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   557
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   558
	*nbuf = svc_getrpccaller(transp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   559
	if (*nbuf == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   560
		freenetconfigent(nconf);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   561
		*serv = anon_client(host);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   562
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   563
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   564
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   565
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   566
	 * Use the this API instead of the netdir_getbyaddr()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   567
	 * to avoid service lookup.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   568
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   569
	if (__netdir_getbyaddr_nosrv(nconf, serv, *nbuf)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   570
		host = &tmp[0];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   571
		if (strcmp(nconf->nc_protofmly, NC_INET) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   572
			struct sockaddr_in *sa;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   573
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   574
			/* LINTED pointer alignment */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   575
			sa = (struct sockaddr_in *)((*nbuf)->buf);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   576
			(void) inet_ntoa_r(sa->sin_addr, tmp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   577
			*serv =	anon_client(host);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   578
			freenetconfigent(nconf);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   579
			return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   580
		} else if (strcmp(nconf->nc_protofmly, NC_INET6) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   581
			struct sockaddr_in6 *sa;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   582
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   583
			/* LINTED pointer alignment */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   584
			sa = (struct sockaddr_in6 *)((*nbuf)->buf);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   585
			(void) inet_ntop(AF_INET6, sa->sin6_addr.s6_addr,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   586
					tmp, INET6_ADDRSTRLEN);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   587
			*serv =	anon_client(host);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   588
			freenetconfigent(nconf);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   589
			return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   590
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   591
		freenetconfigent(nconf);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   592
		*serv = anon_client(host);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   593
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   594
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   595
	freenetconfigent(nconf);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   596
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   597
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   598
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   599
log_cant_reply(SVCXPRT *transp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   600
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   601
	int saverrno;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   602
	struct nd_hostservlist *clnames = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   603
	register char *host;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   604
	struct netbuf *nb;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   605
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   606
	saverrno = errno;	/* save error code */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   607
	getclientsnames(transp, &nb, &clnames);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   608
	if (clnames == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   609
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   610
	host = clnames->h_hostservs->h_host;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   611
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   612
	errno = saverrno;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   613
	if (errno == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   614
		syslog(LOG_ERR, "couldn't send reply to %s", host);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   615
	else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   616
		syslog(LOG_ERR, "couldn't send reply to %s: %m", host);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   617
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   618
	netdir_free(clnames, ND_HOSTSERVLIST);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   619
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   620
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   621
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   622
 * Answer pathconf questions for the mount point fs
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   623
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   624
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   625
mnt_pathconf(struct svc_req *rqstp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   626
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   627
	SVCXPRT *transp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   628
	struct pathcnf p;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   629
	char *path, rpath[MAXPATHLEN];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   630
	struct stat st;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   631
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   632
	transp = rqstp->rq_xprt;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   633
	path = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   634
	(void) memset((caddr_t)&p, 0, sizeof (p));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   635
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   636
	if (!svc_getargs(transp, xdr_dirpath, (caddr_t)&path)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   637
		svcerr_decode(transp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   638
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   639
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   640
	if (lstat(path, &st) < 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   641
		_PC_SET(_PC_ERROR, p.pc_mask);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   642
		goto done;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   643
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   644
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   645
	 * Get a path without symbolic links.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   646
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   647
	if (realpath(path, rpath) == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   648
		syslog(LOG_DEBUG,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   649
			"mount request: realpath failed on %s: %m",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   650
			path);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   651
		_PC_SET(_PC_ERROR, p.pc_mask);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   652
		goto done;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   653
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   654
	(void) memset((caddr_t)&p, 0, sizeof (p));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   655
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   656
	 * can't ask about devices over NFS
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   657
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   658
	_PC_SET(_PC_MAX_CANON, p.pc_mask);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   659
	_PC_SET(_PC_MAX_INPUT, p.pc_mask);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   660
	_PC_SET(_PC_PIPE_BUF, p.pc_mask);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   661
	_PC_SET(_PC_VDISABLE, p.pc_mask);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   662
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   663
	errno = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   664
	p.pc_link_max = pathconf(rpath, _PC_LINK_MAX);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   665
	if (errno)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   666
		_PC_SET(_PC_LINK_MAX, p.pc_mask);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   667
	p.pc_name_max = pathconf(rpath, _PC_NAME_MAX);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   668
	if (errno)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   669
		_PC_SET(_PC_NAME_MAX, p.pc_mask);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   670
	p.pc_path_max = pathconf(rpath, _PC_PATH_MAX);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   671
	if (errno)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   672
		_PC_SET(_PC_PATH_MAX, p.pc_mask);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   673
	if (pathconf(rpath, _PC_NO_TRUNC) == 1)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   674
		_PC_SET(_PC_NO_TRUNC, p.pc_mask);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   675
	if (pathconf(rpath, _PC_CHOWN_RESTRICTED) == 1)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   676
		_PC_SET(_PC_CHOWN_RESTRICTED, p.pc_mask);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   677
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   678
done:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   679
	errno = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   680
	if (!svc_sendreply(transp, xdr_ppathcnf, (char *)&p))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   681
		log_cant_reply(transp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   682
	if (path != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   683
		svc_freeargs(transp, xdr_dirpath, (caddr_t)&path);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   684
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   685
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   686
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   687
 * If the rootmount (export) option is specified, the all mount requests for
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   688
 * subdirectories return EACCES.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   689
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   690
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   691
checkrootmount(struct share *sh, char *rpath)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   692
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   693
	char *val;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   694
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   695
	if ((val = getshareopt(sh->sh_opts, SHOPT_NOSUB)) != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   696
		free(val);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   697
		if (strcmp(sh->sh_path, rpath) != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   698
			return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   699
		else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   700
			return (1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   701
	} else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   702
		return (1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   703
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   704
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   705
#define	MAX_FLAVORS	128
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   706
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   707
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   708
 * Return only EACCES if client does not have access
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   709
 *  to this directory.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   710
 * "If the server exports only /a/b, an attempt to
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   711
 *  mount a/b/c will fail with ENOENT if the directory
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   712
 *  does not exist"... However, if the client
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   713
 *  does not have access to /a/b, an attacker can
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   714
 *  determine whether the directory exists.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   715
 * This routine checks either existence of the file or
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   716
 * existence of the file name entry in the mount table.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   717
 * If the file exists and there is no file name entry,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   718
 * the error returned should be EACCES.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   719
 * If the file does not exist, it must be determined
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   720
 * whether the client has access to a parent
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   721
 * directory.  If the client has access to a parent
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   722
 * directory, the error returned should be ENOENT,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   723
 * otherwise EACCES.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   724
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   725
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   726
mount_enoent_error(char *path, char *rpath, struct nd_hostservlist *clnames,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   727
    struct netbuf *nb, int *flavor_list)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   728
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   729
	char *checkpath, *dp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   730
	struct share *sh = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   731
	int realpath_error = ENOENT, reply_error = EACCES, lofs_tried = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   732
	int flavor_count;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   733
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   734
	checkpath = strdup(path);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   735
	if (checkpath == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   736
		syslog(LOG_ERR, "mount_enoent: no memory");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   737
		return (EACCES);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   738
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   739
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   740
	/* CONSTCOND */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   741
	while (1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   742
		if (sh) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   743
			sharefree(sh);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   744
			sh = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   745
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   746
		if ((sh = findentry(rpath)) == NULL &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   747
			(sh = find_lofsentry(rpath, &lofs_tried)) == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   748
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   749
			 * There is no file name entry.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   750
			 * If the file (with symbolic links resolved) exists,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   751
			 * the error returned should be EACCES.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   752
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   753
			if (realpath_error == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   754
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   755
		} else if (checkrootmount(sh, rpath) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   756
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   757
			 * This is a "nosub" only export, in which case,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   758
			 * mounting subdirectories isn't allowed.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   759
			 * If the file (with symbolic links resolved) exists,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   760
			 * the error returned should be EACCES.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   761
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   762
			if (realpath_error == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   763
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   764
		} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   765
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   766
			 * Check permissions in mount table.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   767
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   768
			if (newopts(sh->sh_opts))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   769
				flavor_count = getclientsflavors_new(sh, nb,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   770
					clnames, flavor_list);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   771
			else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   772
				flavor_count = getclientsflavors_old(sh, nb,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   773
					clnames, flavor_list);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   774
			if (flavor_count != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   775
				/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   776
				 * Found entry in table and
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   777
				 * client has correct permissions.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   778
				 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   779
				reply_error = ENOENT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   780
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   781
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   782
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   783
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   784
		 * Check all parent directories.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   785
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   786
		dp = strrchr(checkpath, '/');
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   787
		if (dp == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   788
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   789
		*dp = '\0';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   790
		if (strlen(checkpath) == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   791
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   792
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   793
		 * Get the real path (no symbolic links in it)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   794
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   795
		if (realpath(checkpath, rpath) == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   796
			if (errno != ENOENT)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   797
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   798
		} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   799
			realpath_error = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   800
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   801
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   802
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   803
	if (sh)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   804
		sharefree(sh);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   805
	free(checkpath);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   806
	return (reply_error);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   807
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   808
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   809
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   810
 * Check mount requests, add to mounted list if ok
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   811
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   812
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   813
mount(struct svc_req *rqstp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   814
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   815
	SVCXPRT *transp;
1610
3436e82414c8 6344186 NFSv3 needs to support .zfs (like NFSv4 already does)
thurlow
parents: 249
diff changeset
   816
	int version, vers;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   817
	struct fhstatus fhs;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   818
	struct mountres3 mountres3;
1610
3436e82414c8 6344186 NFSv3 needs to support .zfs (like NFSv4 already does)
thurlow
parents: 249
diff changeset
   819
	char fh[FHSIZE3];
3436e82414c8 6344186 NFSv3 needs to support .zfs (like NFSv4 already does)
thurlow
parents: 249
diff changeset
   820
	int len = FHSIZE3;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   821
	char *path, rpath[MAXPATHLEN];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   822
	struct share *sh = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   823
	struct nd_hostservlist *clnames = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   824
	char *host = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   825
	int error = 0, lofs_tried = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   826
	int flavor_list[MAX_FLAVORS];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   827
	int flavor_count;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   828
	struct netbuf *nb;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   829
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   830
	transp = rqstp->rq_xprt;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   831
	version = rqstp->rq_vers;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   832
	path = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   833
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   834
	if (!svc_getargs(transp, xdr_dirpath, (caddr_t)&path)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   835
		svcerr_decode(transp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   836
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   837
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   838
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   839
	getclientsnames(transp, &nb, &clnames);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   840
	if (clnames == NULL || nb == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   841
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   842
		 * We failed to get a name for the client, even 'anon',
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   843
		 * probably because we ran out of memory. In this situation
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   844
		 * it doesn't make sense to allow the mount to succeed.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   845
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   846
		error = EACCES;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   847
		goto reply;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   848
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   849
	host = clnames->h_hostservs[0].h_host;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   850
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   851
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   852
	 * If the version being used is less than the minimum version,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   853
	 * the filehandle translation should not be provided to the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   854
	 * client.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   855
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   856
	if (rejecting || version < mount_vers_min) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   857
		if (verbose)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   858
			syslog(LOG_NOTICE, "Rejected mount: %s for %s",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   859
				host, path);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   860
		error = EACCES;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   861
		goto reply;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   862
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   863
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   864
	/*
1676
37f4a3e2bd99 PSARC/2002/762 Layered Trusted Solaris
jpk
parents: 1610
diff changeset
   865
	 * Trusted Extension doesn't support older versions of nfs(v2, v3).
37f4a3e2bd99 PSARC/2002/762 Layered Trusted Solaris
jpk
parents: 1610
diff changeset
   866
	 * To prevent circumventing TX label policy via using an older
37f4a3e2bd99 PSARC/2002/762 Layered Trusted Solaris
jpk
parents: 1610
diff changeset
   867
	 * version of nfs client, reject the mount request and log an
37f4a3e2bd99 PSARC/2002/762 Layered Trusted Solaris
jpk
parents: 1610
diff changeset
   868
	 * error.
37f4a3e2bd99 PSARC/2002/762 Layered Trusted Solaris
jpk
parents: 1610
diff changeset
   869
	 */
37f4a3e2bd99 PSARC/2002/762 Layered Trusted Solaris
jpk
parents: 1610
diff changeset
   870
	if (is_system_labeled()) {
37f4a3e2bd99 PSARC/2002/762 Layered Trusted Solaris
jpk
parents: 1610
diff changeset
   871
		syslog(LOG_ERR,
37f4a3e2bd99 PSARC/2002/762 Layered Trusted Solaris
jpk
parents: 1610
diff changeset
   872
		    "mount rejected: Solaris TX only supports nfs4 clients");
37f4a3e2bd99 PSARC/2002/762 Layered Trusted Solaris
jpk
parents: 1610
diff changeset
   873
		error = EACCES;
37f4a3e2bd99 PSARC/2002/762 Layered Trusted Solaris
jpk
parents: 1610
diff changeset
   874
		goto reply;
37f4a3e2bd99 PSARC/2002/762 Layered Trusted Solaris
jpk
parents: 1610
diff changeset
   875
	}
37f4a3e2bd99 PSARC/2002/762 Layered Trusted Solaris
jpk
parents: 1610
diff changeset
   876
37f4a3e2bd99 PSARC/2002/762 Layered Trusted Solaris
jpk
parents: 1610
diff changeset
   877
	/*
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   878
	 * Get the real path (no symbolic links in it)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   879
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   880
	if (realpath(path, rpath) == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   881
		error = errno;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   882
		if (verbose)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   883
			syslog(LOG_ERR,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   884
				"mount request: realpath: %s: %m", path);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   885
		if (error == ENOENT)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   886
			error = mount_enoent_error(path, rpath, clnames, nb,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   887
					flavor_list);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   888
		goto reply;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   889
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   890
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   891
	if ((sh = findentry(rpath)) == NULL &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   892
		(sh = find_lofsentry(rpath, &lofs_tried)) == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   893
		error = EACCES;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   894
		goto reply;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   895
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   896
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   897
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   898
	 * Check if this is a "nosub" only export, in which case, mounting
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   899
	 * subdirectories isn't allowed. Bug 1184573.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   900
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   901
	if (checkrootmount(sh, rpath) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   902
		error = EACCES;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   903
		goto reply;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   904
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   905
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   906
	if (newopts(sh->sh_opts))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   907
		flavor_count = getclientsflavors_new(sh, nb, clnames,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   908
					flavor_list);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   909
	else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   910
		flavor_count = getclientsflavors_old(sh, nb, clnames,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   911
					flavor_list);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   912
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   913
	if (flavor_count == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   914
		error = EACCES;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   915
		goto reply;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   916
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   917
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   918
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   919
	 * Now get the filehandle.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   920
	 *
1610
3436e82414c8 6344186 NFSv3 needs to support .zfs (like NFSv4 already does)
thurlow
parents: 249
diff changeset
   921
	 * NFS V2 clients get a 32 byte filehandle.
3436e82414c8 6344186 NFSv3 needs to support .zfs (like NFSv4 already does)
thurlow
parents: 249
diff changeset
   922
	 * NFS V3 clients get a 32 or 64 byte filehandle, depending on
3436e82414c8 6344186 NFSv3 needs to support .zfs (like NFSv4 already does)
thurlow
parents: 249
diff changeset
   923
	 * the embedded FIDs.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   924
	 */
1610
3436e82414c8 6344186 NFSv3 needs to support .zfs (like NFSv4 already does)
thurlow
parents: 249
diff changeset
   925
	vers = (version == MOUNTVERS3) ? NFS_V3 : NFS_VERSION;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   926
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   927
	/* LINTED pointer alignment */
1610
3436e82414c8 6344186 NFSv3 needs to support .zfs (like NFSv4 already does)
thurlow
parents: 249
diff changeset
   928
	while (nfs_getfh(rpath, vers, &len, fh) < 0) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   929
		if (errno == EINVAL &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   930
			(sh = find_lofsentry(rpath, &lofs_tried)) != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   931
			errno = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   932
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   933
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   934
		error = errno == EINVAL ? EACCES : errno;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   935
		syslog(LOG_DEBUG, "mount request: getfh failed on %s: %m",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   936
			path);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   937
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   938
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   939
1610
3436e82414c8 6344186 NFSv3 needs to support .zfs (like NFSv4 already does)
thurlow
parents: 249
diff changeset
   940
	if (version == MOUNTVERS3) {
3436e82414c8 6344186 NFSv3 needs to support .zfs (like NFSv4 already does)
thurlow
parents: 249
diff changeset
   941
		mountres3.mountres3_u.mountinfo.fhandle.fhandle3_len = len;
3436e82414c8 6344186 NFSv3 needs to support .zfs (like NFSv4 already does)
thurlow
parents: 249
diff changeset
   942
		mountres3.mountres3_u.mountinfo.fhandle.fhandle3_val = fh;
3436e82414c8 6344186 NFSv3 needs to support .zfs (like NFSv4 already does)
thurlow
parents: 249
diff changeset
   943
	} else {
3436e82414c8 6344186 NFSv3 needs to support .zfs (like NFSv4 already does)
thurlow
parents: 249
diff changeset
   944
		bcopy(fh, &fhs.fhstatus_u.fhs_fhandle, NFS_FHSIZE);
3436e82414c8 6344186 NFSv3 needs to support .zfs (like NFSv4 already does)
thurlow
parents: 249
diff changeset
   945
	}
3436e82414c8 6344186 NFSv3 needs to support .zfs (like NFSv4 already does)
thurlow
parents: 249
diff changeset
   946
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   947
reply:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   948
	switch (version) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   949
	case MOUNTVERS:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   950
	case MOUNTVERS_POSIX:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   951
		if (error == EINVAL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   952
			fhs.fhs_status = NFSERR_ACCES;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   953
		else if (error == EREMOTE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   954
			fhs.fhs_status = NFSERR_REMOTE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   955
		else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   956
			fhs.fhs_status = error;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   957
		if (!svc_sendreply(transp, xdr_fhstatus, (char *)&fhs))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   958
			log_cant_reply(transp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   959
		audit_mountd_mount(host, path, fhs.fhs_status); /* BSM */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   960
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   961
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   962
	case MOUNTVERS3:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   963
		if (!error) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   964
		mountres3.mountres3_u.mountinfo.auth_flavors.auth_flavors_val =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   965
			flavor_list;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   966
		mountres3.mountres3_u.mountinfo.auth_flavors.auth_flavors_len =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   967
			flavor_count;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   968
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   969
		} else if (error == ENAMETOOLONG)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   970
			error = MNT3ERR_NAMETOOLONG;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   971
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   972
		mountres3.fhs_status = error;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   973
		if (!svc_sendreply(transp, xdr_mountres3, (char *)&mountres3))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   974
			log_cant_reply(transp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   975
		audit_mountd_mount(host, path, mountres3.fhs_status); /* BSM */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   976
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   977
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   978
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   979
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   980
	if (verbose)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   981
		syslog(LOG_NOTICE, "MOUNT: %s %s %s",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   982
			(host == NULL) ? "unknown host" : host,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   983
			error ? "denied" : "mounted", path);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   984
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   985
	if (path != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   986
		svc_freeargs(transp, xdr_dirpath, (caddr_t)&path);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   987
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   988
	if (!error)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   989
		mntlist_new(host, rpath); /* add entry to mount list */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   990
done:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   991
	if (sh)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   992
		sharefree(sh);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   993
	netdir_free(clnames, ND_HOSTSERVLIST);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   994
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   995
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   996
struct share *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   997
findentry(char *path)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   998
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   999
	struct share *sh = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1000
	struct sh_list *shp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1001
	register char *p1, *p2;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1002
	struct stat st1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1003
	struct stat64 st2;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1004
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1005
	check_sharetab();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1006
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1007
	(void) rw_rdlock(&sharetab_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1008
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1009
	for (shp = share_list; shp; shp = shp->shl_next) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1010
		sh = shp->shl_sh;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1011
		for (p1 = sh->sh_path, p2 = path; *p1 == *p2; p1++, p2++)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1012
			if (*p1 == '\0')
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1013
				goto done;	/* exact match */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1014
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1015
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1016
		 * Now compare the pathnames for three cases:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1017
		 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1018
		 * Parent: /export/foo		(no trailing slash on parent)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1019
		 * Child:  /export/foo/bar
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1020
		 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1021
		 * Parent: /export/foo/		(trailing slash on parent)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1022
		 * Child:  /export/foo/bar
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1023
		 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1024
		 * Parent: /export/foo/		(no trailing slash on child)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1025
		 * Child:  /export/foo
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1026
		 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1027
		 * Then compare the dev_t of the parent and child to
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1028
		 * make sure that they're both in the same filesystem.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1029
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1030
		if ((*p1 == '\0' && *p2 == '/') ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1031
		    (*p1 == '\0' && *(p1-1) == '/') ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1032
		    (*p2 == '\0' && *p1 == '/' && *(p1+1) == '\0')) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1033
			if (stat(sh->sh_path, &st1) < 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1034
				if (verbose)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1035
					syslog(LOG_NOTICE, "%s: %m", p1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1036
				shp = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1037
				goto done;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1038
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1039
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1040
			 * Use stat64 on "path" since it might be larger
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1041
			 * than 2 Gb and 32 bit stat would fail EOVERFLOW
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1042
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1043
			if (stat64(path, &st2) < 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1044
				if (verbose)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1045
					syslog(LOG_NOTICE, "%s: %m", p2);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1046
				shp = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1047
				goto done;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1048
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1049
			if (st1.st_dev == st2.st_dev)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1050
				goto done;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1051
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1052
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1053
done:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1054
	sh = shp ? sharedup(sh) : NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1055
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1056
	(void) rw_unlock(&sharetab_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1057
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1058
	return (sh);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1059
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1060
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1061
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1062
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1063
is_substring(char **mntp, char **path)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1064
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1065
	char *p1 = *mntp, *p2 = *path;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1066
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1067
	if (*p1 == '\0' && *p2 == '\0') /* exact match */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1068
		return (1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1069
	else if (*p1 == '\0' && *p2 == '/')
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1070
		return (1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1071
	else if (*p1 == '\0' && *(p1-1) == '/') {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1072
		*path = --p2; /* we need the slash in p2 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1073
		return (1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1074
	} else if (*p2 == '\0') {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1075
		while (*p1 == '/')
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1076
			p1++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1077
		if (*p1 == '\0') /* exact match */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1078
			return (1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1079
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1080
	return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1081
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1082
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1083
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1084
 * find_lofsentry() searches for the real path which this requested LOFS path
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1085
 * (rpath) shadows. If found, it will return the sharetab entry of
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1086
 * the real path that corresponds to the LOFS path.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1087
 * We first search mnttab to see if the requested path is an automounted
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1088
 * path. If it is an automounted path, it will trigger the mount by stat()ing
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1089
 * the requested path. Note that it is important to check that this path is
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1090
 * actually an automounted path, otherwise we would stat() a path which may
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1091
 * turn out to be NFS and block indefinitely on a dead server. The automounter
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1092
 * times-out if the server is dead, so there's no risk of hanging this
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1093
 * thread waiting for stat().
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1094
 * After the mount has been triggered (if necessary), we look for a
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1095
 * mountpoint of type LOFS (by searching /etc/mnttab again) which
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1096
 * is a substring of the rpath. If found, we construct a new path by
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1097
 * concatenating the mnt_special and the remaining of rpath, call findentry()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1098
 * to make sure the 'real path' is shared.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1099
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1100
static struct share *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1101
find_lofsentry(char *rpath, int *done_flag)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1102
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1103
	struct stat r_stbuf;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1104
	mntlist_t *ml, *mntl, *mntpnt = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1105
	struct share *retcode = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1106
	char tmp_path[MAXPATHLEN];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1107
	int mntpnt_len = 0, tmp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1108
	char *p1, *p2;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1109
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1110
	if ((*done_flag)++)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1111
		return (retcode);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1112
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1113
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1114
	 * While fsgetmntlist() uses lockf() to
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1115
	 * lock the mnttab before reading it in,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1116
	 * the lock ignores threads in the same process.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1117
	 * Read in the mnttab with the protection of a mutex.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1118
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1119
	(void) mutex_lock(&mnttab_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1120
	mntl = fsgetmntlist();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1121
	(void) mutex_unlock(&mnttab_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1122
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1123
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1124
	 * Obtain the mountpoint for the requested path.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1125
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1126
	for (ml = mntl; ml; ml = ml->mntl_next) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1127
		for (p1 = ml->mntl_mnt->mnt_mountp, p2 = rpath;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1128
			*p1 == *p2 && *p1; p1++, p2++);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1129
		if (is_substring(&p1, &p2) &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1130
		    (tmp = strlen(ml->mntl_mnt->mnt_mountp)) >= mntpnt_len) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1131
			mntpnt = ml;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1132
			mntpnt_len = tmp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1133
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1134
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1135
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1136
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1137
	 * If the path needs to be autoFS mounted, trigger the mount by
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1138
	 * stat()ing it. This is determined by checking whether the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1139
	 * mountpoint we just found is of type autofs.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1140
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1141
	if (mntpnt != NULL &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1142
	    strcmp(mntpnt->mntl_mnt->mnt_fstype, "autofs") == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1143
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1144
		 * The requested path is a substring of an autoFS filesystem.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1145
		 * Trigger the mount.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1146
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1147
		if (stat(rpath, &r_stbuf) < 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1148
			if (verbose)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1149
				syslog(LOG_NOTICE, "%s: %m", rpath);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1150
			goto done;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1151
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1152
		if ((r_stbuf.st_mode & S_IFMT) == S_IFDIR) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1153
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1154
			 * The requested path is a directory, stat(2) it
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1155
			 * again with a trailing '.' to force the autoFS
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1156
			 * module to trigger the mount of indirect
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1157
			 * automount entries, such as /net/jurassic/.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1158
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1159
			if (strlen(rpath) + 2 > MAXPATHLEN) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1160
				if (verbose) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1161
					syslog(LOG_NOTICE,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1162
						"%s/.: exceeds MAXPATHLEN %d",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1163
						rpath, MAXPATHLEN);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1164
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1165
				goto done;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1166
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1167
			(void) strcpy(tmp_path, rpath);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1168
			(void) strcat(tmp_path, "/.");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1169
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1170
			if (stat(tmp_path, &r_stbuf) < 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1171
				if (verbose)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1172
					syslog(LOG_NOTICE, "%s: %m", tmp_path);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1173
				goto done;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1174
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1175
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1176
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1177
		 * The mount has been triggered, re-read mnttab to pick up
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1178
		 * the changes made by autoFS.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1179
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1180
		fsfreemntlist(mntl);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1181
		(void) mutex_lock(&mnttab_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1182
		mntl = fsgetmntlist();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1183
		(void) mutex_unlock(&mnttab_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1184
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1185
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1186
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1187
	 * The autoFS mountpoint has been triggered if necessary,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1188
	 * now search mnttab again to determine if the requested path
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1189
	 * is an LOFS mount of a shared path.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1190
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1191
	mntpnt_len = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1192
	for (ml = mntl; ml; ml = ml->mntl_next) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1193
		if (strcmp(ml->mntl_mnt->mnt_fstype, "lofs"))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1194
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1195
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1196
		for (p1 = ml->mntl_mnt->mnt_mountp, p2 = rpath;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1197
				*p1 == *p2 && *p1; p1++, p2++);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1198
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1199
		if (is_substring(&p1, &p2) &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1200
		    ((tmp = strlen(ml->mntl_mnt->mnt_mountp)) >= mntpnt_len)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1201
			mntpnt_len = tmp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1202
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1203
			if ((strlen(ml->mntl_mnt->mnt_special) + strlen(p2)) >
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1204
			    MAXPATHLEN) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1205
				if (verbose) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1206
					syslog(LOG_NOTICE, "%s%s: exceeds %d",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1207
						ml->mntl_mnt->mnt_special, p2,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1208
						MAXPATHLEN);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1209
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1210
				if (retcode)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1211
					sharefree(retcode);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1212
				retcode = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1213
				goto done;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1214
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1215
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1216
			(void) strcpy(tmp_path, ml->mntl_mnt->mnt_special);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1217
			(void) strcat(tmp_path, p2);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1218
			if (retcode)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1219
				sharefree(retcode);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1220
			retcode = findentry(tmp_path);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1221
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1222
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1223
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1224
	if (retcode) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1225
		assert(strlen(tmp_path) > 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1226
		(void) strcpy(rpath, tmp_path);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1227
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1228
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1229
done:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1230
	fsfreemntlist(mntl);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1231
	return (retcode);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1232
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1233
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1234
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1235
 * Determine whether an access list grants rights to a particular host.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1236
 * We match on aliases of the hostname as well as on the canonical name.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1237
 * Names in the access list may be either hosts or netgroups;  they're
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1238
 * not distinguished syntactically.  We check for hosts first because
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1239
 * it's cheaper (just M*N strcmp()s), then try netgroups.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1240
 */
249
6233bc9dd306 6271088 gcc and cmd/fs.d/autofs don't get along
jwahlig
parents: 199
diff changeset
  1241
int
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1242
in_access_list(struct netbuf *nb, struct nd_hostservlist *clnames,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1243
    char *access_list)	/* N.B. we clobber this "input" parameter */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1244
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1245
	int nentries;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1246
	char *gr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1247
	char *lasts;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1248
	char *host;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1249
	int off;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1250
	int i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1251
	int netgroup_match;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1252
	int response;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1253
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1254
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1255
	 * If no access list - then it's unrestricted
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1256
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1257
	if (access_list == NULL || *access_list == '\0')
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1258
		return (1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1259
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1260
	nentries = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1261
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1262
	for (gr = strtok_r(access_list, ":", &lasts);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1263
		gr != NULL; gr = strtok_r(NULL, ":", &lasts)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1264
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1265
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1266
		 * If the list name has a '-' prepended
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1267
		 * then a match of the following name
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1268
		 * implies failure instead of success.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1269
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1270
		if (*gr == '-') {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1271
			response = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1272
			gr++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1273
		} else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1274
			response = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1275
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1276
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1277
		 * The following loops through all the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1278
		 * client's aliases.  Usually it's just one name.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1279
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1280
		for (i = 0; i < clnames->h_cnt; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1281
			host = clnames->h_hostservs[i].h_host;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1282
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1283
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1284
			 * If the list name begins with a dot then
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1285
			 * do a domain name suffix comparison.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1286
			 * A single dot matches any name with no
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1287
			 * suffix.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1288
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1289
			if (*gr == '.') {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1290
				if (*(gr + 1) == '\0') {  /* single dot */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1291
					if (strchr(host, '.') == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1292
						return (response);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1293
				} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1294
					off = strlen(host) - strlen(gr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1295
					if (off > 0 &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1296
					    strcasecmp(host + off, gr) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1297
						return (response);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1298
					}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1299
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1300
			} else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1301
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1302
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1303
			 * If the list name begins with an at
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1304
			 * sign then do a network comparison.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1305
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1306
			if (*gr == '@') {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1307
				if (netmatch(nb, gr + 1))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1308
					return (response);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1309
			} else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1310
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1311
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1312
			 * Just do a hostname match
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1313
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1314
			if (strcasecmp(gr, host) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1315
				return (response);	/* Matched a hostname */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1316
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1317
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1318
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1319
		nentries++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1320
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1321
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1322
	netgroup_match = netgroup_check(clnames, access_list, nentries);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1323
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1324
	return (netgroup_match);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1325
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1326
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1327
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1328
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1329
netmatch(struct netbuf *nb, char *name)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1330
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1331
	uint_t claddr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1332
	struct netent n, *np;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1333
	char *mp, *p;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1334
	uint_t addr, mask;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1335
	int i, bits;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1336
	char buff[256];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1337
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1338
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1339
	 * Check if it's an IPv4 addr
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1340
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1341
	if (nb->len != sizeof (struct sockaddr_in))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1342
		return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1343
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1344
	(void) memcpy(&claddr,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1345
		/* LINTED pointer alignment */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1346
		&((struct sockaddr_in *)nb->buf)->sin_addr.s_addr,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1347
		sizeof (struct in_addr));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1348
	claddr = ntohl(claddr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1349
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1350
	mp = strchr(name, '/');
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1351
	if (mp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1352
		*mp++ = '\0';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1353
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1354
	if (isdigit(*name)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1355
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1356
		 * Convert a dotted IP address
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1357
		 * to an IP address. The conversion
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1358
		 * is not the same as that in inet_addr().
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1359
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1360
		p = name;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1361
		addr = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1362
		for (i = 0; i < 4; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1363
			addr |= atoi(p) << ((3-i) * 8);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1364
			p = strchr(p, '.');
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1365
			if (p == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1366
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1367
			p++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1368
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1369
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1370
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1371
		 * Turn the netname into
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1372
		 * an IP address.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1373
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1374
		np = getnetbyname_r(name, &n, buff, sizeof (buff));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1375
		if (np == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1376
			syslog(LOG_DEBUG, "getnetbyname_r: %s: %m", name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1377
			return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1378
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1379
		addr = np->n_net;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1380
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1381
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1382
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1383
	 * If the mask is specified explicitly then
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1384
	 * use that value, e.g.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1385
	 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1386
	 *    @109.104.56/28
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1387
	 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1388
	 * otherwise assume a mask from the zero octets
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1389
	 * in the least significant bits of the address, e.g.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1390
	 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1391
	 *   @109.104  or  @109.104.0.0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1392
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1393
	if (mp) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1394
		bits = atoi(mp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1395
		mask = bits ? ~0 << ((sizeof (struct in_addr) * NBBY) - bits)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1396
			: 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1397
		addr &= mask;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1398
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1399
		if ((addr & 0x00ffffff) == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1400
			mask = 0xff000000;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1401
		else if ((addr & 0x0000ffff) == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1402
			mask = 0xffff0000;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1403
		else if ((addr & 0x000000ff) == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1404
			mask = 0xffffff00;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1405
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1406
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1407
	return ((claddr & mask) == addr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1408
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1409
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1410
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1411
static char *optlist[] = {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1412
#define	OPT_RO		0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1413
	SHOPT_RO,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1414
#define	OPT_RW		1
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1415
	SHOPT_RW,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1416
#define	OPT_ROOT	2
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1417
	SHOPT_ROOT,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1418
#define	OPT_SECURE	3
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1419
	SHOPT_SECURE,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1420
#define	OPT_ANON	4
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1421
	SHOPT_ANON,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1422
#define	OPT_WINDOW	5
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1423
	SHOPT_WINDOW,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1424
#define	OPT_NOSUID	6
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1425
	SHOPT_NOSUID,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1426
#define	OPT_ACLOK	7
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1427
	SHOPT_ACLOK,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1428
#define	OPT_SEC		8
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1429
	SHOPT_SEC,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1430
	NULL
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1431
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1432
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1433
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1434
map_flavor(char *str)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1435
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1436
	seconfig_t sec;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1437
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1438
	if (nfs_getseconfig_byname(str, &sec))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1439
		return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1440
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1441
	return (sec.sc_nfsnum);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1442
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1443
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1444
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1445
 * If the option string contains a "sec="
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1446
 * option, then use new option syntax.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1447
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1448
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1449
newopts(char *opts)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1450
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1451
	char *head, *p, *val;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1452
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1453
	if (!opts || *opts == '\0')
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1454
		return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1455
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1456
	head = strdup(opts);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1457
	if (head == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1458
		syslog(LOG_ERR, "opts: no memory");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1459
		return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1460
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1461
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1462
	p = head;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1463
	while (*p) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1464
		if (getsubopt(&p, optlist, &val) == OPT_SEC) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1465
			free(head);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1466
			return (1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1467
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1468
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1469
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1470
	free(head);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1471
	return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1472
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1473
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1474
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1475
 * Given an export and the clients hostname(s)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1476
 * determine the security flavors that this
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1477
 * client is permitted to use.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1478
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1479
 * This routine is called only for "old" syntax, i.e.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1480
 * only one security flavor is allowed.  So we need
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1481
 * to determine two things: the particular flavor,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1482
 * and whether the client is allowed to use this
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1483
 * flavor, i.e. is in the access list.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1484
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1485
 * Note that if there is no access list, then the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1486
 * default is that access is granted.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1487
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1488
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1489
getclientsflavors_old(struct share *sh, struct netbuf *nb,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1490
    struct nd_hostservlist *clnames, int *flavors)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1491
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1492
	char *opts, *p, *val;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1493
	int ok = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1494
	int defaultaccess = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1495
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1496
	opts = strdup(sh->sh_opts);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1497
	if (opts == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1498
		syslog(LOG_ERR, "getclientsflavors: no memory");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1499
		return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1500
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1501
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1502
	flavors[0] = AUTH_SYS;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1503
	p = opts;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1504
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1505
	while (*p) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1506
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1507
		switch (getsubopt(&p, optlist, &val)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1508
		case OPT_SECURE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1509
			flavors[0] = AUTH_DES;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1510
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1511
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1512
		case OPT_RO:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1513
		case OPT_RW:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1514
			defaultaccess = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1515
			if (in_access_list(nb, clnames, val))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1516
				ok++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1517
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1518
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1519
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1520
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1521
	free(opts);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1522
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1523
	return (defaultaccess || ok);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1524
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1525
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1526
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1527
 * Given an export and the clients hostname(s)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1528
 * determine the security flavors that this
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1529
 * client is permitted to use.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1530
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1531
 * This is somewhat more complicated than the "old"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1532
 * routine because the options may contain multiple
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1533
 * security flavors (sec=) each with its own access
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1534
 * lists.  So a client could be granted access based
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1535
 * on a number of security flavors.  Note that the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1536
 * type of access might not always be the same, the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1537
 * client may get readonly access with one flavor
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1538
 * and readwrite with another, however the client
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1539
 * is not told this detail, it gets only the list
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1540
 * of flavors, and only if the client is using
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1541
 * version 3 of the mount protocol.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1542
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1543
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1544
getclientsflavors_new(struct share *sh, struct netbuf *nb,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1545
    struct nd_hostservlist *clnames, int *flavors)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1546
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1547
	char *opts, *p, *val;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1548
	char *lasts;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1549
	char *f;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1550
	int access_ok, count, c;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1551
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1552
	opts = strdup(sh->sh_opts);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1553
	if (opts == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1554
		syslog(LOG_ERR, "getclientsflavors: no memory");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1555
		return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1556
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1557
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1558
	p = opts;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1559
	count = c = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1560
	/* default access is rw */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1561
	access_ok = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1562
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1563
	while (*p) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1564
		switch (getsubopt(&p, optlist, &val)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1565
		case OPT_SEC:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1566
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1567
			 * Before a new sec=xxx option, check if we need
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1568
			 * to move the c index back to the previous count.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1569
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1570
			if (!access_ok) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1571
				c = count;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1572
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1573
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1574
			/* get all the sec=f1[:f2] flavors */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1575
			while ((f = strtok_r(val, ":", &lasts))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1576
					!= NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1577
				flavors[c++] = map_flavor(f);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1578
				val = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1579
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1580
			/* for a new sec=xxx option, default is rw access */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1581
			access_ok = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1582
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1583
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1584
		case OPT_RO:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1585
		case OPT_RW:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1586
			if (in_access_list(nb, clnames, val)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1587
				count = c;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1588
				access_ok = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1589
			} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1590
				access_ok = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1591
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1592
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1593
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1594
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1595
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1596
	if (!access_ok) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1597
		c = count;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1598
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1599
	free(opts);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1600
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1601
	return (c);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1602
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1603
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1604
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1605
 * This is a tricky piece of code that parses the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1606
 * share options looking for a match on the auth
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1607
 * flavor that the client is using. If it finds
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1608
 * a match, then the client is given ro, rw, or
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1609
 * no access depending whether it is in the access
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1610
 * list.  There is a special case for "secure"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1611
 * flavor.  Other flavors are values of the new "sec=" option.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1612
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1613
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1614
check_client(struct share *sh, struct netbuf *nb,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1615
    struct nd_hostservlist *clnames, int flavor)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1616
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1617
	if (newopts(sh->sh_opts))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1618
		return (check_client_new(sh, nb, clnames, flavor));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1619
	else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1620
		return (check_client_old(sh, nb, clnames, flavor));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1621
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1622
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1623
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1624
check_client_old(struct share *sh, struct netbuf *nb,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1625
    struct nd_hostservlist *clnames, int flavor)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1626
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1627
	char *opts, *p, *val;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1628
	int match;	/* Set when a flavor is matched */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1629
	int perm = 0;	/* Set when "ro", "rw" or "root" is matched */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1630
	int list = 0;	/* Set when "ro", "rw" is found */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1631
	int ro_val = 0;	/* Set if ro option is 'ro=' */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1632
	int rw_val = 0;	/* Set if rw option is 'rw=' */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1633
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1634
	opts = strdup(sh->sh_opts);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1635
	if (opts == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1636
		syslog(LOG_ERR, "check_client: no memory");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1637
		return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1638
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1639
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1640
	p = opts;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1641
	match = AUTH_UNIX;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1642
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1643
	while (*p) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1644
		switch (getsubopt(&p, optlist, &val)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1645
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1646
		case OPT_SECURE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1647
			match = AUTH_DES;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1648
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1649
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1650
		case OPT_RO:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1651
			list++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1652
			if (val) ro_val++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1653
			if (in_access_list(nb, clnames, val))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1654
				perm |= NFSAUTH_RO;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1655
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1656
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1657
		case OPT_RW:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1658
			list++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1659
			if (val) rw_val++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1660
			if (in_access_list(nb, clnames, val))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1661
				perm |= NFSAUTH_RW;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1662
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1663
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1664
		case OPT_ROOT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1665
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1666
			 * Check if the client is in
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1667
			 * the root list. Only valid
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1668
			 * for AUTH_SYS.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1669
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1670
			if (flavor != AUTH_SYS)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1671
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1672
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1673
			if (val == NULL || *val == '\0')
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1674
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1675
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1676
			if (in_access_list(nb, clnames, val))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1677
				perm |= NFSAUTH_ROOT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1678
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1679
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1680
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1681
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1682
	free(opts);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1683
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1684
	if (flavor != match)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1685
		return (NFSAUTH_DENIED);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1686
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1687
	if (list) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1688
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1689
		 * If the client doesn't match an "ro" or "rw"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1690
		 * list then set no access.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1691
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1692
		if ((perm & (NFSAUTH_RO | NFSAUTH_RW)) == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1693
			perm |= NFSAUTH_DENIED;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1694
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1695
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1696
		 * The client matched a flavor entry that
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1697
		 * has no explicit "rw" or "ro" determination.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1698
		 * Default it to "rw".
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1699
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1700
		perm |= NFSAUTH_RW;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1701
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1702
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1703
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1704
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1705
	 * The client may show up in both ro= and rw=
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1706
	 * lists.  If so, then turn off the RO access
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1707
	 * bit leaving RW access.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1708
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1709
	if (perm & NFSAUTH_RO && perm & NFSAUTH_RW) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1710
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1711
		 * Logically cover all permutations of rw=,ro=.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1712
		 * In the case where, rw,ro=<host> we would like
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1713
		 * to remove RW access for the host.  In all other cases
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1714
		 * RW wins the precedence battle.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1715
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1716
		if (!rw_val && ro_val) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1717
			perm &= ~(NFSAUTH_RW);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1718
		} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1719
			perm &= ~(NFSAUTH_RO);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1720
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1721
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1722
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1723
	return (perm);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1724
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1725
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1726
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1727
 * Check if the client has access by using a flavor different from
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1728
 * the given "flavor". If "flavor" is not in the flavor list,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1729
 * return TRUE to indicate that this "flavor" is a wrong sec.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1730
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1731
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1732
is_wrongsec(struct share *sh, struct netbuf *nb,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1733
		struct nd_hostservlist *clnames, int flavor)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1734
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1735
	int flavor_list[MAX_FLAVORS];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1736
	int flavor_count, i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1737
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1738
	/* get the flavor list that the client has access with */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1739
	flavor_count = getclientsflavors_new(sh, nb, clnames, flavor_list);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1740
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1741
	if (flavor_count == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1742
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1743
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1744
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1745
	 * Check if the given "flavor" is in the flavor_list.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1746
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1747
	for (i = 0; i < flavor_count; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1748
		if (flavor == flavor_list[i])
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1749
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1750
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1751
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1752
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1753
	 * If "flavor" is not in the flavor_list, return TRUE to indicate
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1754
	 * that the client should have access by using a security flavor
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1755
	 * different from this "flavor".
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1756
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1757
	return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1758
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1759
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1760
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1761
 * Given an export and the client's hostname, we
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1762
 * check the security options to see whether the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1763
 * client is allowed to use the given security flavor.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1764
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1765
 * The strategy is to proceed through the options looking
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1766
 * for a flavor match, then pay attention to the ro, rw,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1767
 * and root options.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1768
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1769
 * Note that an entry may list several flavors in a
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1770
 * single entry, e.g.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1771
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1772
 *   sec=krb5,rw=clnt1:clnt2,ro,sec=sys,ro
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1773
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1774
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1775
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1776
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1777
check_client_new(struct share *sh, struct netbuf *nb,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1778
    struct nd_hostservlist *clnames, int flavor)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1779
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1780
	char *opts, *p, *val;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1781
	char *lasts;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1782
	char *f;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1783
	int match = 0;	/* Set when a flavor is matched */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1784
	int perm = 0;	/* Set when "ro", "rw" or "root" is matched */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1785
	int list = 0;	/* Set when "ro", "rw" is found */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1786
	int ro_val = 0;	/* Set if ro option is 'ro=' */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1787
	int rw_val = 0;	/* Set if rw option is 'rw=' */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1788
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1789
	opts = strdup(sh->sh_opts);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1790
	if (opts == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1791
		syslog(LOG_ERR, "check_client: no memory");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1792
		return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1793
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1794
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1795
	p = opts;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1796
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1797
	while (*p) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1798
		switch (getsubopt(&p, optlist, &val)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1799
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1800
		case OPT_SEC:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1801
			if (match)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1802
				goto done;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1803
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1804
			while ((f = strtok_r(val, ":", &lasts))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1805
					!= NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1806
				if (flavor == map_flavor(f)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1807
					match = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1808
					break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1809
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1810
				val = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1811
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1812
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1813
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1814
		case OPT_RO:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1815
			if (!match)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1816
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1817
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1818
			list++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1819
			if (val) ro_val++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1820
			if (in_access_list(nb, clnames, val))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1821
				perm |= NFSAUTH_RO;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1822
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1823
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1824
		case OPT_RW:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1825
			if (!match)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1826
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1827
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1828
			list++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1829
			if (val) rw_val++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1830
			if (in_access_list(nb, clnames, val))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1831
				perm |= NFSAUTH_RW;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1832
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1833
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1834
		case OPT_ROOT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1835
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1836
			 * Check if the client is in
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1837
			 * the root list. Only valid
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1838
			 * for AUTH_SYS.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1839
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1840
			if (flavor != AUTH_SYS)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1841
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1842
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1843
			if (!match)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1844
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1845
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1846
			if (val == NULL || *val == '\0')
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1847
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1848
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1849
			if (in_access_list(nb, clnames, val))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1850
				perm |= NFSAUTH_ROOT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1851
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1852
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1853
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1854
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1855
done:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1856
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1857
	 * If no match then set the perm accordingly
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1858
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1859
	if (!match)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1860
		return (NFSAUTH_DENIED);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1861
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1862
	if (list) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1863
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1864
		 * If the client doesn't match an "ro" or "rw" list then
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1865
		 * check if it may have access by using a different flavor.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1866
		 * If so, return NFSAUTH_WRONGSEC.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1867
		 * If not, return NFSAUTH_DENIED.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1868
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1869
		if ((perm & (NFSAUTH_RO | NFSAUTH_RW)) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1870
			if (is_wrongsec(sh, nb, clnames, flavor))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1871
				perm |= NFSAUTH_WRONGSEC;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1872
			else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1873
				perm |= NFSAUTH_DENIED;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1874
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1875
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1876
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1877
		 * The client matched a flavor entry that
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1878
		 * has no explicit "rw" or "ro" determination.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1879
		 * Make sure it defaults to "rw".
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1880
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1881
		perm |= NFSAUTH_RW;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1882
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1883
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1884
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1885
	 * The client may show up in both ro= and rw=
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1886
	 * lists.  If so, then turn off the RO access
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1887
	 * bit leaving RW access.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1888
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1889
	if (perm & NFSAUTH_RO && perm & NFSAUTH_RW) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1890
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1891
		 * Logically cover all permutations of rw=,ro=.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1892
		 * In the case where, rw,ro=<host> we would like
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1893
		 * to remove RW access for the host.  In all other cases
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1894
		 * RW wins the precedence battle.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1895
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1896
		if (!rw_val && ro_val) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1897
			perm &= ~(NFSAUTH_RW);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1898
		} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1899
			perm &= ~(NFSAUTH_RO);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1900
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1901
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1902
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1903
	free(opts);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1904
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1905
	return (perm);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1906
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1907
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1908
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1909
check_sharetab()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1910
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1911
	FILE *f;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1912
	struct stat st;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1913
	static timestruc_t last_sharetab_time;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1914
	timestruc_t prev_sharetab_time;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1915
	struct share *sh;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1916
	struct sh_list *shp, *shp_prev;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1917
	int res, c = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1918
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1919
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1920
	 *  read in /etc/dfs/sharetab if it has changed
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1921
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1922
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1923
	if (stat(SHARETAB, &st) != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1924
		syslog(LOG_ERR, "Cannot stat %s: %m", SHARETAB);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1925
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1926
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1927
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1928
	if (st.st_mtim.tv_sec == last_sharetab_time.tv_sec &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1929
	    st.st_mtim.tv_nsec == last_sharetab_time.tv_nsec) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1930
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1931
		 * No change.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1932
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1933
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1934
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1935
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1936
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1937
	 * Remember the mod time, then after getting the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1938
	 * write lock check again.  If another thread
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1939
	 * already did the update, then there's no
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1940
	 * work to do.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1941
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1942
	prev_sharetab_time = last_sharetab_time;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1943
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1944
	(void) rw_wrlock(&sharetab_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1945
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1946
	if (prev_sharetab_time.tv_sec != last_sharetab_time.tv_sec ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1947
	    prev_sharetab_time.tv_nsec != last_sharetab_time.tv_nsec) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1948
		(void) rw_unlock(&sharetab_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1949
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1950
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1951
3957
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents: 3701
diff changeset
  1952
	/*
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents: 3701
diff changeset
  1953
	 * Note that since the sharetab is now in memory
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents: 3701
diff changeset
  1954
	 * and a snapshot is taken, we no longer have to
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents: 3701
diff changeset
  1955
	 * lock the file.
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents: 3701
diff changeset
  1956
	 */
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents: 3701
diff changeset
  1957
	f = fopen(SHARETAB, "r");
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1958
	if (f == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1959
		syslog(LOG_ERR, "Cannot open %s: %m", SHARETAB);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1960
		(void) rw_unlock(&sharetab_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1961
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1962
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1963
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1964
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1965
	 * Once we are sure /etc/dfs/sharetab has been
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1966
	 * modified, flush netgroup cache entries.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1967
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1968
	netgrp_cache_flush();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1969
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1970
	sh_free(share_list);			/* free old list */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1971
	share_list = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1972
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1973
	while ((res = getshare(f, &sh)) > 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1974
		c++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1975
		if (strcmp(sh->sh_fstype, "nfs") != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1976
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1977
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1978
		shp = malloc(sizeof (*shp));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1979
		if (shp == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1980
			goto alloc_failed;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1981
		if (share_list == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1982
			share_list = shp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1983
		else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1984
			/* LINTED not used before set */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1985
			shp_prev->shl_next = shp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1986
		shp_prev = shp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1987
		shp->shl_next = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1988
		shp->shl_sh = sharedup(sh);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1989
		if (shp->shl_sh == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1990
			goto alloc_failed;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1991
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1992
	if (res < 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1993
		syslog(LOG_ERR, "%s: invalid at line %d\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1994
			SHARETAB, c + 1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1995
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1996
	if (stat(SHARETAB, &st) != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1997
		syslog(LOG_ERR, "Cannot stat %s: %m", SHARETAB);
3701
fec29e0d1d48 6508208 File not closed on error path in mountd
th199096
parents: 2140
diff changeset
  1998
		(void) fclose(f);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1999
		(void) rw_unlock(&sharetab_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2000
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2001
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2002
	last_sharetab_time = st.st_mtim;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2003
	(void) fclose(f);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2004
	(void) rw_unlock(&sharetab_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2005
	return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2006
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2007
alloc_failed:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2008
	syslog(LOG_ERR, "check_sharetab: no memory");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2009
	sh_free(share_list);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2010
	share_list = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2011
	(void) fclose(f);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2012
	(void) rw_unlock(&sharetab_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2013
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2014
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2015
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2016
sh_free(struct sh_list *shp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2017
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2018
	register struct sh_list *next;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2019
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2020
	while (shp) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2021
		sharefree(shp->shl_sh);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2022
		next = shp->shl_next;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2023
		free(shp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2024
		shp = next;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2025
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2026
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2027
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2028
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2029
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2030
 * Remove an entry from mounted list
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2031
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2032
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2033
umount(struct svc_req *rqstp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2034
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2035
	char *host, *path, *remove_path;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2036
	char rpath[MAXPATHLEN];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2037
	struct nd_hostservlist *clnames = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2038
	SVCXPRT *transp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2039
	struct netbuf *nb;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2040
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2041
	transp = rqstp->rq_xprt;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2042
	path = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2043
	if (!svc_getargs(transp, xdr_dirpath, (caddr_t)&path)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2044
		svcerr_decode(transp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2045
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2046
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2047
	errno = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2048
	if (!svc_sendreply(transp, xdr_void, (char *)NULL))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2049
		log_cant_reply(transp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2050
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2051
	getclientsnames(transp, &nb, &clnames);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2052
	if (clnames == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2053
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2054
		 * Without the hostname we can't do audit or delete
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2055
		 * this host from the mount entries.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2056
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2057
		svc_freeargs(transp, xdr_dirpath, (caddr_t)&path);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2058
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2059
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2060
	host = clnames->h_hostservs[0].h_host;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2061
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2062
	if (verbose)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2063
		syslog(LOG_NOTICE, "UNMOUNT: %s unmounted %s", host, path);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2064
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2065
	audit_mountd_umount(host, path);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2066
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2067
	remove_path = rpath;	/* assume we will use the cannonical path */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2068
	if (realpath(path, rpath) == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2069
		if (verbose)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2070
			syslog(LOG_WARNING, "UNMOUNT: realpath: %s: %m ", path);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2071
		remove_path = path;	/* use path provided instead */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2072
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2073
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2074
	mntlist_delete(host, remove_path);	/* remove from mount list */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2075
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2076
	svc_freeargs(transp, xdr_dirpath, (caddr_t)&path);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2077
	netdir_free(clnames, ND_HOSTSERVLIST);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2078
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2079
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2080
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2081
 * Remove all entries for one machine from mounted list
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2082
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2083
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2084
umountall(struct svc_req *rqstp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2085
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2086
	struct nd_hostservlist *clnames = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2087
	SVCXPRT *transp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2088
	char *host;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2089
	struct netbuf *nb;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2090
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2091
	transp = rqstp->rq_xprt;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2092
	if (!svc_getargs(transp, xdr_void, NULL)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2093
		svcerr_decode(transp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2094
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2095
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2096
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2097
	 * We assume that this call is asynchronous and made via rpcbind
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2098
	 * callit routine.  Therefore return control immediately. The error
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2099
	 * causes rpcbind to remain silent, as opposed to every machine
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2100
	 * on the net blasting the requester with a response.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2101
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2102
	svcerr_systemerr(transp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2103
	getclientsnames(transp, &nb, &clnames);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2104
	if (clnames == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2105
		/* Can't do anything without the name of the client */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2106
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2107
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2108
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2109
	host = clnames->h_hostservs[0].h_host;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2110
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2111
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2112
	 * Remove all hosts entries from mount list
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2113
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2114
	mntlist_delete_all(host);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2115
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2116
	if (verbose)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2117
		syslog(LOG_NOTICE, "UNMOUNTALL: from %s", host);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2118
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2119
	netdir_free(clnames, ND_HOSTSERVLIST);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2120
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2121
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2122
void *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2123
exmalloc(size_t size)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2124
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2125
	void *ret;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2126
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2127
	if ((ret = malloc(size)) == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2128
		syslog(LOG_ERR, "Out of memory");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2129
		exit(1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2130
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2131
	return (ret);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2132
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2133
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2134
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2135
sigexit(int signum)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2136
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2137
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2138
	if (signum == SIGHUP)
199
cd53dc361dfa 6253388 During nlm tests, BAD TRAP: type=31 rp=2a103e08ad0 addr=1 mmu_fsr=0 occurred in module "genunix"
gt29601
parents: 0
diff changeset
  2139
		_exit(0);
cd53dc361dfa 6253388 During nlm tests, BAD TRAP: type=31 rp=2a103e08ad0 addr=1 mmu_fsr=0 occurred in module "genunix"
gt29601
parents: 0
diff changeset
  2140
	_exit(1);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2141
}