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*09b0d01cSGary Mills * Copyright 2014 Gary Mills 247c478bd9Sstevel@tonic-gate * Copyright 2001 Sun Microsystems, Inc. All rights reserved. 257c478bd9Sstevel@tonic-gate * Use is subject to license terms. 267c478bd9Sstevel@tonic-gate */ 277c478bd9Sstevel@tonic-gate 287c478bd9Sstevel@tonic-gate /* Copyright (c) 1983, 1984, 1985, 1986, 1987, 1988, 1989 AT&T */ 297c478bd9Sstevel@tonic-gate /* All Rights Reserved */ 307c478bd9Sstevel@tonic-gate 317c478bd9Sstevel@tonic-gate /* 327c478bd9Sstevel@tonic-gate * Portions of this source code were derived from Berkeley 4.3 BSD 337c478bd9Sstevel@tonic-gate * under license from the Regents of the University of California. 347c478bd9Sstevel@tonic-gate */ 357c478bd9Sstevel@tonic-gate 367c478bd9Sstevel@tonic-gate /* 377c478bd9Sstevel@tonic-gate * Miscellaneous support routines for kernel implentation of AUTH_DES 387c478bd9Sstevel@tonic-gate */ 397c478bd9Sstevel@tonic-gate 407c478bd9Sstevel@tonic-gate /* 417c478bd9Sstevel@tonic-gate * rtime - get time from remote machine 427c478bd9Sstevel@tonic-gate * 437c478bd9Sstevel@tonic-gate * sets time, obtaining value from host 447c478bd9Sstevel@tonic-gate * on the udp/time socket. Since timeserver returns 457c478bd9Sstevel@tonic-gate * with time of day in seconds since Jan 1, 1900, must 467c478bd9Sstevel@tonic-gate * subtract 86400(365*70 + 17) to get time 477c478bd9Sstevel@tonic-gate * since Jan 1, 1970, which is what get/settimeofday 487c478bd9Sstevel@tonic-gate * uses. 497c478bd9Sstevel@tonic-gate */ 507c478bd9Sstevel@tonic-gate #include <sys/param.h> 517c478bd9Sstevel@tonic-gate #include <sys/types.h> 527c478bd9Sstevel@tonic-gate #include <sys/time.h> 537c478bd9Sstevel@tonic-gate #include <sys/systm.h> 547c478bd9Sstevel@tonic-gate #include <sys/errno.h> 557c478bd9Sstevel@tonic-gate #include <sys/proc.h> 567c478bd9Sstevel@tonic-gate #include <sys/user.h> 577c478bd9Sstevel@tonic-gate #include <sys/socket.h> 587c478bd9Sstevel@tonic-gate #include <sys/sysmacros.h> 597c478bd9Sstevel@tonic-gate #include <netinet/in.h> 607c478bd9Sstevel@tonic-gate #include <rpc/rpc.h> 617c478bd9Sstevel@tonic-gate #include <sys/stream.h> 627c478bd9Sstevel@tonic-gate #include <sys/strsubr.h> 637c478bd9Sstevel@tonic-gate #include <sys/cred.h> 647c478bd9Sstevel@tonic-gate #include <sys/utsname.h> 657c478bd9Sstevel@tonic-gate #include <sys/vnode.h> 667c478bd9Sstevel@tonic-gate #include <sys/file.h> 677c478bd9Sstevel@tonic-gate #include <sys/uio.h> 687c478bd9Sstevel@tonic-gate #include <sys/systeminfo.h> 697c478bd9Sstevel@tonic-gate #include <rpc/rpcb_prot.h> 707c478bd9Sstevel@tonic-gate #include <sys/cmn_err.h> 717c478bd9Sstevel@tonic-gate 727c478bd9Sstevel@tonic-gate #define TOFFSET ((uint32_t)86400 * (365 * 70 + (70 / 4))) 737c478bd9Sstevel@tonic-gate #define WRITTEN ((uint32_t)86400 * (365 * 86 + (86 / 4))) 747c478bd9Sstevel@tonic-gate 757c478bd9Sstevel@tonic-gate #define NC_INET "inet" /* XXX */ 767c478bd9Sstevel@tonic-gate 777c478bd9Sstevel@tonic-gate int 787c478bd9Sstevel@tonic-gate rtime(struct knetconfig *synconfig, struct netbuf *addrp, int calltype, 797c478bd9Sstevel@tonic-gate struct timeval *timep, struct timeval *wait) 807c478bd9Sstevel@tonic-gate { 817c478bd9Sstevel@tonic-gate int error; 827c478bd9Sstevel@tonic-gate int timo; 837c478bd9Sstevel@tonic-gate time_t thetime; 847c478bd9Sstevel@tonic-gate int32_t srvtime; 857c478bd9Sstevel@tonic-gate uint32_t dummy; 867c478bd9Sstevel@tonic-gate struct t_kunitdata *unitdata; 877c478bd9Sstevel@tonic-gate struct t_call *server; 887c478bd9Sstevel@tonic-gate TIUSER *tiptr; 897c478bd9Sstevel@tonic-gate int type; 907c478bd9Sstevel@tonic-gate int uderr; 917c478bd9Sstevel@tonic-gate int i; 927c478bd9Sstevel@tonic-gate int retries; 937c478bd9Sstevel@tonic-gate mblk_t *mp; 947c478bd9Sstevel@tonic-gate mblk_t *mp2; 957c478bd9Sstevel@tonic-gate 967c478bd9Sstevel@tonic-gate retries = 5; 977c478bd9Sstevel@tonic-gate if (calltype == 0) { 987c478bd9Sstevel@tonic-gate again: 997c478bd9Sstevel@tonic-gate RPCLOG0(8, "rtime: using old method\n"); 1007c478bd9Sstevel@tonic-gate if ((error = t_kopen(NULL, synconfig->knc_rdev, 1017c478bd9Sstevel@tonic-gate FREAD|FWRITE, &tiptr, CRED())) != 0) { 1027c478bd9Sstevel@tonic-gate RPCLOG(1, "rtime: t_kopen %d\n", error); 1037c478bd9Sstevel@tonic-gate return (-1); 1047c478bd9Sstevel@tonic-gate } 1057c478bd9Sstevel@tonic-gate 1067c478bd9Sstevel@tonic-gate if ((error = t_kbind(tiptr, NULL, NULL)) != 0) { 1077c478bd9Sstevel@tonic-gate (void) t_kclose(tiptr, 1); 1087c478bd9Sstevel@tonic-gate RPCLOG(1, "rtime: t_kbind %d\n", error); 1097c478bd9Sstevel@tonic-gate return (-1); 1107c478bd9Sstevel@tonic-gate } 1117c478bd9Sstevel@tonic-gate 1127c478bd9Sstevel@tonic-gate if (synconfig->knc_semantics == NC_TPI_CLTS) { 113*09b0d01cSGary Mills if ((error = t_kalloc(tiptr, T_UNITDATA, 114*09b0d01cSGary Mills T_UDATA|T_ADDR, (char **)&unitdata)) != 0) { 1157c478bd9Sstevel@tonic-gate RPCLOG(1, "rtime: t_kalloc %d\n", error); 1167c478bd9Sstevel@tonic-gate (void) t_kclose(tiptr, 1); 1177c478bd9Sstevel@tonic-gate return (-1); 1187c478bd9Sstevel@tonic-gate } 1197c478bd9Sstevel@tonic-gate 1207c478bd9Sstevel@tonic-gate unitdata->addr.len = addrp->len; 121*09b0d01cSGary Mills bcopy(addrp->buf, unitdata->addr.buf, 122*09b0d01cSGary Mills unitdata->addr.len); 1237c478bd9Sstevel@tonic-gate 1247c478bd9Sstevel@tonic-gate dummy = 0; 1257c478bd9Sstevel@tonic-gate unitdata->udata.buf = (caddr_t)&dummy; 1267c478bd9Sstevel@tonic-gate unitdata->udata.len = sizeof (dummy); 1277c478bd9Sstevel@tonic-gate 128*09b0d01cSGary Mills if ((error = t_ksndudata(tiptr, unitdata, NULL)) != 129*09b0d01cSGary Mills 0) { 1307c478bd9Sstevel@tonic-gate RPCLOG(1, "rtime: t_ksndudata %d\n", error); 131*09b0d01cSGary Mills (void) t_kfree(tiptr, (char *)unitdata, 132*09b0d01cSGary Mills T_UNITDATA); 1337c478bd9Sstevel@tonic-gate (void) t_kclose(tiptr, 1); 1347c478bd9Sstevel@tonic-gate return (-1); 1357c478bd9Sstevel@tonic-gate } 1367c478bd9Sstevel@tonic-gate 1377c478bd9Sstevel@tonic-gate timo = TIMEVAL_TO_TICK(wait); 1387c478bd9Sstevel@tonic-gate 1397c478bd9Sstevel@tonic-gate RPCLOG(8, "rtime: timo %x\n", timo); 140*09b0d01cSGary Mills if ((error = t_kspoll(tiptr, timo, READWAIT, 141*09b0d01cSGary Mills &type)) != 0) { 1427c478bd9Sstevel@tonic-gate RPCLOG(1, "rtime: t_kspoll %d\n", error); 143*09b0d01cSGary Mills (void) t_kfree(tiptr, (char *)unitdata, 144*09b0d01cSGary Mills T_UNITDATA); 1457c478bd9Sstevel@tonic-gate (void) t_kclose(tiptr, 1); 1467c478bd9Sstevel@tonic-gate return (-1); 1477c478bd9Sstevel@tonic-gate } 1487c478bd9Sstevel@tonic-gate 1497c478bd9Sstevel@tonic-gate if (type == 0) { 1507c478bd9Sstevel@tonic-gate RPCLOG0(1, "rtime: t_kspoll timed out\n"); 151*09b0d01cSGary Mills (void) t_kfree(tiptr, (char *)unitdata, 152*09b0d01cSGary Mills T_UNITDATA); 1537c478bd9Sstevel@tonic-gate (void) t_kclose(tiptr, 1); 1547c478bd9Sstevel@tonic-gate return (-1); 1557c478bd9Sstevel@tonic-gate } 1567c478bd9Sstevel@tonic-gate 1577c478bd9Sstevel@tonic-gate error = t_krcvudata(tiptr, unitdata, &type, &uderr); 1587c478bd9Sstevel@tonic-gate if (error != 0) { 1597c478bd9Sstevel@tonic-gate RPCLOG(1, "rtime: t_krcvudata %d\n", error); 160*09b0d01cSGary Mills (void) t_kfree(tiptr, (char *)unitdata, 161*09b0d01cSGary Mills T_UNITDATA); 1627c478bd9Sstevel@tonic-gate (void) t_kclose(tiptr, 1); 163*09b0d01cSGary Mills if (error == EBADMSG && retries-- > 0) 164*09b0d01cSGary Mills goto again; 1657c478bd9Sstevel@tonic-gate return (-1); 1667c478bd9Sstevel@tonic-gate } 1677c478bd9Sstevel@tonic-gate 1687c478bd9Sstevel@tonic-gate if (type == T_UDERR) { 1697c478bd9Sstevel@tonic-gate if (bcmp(addrp->buf, unitdata->addr.buf, 1707c478bd9Sstevel@tonic-gate unitdata->addr.len) != 0) { 1717c478bd9Sstevel@tonic-gate /* 1727c478bd9Sstevel@tonic-gate * Response comes from some other 1737c478bd9Sstevel@tonic-gate * destination: 1747c478bd9Sstevel@tonic-gate * ignore it since it's not related to the 1757c478bd9Sstevel@tonic-gate * request we just sent out. 1767c478bd9Sstevel@tonic-gate */ 1777c478bd9Sstevel@tonic-gate (void) t_kfree(tiptr, (char *)unitdata, 1787c478bd9Sstevel@tonic-gate T_UNITDATA); 1797c478bd9Sstevel@tonic-gate (void) t_kclose(tiptr, 1); 1807c478bd9Sstevel@tonic-gate goto again; 1817c478bd9Sstevel@tonic-gate } 1827c478bd9Sstevel@tonic-gate } 1837c478bd9Sstevel@tonic-gate 1847c478bd9Sstevel@tonic-gate if (type != T_DATA) { 185*09b0d01cSGary Mills RPCLOG(1, 186*09b0d01cSGary Mills "rtime: t_krcvudata returned type %d\n", 1877c478bd9Sstevel@tonic-gate type); 188*09b0d01cSGary Mills (void) t_kfree(tiptr, (char *)unitdata, 189*09b0d01cSGary Mills T_UNITDATA); 1907c478bd9Sstevel@tonic-gate (void) t_kclose(tiptr, 1); 1917c478bd9Sstevel@tonic-gate if (retries-- == 0) 1927c478bd9Sstevel@tonic-gate return (-1); 1937c478bd9Sstevel@tonic-gate goto again; 1947c478bd9Sstevel@tonic-gate } 1957c478bd9Sstevel@tonic-gate 1967c478bd9Sstevel@tonic-gate if (unitdata->udata.len < sizeof (uint32_t)) { 1977c478bd9Sstevel@tonic-gate RPCLOG(1, "rtime: bad rcvd length %d\n", 1987c478bd9Sstevel@tonic-gate unitdata->udata.len); 199*09b0d01cSGary Mills (void) t_kfree(tiptr, (char *)unitdata, 200*09b0d01cSGary Mills T_UNITDATA); 2017c478bd9Sstevel@tonic-gate (void) t_kclose(tiptr, 1); 2027c478bd9Sstevel@tonic-gate if (retries-- == 0) 2037c478bd9Sstevel@tonic-gate return (-1); 2047c478bd9Sstevel@tonic-gate goto again; 2057c478bd9Sstevel@tonic-gate } 2067c478bd9Sstevel@tonic-gate 207*09b0d01cSGary Mills thetime = (time_t)ntohl( 2087c478bd9Sstevel@tonic-gate /* LINTED pointer alignment */ 209*09b0d01cSGary Mills *(uint32_t *)unitdata->udata.buf); 2107c478bd9Sstevel@tonic-gate (void) t_kfree(tiptr, (char *)unitdata, T_UNITDATA); 2117c478bd9Sstevel@tonic-gate 2127c478bd9Sstevel@tonic-gate } else { 2137c478bd9Sstevel@tonic-gate 2147c478bd9Sstevel@tonic-gate if ((error = t_kalloc(tiptr, T_CALL, T_ADDR, 2157c478bd9Sstevel@tonic-gate (char **)&server)) != 0) { 2167c478bd9Sstevel@tonic-gate RPCLOG(1, "rtime: t_kalloc %d\n", error); 2177c478bd9Sstevel@tonic-gate (void) t_kclose(tiptr, 1); 2187c478bd9Sstevel@tonic-gate return (-1); 2197c478bd9Sstevel@tonic-gate } 2207c478bd9Sstevel@tonic-gate 2217c478bd9Sstevel@tonic-gate server->addr.len = addrp->len; 2227c478bd9Sstevel@tonic-gate bcopy(addrp->buf, server->addr.buf, server->addr.len); 2237c478bd9Sstevel@tonic-gate 2247c478bd9Sstevel@tonic-gate if ((error = t_kconnect(tiptr, server, NULL)) != 0) { 2257c478bd9Sstevel@tonic-gate RPCLOG(1, "rtime: t_kconnect %d\n", error); 2267c478bd9Sstevel@tonic-gate (void) t_kfree(tiptr, (char *)server, T_CALL); 2277c478bd9Sstevel@tonic-gate (void) t_kclose(tiptr, 1); 2287c478bd9Sstevel@tonic-gate return (-1); 2297c478bd9Sstevel@tonic-gate } 2307c478bd9Sstevel@tonic-gate (void) t_kfree(tiptr, (char *)server, T_CALL); 2317c478bd9Sstevel@tonic-gate 2327c478bd9Sstevel@tonic-gate timo = TIMEVAL_TO_TICK(wait); 2337c478bd9Sstevel@tonic-gate 2347c478bd9Sstevel@tonic-gate RPCLOG(8, "rtime: timo %x\n", timo); 2357c478bd9Sstevel@tonic-gate 2367c478bd9Sstevel@tonic-gate i = 0; 2377c478bd9Sstevel@tonic-gate dummy = 0; 2387c478bd9Sstevel@tonic-gate 2397c478bd9Sstevel@tonic-gate /* now read up to 4 bytes from the TIME server */ 2407c478bd9Sstevel@tonic-gate while (i < sizeof (dummy)) { 2417c478bd9Sstevel@tonic-gate 2427c478bd9Sstevel@tonic-gate error = t_kspoll(tiptr, timo, READWAIT, &type); 2437c478bd9Sstevel@tonic-gate if (error != 0) { 244*09b0d01cSGary Mills RPCLOG(1, "rtime: t_kspoll %d\n", 245*09b0d01cSGary Mills error); 2467c478bd9Sstevel@tonic-gate (void) t_kclose(tiptr, 1); 2477c478bd9Sstevel@tonic-gate return (-1); 2487c478bd9Sstevel@tonic-gate } 2497c478bd9Sstevel@tonic-gate 2507c478bd9Sstevel@tonic-gate if (type == 0) { 251*09b0d01cSGary Mills RPCLOG0(1, 252*09b0d01cSGary Mills "rtime: t_kspoll timed out\n"); 2537c478bd9Sstevel@tonic-gate (void) t_kclose(tiptr, 1); 2547c478bd9Sstevel@tonic-gate return (-1); 2557c478bd9Sstevel@tonic-gate } 2567c478bd9Sstevel@tonic-gate 257*09b0d01cSGary Mills error = tli_recv(tiptr, &mp, 258*09b0d01cSGary Mills tiptr->fp->f_flag); 2597c478bd9Sstevel@tonic-gate if (error != 0) { 260*09b0d01cSGary Mills RPCLOG(1, "rtime: tli_recv %d\n", 261*09b0d01cSGary Mills error); 2627c478bd9Sstevel@tonic-gate (void) t_kclose(tiptr, 1); 2637c478bd9Sstevel@tonic-gate return (-1); 2647c478bd9Sstevel@tonic-gate } 2657c478bd9Sstevel@tonic-gate 2667c478bd9Sstevel@tonic-gate if (mp->b_datap->db_type != M_DATA) { 2677c478bd9Sstevel@tonic-gate RPCLOG(1, "rtime: wrong msg type %d\n", 2687c478bd9Sstevel@tonic-gate mp->b_datap->db_type); 269*09b0d01cSGary Mills RPCLOG(1, 270*09b0d01cSGary Mills "rtime: wrong msg type: read %d" 2717c478bd9Sstevel@tonic-gate " bytes\n", i); 2727c478bd9Sstevel@tonic-gate (void) t_kclose(tiptr, 1); 2737c478bd9Sstevel@tonic-gate freemsg(mp); 2747c478bd9Sstevel@tonic-gate return (-1); 2757c478bd9Sstevel@tonic-gate } 2767c478bd9Sstevel@tonic-gate 2777c478bd9Sstevel@tonic-gate mp2 = mp; 2787c478bd9Sstevel@tonic-gate 2797c478bd9Sstevel@tonic-gate /* 280*09b0d01cSGary Mills * The outer loop iterates until we reach the 281*09b0d01cSGary Mills * end of the mblk chain. 2827c478bd9Sstevel@tonic-gate */ 2837c478bd9Sstevel@tonic-gate while (mp2 != NULL) { 2847c478bd9Sstevel@tonic-gate 2857c478bd9Sstevel@tonic-gate /* 286*09b0d01cSGary Mills * The inner loop iterates until 287*09b0d01cSGary Mills * we've gotten 4 bytes or until 288*09b0d01cSGary Mills * the mblk is exhausted. 2897c478bd9Sstevel@tonic-gate */ 2907c478bd9Sstevel@tonic-gate while (i < sizeof (dummy) && 2917c478bd9Sstevel@tonic-gate mp2->b_rptr < mp2->b_wptr) { 2927c478bd9Sstevel@tonic-gate 2937c478bd9Sstevel@tonic-gate i++; 2947c478bd9Sstevel@tonic-gate 2957c478bd9Sstevel@tonic-gate /* 2967c478bd9Sstevel@tonic-gate * We avoid big-endian/little-endian 2977c478bd9Sstevel@tonic-gate * issues by serializing the result 2987c478bd9Sstevel@tonic-gate * one byte at a time. 2997c478bd9Sstevel@tonic-gate */ 3007c478bd9Sstevel@tonic-gate dummy <<= 8; 301*09b0d01cSGary Mills dummy += ((*mp2->b_rptr) & 302*09b0d01cSGary Mills 0xFF); 3037c478bd9Sstevel@tonic-gate 3047c478bd9Sstevel@tonic-gate mp2->b_rptr++; 3057c478bd9Sstevel@tonic-gate } 3067c478bd9Sstevel@tonic-gate 3077c478bd9Sstevel@tonic-gate mp2 = mp2->b_cont; 3087c478bd9Sstevel@tonic-gate } 3097c478bd9Sstevel@tonic-gate 3107c478bd9Sstevel@tonic-gate freemsg(mp); 3117c478bd9Sstevel@tonic-gate } 3127c478bd9Sstevel@tonic-gate 3137c478bd9Sstevel@tonic-gate thetime = (time_t)dummy; 3147c478bd9Sstevel@tonic-gate } 3157c478bd9Sstevel@tonic-gate 3167c478bd9Sstevel@tonic-gate (void) t_kclose(tiptr, 1); 3177c478bd9Sstevel@tonic-gate 3187c478bd9Sstevel@tonic-gate } else { 3197c478bd9Sstevel@tonic-gate CLIENT *client; 3207c478bd9Sstevel@tonic-gate struct timeval timout; 3217c478bd9Sstevel@tonic-gate 3227c478bd9Sstevel@tonic-gate RPCLOG0(8, "rtime: using new method\n"); 3237c478bd9Sstevel@tonic-gate 3247c478bd9Sstevel@tonic-gate new_again: 3257c478bd9Sstevel@tonic-gate /* 3267c478bd9Sstevel@tonic-gate * We talk to rpcbind. 3277c478bd9Sstevel@tonic-gate */ 3287c478bd9Sstevel@tonic-gate error = clnt_tli_kcreate(synconfig, addrp, (rpcprog_t)RPCBPROG, 3297c478bd9Sstevel@tonic-gate (rpcvers_t)RPCBVERS, 0, retries, CRED(), &client); 3307c478bd9Sstevel@tonic-gate 3317c478bd9Sstevel@tonic-gate if (error != 0) { 3327c478bd9Sstevel@tonic-gate RPCLOG(1, 3337c478bd9Sstevel@tonic-gate "rtime: clnt_tli_kcreate returned %d\n", error); 3347c478bd9Sstevel@tonic-gate return (-1); 3357c478bd9Sstevel@tonic-gate } 3367c478bd9Sstevel@tonic-gate timout.tv_sec = 60; 3377c478bd9Sstevel@tonic-gate timout.tv_usec = 0; 3387c478bd9Sstevel@tonic-gate error = clnt_call(client, RPCBPROC_GETTIME, (xdrproc_t)xdr_void, 3397c478bd9Sstevel@tonic-gate NULL, (xdrproc_t)xdr_u_int, 3407c478bd9Sstevel@tonic-gate (caddr_t)&srvtime, timout); 3417c478bd9Sstevel@tonic-gate thetime = srvtime; 3427c478bd9Sstevel@tonic-gate auth_destroy(client->cl_auth); 3437c478bd9Sstevel@tonic-gate clnt_destroy(client); 3447c478bd9Sstevel@tonic-gate if (error == RPC_UDERROR) { 3457c478bd9Sstevel@tonic-gate if (retries-- > 0) 3467c478bd9Sstevel@tonic-gate goto new_again; 3477c478bd9Sstevel@tonic-gate } 3487c478bd9Sstevel@tonic-gate if (error != RPC_SUCCESS) { 3497c478bd9Sstevel@tonic-gate RPCLOG(1, "rtime: time sync clnt_call returned %d\n", 3507c478bd9Sstevel@tonic-gate error); 3517c478bd9Sstevel@tonic-gate error = EIO; 3527c478bd9Sstevel@tonic-gate return (-1); 3537c478bd9Sstevel@tonic-gate } 3547c478bd9Sstevel@tonic-gate } 3557c478bd9Sstevel@tonic-gate 3567c478bd9Sstevel@tonic-gate if (calltype != 0) 3577c478bd9Sstevel@tonic-gate thetime += TOFFSET; 3587c478bd9Sstevel@tonic-gate 3597c478bd9Sstevel@tonic-gate RPCLOG(8, "rtime: thetime = %lx\n", thetime); 3607c478bd9Sstevel@tonic-gate 3617c478bd9Sstevel@tonic-gate if (thetime < WRITTEN) { 3627c478bd9Sstevel@tonic-gate RPCLOG(1, "rtime: time returned is too far in past %lx", 3637c478bd9Sstevel@tonic-gate thetime); 3647c478bd9Sstevel@tonic-gate RPCLOG(1, "rtime: WRITTEN %x", WRITTEN); 3657c478bd9Sstevel@tonic-gate return (-1); 3667c478bd9Sstevel@tonic-gate } 3677c478bd9Sstevel@tonic-gate thetime -= TOFFSET; 3687c478bd9Sstevel@tonic-gate 3697c478bd9Sstevel@tonic-gate timep->tv_sec = thetime; 3707c478bd9Sstevel@tonic-gate RPCLOG(8, "rtime: timep->tv_sec = %lx\n", timep->tv_sec); 3717c478bd9Sstevel@tonic-gate RPCLOG(8, "rtime: machine time = %lx\n", gethrestime_sec()); 3727c478bd9Sstevel@tonic-gate timep->tv_usec = 0; 3737c478bd9Sstevel@tonic-gate RPCLOG0(8, "rtime: returning success\n"); 3747c478bd9Sstevel@tonic-gate return (0); 3757c478bd9Sstevel@tonic-gate } 3767c478bd9Sstevel@tonic-gate 3777c478bd9Sstevel@tonic-gate /* 3787c478bd9Sstevel@tonic-gate * What is my network name? 3797c478bd9Sstevel@tonic-gate * WARNING: this gets the network name in sun unix format. 3807c478bd9Sstevel@tonic-gate * Other operating systems (non-unix) are free to put something else 3817c478bd9Sstevel@tonic-gate * here. 3827c478bd9Sstevel@tonic-gate * 3837c478bd9Sstevel@tonic-gate * Return 0 on success 3847c478bd9Sstevel@tonic-gate * Return RPC errors (non-zero values) if failed. 3857c478bd9Sstevel@tonic-gate */ 3867c478bd9Sstevel@tonic-gate enum clnt_stat 3877c478bd9Sstevel@tonic-gate kgetnetname(char *netname) 3887c478bd9Sstevel@tonic-gate { 3897c478bd9Sstevel@tonic-gate return (key_getnetname(netname, CRED())); 3907c478bd9Sstevel@tonic-gate } 391