Home | History | Annotate | Download | only in rpc
      1 /*
      2  * CDDL HEADER START
      3  *
      4  * The contents of this file are subject to the terms of the
      5  * Common Development and Distribution License, Version 1.0 only
      6  * (the "License").  You may not use this file except in compliance
      7  * with the License.
      8  *
      9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
     10  * or http://www.opensolaris.org/os/licensing.
     11  * See the License for the specific language governing permissions
     12  * and limitations under the License.
     13  *
     14  * When distributing Covered Code, include this CDDL HEADER in each
     15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
     16  * If applicable, add the following below this CDDL HEADER, with the
     17  * fields enclosed by brackets "[]" replaced with your own identifying
     18  * information: Portions Copyright [yyyy] [name of copyright owner]
     19  *
     20  * CDDL HEADER END
     21  */
     22 /*
     23  * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
     24  * Use is subject to license terms.
     25  */
     26 
     27 /*	Copyright (c) 1983, 1984, 1985, 1986, 1987, 1988, 1989 AT&T	*/
     28 /*	  All Rights Reserved  	*/
     29 
     30 /*
     31  * Portions of this source code were derived from Berkeley 4.3 BSD
     32  * under license from the Regents of the University of California.
     33  */
     34 
     35 #pragma ident	"@(#)clnt_perr.c	1.19	05/06/08 SMI"
     36 
     37 /*
     38  * clnt_perror.c
     39  */
     40 #include <sys/types.h>
     41 #include <sys/t_lock.h>
     42 #include <rpc/types.h>
     43 #include <rpc/auth.h>
     44 #include <rpc/clnt.h>
     45 #include <sys/systm.h>
     46 #include <sys/cmn_err.h>
     47 #include <sys/inttypes.h>
     48 
     49 /*
     50  * Return an ascii string which matches the RPC clnt stat passed in.
     51  */
     52 const char *
     53 clnt_sperrno(const enum clnt_stat stat)
     54 {
     55 	switch (stat) {
     56 	case RPC_SUCCESS:
     57 		return ("RPC: Success");
     58 	case RPC_CANTENCODEARGS:
     59 		return ("RPC: Can't encode arguments");
     60 	case RPC_CANTDECODERES:
     61 		return ("RPC: Can't decode result");
     62 	case RPC_CANTSEND:
     63 		return ("RPC: Unable to send");
     64 	case RPC_CANTRECV:
     65 		return ("RPC: Unable to receive");
     66 	case RPC_TIMEDOUT:
     67 		return ("RPC: Timed out");
     68 	case RPC_INTR:
     69 		return ("RPC: Interrupted");
     70 	case RPC_UDERROR:
     71 		return ("RPC: Unitdata error");
     72 	case RPC_VERSMISMATCH:
     73 		return ("RPC: Incompatible versions of RPC");
     74 	case RPC_AUTHERROR:
     75 		return ("RPC: Authentication error");
     76 	case RPC_PROGUNAVAIL:
     77 		return ("RPC: Program unavailable");
     78 	case RPC_PROGVERSMISMATCH:
     79 		return ("RPC: Program/version mismatch");
     80 	case RPC_PROCUNAVAIL:
     81 		return ("RPC: Procedure unavailable");
     82 	case RPC_CANTDECODEARGS:
     83 		return ("RPC: Server can't decode arguments");
     84 	case RPC_SYSTEMERROR:
     85 		return ("RPC: Remote system error");
     86 	case RPC_UNKNOWNHOST:
     87 		return ("RPC: Unknown host");
     88 	case RPC_UNKNOWNPROTO:
     89 		return ("RPC: Unknown protocol");
     90 	case RPC_UNKNOWNADDR:
     91 		return ("RPC: Remote address unknown");
     92 	case RPC_NOBROADCAST:
     93 		return ("RPC: Broadcasting not supported");
     94 	case RPC_PMAPFAILURE:
     95 		return ("RPC: Port mapper failure");
     96 	case RPC_PROGNOTREGISTERED:
     97 		return ("RPC: Program not registered");
     98 	case RPC_N2AXLATEFAILURE:
     99 		return ("RPC: Name to address translation failed");
    100 	case RPC_TLIERROR:
    101 		return ("RPC: TLI error");
    102 	case RPC_FAILED:
    103 		return ("RPC: Failed (unspecified error)");
    104 	case RPC_INPROGRESS:
    105 		return ("RPC: Operation in progress");
    106 	case RPC_STALERACHANDLE:
    107 		return ("RPC: Stale RAC handle");
    108 	case RPC_CANTCONNECT:
    109 		return ("RPC: Couldn't make connection");
    110 	case RPC_XPRTFAILED:
    111 		return ("RPC: Received disconnect from remote");
    112 	case RPC_CANTCREATESTREAM:
    113 		return ("RPC: Can't push RPC module");
    114 	case RPC_CANTSTORE:
    115 		return ("RPC: Can't store pending message");
    116 	}
    117 	return ("RPC: (unknown error code)");
    118 }
    119 
    120 /*
    121  * Return string reply error info. For use after clnt_call().
    122  * It allocates the  buffer of size MAXPATHLEN and assumes
    123  * caller's responsibility to free the memory after use.
    124  */
    125 char *
    126 clnt_sperror(const CLIENT *cl, const char *s)
    127 {
    128 	struct rpc_err e;
    129 #ifdef notyet
    130 	char *err;
    131 #endif
    132 	char *str;
    133 	char *strstart;
    134 
    135 	str = kmem_alloc(MAXPATHLEN, KM_SLEEP);
    136 	strstart = str;
    137 
    138 	CLNT_GETERR((CLIENT *) cl, &e);
    139 
    140 	(void) sprintf(str, "%s: ", s);
    141 	str += strlen(str);
    142 
    143 	(void) strcpy(str, clnt_sperrno(e.re_status));
    144 	str += strlen(str);
    145 
    146 	switch (e.re_status) {
    147 	case RPC_SUCCESS:
    148 	case RPC_CANTENCODEARGS:
    149 	case RPC_CANTDECODERES:
    150 	case RPC_TIMEDOUT:
    151 	case RPC_PROGUNAVAIL:
    152 	case RPC_PROCUNAVAIL:
    153 	case RPC_CANTDECODEARGS:
    154 	case RPC_SYSTEMERROR:
    155 	case RPC_UNKNOWNHOST:
    156 	case RPC_UNKNOWNPROTO:
    157 	case RPC_UNKNOWNADDR:
    158 	case RPC_NOBROADCAST:
    159 	case RPC_RPCBFAILURE:
    160 	case RPC_PROGNOTREGISTERED:
    161 	case RPC_FAILED:
    162 	case RPC_INPROGRESS:
    163 		break;
    164 
    165 #ifdef notyet
    166 	case RPC_N2AXLATEFAILURE:
    167 		(void) sprintf(str, "; %s", netdir_sperror());
    168 		break;
    169 #endif
    170 
    171 	case RPC_TLIERROR:
    172 #ifdef notyet
    173 		(void) sprintf(str, "; %s", t_errlist[e.re_terrno]);
    174 #else
    175 		(void) sprintf(str, "; %d", e.re_terrno);
    176 #endif
    177 		str += strlen(str);
    178 		if (e.re_errno) {
    179 #ifdef notyet
    180 			(void) sprintf(str, "; %s", strerror(e.re_errno));
    181 #else
    182 			(void) sprintf(str, "; %d", e.re_errno);
    183 #endif
    184 		}
    185 		break;
    186 
    187 	case RPC_CANTSEND:
    188 	case RPC_CANTRECV:
    189 		if (e.re_errno) {
    190 #ifdef notyet
    191 			(void) sprintf(str, "; errno = %s",
    192 			    strerror(e.re_errno));
    193 #else
    194 			(void) sprintf(str, "; errno = %d", e.re_errno);
    195 #endif
    196 			str += strlen(str);
    197 		}
    198 		if (e.re_terrno) {
    199 #ifdef notyet
    200 			(void) sprintf(str, "; %s", t_errlist[e.re_terrno]);
    201 #else
    202 			(void) sprintf(str, "; %d", e.re_terrno);
    203 #endif
    204 		}
    205 		break;
    206 
    207 	case RPC_VERSMISMATCH:
    208 		(void) sprintf(str,
    209 		    "; low version = %" PRIu32 ", high version = %" PRIu32,
    210 		    e.re_vers.low, e.re_vers.high);
    211 		break;
    212 
    213 #ifdef notyet
    214 	case RPC_AUTHERROR:
    215 		err = auth_errmsg(e.re_why);
    216 		(void) sprintf(str, "; why = ");
    217 		str += strlen(str);
    218 		if (err != NULL) {
    219 			(void) sprintf(str, "%s", err);
    220 		} else {
    221 			(void) sprintf(str,
    222 			    "(unknown authentication error - %d)",
    223 			    (int)e.re_why);
    224 		}
    225 		break;
    226 #endif
    227 
    228 	case RPC_PROGVERSMISMATCH:
    229 		(void) sprintf(str,
    230 		    "; low version = %" PRIu32 ", high version = %" PRIu32,
    231 		    e.re_vers.low, e.re_vers.high);
    232 		break;
    233 
    234 	default:	/* unknown */
    235 		(void) sprintf(str, "; s1 = %" PRIu32 ", s2 = %" PRIu32,
    236 		    e.re_lb.s1, e.re_lb.s2);
    237 		break;
    238 	}
    239 	return (strstart);
    240 }
    241