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