1*2f172c55SRobert Thurlow /* 2*2f172c55SRobert Thurlow * CDDL HEADER START 3*2f172c55SRobert Thurlow * 4*2f172c55SRobert Thurlow * The contents of this file are subject to the terms of the 5*2f172c55SRobert Thurlow * Common Development and Distribution License (the "License"). 6*2f172c55SRobert Thurlow * You may not use this file except in compliance with the License. 7*2f172c55SRobert Thurlow * 8*2f172c55SRobert Thurlow * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9*2f172c55SRobert Thurlow * or http://www.opensolaris.org/os/licensing. 10*2f172c55SRobert Thurlow * See the License for the specific language governing permissions 11*2f172c55SRobert Thurlow * and limitations under the License. 12*2f172c55SRobert Thurlow * 13*2f172c55SRobert Thurlow * When distributing Covered Code, include this CDDL HEADER in each 14*2f172c55SRobert Thurlow * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15*2f172c55SRobert Thurlow * If applicable, add the following below this CDDL HEADER, with the 16*2f172c55SRobert Thurlow * fields enclosed by brackets "[]" replaced with your own identifying 17*2f172c55SRobert Thurlow * information: Portions Copyright [yyyy] [name of copyright owner] 18*2f172c55SRobert Thurlow * 19*2f172c55SRobert Thurlow * CDDL HEADER END 20*2f172c55SRobert Thurlow */ 21*2f172c55SRobert Thurlow /* 22*2f172c55SRobert Thurlow * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 23*2f172c55SRobert Thurlow * Use is subject to license terms. 24*2f172c55SRobert Thurlow */ 25*2f172c55SRobert Thurlow 26*2f172c55SRobert Thurlow 27*2f172c55SRobert Thurlow /* 28*2f172c55SRobert Thurlow * Helper routines for nfsmapid and autod daemon 29*2f172c55SRobert Thurlow * to translate hostname to IP address and Netinfo. 30*2f172c55SRobert Thurlow */ 31*2f172c55SRobert Thurlow #include <stdio.h> 32*2f172c55SRobert Thurlow #include <stdlib.h> 33*2f172c55SRobert Thurlow #include <alloca.h> 34*2f172c55SRobert Thurlow #include <signal.h> 35*2f172c55SRobert Thurlow #include <libintl.h> 36*2f172c55SRobert Thurlow #include <limits.h> 37*2f172c55SRobert Thurlow #include <errno.h> 38*2f172c55SRobert Thurlow #include <sys/types.h> 39*2f172c55SRobert Thurlow #include <string.h> 40*2f172c55SRobert Thurlow #include <memory.h> 41*2f172c55SRobert Thurlow #include <pwd.h> 42*2f172c55SRobert Thurlow #include <grp.h> 43*2f172c55SRobert Thurlow #include <door.h> 44*2f172c55SRobert Thurlow #include <syslog.h> 45*2f172c55SRobert Thurlow #include <fcntl.h> 46*2f172c55SRobert Thurlow #include <unistd.h> 47*2f172c55SRobert Thurlow #include <assert.h> 48*2f172c55SRobert Thurlow #include <deflt.h> 49*2f172c55SRobert Thurlow #include <netdir.h> 50*2f172c55SRobert Thurlow #include <nfs/nfs4.h> 51*2f172c55SRobert Thurlow #include <nfs/nfssys.h> 52*2f172c55SRobert Thurlow #include <nfs/nfsid_map.h> 53*2f172c55SRobert Thurlow #include <nfs/mapid.h> 54*2f172c55SRobert Thurlow #include <nfs/nfs_sec.h> 55*2f172c55SRobert Thurlow #include <sys/sdt.h> 56*2f172c55SRobert Thurlow #include <sys/idmap.h> 57*2f172c55SRobert Thurlow #include <idmap.h> 58*2f172c55SRobert Thurlow #include <sys/fs/autofs.h> 59*2f172c55SRobert Thurlow #include "nfs_resolve.h" 60*2f172c55SRobert Thurlow 61*2f172c55SRobert Thurlow void 62*2f172c55SRobert Thurlow free_knconf(struct knetconfig *k) 63*2f172c55SRobert Thurlow { 64*2f172c55SRobert Thurlow if (k == NULL) 65*2f172c55SRobert Thurlow return; 66*2f172c55SRobert Thurlow if (k->knc_protofmly) 67*2f172c55SRobert Thurlow free(k->knc_protofmly); 68*2f172c55SRobert Thurlow if (k->knc_proto) 69*2f172c55SRobert Thurlow free(k->knc_proto); 70*2f172c55SRobert Thurlow free(k); 71*2f172c55SRobert Thurlow } 72*2f172c55SRobert Thurlow 73*2f172c55SRobert Thurlow struct knetconfig * 74*2f172c55SRobert Thurlow get_knconf(struct netconfig *nconf) 75*2f172c55SRobert Thurlow { 76*2f172c55SRobert Thurlow struct stat stbuf; 77*2f172c55SRobert Thurlow struct knetconfig *k = NULL; 78*2f172c55SRobert Thurlow int len; 79*2f172c55SRobert Thurlow 80*2f172c55SRobert Thurlow if (stat(nconf->nc_device, &stbuf) < 0) { 81*2f172c55SRobert Thurlow syslog(LOG_ERR, "get_knconf: stat %s: %m", nconf->nc_device); 82*2f172c55SRobert Thurlow return (NULL); 83*2f172c55SRobert Thurlow } 84*2f172c55SRobert Thurlow k = (struct knetconfig *)malloc(sizeof (*k)); 85*2f172c55SRobert Thurlow if (k == NULL) 86*2f172c55SRobert Thurlow goto nomem; 87*2f172c55SRobert Thurlow k->knc_semantics = nconf->nc_semantics; 88*2f172c55SRobert Thurlow 89*2f172c55SRobert Thurlow len = strlen(nconf->nc_protofmly); 90*2f172c55SRobert Thurlow if (len <= 0) 91*2f172c55SRobert Thurlow goto err_out; 92*2f172c55SRobert Thurlow k->knc_protofmly = malloc(KNC_STRSIZE); 93*2f172c55SRobert Thurlow if (k->knc_protofmly == NULL) 94*2f172c55SRobert Thurlow goto nomem; 95*2f172c55SRobert Thurlow bzero(k->knc_protofmly, KNC_STRSIZE); 96*2f172c55SRobert Thurlow bcopy(nconf->nc_protofmly, k->knc_protofmly, len); 97*2f172c55SRobert Thurlow 98*2f172c55SRobert Thurlow len = strlen(nconf->nc_proto); 99*2f172c55SRobert Thurlow if (len <= 0) 100*2f172c55SRobert Thurlow goto err_out; 101*2f172c55SRobert Thurlow k->knc_proto = malloc(KNC_STRSIZE); 102*2f172c55SRobert Thurlow if (k->knc_proto == NULL) 103*2f172c55SRobert Thurlow goto nomem; 104*2f172c55SRobert Thurlow bzero(k->knc_proto, KNC_STRSIZE); 105*2f172c55SRobert Thurlow bcopy(nconf->nc_proto, k->knc_proto, len); 106*2f172c55SRobert Thurlow 107*2f172c55SRobert Thurlow k->knc_rdev = stbuf.st_rdev; 108*2f172c55SRobert Thurlow 109*2f172c55SRobert Thurlow return (k); 110*2f172c55SRobert Thurlow 111*2f172c55SRobert Thurlow nomem: 112*2f172c55SRobert Thurlow syslog(LOG_ERR, "get_knconf: no memory"); 113*2f172c55SRobert Thurlow err_out: 114*2f172c55SRobert Thurlow if (k != NULL) 115*2f172c55SRobert Thurlow (void) free_knconf(k); 116*2f172c55SRobert Thurlow return (NULL); 117*2f172c55SRobert Thurlow } 118*2f172c55SRobert Thurlow 119*2f172c55SRobert Thurlow /* 120*2f172c55SRobert Thurlow * Get the information needed for an NFSv4.x referral. This 121*2f172c55SRobert Thurlow * information includes the netbuf, netname and knconfig. 122*2f172c55SRobert Thurlow */ 123*2f172c55SRobert Thurlow struct nfs_fsl_info * 124*2f172c55SRobert Thurlow get_nfs4ref_info(char *host, int port, int nfsver) 125*2f172c55SRobert Thurlow { 126*2f172c55SRobert Thurlow char netname[MAXNETNAMELEN + 1]; 127*2f172c55SRobert Thurlow enum clnt_stat cstat; 128*2f172c55SRobert Thurlow struct nfs_fsl_info *fsl_retp = NULL; 129*2f172c55SRobert Thurlow struct netconfig *netconf = NULL; 130*2f172c55SRobert Thurlow char *nametemp, *namex = NULL; 131*2f172c55SRobert Thurlow struct netbuf *nb = NULL; 132*2f172c55SRobert Thurlow NCONF_HANDLE *nc = NULL; 133*2f172c55SRobert Thurlow 134*2f172c55SRobert Thurlow fsl_retp = calloc(1, sizeof (struct nfs_fsl_info)); 135*2f172c55SRobert Thurlow if (fsl_retp == NULL) { 136*2f172c55SRobert Thurlow syslog(LOG_ERR, "get_nfs4ref_info: no memory\n"); 137*2f172c55SRobert Thurlow return (NULL); 138*2f172c55SRobert Thurlow } 139*2f172c55SRobert Thurlow 140*2f172c55SRobert Thurlow nametemp = malloc(MAXNETNAMELEN + 1); 141*2f172c55SRobert Thurlow if (nametemp == NULL) { 142*2f172c55SRobert Thurlow free(fsl_retp); 143*2f172c55SRobert Thurlow return (NULL); 144*2f172c55SRobert Thurlow } 145*2f172c55SRobert Thurlow host2netname(nametemp, host, NULL); 146*2f172c55SRobert Thurlow namex = calloc(1, strlen(nametemp) + 1); 147*2f172c55SRobert Thurlow if (namex == NULL) { 148*2f172c55SRobert Thurlow free(nametemp); 149*2f172c55SRobert Thurlow free(fsl_retp); 150*2f172c55SRobert Thurlow return (NULL); 151*2f172c55SRobert Thurlow } 152*2f172c55SRobert Thurlow strncpy(namex, nametemp, strlen(nametemp)); 153*2f172c55SRobert Thurlow free(nametemp); 154*2f172c55SRobert Thurlow fsl_retp->netname = namex; 155*2f172c55SRobert Thurlow fsl_retp->netnm_len = strlen(namex) + 1; 156*2f172c55SRobert Thurlow 157*2f172c55SRobert Thurlow fsl_retp->addr = resolve_netconf(host, NFS_PROGRAM, nfsver, 158*2f172c55SRobert Thurlow &netconf, port, NULL, NULL, TRUE, NULL, &cstat); 159*2f172c55SRobert Thurlow 160*2f172c55SRobert Thurlow if (netconf == NULL || fsl_retp->addr == NULL) 161*2f172c55SRobert Thurlow goto done; 162*2f172c55SRobert Thurlow 163*2f172c55SRobert Thurlow fsl_retp->knconf = get_knconf(netconf); 164*2f172c55SRobert Thurlow if (fsl_retp->knconf == NULL) 165*2f172c55SRobert Thurlow goto done; 166*2f172c55SRobert Thurlow fsl_retp->knconf_len = (sizeof (struct knetconfig) + 167*2f172c55SRobert Thurlow (KNC_STRSIZE * 2)); 168*2f172c55SRobert Thurlow fsl_retp->netbuf_len = (sizeof (struct netbuf) + 169*2f172c55SRobert Thurlow fsl_retp->addr->maxlen); 170*2f172c55SRobert Thurlow return (fsl_retp); 171*2f172c55SRobert Thurlow done: 172*2f172c55SRobert Thurlow free_nfs4ref_info(fsl_retp); 173*2f172c55SRobert Thurlow return (NULL); 174*2f172c55SRobert Thurlow } 175*2f172c55SRobert Thurlow 176*2f172c55SRobert Thurlow void 177*2f172c55SRobert Thurlow free_nfs4ref_info(struct nfs_fsl_info *fsl_retp) 178*2f172c55SRobert Thurlow { 179*2f172c55SRobert Thurlow if (fsl_retp == NULL) 180*2f172c55SRobert Thurlow return; 181*2f172c55SRobert Thurlow free_knconf(fsl_retp->knconf); 182*2f172c55SRobert Thurlow free(fsl_retp->netname); 183*2f172c55SRobert Thurlow if (fsl_retp->addr != NULL) { 184*2f172c55SRobert Thurlow free(fsl_retp->addr->buf); 185*2f172c55SRobert Thurlow free(fsl_retp->addr); 186*2f172c55SRobert Thurlow } 187*2f172c55SRobert Thurlow free(fsl_retp); 188*2f172c55SRobert Thurlow } 189*2f172c55SRobert Thurlow 190*2f172c55SRobert Thurlow void 191*2f172c55SRobert Thurlow cleanup_tli_parms(struct t_bind *tbind, int fd) 192*2f172c55SRobert Thurlow { 193*2f172c55SRobert Thurlow if (tbind != NULL) { 194*2f172c55SRobert Thurlow t_free((char *)tbind, T_BIND); 195*2f172c55SRobert Thurlow tbind = NULL; 196*2f172c55SRobert Thurlow } 197*2f172c55SRobert Thurlow if (fd >= 0) 198*2f172c55SRobert Thurlow (void) t_close(fd); 199*2f172c55SRobert Thurlow fd = -1; 200*2f172c55SRobert Thurlow } 201*2f172c55SRobert Thurlow 202*2f172c55SRobert Thurlow struct netbuf * 203*2f172c55SRobert Thurlow resolve_netconf(char *host, rpcprog_t prog, rpcvers_t nfsver, 204*2f172c55SRobert Thurlow struct netconfig **netconf, ushort_t port, 205*2f172c55SRobert Thurlow struct t_info *tinfo, caddr_t *fhp, bool_t direct_to_server, 206*2f172c55SRobert Thurlow char *fspath, enum clnt_stat *cstatp) 207*2f172c55SRobert Thurlow { 208*2f172c55SRobert Thurlow NCONF_HANDLE *nc; 209*2f172c55SRobert Thurlow struct netconfig *nconf = NULL; 210*2f172c55SRobert Thurlow int nthtry = FIRST_TRY; 211*2f172c55SRobert Thurlow struct netbuf *nb; 212*2f172c55SRobert Thurlow enum clnt_stat cstat; 213*2f172c55SRobert Thurlow 214*2f172c55SRobert Thurlow nc = setnetpath(); 215*2f172c55SRobert Thurlow if (nc == NULL) 216*2f172c55SRobert Thurlow goto done; 217*2f172c55SRobert Thurlow retry: 218*2f172c55SRobert Thurlow while (nconf = getnetpath(nc)) { 219*2f172c55SRobert Thurlow if (nconf->nc_flag & NC_VISIBLE) { 220*2f172c55SRobert Thurlow if (nthtry == FIRST_TRY) { 221*2f172c55SRobert Thurlow if ((nconf->nc_semantics == 222*2f172c55SRobert Thurlow NC_TPI_COTS_ORD) || 223*2f172c55SRobert Thurlow (nconf->nc_semantics == 224*2f172c55SRobert Thurlow NC_TPI_COTS)) { 225*2f172c55SRobert Thurlow if (port == 0) 226*2f172c55SRobert Thurlow break; 227*2f172c55SRobert Thurlow if ((strcmp(nconf->nc_protofmly, 228*2f172c55SRobert Thurlow NC_INET) == 0 || 229*2f172c55SRobert Thurlow strcmp(nconf->nc_protofmly, 230*2f172c55SRobert Thurlow NC_INET6) == 0) && 231*2f172c55SRobert Thurlow (strcmp(nconf->nc_proto, 232*2f172c55SRobert Thurlow NC_TCP) == 0)) 233*2f172c55SRobert Thurlow break; 234*2f172c55SRobert Thurlow } 235*2f172c55SRobert Thurlow } 236*2f172c55SRobert Thurlow if (nthtry == SECOND_TRY) { 237*2f172c55SRobert Thurlow if (nconf->nc_semantics == 238*2f172c55SRobert Thurlow NC_TPI_CLTS) { 239*2f172c55SRobert Thurlow if (port == 0) 240*2f172c55SRobert Thurlow break; 241*2f172c55SRobert Thurlow if ((strcmp(nconf->nc_protofmly, 242*2f172c55SRobert Thurlow NC_INET) == 0 || 243*2f172c55SRobert Thurlow strcmp(nconf->nc_protofmly, 244*2f172c55SRobert Thurlow NC_INET6) == 0) && 245*2f172c55SRobert Thurlow (strcmp(nconf->nc_proto, 246*2f172c55SRobert Thurlow NC_UDP) == 0)) 247*2f172c55SRobert Thurlow break; 248*2f172c55SRobert Thurlow } 249*2f172c55SRobert Thurlow } 250*2f172c55SRobert Thurlow } 251*2f172c55SRobert Thurlow } /* while */ 252*2f172c55SRobert Thurlow if (nconf == NULL) { 253*2f172c55SRobert Thurlow if (++nthtry <= MNT_PREF_LISTLEN) { 254*2f172c55SRobert Thurlow endnetpath(nc); 255*2f172c55SRobert Thurlow if ((nc = setnetpath()) == NULL) 256*2f172c55SRobert Thurlow goto done; 257*2f172c55SRobert Thurlow goto retry; 258*2f172c55SRobert Thurlow } else 259*2f172c55SRobert Thurlow return (NULL); 260*2f172c55SRobert Thurlow } else { 261*2f172c55SRobert Thurlow nb = get_server_addr(host, NFS_PROGRAM, nfsver, 262*2f172c55SRobert Thurlow nconf, port, NULL, NULL, TRUE, NULL, &cstat); 263*2f172c55SRobert Thurlow if (cstat != RPC_SUCCESS) 264*2f172c55SRobert Thurlow goto retry; 265*2f172c55SRobert Thurlow } 266*2f172c55SRobert Thurlow done: 267*2f172c55SRobert Thurlow *netconf = nconf; 268*2f172c55SRobert Thurlow *cstatp = cstat; 269*2f172c55SRobert Thurlow if (nc) 270*2f172c55SRobert Thurlow endnetpath(nc); 271*2f172c55SRobert Thurlow return (nb); 272*2f172c55SRobert Thurlow } 273*2f172c55SRobert Thurlow 274*2f172c55SRobert Thurlow int 275*2f172c55SRobert Thurlow setup_nb_parms(struct netconfig *nconf, struct t_bind *tbind, 276*2f172c55SRobert Thurlow struct t_info *tinfo, char *hostname, int fd, bool_t direct_to_server, 277*2f172c55SRobert Thurlow ushort_t port, rpcprog_t prog, rpcvers_t vers, bool_t file_handle) 278*2f172c55SRobert Thurlow { 279*2f172c55SRobert Thurlow if (nconf == NULL) { 280*2f172c55SRobert Thurlow return (-1); 281*2f172c55SRobert Thurlow } 282*2f172c55SRobert Thurlow if (direct_to_server == TRUE) { 283*2f172c55SRobert Thurlow struct nd_hostserv hs; 284*2f172c55SRobert Thurlow struct nd_addrlist *retaddrs; 285*2f172c55SRobert Thurlow hs.h_host = hostname; 286*2f172c55SRobert Thurlow 287*2f172c55SRobert Thurlow if (port == 0) 288*2f172c55SRobert Thurlow hs.h_serv = "nfs"; 289*2f172c55SRobert Thurlow else 290*2f172c55SRobert Thurlow hs.h_serv = NULL; 291*2f172c55SRobert Thurlow 292*2f172c55SRobert Thurlow if (netdir_getbyname(nconf, &hs, &retaddrs) != ND_OK) { 293*2f172c55SRobert Thurlow return (-1); 294*2f172c55SRobert Thurlow } 295*2f172c55SRobert Thurlow memcpy(tbind->addr.buf, retaddrs->n_addrs->buf, 296*2f172c55SRobert Thurlow retaddrs->n_addrs->len); 297*2f172c55SRobert Thurlow tbind->addr.len = retaddrs->n_addrs->len; 298*2f172c55SRobert Thurlow tbind->addr.maxlen = retaddrs->n_addrs->maxlen; 299*2f172c55SRobert Thurlow netdir_free((void *)retaddrs, ND_ADDRLIST); 300*2f172c55SRobert Thurlow if (port) { 301*2f172c55SRobert Thurlow /* LINTED pointer alignment */ 302*2f172c55SRobert Thurlow if (strcmp(nconf->nc_protofmly, NC_INET) == NULL) 303*2f172c55SRobert Thurlow ((struct sockaddr_in *) 304*2f172c55SRobert Thurlow tbind->addr.buf)->sin_port = 305*2f172c55SRobert Thurlow htons((ushort_t)port); 306*2f172c55SRobert Thurlow else if (strcmp(nconf->nc_protofmly, NC_INET6) == NULL) 307*2f172c55SRobert Thurlow ((struct sockaddr_in6 *) 308*2f172c55SRobert Thurlow tbind->addr.buf)->sin6_port = 309*2f172c55SRobert Thurlow htons((ushort_t)port); 310*2f172c55SRobert Thurlow } 311*2f172c55SRobert Thurlow 312*2f172c55SRobert Thurlow if (file_handle) { 313*2f172c55SRobert Thurlow if (netdir_options(nconf, ND_SET_RESERVEDPORT, fd, 314*2f172c55SRobert Thurlow NULL) == -1) 315*2f172c55SRobert Thurlow return (-1); 316*2f172c55SRobert Thurlow } 317*2f172c55SRobert Thurlow } else if (!file_handle) { 318*2f172c55SRobert Thurlow if (port) { 319*2f172c55SRobert Thurlow /* LINTED pointer alignment */ 320*2f172c55SRobert Thurlow if (strcmp(nconf->nc_protofmly, NC_INET) == NULL) 321*2f172c55SRobert Thurlow ((struct sockaddr_in *) 322*2f172c55SRobert Thurlow tbind->addr.buf)->sin_port = 323*2f172c55SRobert Thurlow htons((ushort_t)port); 324*2f172c55SRobert Thurlow else if (strcmp(nconf->nc_protofmly, NC_INET6) == NULL) 325*2f172c55SRobert Thurlow ((struct sockaddr_in6 *) 326*2f172c55SRobert Thurlow tbind->addr.buf)->sin6_port = 327*2f172c55SRobert Thurlow htons((ushort_t)port); 328*2f172c55SRobert Thurlow } 329*2f172c55SRobert Thurlow } else { 330*2f172c55SRobert Thurlow return (-1); 331*2f172c55SRobert Thurlow } 332*2f172c55SRobert Thurlow return (1); 333*2f172c55SRobert Thurlow } 334*2f172c55SRobert Thurlow 335*2f172c55SRobert Thurlow /* 336*2f172c55SRobert Thurlow * Sets up TLI interface and finds the address withe netdir_getbyname(). 337*2f172c55SRobert Thurlow * returns the address returned from the call. 338*2f172c55SRobert Thurlow * Caller frees up the memory allocated here. 339*2f172c55SRobert Thurlow */ 340*2f172c55SRobert Thurlow struct netbuf * 341*2f172c55SRobert Thurlow get_server_addr(char *hostname, rpcprog_t prog, rpcvers_t vers, 342*2f172c55SRobert Thurlow struct netconfig *nconf, ushort_t port, 343*2f172c55SRobert Thurlow struct t_info *tinfo, caddr_t *fhp, bool_t direct_to_server, 344*2f172c55SRobert Thurlow char *fspath, enum clnt_stat *cstat) 345*2f172c55SRobert Thurlow { 346*2f172c55SRobert Thurlow int fd = -1; 347*2f172c55SRobert Thurlow struct t_bind *tbind = NULL; 348*2f172c55SRobert Thurlow enum clnt_stat cs = RPC_SYSTEMERROR; 349*2f172c55SRobert Thurlow struct netbuf *nb = NULL; 350*2f172c55SRobert Thurlow int ret = -1; 351*2f172c55SRobert Thurlow 352*2f172c55SRobert Thurlow if (prog == NFS_PROGRAM && vers == NFS_V4) 353*2f172c55SRobert Thurlow if (strncasecmp(nconf->nc_proto, NC_UDP, strlen(NC_UDP)) == 0) 354*2f172c55SRobert Thurlow goto done; 355*2f172c55SRobert Thurlow 356*2f172c55SRobert Thurlow if ((fd = t_open(nconf->nc_device, O_RDWR, tinfo)) < 0) 357*2f172c55SRobert Thurlow goto done; 358*2f172c55SRobert Thurlow 359*2f172c55SRobert Thurlow if ((tbind = (struct t_bind *)t_alloc(fd, T_BIND, T_ADDR)) == NULL) 360*2f172c55SRobert Thurlow goto done; 361*2f172c55SRobert Thurlow 362*2f172c55SRobert Thurlow if (setup_nb_parms(nconf, tbind, tinfo, hostname, fd, direct_to_server, 363*2f172c55SRobert Thurlow port, prog, vers, 0) < 0) 364*2f172c55SRobert Thurlow goto done; 365*2f172c55SRobert Thurlow 366*2f172c55SRobert Thurlow nb = (struct netbuf *)malloc(sizeof (struct netbuf)); 367*2f172c55SRobert Thurlow if (nb == NULL) { 368*2f172c55SRobert Thurlow syslog(LOG_ERR, "no memory\n"); 369*2f172c55SRobert Thurlow goto done; 370*2f172c55SRobert Thurlow } 371*2f172c55SRobert Thurlow nb->buf = (char *)malloc(tbind->addr.maxlen); 372*2f172c55SRobert Thurlow if (nb->buf == NULL) { 373*2f172c55SRobert Thurlow syslog(LOG_ERR, "no memory\n"); 374*2f172c55SRobert Thurlow free(nb); 375*2f172c55SRobert Thurlow nb = NULL; 376*2f172c55SRobert Thurlow goto done; 377*2f172c55SRobert Thurlow } 378*2f172c55SRobert Thurlow (void) memcpy(nb->buf, tbind->addr.buf, tbind->addr.len); 379*2f172c55SRobert Thurlow nb->len = tbind->addr.len; 380*2f172c55SRobert Thurlow nb->maxlen = tbind->addr.maxlen; 381*2f172c55SRobert Thurlow cs = RPC_SUCCESS; 382*2f172c55SRobert Thurlow done: 383*2f172c55SRobert Thurlow *cstat = cs; 384*2f172c55SRobert Thurlow cleanup_tli_parms(tbind, fd); 385*2f172c55SRobert Thurlow return (nb); 386*2f172c55SRobert Thurlow } 387