17c478bd9Sstevel@tonic-gate /* 27c478bd9Sstevel@tonic-gate * CDDL HEADER START 37c478bd9Sstevel@tonic-gate * 47c478bd9Sstevel@tonic-gate * The contents of this file are subject to the terms of the 566786d5eSdjl * Common Development and Distribution License (the "License"). 666786d5eSdjl * You may not use this file except in compliance with the License. 77c478bd9Sstevel@tonic-gate * 87c478bd9Sstevel@tonic-gate * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 97c478bd9Sstevel@tonic-gate * or http://www.opensolaris.org/os/licensing. 107c478bd9Sstevel@tonic-gate * See the License for the specific language governing permissions 117c478bd9Sstevel@tonic-gate * and limitations under the License. 127c478bd9Sstevel@tonic-gate * 137c478bd9Sstevel@tonic-gate * When distributing Covered Code, include this CDDL HEADER in each 147c478bd9Sstevel@tonic-gate * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 157c478bd9Sstevel@tonic-gate * If applicable, add the following below this CDDL HEADER, with the 167c478bd9Sstevel@tonic-gate * fields enclosed by brackets "[]" replaced with your own identifying 177c478bd9Sstevel@tonic-gate * information: Portions Copyright [yyyy] [name of copyright owner] 187c478bd9Sstevel@tonic-gate * 197c478bd9Sstevel@tonic-gate * CDDL HEADER END 207c478bd9Sstevel@tonic-gate */ 217c478bd9Sstevel@tonic-gate /* 22*4b3b7fc6SAlex Wilson * Copyright 2017 Joyent Inc 23d67944fbSScott Rotondo * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 247c478bd9Sstevel@tonic-gate * Use is subject to license terms. 257c478bd9Sstevel@tonic-gate */ 267c478bd9Sstevel@tonic-gate 277c478bd9Sstevel@tonic-gate /* 287c478bd9Sstevel@tonic-gate * NIS update service 297c478bd9Sstevel@tonic-gate */ 307c478bd9Sstevel@tonic-gate #include <stdio.h> 317c478bd9Sstevel@tonic-gate #include <sys/wait.h> 327c478bd9Sstevel@tonic-gate #include <sys/time.h> 337c478bd9Sstevel@tonic-gate #include <sys/file.h> 347c478bd9Sstevel@tonic-gate #include <ctype.h> 357c478bd9Sstevel@tonic-gate #include <rpc/rpc.h> 367c478bd9Sstevel@tonic-gate #include <rpc/auth_des.h> 377c478bd9Sstevel@tonic-gate #include <sys/socket.h> 387c478bd9Sstevel@tonic-gate #include <sys/signal.h> 397c478bd9Sstevel@tonic-gate #include <sys/stat.h> 407c478bd9Sstevel@tonic-gate #include <sys/termio.h> 41*4b3b7fc6SAlex Wilson #include <sys/debug.h> 427c478bd9Sstevel@tonic-gate #include <strings.h> 437c478bd9Sstevel@tonic-gate #include <rpcsvc/ypclnt.h> 447c478bd9Sstevel@tonic-gate #include <rpcsvc/yp_prot.h> 457c478bd9Sstevel@tonic-gate #include <netdir.h> 467c478bd9Sstevel@tonic-gate #include <rpcsvc/ypupd.h> 477c478bd9Sstevel@tonic-gate #include <netdb.h> 487c478bd9Sstevel@tonic-gate #include "shim.h" 497c478bd9Sstevel@tonic-gate #include "yptol.h" 507c478bd9Sstevel@tonic-gate 517c478bd9Sstevel@tonic-gate #define RPC_INETDSOCK 0 /* socket descriptor if using inetd */ 527c478bd9Sstevel@tonic-gate #define debug(msg) /* turn off debugging */ 537c478bd9Sstevel@tonic-gate 547c478bd9Sstevel@tonic-gate char YPDIR[] = "/var/yp"; 557c478bd9Sstevel@tonic-gate char UPDATEFILE[] = "updaters"; 567c478bd9Sstevel@tonic-gate 577c478bd9Sstevel@tonic-gate void ypupdate_prog(); 587c478bd9Sstevel@tonic-gate void detachfromtty(); 59a506a34cSth160488 60a506a34cSth160488 static int addr2netname(char *, SVCXPRT *); 61d67944fbSScott Rotondo static int issock(); 62a506a34cSth160488 637c478bd9Sstevel@tonic-gate int insecure; 647c478bd9Sstevel@tonic-gate extern SVCXPRT *svctcp_create(int, uint_t, uint_t); 657c478bd9Sstevel@tonic-gate extern SVCXPRT *svcudp_create(); 667c478bd9Sstevel@tonic-gate 67a506a34cSth160488 int 687c478bd9Sstevel@tonic-gate main(argc, argv) 697c478bd9Sstevel@tonic-gate int argc; 707c478bd9Sstevel@tonic-gate char *argv[]; 717c478bd9Sstevel@tonic-gate { 727c478bd9Sstevel@tonic-gate char *cmd; 737c478bd9Sstevel@tonic-gate int connmaxrec = RPC_MAXDATASIZE; 747c478bd9Sstevel@tonic-gate struct stat filestat; 757c478bd9Sstevel@tonic-gate 767c478bd9Sstevel@tonic-gate /* 777c478bd9Sstevel@tonic-gate * Check if we are running in N2L mode. If so updated is unsuported. 787c478bd9Sstevel@tonic-gate * This could be done by calling is_yptol_mode(), from libnisdb, but it 797c478bd9Sstevel@tonic-gate * seems over complex to pull in an entire library for one check so 807c478bd9Sstevel@tonic-gate * do it in line. Just pull in the name of file to check. 817c478bd9Sstevel@tonic-gate */ 827c478bd9Sstevel@tonic-gate if (stat(NTOL_MAP_FILE, &filestat) != -1) { 837c478bd9Sstevel@tonic-gate fprintf(stderr, "rpc.updated not supported in NIS to LDAP " 847c478bd9Sstevel@tonic-gate "transition mode."); 857c478bd9Sstevel@tonic-gate exit(1); 867c478bd9Sstevel@tonic-gate } 877c478bd9Sstevel@tonic-gate 887c478bd9Sstevel@tonic-gate 897c478bd9Sstevel@tonic-gate cmd = argv[0]; 907c478bd9Sstevel@tonic-gate switch (argc) { 917c478bd9Sstevel@tonic-gate case 0: 927c478bd9Sstevel@tonic-gate cmd = "ypupdated"; 937c478bd9Sstevel@tonic-gate break; 947c478bd9Sstevel@tonic-gate case 1: 957c478bd9Sstevel@tonic-gate break; 967c478bd9Sstevel@tonic-gate case 2: 977c478bd9Sstevel@tonic-gate if (strcmp(argv[1], "-i") == 0) { 987c478bd9Sstevel@tonic-gate insecure++; 997c478bd9Sstevel@tonic-gate break; 1007c478bd9Sstevel@tonic-gate } else if (strcmp(argv[1], "-s") == 0) { 1017c478bd9Sstevel@tonic-gate insecure = 0; 1027c478bd9Sstevel@tonic-gate break; 1037c478bd9Sstevel@tonic-gate } 1047c478bd9Sstevel@tonic-gate default: 1057c478bd9Sstevel@tonic-gate fprintf(stderr, "%s: warning -- options ignored\n", cmd); 1067c478bd9Sstevel@tonic-gate break; 1077c478bd9Sstevel@tonic-gate } 1087c478bd9Sstevel@tonic-gate 1097c478bd9Sstevel@tonic-gate if (chdir(YPDIR) < 0) { 1107c478bd9Sstevel@tonic-gate fprintf(stderr, "%s: can't chdir to ", cmd); 1117c478bd9Sstevel@tonic-gate perror(YPDIR); 1127c478bd9Sstevel@tonic-gate exit(1); 1137c478bd9Sstevel@tonic-gate } 1147c478bd9Sstevel@tonic-gate 1157c478bd9Sstevel@tonic-gate /* 1167c478bd9Sstevel@tonic-gate * Set non-blocking mode and maximum record size for 1177c478bd9Sstevel@tonic-gate * connection oriented RPC transports. 1187c478bd9Sstevel@tonic-gate */ 1197c478bd9Sstevel@tonic-gate if (!rpc_control(RPC_SVC_CONNMAXREC_SET, &connmaxrec)) { 1207c478bd9Sstevel@tonic-gate fprintf(stderr, "unable to set maximum RPC record size"); 1217c478bd9Sstevel@tonic-gate } 1227c478bd9Sstevel@tonic-gate 1237c478bd9Sstevel@tonic-gate if (issock(RPC_INETDSOCK)) { 1247c478bd9Sstevel@tonic-gate SVCXPRT *transp; 1257c478bd9Sstevel@tonic-gate int proto = 0; 1267c478bd9Sstevel@tonic-gate transp = svctcp_create(RPC_INETDSOCK, 0, 0); 1277c478bd9Sstevel@tonic-gate if (transp == NULL) { 1287c478bd9Sstevel@tonic-gate fprintf(stderr, "%s: cannot create tcp service\n", cmd); 1297c478bd9Sstevel@tonic-gate exit(1); 1307c478bd9Sstevel@tonic-gate } 1317c478bd9Sstevel@tonic-gate if (!svc_register(transp, YPU_PROG, YPU_VERS, ypupdate_prog, 1327c478bd9Sstevel@tonic-gate proto)) { 1337c478bd9Sstevel@tonic-gate fprintf(stderr, "%s: couldn't register service\n", cmd); 1347c478bd9Sstevel@tonic-gate exit(1); 1357c478bd9Sstevel@tonic-gate } 1367c478bd9Sstevel@tonic-gate } else { 1377c478bd9Sstevel@tonic-gate detachfromtty(); 1387c478bd9Sstevel@tonic-gate (void) rpcb_unset(YPU_PROG, YPU_VERS, 0); 1397c478bd9Sstevel@tonic-gate if (!svc_create(ypupdate_prog, YPU_PROG, YPU_VERS, "tcp")) { 1407c478bd9Sstevel@tonic-gate fprintf(stderr, "%s: cannot create tcp service\n", cmd); 1417c478bd9Sstevel@tonic-gate exit(1); 1427c478bd9Sstevel@tonic-gate } 1437c478bd9Sstevel@tonic-gate } 1447c478bd9Sstevel@tonic-gate 1457c478bd9Sstevel@tonic-gate if (!svc_create(ypupdate_prog, YPU_PROG, YPU_VERS, "udp")) { 1467c478bd9Sstevel@tonic-gate fprintf(stderr, "%s: cannot create udp service\n", cmd); 1477c478bd9Sstevel@tonic-gate exit(1); 1487c478bd9Sstevel@tonic-gate } 1497c478bd9Sstevel@tonic-gate 1507c478bd9Sstevel@tonic-gate svc_run(); 1517c478bd9Sstevel@tonic-gate abort(); 1527c478bd9Sstevel@tonic-gate /* NOTREACHED */ 153a506a34cSth160488 return (1); 1547c478bd9Sstevel@tonic-gate } 1557c478bd9Sstevel@tonic-gate 1567c478bd9Sstevel@tonic-gate /* 1577c478bd9Sstevel@tonic-gate * Determine if a descriptor belongs to a socket or not 1587c478bd9Sstevel@tonic-gate */ 1597c478bd9Sstevel@tonic-gate static int 1607c478bd9Sstevel@tonic-gate issock(fd) 1617c478bd9Sstevel@tonic-gate int fd; 1627c478bd9Sstevel@tonic-gate { 1637c478bd9Sstevel@tonic-gate struct stat st; 1647c478bd9Sstevel@tonic-gate 1657c478bd9Sstevel@tonic-gate if (fstat(fd, &st) == -1) 1667c478bd9Sstevel@tonic-gate return (0); 1677c478bd9Sstevel@tonic-gate else 1687c478bd9Sstevel@tonic-gate return (S_ISSOCK(fd)); 1697c478bd9Sstevel@tonic-gate } 1707c478bd9Sstevel@tonic-gate 1717c478bd9Sstevel@tonic-gate 1727c478bd9Sstevel@tonic-gate void 1737c478bd9Sstevel@tonic-gate detachfromtty() 1747c478bd9Sstevel@tonic-gate { 1757c478bd9Sstevel@tonic-gate int tt; 1767c478bd9Sstevel@tonic-gate 1777c478bd9Sstevel@tonic-gate close(0); 1787c478bd9Sstevel@tonic-gate close(1); 1797c478bd9Sstevel@tonic-gate close(2); 1807c478bd9Sstevel@tonic-gate switch (fork()) { 1817c478bd9Sstevel@tonic-gate case -1: 1827c478bd9Sstevel@tonic-gate perror("fork"); 1837c478bd9Sstevel@tonic-gate break; 1847c478bd9Sstevel@tonic-gate case 0: 1857c478bd9Sstevel@tonic-gate break; 1867c478bd9Sstevel@tonic-gate default: 1877c478bd9Sstevel@tonic-gate exit(0); 1887c478bd9Sstevel@tonic-gate } 1897c478bd9Sstevel@tonic-gate tt = open("/dev/tty", O_RDWR, 0); 1907c478bd9Sstevel@tonic-gate if (tt >= 0) { 1917c478bd9Sstevel@tonic-gate ioctl(tt, TIOCNOTTY, 0); 1927c478bd9Sstevel@tonic-gate close(tt); 1937c478bd9Sstevel@tonic-gate } 1947c478bd9Sstevel@tonic-gate open("/dev/null", O_RDWR, 0); 1957c478bd9Sstevel@tonic-gate dup(0); 1967c478bd9Sstevel@tonic-gate dup(0); 1977c478bd9Sstevel@tonic-gate } 1987c478bd9Sstevel@tonic-gate 1997c478bd9Sstevel@tonic-gate void 2007c478bd9Sstevel@tonic-gate ypupdate_prog(rqstp, transp) 2017c478bd9Sstevel@tonic-gate struct svc_req *rqstp; 2027c478bd9Sstevel@tonic-gate SVCXPRT *transp; 2037c478bd9Sstevel@tonic-gate { 2047c478bd9Sstevel@tonic-gate struct ypupdate_args args; 2057c478bd9Sstevel@tonic-gate uint_t rslt; 2067c478bd9Sstevel@tonic-gate uint_t op; 2077c478bd9Sstevel@tonic-gate char *netname; 2087c478bd9Sstevel@tonic-gate char namebuf[MAXNETNAMELEN+1]; 2097c478bd9Sstevel@tonic-gate struct authunix_parms *aup; 2107c478bd9Sstevel@tonic-gate 2117c478bd9Sstevel@tonic-gate switch (rqstp->rq_proc) { 2127c478bd9Sstevel@tonic-gate case NULLPROC: 2137c478bd9Sstevel@tonic-gate svc_sendreply(transp, xdr_void, NULL); 2147c478bd9Sstevel@tonic-gate return; 2157c478bd9Sstevel@tonic-gate case YPU_CHANGE: 2167c478bd9Sstevel@tonic-gate op = YPOP_CHANGE; 2177c478bd9Sstevel@tonic-gate break; 2187c478bd9Sstevel@tonic-gate case YPU_DELETE: 2197c478bd9Sstevel@tonic-gate op = YPOP_DELETE; 2207c478bd9Sstevel@tonic-gate break; 2217c478bd9Sstevel@tonic-gate case YPU_INSERT: 2227c478bd9Sstevel@tonic-gate op = YPOP_INSERT; 2237c478bd9Sstevel@tonic-gate break; 2247c478bd9Sstevel@tonic-gate case YPU_STORE: 2257c478bd9Sstevel@tonic-gate op = YPOP_STORE; 2267c478bd9Sstevel@tonic-gate break; 2277c478bd9Sstevel@tonic-gate default: 2287c478bd9Sstevel@tonic-gate svcerr_noproc(transp); 2297c478bd9Sstevel@tonic-gate return; 2307c478bd9Sstevel@tonic-gate } 231*4b3b7fc6SAlex Wilson 232*4b3b7fc6SAlex Wilson CTASSERT(sizeof (struct authdes_cred) <= RQCRED_SIZE); 233*4b3b7fc6SAlex Wilson CTASSERT(sizeof (struct authunix_parms) <= RQCRED_SIZE); 234*4b3b7fc6SAlex Wilson 2357c478bd9Sstevel@tonic-gate switch (rqstp->rq_cred.oa_flavor) { 2367c478bd9Sstevel@tonic-gate case AUTH_DES: 2377c478bd9Sstevel@tonic-gate netname = ((struct authdes_cred *) 2387c478bd9Sstevel@tonic-gate rqstp->rq_clntcred)->adc_fullname.name; 2397c478bd9Sstevel@tonic-gate break; 2407c478bd9Sstevel@tonic-gate case AUTH_UNIX: 2417c478bd9Sstevel@tonic-gate if (insecure) { 2427c478bd9Sstevel@tonic-gate aup = (struct authunix_parms *)rqstp->rq_clntcred; 2437c478bd9Sstevel@tonic-gate if (aup->aup_uid == 0) { 2447c478bd9Sstevel@tonic-gate /* 2457c478bd9Sstevel@tonic-gate * addr2netname(namebuf, svc_getcaller(transp)); 2467c478bd9Sstevel@tonic-gate */ 2477c478bd9Sstevel@tonic-gate addr2netname(namebuf, transp); 2487c478bd9Sstevel@tonic-gate } else { 2497c478bd9Sstevel@tonic-gate user2netname(namebuf, aup->aup_uid, NULL); 2507c478bd9Sstevel@tonic-gate } 2517c478bd9Sstevel@tonic-gate netname = namebuf; 2527c478bd9Sstevel@tonic-gate break; 2537c478bd9Sstevel@tonic-gate } 2547c478bd9Sstevel@tonic-gate default: 2557c478bd9Sstevel@tonic-gate svcerr_weakauth(transp); 2567c478bd9Sstevel@tonic-gate return; 2577c478bd9Sstevel@tonic-gate } 2587c478bd9Sstevel@tonic-gate bzero(&args, sizeof (args)); 2597c478bd9Sstevel@tonic-gate if (!svc_getargs(transp, xdr_ypupdate_args, (caddr_t)&args)) { 2607c478bd9Sstevel@tonic-gate svcerr_decode(transp); 2617c478bd9Sstevel@tonic-gate return; 2627c478bd9Sstevel@tonic-gate } 2637c478bd9Sstevel@tonic-gate rslt = update(netname, 2647c478bd9Sstevel@tonic-gate args.mapname, op, args.key.yp_buf_len, args.key.yp_buf_val, 2657c478bd9Sstevel@tonic-gate args.datum.yp_buf_len, args.datum.yp_buf_val); 2667c478bd9Sstevel@tonic-gate if (!svc_sendreply(transp, xdr_u_int, (const caddr_t)&rslt)) { 2677c478bd9Sstevel@tonic-gate debug("svc_sendreply failed"); 2687c478bd9Sstevel@tonic-gate } 2697c478bd9Sstevel@tonic-gate if (!svc_freeargs(transp, xdr_ypupdate_args, (caddr_t)&args)) { 2707c478bd9Sstevel@tonic-gate debug("svc_freeargs failed"); 2717c478bd9Sstevel@tonic-gate } 2727c478bd9Sstevel@tonic-gate } 2737c478bd9Sstevel@tonic-gate 2747c478bd9Sstevel@tonic-gate /* 2757c478bd9Sstevel@tonic-gate * Determine if requester is allowed to update the given map, 2767c478bd9Sstevel@tonic-gate * and update it if so. Returns the NIS status, which is zero 2777c478bd9Sstevel@tonic-gate * if there is no access violation. 2787c478bd9Sstevel@tonic-gate */ 279a506a34cSth160488 int 2807c478bd9Sstevel@tonic-gate update(requester, mapname, op, keylen, key, datalen, data) 2817c478bd9Sstevel@tonic-gate char *requester; 2827c478bd9Sstevel@tonic-gate char *mapname; 2837c478bd9Sstevel@tonic-gate uint_t op; 2847c478bd9Sstevel@tonic-gate uint_t keylen; 2857c478bd9Sstevel@tonic-gate char *key; 2867c478bd9Sstevel@tonic-gate uint_t datalen; 2877c478bd9Sstevel@tonic-gate char *data; 2887c478bd9Sstevel@tonic-gate { 2897c478bd9Sstevel@tonic-gate char updater[MAXMAPNAMELEN + 40]; 2907c478bd9Sstevel@tonic-gate FILE *childargs; 2917c478bd9Sstevel@tonic-gate FILE *childrslt; 2927c478bd9Sstevel@tonic-gate int status; 2937c478bd9Sstevel@tonic-gate int yperrno; 2947c478bd9Sstevel@tonic-gate int pid; 2957c478bd9Sstevel@tonic-gate char default_domain[YPMAXDOMAIN]; 2967c478bd9Sstevel@tonic-gate int err; 2977c478bd9Sstevel@tonic-gate char fake_key[10]; 2987c478bd9Sstevel@tonic-gate char *outval = NULL; 2997c478bd9Sstevel@tonic-gate int outval_len; 3007c478bd9Sstevel@tonic-gate 3017c478bd9Sstevel@tonic-gate if (getdomainname(default_domain, YPMAXDOMAIN)) { 3027c478bd9Sstevel@tonic-gate debug("Couldn't get default domain name"); 3037c478bd9Sstevel@tonic-gate return (YPERR_YPERR); 3047c478bd9Sstevel@tonic-gate } 3057c478bd9Sstevel@tonic-gate 3067c478bd9Sstevel@tonic-gate /* check to see if we have a valid mapname */ 3077c478bd9Sstevel@tonic-gate strncpy(fake_key, "junk", 4); 3087c478bd9Sstevel@tonic-gate err = yp_match(default_domain, mapname, 3097c478bd9Sstevel@tonic-gate fake_key, strlen(fake_key), &outval, &outval_len); 3107c478bd9Sstevel@tonic-gate switch (err) { 31166786d5eSdjl case 0: 31266786d5eSdjl case YPERR_KEY: 31366786d5eSdjl /* do nothing, only worry about above return code */ 3147c478bd9Sstevel@tonic-gate break; 3157c478bd9Sstevel@tonic-gate default: 31666786d5eSdjl /* defensive programming */ 31766786d5eSdjl return (YPERR_YPERR); 3187c478bd9Sstevel@tonic-gate break; 3197c478bd9Sstevel@tonic-gate } 3207c478bd9Sstevel@tonic-gate 3217c478bd9Sstevel@tonic-gate /* valid map - continue */ 3227c478bd9Sstevel@tonic-gate sprintf(updater, "make -s -f %s %s", UPDATEFILE, mapname); 3237c478bd9Sstevel@tonic-gate pid = _openchild(updater, &childargs, &childrslt); 3247c478bd9Sstevel@tonic-gate if (pid < 0) { 3257c478bd9Sstevel@tonic-gate debug("openpipes failed"); 3267c478bd9Sstevel@tonic-gate return (YPERR_YPERR); 3277c478bd9Sstevel@tonic-gate } 3287c478bd9Sstevel@tonic-gate 3297c478bd9Sstevel@tonic-gate /* 3307c478bd9Sstevel@tonic-gate * Write to child 3317c478bd9Sstevel@tonic-gate */ 3327c478bd9Sstevel@tonic-gate fprintf(childargs, "%s\n", requester); 3337c478bd9Sstevel@tonic-gate fprintf(childargs, "%u\n", op); 3347c478bd9Sstevel@tonic-gate fprintf(childargs, "%u\n", keylen); 3357c478bd9Sstevel@tonic-gate fwrite(key, keylen, 1, childargs); 3367c478bd9Sstevel@tonic-gate fprintf(childargs, "\n"); 3377c478bd9Sstevel@tonic-gate fprintf(childargs, "%u\n", datalen); 3387c478bd9Sstevel@tonic-gate fwrite(data, datalen, 1, childargs); 3397c478bd9Sstevel@tonic-gate fprintf(childargs, "\n"); 3407c478bd9Sstevel@tonic-gate fclose(childargs); 3417c478bd9Sstevel@tonic-gate 3427c478bd9Sstevel@tonic-gate /* 3437c478bd9Sstevel@tonic-gate * Read from child 3447c478bd9Sstevel@tonic-gate */ 3457c478bd9Sstevel@tonic-gate fscanf(childrslt, "%d", &yperrno); 3467c478bd9Sstevel@tonic-gate fclose(childrslt); 3477c478bd9Sstevel@tonic-gate 3487c478bd9Sstevel@tonic-gate wait(&status); 3497c478bd9Sstevel@tonic-gate if (!WIFEXITED(status)) { 3507c478bd9Sstevel@tonic-gate return (YPERR_YPERR); 3517c478bd9Sstevel@tonic-gate } 3527c478bd9Sstevel@tonic-gate return (yperrno); 3537c478bd9Sstevel@tonic-gate } 3547c478bd9Sstevel@tonic-gate 3557c478bd9Sstevel@tonic-gate #if 0 3567c478bd9Sstevel@tonic-gate addr2netname(namebuf, addr) 3577c478bd9Sstevel@tonic-gate char *namebuf; 3587c478bd9Sstevel@tonic-gate struct sockaddr_in *addr; 3597c478bd9Sstevel@tonic-gate { 3607c478bd9Sstevel@tonic-gate struct hostent *h; 3617c478bd9Sstevel@tonic-gate 3627c478bd9Sstevel@tonic-gate h = gethostbyaddr((const char *) &addr->sin_addr, 3637c478bd9Sstevel@tonic-gate sizeof (addr->sin_addr), AF_INET); 3647c478bd9Sstevel@tonic-gate if (h == NULL) { 3657c478bd9Sstevel@tonic-gate host2netname(namebuf, (const char *) inet_ntoa(addr->sin_addr), 3667c478bd9Sstevel@tonic-gate NULL); 3677c478bd9Sstevel@tonic-gate } else { 3687c478bd9Sstevel@tonic-gate host2netname(namebuf, h->h_name, NULL); 3697c478bd9Sstevel@tonic-gate } 3707c478bd9Sstevel@tonic-gate } 3717c478bd9Sstevel@tonic-gate #endif 3727c478bd9Sstevel@tonic-gate 3737c478bd9Sstevel@tonic-gate 3747c478bd9Sstevel@tonic-gate static int 3757c478bd9Sstevel@tonic-gate addr2netname(namebuf, transp) 3767c478bd9Sstevel@tonic-gate char *namebuf; 3777c478bd9Sstevel@tonic-gate SVCXPRT *transp; 3787c478bd9Sstevel@tonic-gate { 3797c478bd9Sstevel@tonic-gate struct nd_hostservlist *hostservs = NULL; 3807c478bd9Sstevel@tonic-gate struct netconfig *nconf; 3817c478bd9Sstevel@tonic-gate struct netbuf *who; 3827c478bd9Sstevel@tonic-gate 3837c478bd9Sstevel@tonic-gate who = svc_getrpccaller(transp); 3847c478bd9Sstevel@tonic-gate if ((who == NULL) || (who->len == 0)) 3857c478bd9Sstevel@tonic-gate return (-1); 3867c478bd9Sstevel@tonic-gate if ((nconf = getnetconfigent(transp->xp_netid)) 3877c478bd9Sstevel@tonic-gate == (struct netconfig *)NULL) 3887c478bd9Sstevel@tonic-gate return (-1); 3897c478bd9Sstevel@tonic-gate if (netdir_getbyaddr(nconf, &hostservs, who) != 0) { 3907c478bd9Sstevel@tonic-gate (void) freenetconfigent(nconf); 3917c478bd9Sstevel@tonic-gate return (-1); 3927c478bd9Sstevel@tonic-gate } 3937c478bd9Sstevel@tonic-gate if (hostservs != NULL) 3947c478bd9Sstevel@tonic-gate strcpy(namebuf, hostservs->h_hostservs->h_host); 3957c478bd9Sstevel@tonic-gate 3967c478bd9Sstevel@tonic-gate (void) freenetconfigent(nconf); 3977c478bd9Sstevel@tonic-gate netdir_free((char *)hostservs, ND_HOSTSERVLIST); 3987c478bd9Sstevel@tonic-gate return (0); 3997c478bd9Sstevel@tonic-gate } 400