clnt_perror.c revision 1.6
11.6Sjtc/*	$NetBSD: clnt_perror.c,v 1.6 1995/04/21 21:59:52 jtc 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.1Scgd#if defined(LIBC_SCCS) && !defined(lint)
331.1Scgd/*static char *sccsid = "from: @(#)clnt_perror.c 1.15 87/10/07 Copyr 1984 Sun Micro";*/
341.1Scgd/*static char *sccsid = "from: @(#)clnt_perror.c	2.1 88/07/29 4.0 RPCSRC";*/
351.6Sjtcstatic char *rcsid = "$NetBSD: clnt_perror.c,v 1.6 1995/04/21 21:59:52 jtc Exp $";
361.1Scgd#endif
371.1Scgd
381.1Scgd/*
391.1Scgd * clnt_perror.c
401.1Scgd *
411.1Scgd * Copyright (C) 1984, Sun Microsystems, Inc.
421.1Scgd *
431.1Scgd */
441.1Scgd#include <stdio.h>
451.3Scgd#include <stdlib.h>
461.1Scgd#include <string.h>
471.1Scgd#include <rpc/rpc.h>
481.1Scgd#include <rpc/types.h>
491.1Scgd#include <rpc/auth.h>
501.1Scgd#include <rpc/clnt.h>
511.1Scgd
521.1Scgdstatic char *auth_errmsg();
531.1Scgd
541.1Scgdstatic char *buf;
551.1Scgd
561.1Scgdstatic char *
571.1Scgd_buf()
581.1Scgd{
591.1Scgd
601.1Scgd	if (buf == 0)
611.1Scgd		buf = (char *)malloc(256);
621.1Scgd	return (buf);
631.1Scgd}
641.1Scgd
651.1Scgd/*
661.1Scgd * Print reply error info
671.1Scgd */
681.1Scgdchar *
691.1Scgdclnt_sperror(rpch, s)
701.1Scgd	CLIENT *rpch;
711.1Scgd	char *s;
721.1Scgd{
731.1Scgd	struct rpc_err e;
741.1Scgd	void clnt_perrno();
751.1Scgd	char *err;
761.1Scgd	char *str = _buf();
771.1Scgd	char *strstart = str;
781.1Scgd
791.1Scgd	if (str == 0)
801.1Scgd		return (0);
811.1Scgd	CLNT_GETERR(rpch, &e);
821.1Scgd
831.1Scgd	(void) sprintf(str, "%s: ", s);
841.1Scgd	str += strlen(str);
851.1Scgd
861.1Scgd	(void) strcpy(str, clnt_sperrno(e.re_status));
871.1Scgd	str += strlen(str);
881.1Scgd
891.1Scgd	switch (e.re_status) {
901.1Scgd	case RPC_SUCCESS:
911.1Scgd	case RPC_CANTENCODEARGS:
921.1Scgd	case RPC_CANTDECODERES:
931.1Scgd	case RPC_TIMEDOUT:
941.1Scgd	case RPC_PROGUNAVAIL:
951.1Scgd	case RPC_PROCUNAVAIL:
961.1Scgd	case RPC_CANTDECODEARGS:
971.1Scgd	case RPC_SYSTEMERROR:
981.1Scgd	case RPC_UNKNOWNHOST:
991.1Scgd	case RPC_UNKNOWNPROTO:
1001.1Scgd	case RPC_PMAPFAILURE:
1011.1Scgd	case RPC_PROGNOTREGISTERED:
1021.1Scgd	case RPC_FAILED:
1031.1Scgd		break;
1041.1Scgd
1051.1Scgd	case RPC_CANTSEND:
1061.1Scgd	case RPC_CANTRECV:
1071.1Scgd		(void) sprintf(str, "; errno = %s",
1081.1Scgd		    strerror(e.re_errno));
1091.1Scgd		str += strlen(str);
1101.1Scgd		break;
1111.1Scgd
1121.1Scgd	case RPC_VERSMISMATCH:
1131.1Scgd		(void) sprintf(str,
1141.1Scgd			"; low version = %lu, high version = %lu",
1151.1Scgd			e.re_vers.low, e.re_vers.high);
1161.1Scgd		str += strlen(str);
1171.1Scgd		break;
1181.1Scgd
1191.1Scgd	case RPC_AUTHERROR:
1201.1Scgd		err = auth_errmsg(e.re_why);
1211.1Scgd		(void) sprintf(str,"; why = ");
1221.1Scgd		str += strlen(str);
1231.1Scgd		if (err != NULL) {
1241.1Scgd			(void) sprintf(str, "%s",err);
1251.1Scgd		} else {
1261.1Scgd			(void) sprintf(str,
1271.1Scgd				"(unknown authentication error - %d)",
1281.1Scgd				(int) e.re_why);
1291.1Scgd		}
1301.1Scgd		str += strlen(str);
1311.1Scgd		break;
1321.1Scgd
1331.1Scgd	case RPC_PROGVERSMISMATCH:
1341.1Scgd		(void) sprintf(str,
1351.1Scgd			"; low version = %lu, high version = %lu",
1361.1Scgd			e.re_vers.low, e.re_vers.high);
1371.1Scgd		str += strlen(str);
1381.1Scgd		break;
1391.1Scgd
1401.1Scgd	default:	/* unknown */
1411.1Scgd		(void) sprintf(str,
1421.1Scgd			"; s1 = %lu, s2 = %lu",
1431.1Scgd			e.re_lb.s1, e.re_lb.s2);
1441.1Scgd		str += strlen(str);
1451.1Scgd		break;
1461.1Scgd	}
1471.1Scgd	(void) sprintf(str, "\n");
1481.1Scgd	return(strstart) ;
1491.1Scgd}
1501.1Scgd
1511.1Scgdvoid
1521.1Scgdclnt_perror(rpch, s)
1531.1Scgd	CLIENT *rpch;
1541.1Scgd	char *s;
1551.1Scgd{
1561.4Sjtc	(void) fprintf(stderr,"%s\n",clnt_sperror(rpch,s));
1571.1Scgd}
1581.1Scgd
1591.6Sjtcstatic const char *const rpc_errlist[] = {
1601.6Sjtc	"RPC: Success",				/*  0 - RPC_SUCCESS */
1611.6Sjtc	"RPC: Can't encode arguments",		/*  1 - RPC_CANTENCODEARGS */
1621.6Sjtc	"RPC: Can't decode result",		/*  2 - RPC_CANTDECODERES */
1631.6Sjtc	"RPC: Unable to send",			/*  3 - RPC_CANTSEND */
1641.6Sjtc	"RPC: Unable to receive",		/*  4 - RPC_CANTRECV */
1651.6Sjtc	"RPC: Timed out",			/*  5 - RPC_TIMEDOUT */
1661.6Sjtc	"RPC: Incompatible versions of RPC",	/*  6 - RPC_VERSMISMATCH */
1671.6Sjtc	"RPC: Authentication error",		/*  7 - RPC_AUTHERROR */
1681.6Sjtc	"RPC: Program unavailable",		/*  8 - RPC_PROGUNAVAIL */
1691.6Sjtc	"RPC: Program/version mismatch",	/*  9 - RPC_PROGVERSMISMATCH */
1701.6Sjtc	"RPC: Procedure unavailable",		/* 10 - RPC_PROCUNAVAIL */
1711.6Sjtc	"RPC: Server can't decode arguments",	/* 11 - RPC_CANTDECODEARGS */
1721.6Sjtc	"RPC: Remote system error",		/* 12 - RPC_SYSTEMERROR */
1731.6Sjtc	"RPC: Unknown host",			/* 13 - RPC_UNKNOWNHOST */
1741.6Sjtc	"RPC: Port mapper failure",		/* 14 - RPC_PMAPFAILURE */
1751.6Sjtc	"RPC: Program not registered",		/* 15 - RPC_PROGNOTREGISTERED */
1761.6Sjtc	"RPC: Failed (unspecified error)",	/* 16 - RPC_FAILED */
1771.6Sjtc	"RPC: Unknown protocol"			/* 17 - RPC_UNKNOWNPROTO */
1781.1Scgd};
1791.1Scgd
1801.1Scgd
1811.1Scgd/*
1821.1Scgd * This interface for use by clntrpc
1831.1Scgd */
1841.1Scgdchar *
1851.1Scgdclnt_sperrno(stat)
1861.1Scgd	enum clnt_stat stat;
1871.1Scgd{
1881.1Scgd	int i;
1891.1Scgd
1901.6Sjtc	unsigned int errnum = stat;
1911.6Sjtc
1921.6Sjtc	if (errnum < (sizeof(rpc_errlist)/sizeof(rpc_errlist[0])))
1931.6Sjtc		return rpc__errlist[errnum];
1941.6Sjtc
1951.1Scgd	return ("RPC: (unknown error code)");
1961.1Scgd}
1971.1Scgd
1981.1Scgdvoid
1991.1Scgdclnt_perrno(num)
2001.1Scgd	enum clnt_stat num;
2011.1Scgd{
2021.4Sjtc	(void) fprintf(stderr,"%s\n",clnt_sperrno(num));
2031.1Scgd}
2041.1Scgd
2051.1Scgd
2061.1Scgdchar *
2071.1Scgdclnt_spcreateerror(s)
2081.1Scgd	char *s;
2091.1Scgd{
2101.1Scgd	char *str = _buf();
2111.1Scgd
2121.1Scgd	if (str == 0)
2131.1Scgd		return(0);
2141.1Scgd	(void) sprintf(str, "%s: ", s);
2151.1Scgd	(void) strcat(str, clnt_sperrno(rpc_createerr.cf_stat));
2161.1Scgd	switch (rpc_createerr.cf_stat) {
2171.1Scgd	case RPC_PMAPFAILURE:
2181.1Scgd		(void) strcat(str, " - ");
2191.1Scgd		(void) strcat(str,
2201.1Scgd		    clnt_sperrno(rpc_createerr.cf_error.re_status));
2211.1Scgd		break;
2221.1Scgd
2231.1Scgd	case RPC_SYSTEMERROR:
2241.1Scgd		(void) strcat(str, " - ");
2251.2Sjtc		(void) strcat(str, strerror(rpc_createerr.cf_error.re_errno));
2261.1Scgd		break;
2271.1Scgd	}
2281.1Scgd	(void) strcat(str, "\n");
2291.1Scgd	return (str);
2301.1Scgd}
2311.1Scgd
2321.1Scgdvoid
2331.1Scgdclnt_pcreateerror(s)
2341.1Scgd	char *s;
2351.1Scgd{
2361.4Sjtc	(void) fprintf(stderr,"%s\n",clnt_spcreateerror(s));
2371.1Scgd}
2381.1Scgd
2391.6Sjtcstatic const char *const auth_errlist[] = {
2401.6Sjtc	"Authentication OK",			/* 0 - AUTH_OK */
2411.6Sjtc	"Invalid client credential",		/* 1 - AUTH_BADCRED */
2421.6Sjtc	"Server rejected credential",		/* 2 - AUTH_REJECTEDCRED */
2431.6Sjtc	"Invalid client verifier", 		/* 3 - AUTH_BADVERF */
2441.6Sjtc	"Server rejected verifier", 		/* 4 - AUTH_REJECTEDVERF */
2451.6Sjtc	"Client credential too weak",		/* 5 - AUTH_TOOWEAK */
2461.6Sjtc	"Invalid server verifier",		/* 6 - AUTH_INVALIDRESP */
2471.6Sjtc	"Failed (unspecified error)"		/* 7 - AUTH_FAILED */
2481.1Scgd};
2491.1Scgd
2501.1Scgdstatic char *
2511.1Scgdauth_errmsg(stat)
2521.1Scgd	enum auth_stat stat;
2531.1Scgd{
2541.6Sjtc	unsigned int errnum = stat;
2551.6Sjtc
2561.6Sjtc	if (errnum < (sizeof(auth_errlist)/sizeof(auth_errlist[0])))
2571.6Sjtc		return auth_errlist[errnum];
2581.1Scgd
2591.1Scgd	return(NULL);
2601.1Scgd}
261