2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow/*
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow * CDDL HEADER START
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow *
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow * The contents of this file are subject to the terms of the
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow * Common Development and Distribution License (the "License").
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow * You may not use this file except in compliance with the License.
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow *
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow * or http://www.opensolaris.org/os/licensing.
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow * See the License for the specific language governing permissions
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow * and limitations under the License.
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow *
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow * When distributing Covered Code, include this CDDL HEADER in each
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow * If applicable, add the following below this CDDL HEADER, with the
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow * fields enclosed by brackets "[]" replaced with your own identifying
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow * information: Portions Copyright [yyyy] [name of copyright owner]
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow *
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow * CDDL HEADER END
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow */
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow/*
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow * Use is subject to license terms.
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow */
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow/*
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow * Helper routines for nfsmapid and autod daemon
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow * to translate hostname to IP address and Netinfo.
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow */
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow#include <stdio.h>
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow#include <stdlib.h>
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow#include <alloca.h>
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow#include <signal.h>
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow#include <libintl.h>
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow#include <limits.h>
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow#include <errno.h>
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow#include <sys/types.h>
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow#include <string.h>
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow#include <memory.h>
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow#include <pwd.h>
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow#include <grp.h>
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow#include <door.h>
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow#include <syslog.h>
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow#include <fcntl.h>
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow#include <unistd.h>
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow#include <assert.h>
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow#include <deflt.h>
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow#include <netdir.h>
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow#include <nfs/nfs4.h>
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow#include <nfs/nfssys.h>
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow#include <nfs/nfsid_map.h>
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow#include <nfs/mapid.h>
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow#include <nfs/nfs_sec.h>
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow#include <sys/sdt.h>
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow#include <sys/idmap.h>
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow#include <idmap.h>
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow#include <sys/fs/autofs.h>
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow#include "nfs_resolve.h"
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlowvoid
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlowfree_knconf(struct knetconfig *k)
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow{
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow if (k == NULL)
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow return;
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow if (k->knc_protofmly)
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow free(k->knc_protofmly);
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow if (k->knc_proto)
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow free(k->knc_proto);
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow free(k);
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow}
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlowstruct knetconfig *
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlowget_knconf(struct netconfig *nconf)
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow{
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow struct stat stbuf;
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow struct knetconfig *k = NULL;
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow int len;
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow if (stat(nconf->nc_device, &stbuf) < 0) {
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow syslog(LOG_ERR, "get_knconf: stat %s: %m", nconf->nc_device);
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow return (NULL);
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow }
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow k = (struct knetconfig *)malloc(sizeof (*k));
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow if (k == NULL)
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow goto nomem;
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow k->knc_semantics = nconf->nc_semantics;
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow len = strlen(nconf->nc_protofmly);
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow if (len <= 0)
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow goto err_out;
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow k->knc_protofmly = malloc(KNC_STRSIZE);
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow if (k->knc_protofmly == NULL)
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow goto nomem;
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow bzero(k->knc_protofmly, KNC_STRSIZE);
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow bcopy(nconf->nc_protofmly, k->knc_protofmly, len);
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow len = strlen(nconf->nc_proto);
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow if (len <= 0)
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow goto err_out;
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow k->knc_proto = malloc(KNC_STRSIZE);
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow if (k->knc_proto == NULL)
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow goto nomem;
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow bzero(k->knc_proto, KNC_STRSIZE);
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow bcopy(nconf->nc_proto, k->knc_proto, len);
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow k->knc_rdev = stbuf.st_rdev;
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow return (k);
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlownomem:
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow syslog(LOG_ERR, "get_knconf: no memory");
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlowerr_out:
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow if (k != NULL)
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow (void) free_knconf(k);
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow return (NULL);
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow}
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow/*
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow * Get the information needed for an NFSv4.x referral. This
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow * information includes the netbuf, netname and knconfig.
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow */
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlowstruct nfs_fsl_info *
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlowget_nfs4ref_info(char *host, int port, int nfsver)
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow{
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow char netname[MAXNETNAMELEN + 1];
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow enum clnt_stat cstat;
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow struct nfs_fsl_info *fsl_retp = NULL;
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow struct netconfig *netconf = NULL;
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow char *nametemp, *namex = NULL;
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow struct netbuf *nb = NULL;
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow NCONF_HANDLE *nc = NULL;
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow fsl_retp = calloc(1, sizeof (struct nfs_fsl_info));
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow if (fsl_retp == NULL) {
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow syslog(LOG_ERR, "get_nfs4ref_info: no memory\n");
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow return (NULL);
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow }
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow nametemp = malloc(MAXNETNAMELEN + 1);
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow if (nametemp == NULL) {
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow free(fsl_retp);
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow return (NULL);
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow }
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow host2netname(nametemp, host, NULL);
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow namex = calloc(1, strlen(nametemp) + 1);
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow if (namex == NULL) {
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow free(nametemp);
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow free(fsl_retp);
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow return (NULL);
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow }
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow strncpy(namex, nametemp, strlen(nametemp));
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow free(nametemp);
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow fsl_retp->netname = namex;
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow fsl_retp->netnm_len = strlen(namex) + 1;
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow fsl_retp->addr = resolve_netconf(host, NFS_PROGRAM, nfsver,
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow &netconf, port, NULL, NULL, TRUE, NULL, &cstat);
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow if (netconf == NULL || fsl_retp->addr == NULL)
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow goto done;
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow fsl_retp->knconf = get_knconf(netconf);
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow if (fsl_retp->knconf == NULL)
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow goto done;
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow fsl_retp->knconf_len = (sizeof (struct knetconfig) +
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow (KNC_STRSIZE * 2));
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow fsl_retp->netbuf_len = (sizeof (struct netbuf) +
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow fsl_retp->addr->maxlen);
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow return (fsl_retp);
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlowdone:
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow free_nfs4ref_info(fsl_retp);
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow return (NULL);
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow}
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlowvoid
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlowfree_nfs4ref_info(struct nfs_fsl_info *fsl_retp)
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow{
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow if (fsl_retp == NULL)
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow return;
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow free_knconf(fsl_retp->knconf);
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow free(fsl_retp->netname);
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow if (fsl_retp->addr != NULL) {
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow free(fsl_retp->addr->buf);
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow free(fsl_retp->addr);
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow }
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow free(fsl_retp);
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow}
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlowvoid
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlowcleanup_tli_parms(struct t_bind *tbind, int fd)
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow{
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow if (tbind != NULL) {
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow t_free((char *)tbind, T_BIND);
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow tbind = NULL;
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow }
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow if (fd >= 0)
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow (void) t_close(fd);
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow fd = -1;
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow}
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlowstruct netbuf *
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlowresolve_netconf(char *host, rpcprog_t prog, rpcvers_t nfsver,
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow struct netconfig **netconf, ushort_t port,
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow struct t_info *tinfo, caddr_t *fhp, bool_t direct_to_server,
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow char *fspath, enum clnt_stat *cstatp)
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow{
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow NCONF_HANDLE *nc;
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow struct netconfig *nconf = NULL;
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow int nthtry = FIRST_TRY;
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow struct netbuf *nb;
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow enum clnt_stat cstat;
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow nc = setnetpath();
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow if (nc == NULL)
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow goto done;
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlowretry:
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow while (nconf = getnetpath(nc)) {
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow if (nconf->nc_flag & NC_VISIBLE) {
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow if (nthtry == FIRST_TRY) {
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow if ((nconf->nc_semantics ==
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow NC_TPI_COTS_ORD) ||
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow (nconf->nc_semantics ==
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow NC_TPI_COTS)) {
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow if (port == 0)
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow break;
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow if ((strcmp(nconf->nc_protofmly,
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow NC_INET) == 0 ||
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow strcmp(nconf->nc_protofmly,
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow NC_INET6) == 0) &&
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow (strcmp(nconf->nc_proto,
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow NC_TCP) == 0))
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow break;
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow }
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow }
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow if (nthtry == SECOND_TRY) {
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow if (nconf->nc_semantics ==
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow NC_TPI_CLTS) {
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow if (port == 0)
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow break;
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow if ((strcmp(nconf->nc_protofmly,
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow NC_INET) == 0 ||
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow strcmp(nconf->nc_protofmly,
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow NC_INET6) == 0) &&
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow (strcmp(nconf->nc_proto,
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow NC_UDP) == 0))
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow break;
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow }
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow }
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow }
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow } /* while */
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow if (nconf == NULL) {
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow if (++nthtry <= MNT_PREF_LISTLEN) {
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow endnetpath(nc);
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow if ((nc = setnetpath()) == NULL)
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow goto done;
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow goto retry;
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow } else
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow return (NULL);
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow } else {
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow nb = get_server_addr(host, NFS_PROGRAM, nfsver,
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow nconf, port, NULL, NULL, TRUE, NULL, &cstat);
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow if (cstat != RPC_SUCCESS)
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow goto retry;
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow }
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlowdone:
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow *netconf = nconf;
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow *cstatp = cstat;
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow if (nc)
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow endnetpath(nc);
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow return (nb);
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow}
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlowint
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlowsetup_nb_parms(struct netconfig *nconf, struct t_bind *tbind,
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow struct t_info *tinfo, char *hostname, int fd, bool_t direct_to_server,
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow ushort_t port, rpcprog_t prog, rpcvers_t vers, bool_t file_handle)
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow{
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow if (nconf == NULL) {
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow return (-1);
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow }
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow if (direct_to_server == TRUE) {
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow struct nd_hostserv hs;
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow struct nd_addrlist *retaddrs;
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow hs.h_host = hostname;
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow if (port == 0)
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow hs.h_serv = "nfs";
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow else
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow hs.h_serv = NULL;
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow if (netdir_getbyname(nconf, &hs, &retaddrs) != ND_OK) {
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow return (-1);
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow }
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow memcpy(tbind->addr.buf, retaddrs->n_addrs->buf,
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow retaddrs->n_addrs->len);
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow tbind->addr.len = retaddrs->n_addrs->len;
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow tbind->addr.maxlen = retaddrs->n_addrs->maxlen;
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow netdir_free((void *)retaddrs, ND_ADDRLIST);
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow if (port) {
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow /* LINTED pointer alignment */
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow if (strcmp(nconf->nc_protofmly, NC_INET) == NULL)
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow ((struct sockaddr_in *)
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow tbind->addr.buf)->sin_port =
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow htons((ushort_t)port);
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow else if (strcmp(nconf->nc_protofmly, NC_INET6) == NULL)
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow ((struct sockaddr_in6 *)
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow tbind->addr.buf)->sin6_port =
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow htons((ushort_t)port);
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow }
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow if (file_handle) {
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow if (netdir_options(nconf, ND_SET_RESERVEDPORT, fd,
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow NULL) == -1)
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow return (-1);
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow }
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow } else if (!file_handle) {
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow if (port) {
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow /* LINTED pointer alignment */
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow if (strcmp(nconf->nc_protofmly, NC_INET) == NULL)
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow ((struct sockaddr_in *)
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow tbind->addr.buf)->sin_port =
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow htons((ushort_t)port);
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow else if (strcmp(nconf->nc_protofmly, NC_INET6) == NULL)
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow ((struct sockaddr_in6 *)
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow tbind->addr.buf)->sin6_port =
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow htons((ushort_t)port);
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow }
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow } else {
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow return (-1);
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow }
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow return (1);
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow}
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow/*
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow * Sets up TLI interface and finds the address withe netdir_getbyname().
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow * returns the address returned from the call.
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow * Caller frees up the memory allocated here.
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow */
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlowstruct netbuf *
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlowget_server_addr(char *hostname, rpcprog_t prog, rpcvers_t vers,
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow struct netconfig *nconf, ushort_t port,
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow struct t_info *tinfo, caddr_t *fhp, bool_t direct_to_server,
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow char *fspath, enum clnt_stat *cstat)
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow{
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow int fd = -1;
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow struct t_bind *tbind = NULL;
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow enum clnt_stat cs = RPC_SYSTEMERROR;
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow struct netbuf *nb = NULL;
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow int ret = -1;
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow if (prog == NFS_PROGRAM && vers == NFS_V4)
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow if (strncasecmp(nconf->nc_proto, NC_UDP, strlen(NC_UDP)) == 0)
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow goto done;
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow if ((fd = t_open(nconf->nc_device, O_RDWR, tinfo)) < 0)
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow goto done;
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow if ((tbind = (struct t_bind *)t_alloc(fd, T_BIND, T_ADDR)) == NULL)
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow goto done;
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow if (setup_nb_parms(nconf, tbind, tinfo, hostname, fd, direct_to_server,
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow port, prog, vers, 0) < 0)
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow goto done;
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow nb = (struct netbuf *)malloc(sizeof (struct netbuf));
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow if (nb == NULL) {
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow syslog(LOG_ERR, "no memory\n");
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow goto done;
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow }
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow nb->buf = (char *)malloc(tbind->addr.maxlen);
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow if (nb->buf == NULL) {
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow syslog(LOG_ERR, "no memory\n");
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow free(nb);
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow nb = NULL;
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow goto done;
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow }
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow (void) memcpy(nb->buf, tbind->addr.buf, tbind->addr.len);
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow nb->len = tbind->addr.len;
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow nb->maxlen = tbind->addr.maxlen;
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow cs = RPC_SUCCESS;
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlowdone:
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow *cstat = cs;
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow cleanup_tli_parms(tbind, fd);
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow return (nb);
2f172c55ef76964744bc62b4500ece87f3089b4dRobert Thurlow}