clnt_perror.c revision 1.18
11.18Slukem/*	$NetBSD: clnt_perror.c,v 1.18 1999/09/16 11:45:22 lukem Exp $	*/
21.5Scgd
31.1Scgd/*
41.1Scgd * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
51.1Scgd * unrestricted use provided that this legend is included on all tape
61.1Scgd * media and as a part of the software program in whole or part.  Users
71.1Scgd * may copy or modify Sun RPC without charge, but are not authorized
81.1Scgd * to license or distribute it to anyone else except as part of a product or
91.1Scgd * program developed by the user.
101.1Scgd *
111.1Scgd * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
121.1Scgd * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
131.1Scgd * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
141.1Scgd *
151.1Scgd * Sun RPC is provided with no support and without any obligation on the
161.1Scgd * part of Sun Microsystems, Inc. to assist in its use, correction,
171.1Scgd * modification or enhancement.
181.1Scgd *
191.1Scgd * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
201.1Scgd * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
211.1Scgd * OR ANY PART THEREOF.
221.1Scgd *
231.1Scgd * In no event will Sun Microsystems, Inc. be liable for any lost revenue
241.1Scgd * or profits or other special, indirect and consequential damages, even if
251.1Scgd * Sun has been advised of the possibility of such damages.
261.1Scgd *
271.1Scgd * Sun Microsystems, Inc.
281.1Scgd * 2550 Garcia Avenue
291.1Scgd * Mountain View, California  94043
301.1Scgd */
311.1Scgd
321.10Schristos#include <sys/cdefs.h>
331.1Scgd#if defined(LIBC_SCCS) && !defined(lint)
341.10Schristos#if 0
351.10Schristosstatic char *sccsid = "@(#)clnt_perror.c 1.15 87/10/07 Copyr 1984 Sun Micro";
361.10Schristosstatic char *sccsid = "@(#)clnt_perror.c	2.1 88/07/29 4.0 RPCSRC";
371.10Schristos#else
381.18Slukem__RCSID("$NetBSD: clnt_perror.c,v 1.18 1999/09/16 11:45:22 lukem Exp $");
391.10Schristos#endif
401.1Scgd#endif
411.1Scgd
421.1Scgd/*
431.1Scgd * clnt_perror.c
441.1Scgd *
451.1Scgd * Copyright (C) 1984, Sun Microsystems, Inc.
461.1Scgd *
471.1Scgd */
481.11Sjtc#include "namespace.h"
491.14Slukem
501.18Slukem#include <assert.h>
511.1Scgd#include <stdio.h>
521.3Scgd#include <stdlib.h>
531.1Scgd#include <string.h>
541.14Slukem
551.1Scgd#include <rpc/rpc.h>
561.1Scgd#include <rpc/types.h>
571.1Scgd#include <rpc/auth.h>
581.1Scgd#include <rpc/clnt.h>
591.11Sjtc
601.11Sjtc#ifdef __weak_alias
611.11Sjtc__weak_alias(clnt_pcreateerror,_clnt_pcreateerror);
621.11Sjtc__weak_alias(clnt_perrno,_clnt_perrno);
631.11Sjtc__weak_alias(clnt_perror,_clnt_perror);
641.11Sjtc__weak_alias(clnt_spcreateerror,_clnt_spcreateerror);
651.11Sjtc__weak_alias(clnt_sperrno,_clnt_sperrno);
661.11Sjtc__weak_alias(clnt_sperror,_clnt_sperror);
671.11Sjtc#endif
681.1Scgd
691.1Scgdstatic char *buf;
701.17Schristosstatic size_t buflen;
711.1Scgd
721.10Schristosstatic char *_buf __P((void));
731.10Schristosstatic char *auth_errmsg __P((enum auth_stat));
741.10Schristos
751.1Scgdstatic char *
761.1Scgd_buf()
771.1Scgd{
781.1Scgd
791.16Slukem	buflen = 256;
801.13Slukem	if (buf == 0)
811.16Slukem		buf = (char *)malloc(buflen);
821.1Scgd	return (buf);
831.1Scgd}
841.1Scgd
851.1Scgd/*
861.1Scgd * Print reply error info
871.1Scgd */
881.1Scgdchar *
891.1Scgdclnt_sperror(rpch, s)
901.13Slukem	CLIENT *rpch;
911.13Slukem	char *s;
921.1Scgd{
931.1Scgd	struct rpc_err e;
941.1Scgd	char *err;
951.18Slukem	char *str;
961.1Scgd	char *strstart = str;
971.15Schristos	size_t len = buflen, i;
981.1Scgd
991.18Slukem	_DIAGASSERT(rpch != NULL);
1001.18Slukem	_DIAGASSERT(s != NULL);
1011.18Slukem#ifdef _DIAGNOSTIC
1021.18Slukem	if (rpch == NULL || s == NULL)
1031.18Slukem		return (NULL);
1041.18Slukem#endif
1051.18Slukem
1061.18Slukem	str = _buf();
1071.13Slukem	if (str == 0)
1081.13Slukem		return (0);
1091.1Scgd	CLNT_GETERR(rpch, &e);
1101.1Scgd
1111.9Smrg	i = snprintf(str, len, "%s: ", s);
1121.9Smrg	str += i;
1131.9Smrg	len -= i;
1141.9Smrg
1151.9Smrg	(void)strncpy(str, clnt_sperrno(e.re_status), len - 1);
1161.9Smrg	i = strlen(str);
1171.9Smrg	str += i;
1181.9Smrg	len -= i;
1191.1Scgd
1201.1Scgd	switch (e.re_status) {
1211.1Scgd	case RPC_SUCCESS:
1221.1Scgd	case RPC_CANTENCODEARGS:
1231.1Scgd	case RPC_CANTDECODERES:
1241.1Scgd	case RPC_TIMEDOUT:
1251.1Scgd	case RPC_PROGUNAVAIL:
1261.1Scgd	case RPC_PROCUNAVAIL:
1271.1Scgd	case RPC_CANTDECODEARGS:
1281.1Scgd	case RPC_SYSTEMERROR:
1291.1Scgd	case RPC_UNKNOWNHOST:
1301.1Scgd	case RPC_UNKNOWNPROTO:
1311.1Scgd	case RPC_PMAPFAILURE:
1321.1Scgd	case RPC_PROGNOTREGISTERED:
1331.1Scgd	case RPC_FAILED:
1341.1Scgd		break;
1351.1Scgd
1361.1Scgd	case RPC_CANTSEND:
1371.1Scgd	case RPC_CANTRECV:
1381.16Slukem		i = snprintf(str, len, "; errno = %s", strerror(e.re_errno));
1391.9Smrg		str += i;
1401.9Smrg		len -= i;
1411.1Scgd		break;
1421.1Scgd
1431.1Scgd	case RPC_VERSMISMATCH:
1441.16Slukem		i = snprintf(str, len, "; low version = %u, high version = %u",
1451.1Scgd			e.re_vers.low, e.re_vers.high);
1461.9Smrg		str += i;
1471.9Smrg		len -= i;
1481.1Scgd		break;
1491.1Scgd
1501.1Scgd	case RPC_AUTHERROR:
1511.1Scgd		err = auth_errmsg(e.re_why);
1521.9Smrg		i = snprintf(str, len, "; why = ");
1531.9Smrg		str += i;
1541.9Smrg		len -= i;
1551.1Scgd		if (err != NULL) {
1561.9Smrg			i = snprintf(str, len, "%s",err);
1571.1Scgd		} else {
1581.9Smrg			i = snprintf(str, len,
1591.1Scgd				"(unknown authentication error - %d)",
1601.1Scgd				(int) e.re_why);
1611.1Scgd		}
1621.9Smrg		str += i;
1631.9Smrg		len -= i;
1641.1Scgd		break;
1651.1Scgd
1661.1Scgd	case RPC_PROGVERSMISMATCH:
1671.16Slukem		i = snprintf(str, len, "; low version = %u, high version = %u",
1681.1Scgd			e.re_vers.low, e.re_vers.high);
1691.9Smrg		str += i;
1701.9Smrg		len -= i;
1711.1Scgd		break;
1721.1Scgd
1731.1Scgd	default:	/* unknown */
1741.16Slukem		i = snprintf(str, len, "; s1 = %u, s2 = %u",
1751.1Scgd			e.re_lb.s1, e.re_lb.s2);
1761.9Smrg		str += i;
1771.9Smrg		len -= i;
1781.1Scgd		break;
1791.1Scgd	}
1801.1Scgd	return(strstart) ;
1811.1Scgd}
1821.1Scgd
1831.1Scgdvoid
1841.1Scgdclnt_perror(rpch, s)
1851.13Slukem	CLIENT *rpch;
1861.13Slukem	char *s;
1871.1Scgd{
1881.18Slukem
1891.18Slukem	_DIAGASSERT(rpch != NULL);
1901.18Slukem	_DIAGASSERT(s != NULL);
1911.18Slukem#ifdef _DIAGNOSTIC
1921.18Slukem	if (rpch == NULL || s == NULL)
1931.18Slukem		return;
1941.18Slukem#endif
1951.18Slukem
1961.14Slukem	(void) fprintf(stderr, "%s\n", clnt_sperror(rpch,s));
1971.1Scgd}
1981.1Scgd
1991.6Sjtcstatic const char *const rpc_errlist[] = {
2001.6Sjtc	"RPC: Success",				/*  0 - RPC_SUCCESS */
2011.6Sjtc	"RPC: Can't encode arguments",		/*  1 - RPC_CANTENCODEARGS */
2021.6Sjtc	"RPC: Can't decode result",		/*  2 - RPC_CANTDECODERES */
2031.6Sjtc	"RPC: Unable to send",			/*  3 - RPC_CANTSEND */
2041.6Sjtc	"RPC: Unable to receive",		/*  4 - RPC_CANTRECV */
2051.6Sjtc	"RPC: Timed out",			/*  5 - RPC_TIMEDOUT */
2061.6Sjtc	"RPC: Incompatible versions of RPC",	/*  6 - RPC_VERSMISMATCH */
2071.6Sjtc	"RPC: Authentication error",		/*  7 - RPC_AUTHERROR */
2081.6Sjtc	"RPC: Program unavailable",		/*  8 - RPC_PROGUNAVAIL */
2091.6Sjtc	"RPC: Program/version mismatch",	/*  9 - RPC_PROGVERSMISMATCH */
2101.6Sjtc	"RPC: Procedure unavailable",		/* 10 - RPC_PROCUNAVAIL */
2111.6Sjtc	"RPC: Server can't decode arguments",	/* 11 - RPC_CANTDECODEARGS */
2121.6Sjtc	"RPC: Remote system error",		/* 12 - RPC_SYSTEMERROR */
2131.6Sjtc	"RPC: Unknown host",			/* 13 - RPC_UNKNOWNHOST */
2141.6Sjtc	"RPC: Port mapper failure",		/* 14 - RPC_PMAPFAILURE */
2151.6Sjtc	"RPC: Program not registered",		/* 15 - RPC_PROGNOTREGISTERED */
2161.6Sjtc	"RPC: Failed (unspecified error)",	/* 16 - RPC_FAILED */
2171.6Sjtc	"RPC: Unknown protocol"			/* 17 - RPC_UNKNOWNPROTO */
2181.1Scgd};
2191.1Scgd
2201.1Scgd
2211.1Scgd/*
2221.1Scgd * This interface for use by clntrpc
2231.1Scgd */
2241.1Scgdchar *
2251.1Scgdclnt_sperrno(stat)
2261.1Scgd	enum clnt_stat stat;
2271.1Scgd{
2281.6Sjtc	unsigned int errnum = stat;
2291.6Sjtc
2301.6Sjtc	if (errnum < (sizeof(rpc_errlist)/sizeof(rpc_errlist[0])))
2311.15Schristos		/* LINTED interface problem */
2321.7Scgd		return (char *)rpc_errlist[errnum];
2331.6Sjtc
2341.1Scgd	return ("RPC: (unknown error code)");
2351.1Scgd}
2361.1Scgd
2371.1Scgdvoid
2381.1Scgdclnt_perrno(num)
2391.1Scgd	enum clnt_stat num;
2401.1Scgd{
2411.14Slukem	(void) fprintf(stderr, "%s\n", clnt_sperrno(num));
2421.1Scgd}
2431.1Scgd
2441.1Scgd
2451.1Scgdchar *
2461.1Scgdclnt_spcreateerror(s)
2471.13Slukem	char *s;
2481.1Scgd{
2491.18Slukem	char *str;
2501.15Schristos	size_t len = buflen, i;
2511.1Scgd
2521.18Slukem	_DIAGASSERT(s != NULL);
2531.18Slukem#ifdef _DIAGNOSTIC
2541.18Slukem	if (s == NULL)
2551.18Slukem		return (NULL);
2561.18Slukem#endif
2571.18Slukem
2581.18Slukem	str = _buf();
2591.13Slukem	if (str == 0)
2601.13Slukem		return(0);
2611.9Smrg	i = snprintf(str, len, "%s: ", s);
2621.9Smrg	len -= i;
2631.9Smrg	(void)strncat(str, clnt_sperrno(rpc_createerr.cf_stat), len - 1);
2641.1Scgd	switch (rpc_createerr.cf_stat) {
2651.1Scgd	case RPC_PMAPFAILURE:
2661.9Smrg		(void) strncat(str, " - ", len - 1);
2671.9Smrg		(void) strncat(str,
2681.9Smrg		    clnt_sperrno(rpc_createerr.cf_error.re_status), len - 4);
2691.1Scgd		break;
2701.1Scgd
2711.1Scgd	case RPC_SYSTEMERROR:
2721.9Smrg		(void)strncat(str, " - ", len - 1);
2731.9Smrg		(void)strncat(str, strerror(rpc_createerr.cf_error.re_errno),
2741.9Smrg		    len - 4);
2751.10Schristos		break;
2761.10Schristos
2771.10Schristos	case RPC_CANTSEND:
2781.10Schristos	case RPC_CANTDECODERES:
2791.10Schristos	case RPC_CANTENCODEARGS:
2801.10Schristos	case RPC_SUCCESS:
2811.10Schristos	case RPC_UNKNOWNPROTO:
2821.10Schristos	case RPC_PROGNOTREGISTERED:
2831.10Schristos	case RPC_FAILED:
2841.10Schristos	case RPC_UNKNOWNHOST:
2851.10Schristos	case RPC_CANTDECODEARGS:
2861.10Schristos	case RPC_PROCUNAVAIL:
2871.10Schristos	case RPC_PROGVERSMISMATCH:
2881.10Schristos	case RPC_PROGUNAVAIL:
2891.10Schristos	case RPC_AUTHERROR:
2901.10Schristos	case RPC_VERSMISMATCH:
2911.10Schristos	case RPC_TIMEDOUT:
2921.10Schristos	case RPC_CANTRECV:
2931.1Scgd		break;
2941.1Scgd	}
2951.1Scgd	return (str);
2961.1Scgd}
2971.1Scgd
2981.1Scgdvoid
2991.1Scgdclnt_pcreateerror(s)
3001.13Slukem	char *s;
3011.1Scgd{
3021.18Slukem
3031.18Slukem	_DIAGASSERT(s != NULL);
3041.18Slukem#ifdef _DIAGNOSTIC
3051.18Slukem	if (s == NULL)
3061.18Slukem		return;
3071.18Slukem#endif
3081.18Slukem
3091.14Slukem	(void) fprintf(stderr, "%s\n", clnt_spcreateerror(s));
3101.1Scgd}
3111.1Scgd
3121.6Sjtcstatic const char *const auth_errlist[] = {
3131.6Sjtc	"Authentication OK",			/* 0 - AUTH_OK */
3141.6Sjtc	"Invalid client credential",		/* 1 - AUTH_BADCRED */
3151.6Sjtc	"Server rejected credential",		/* 2 - AUTH_REJECTEDCRED */
3161.6Sjtc	"Invalid client verifier", 		/* 3 - AUTH_BADVERF */
3171.6Sjtc	"Server rejected verifier", 		/* 4 - AUTH_REJECTEDVERF */
3181.6Sjtc	"Client credential too weak",		/* 5 - AUTH_TOOWEAK */
3191.6Sjtc	"Invalid server verifier",		/* 6 - AUTH_INVALIDRESP */
3201.6Sjtc	"Failed (unspecified error)"		/* 7 - AUTH_FAILED */
3211.1Scgd};
3221.1Scgd
3231.1Scgdstatic char *
3241.1Scgdauth_errmsg(stat)
3251.1Scgd	enum auth_stat stat;
3261.1Scgd{
3271.6Sjtc	unsigned int errnum = stat;
3281.6Sjtc
3291.6Sjtc	if (errnum < (sizeof(auth_errlist)/sizeof(auth_errlist[0])))
3301.15Schristos		/* LINTED interface problem */
3311.7Scgd		return (char *)auth_errlist[errnum];
3321.1Scgd
3331.1Scgd	return(NULL);
3341.1Scgd}
335