clnt_perror.c revision 1.1
11.1Scgd/*
21.1Scgd * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
31.1Scgd * unrestricted use provided that this legend is included on all tape
41.1Scgd * media and as a part of the software program in whole or part.  Users
51.1Scgd * may copy or modify Sun RPC without charge, but are not authorized
61.1Scgd * to license or distribute it to anyone else except as part of a product or
71.1Scgd * program developed by the user.
81.1Scgd *
91.1Scgd * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
101.1Scgd * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
111.1Scgd * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
121.1Scgd *
131.1Scgd * Sun RPC is provided with no support and without any obligation on the
141.1Scgd * part of Sun Microsystems, Inc. to assist in its use, correction,
151.1Scgd * modification or enhancement.
161.1Scgd *
171.1Scgd * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
181.1Scgd * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
191.1Scgd * OR ANY PART THEREOF.
201.1Scgd *
211.1Scgd * In no event will Sun Microsystems, Inc. be liable for any lost revenue
221.1Scgd * or profits or other special, indirect and consequential damages, even if
231.1Scgd * Sun has been advised of the possibility of such damages.
241.1Scgd *
251.1Scgd * Sun Microsystems, Inc.
261.1Scgd * 2550 Garcia Avenue
271.1Scgd * Mountain View, California  94043
281.1Scgd */
291.1Scgd
301.1Scgd#if defined(LIBC_SCCS) && !defined(lint)
311.1Scgd/*static char *sccsid = "from: @(#)clnt_perror.c 1.15 87/10/07 Copyr 1984 Sun Micro";*/
321.1Scgd/*static char *sccsid = "from: @(#)clnt_perror.c	2.1 88/07/29 4.0 RPCSRC";*/
331.1Scgdstatic char *rcsid = "$Id: clnt_perror.c,v 1.1 1993/10/07 07:29:41 cgd Exp $";
341.1Scgd#endif
351.1Scgd
361.1Scgd/*
371.1Scgd * clnt_perror.c
381.1Scgd *
391.1Scgd * Copyright (C) 1984, Sun Microsystems, Inc.
401.1Scgd *
411.1Scgd */
421.1Scgd#include <stdio.h>
431.1Scgd#include <string.h>
441.1Scgd#include <rpc/rpc.h>
451.1Scgd#include <rpc/types.h>
461.1Scgd#include <rpc/auth.h>
471.1Scgd#include <rpc/clnt.h>
481.1Scgd
491.1Scgdstatic char *auth_errmsg();
501.1Scgd
511.1Scgdstatic char *buf;
521.1Scgd
531.1Scgdstatic char *
541.1Scgd_buf()
551.1Scgd{
561.1Scgd
571.1Scgd	if (buf == 0)
581.1Scgd		buf = (char *)malloc(256);
591.1Scgd	return (buf);
601.1Scgd}
611.1Scgd
621.1Scgd/*
631.1Scgd * Print reply error info
641.1Scgd */
651.1Scgdchar *
661.1Scgdclnt_sperror(rpch, s)
671.1Scgd	CLIENT *rpch;
681.1Scgd	char *s;
691.1Scgd{
701.1Scgd	struct rpc_err e;
711.1Scgd	void clnt_perrno();
721.1Scgd	char *err;
731.1Scgd	char *str = _buf();
741.1Scgd	char *strstart = str;
751.1Scgd
761.1Scgd	if (str == 0)
771.1Scgd		return (0);
781.1Scgd	CLNT_GETERR(rpch, &e);
791.1Scgd
801.1Scgd	(void) sprintf(str, "%s: ", s);
811.1Scgd	str += strlen(str);
821.1Scgd
831.1Scgd	(void) strcpy(str, clnt_sperrno(e.re_status));
841.1Scgd	str += strlen(str);
851.1Scgd
861.1Scgd	switch (e.re_status) {
871.1Scgd	case RPC_SUCCESS:
881.1Scgd	case RPC_CANTENCODEARGS:
891.1Scgd	case RPC_CANTDECODERES:
901.1Scgd	case RPC_TIMEDOUT:
911.1Scgd	case RPC_PROGUNAVAIL:
921.1Scgd	case RPC_PROCUNAVAIL:
931.1Scgd	case RPC_CANTDECODEARGS:
941.1Scgd	case RPC_SYSTEMERROR:
951.1Scgd	case RPC_UNKNOWNHOST:
961.1Scgd	case RPC_UNKNOWNPROTO:
971.1Scgd	case RPC_PMAPFAILURE:
981.1Scgd	case RPC_PROGNOTREGISTERED:
991.1Scgd	case RPC_FAILED:
1001.1Scgd		break;
1011.1Scgd
1021.1Scgd	case RPC_CANTSEND:
1031.1Scgd	case RPC_CANTRECV:
1041.1Scgd		(void) sprintf(str, "; errno = %s",
1051.1Scgd		    strerror(e.re_errno));
1061.1Scgd		str += strlen(str);
1071.1Scgd		break;
1081.1Scgd
1091.1Scgd	case RPC_VERSMISMATCH:
1101.1Scgd		(void) sprintf(str,
1111.1Scgd			"; low version = %lu, high version = %lu",
1121.1Scgd			e.re_vers.low, e.re_vers.high);
1131.1Scgd		str += strlen(str);
1141.1Scgd		break;
1151.1Scgd
1161.1Scgd	case RPC_AUTHERROR:
1171.1Scgd		err = auth_errmsg(e.re_why);
1181.1Scgd		(void) sprintf(str,"; why = ");
1191.1Scgd		str += strlen(str);
1201.1Scgd		if (err != NULL) {
1211.1Scgd			(void) sprintf(str, "%s",err);
1221.1Scgd		} else {
1231.1Scgd			(void) sprintf(str,
1241.1Scgd				"(unknown authentication error - %d)",
1251.1Scgd				(int) e.re_why);
1261.1Scgd		}
1271.1Scgd		str += strlen(str);
1281.1Scgd		break;
1291.1Scgd
1301.1Scgd	case RPC_PROGVERSMISMATCH:
1311.1Scgd		(void) sprintf(str,
1321.1Scgd			"; low version = %lu, high version = %lu",
1331.1Scgd			e.re_vers.low, e.re_vers.high);
1341.1Scgd		str += strlen(str);
1351.1Scgd		break;
1361.1Scgd
1371.1Scgd	default:	/* unknown */
1381.1Scgd		(void) sprintf(str,
1391.1Scgd			"; s1 = %lu, s2 = %lu",
1401.1Scgd			e.re_lb.s1, e.re_lb.s2);
1411.1Scgd		str += strlen(str);
1421.1Scgd		break;
1431.1Scgd	}
1441.1Scgd	(void) sprintf(str, "\n");
1451.1Scgd	return(strstart) ;
1461.1Scgd}
1471.1Scgd
1481.1Scgdvoid
1491.1Scgdclnt_perror(rpch, s)
1501.1Scgd	CLIENT *rpch;
1511.1Scgd	char *s;
1521.1Scgd{
1531.1Scgd	(void) fprintf(stderr,"%s",clnt_sperror(rpch,s));
1541.1Scgd}
1551.1Scgd
1561.1Scgd
1571.1Scgdstruct rpc_errtab {
1581.1Scgd	enum clnt_stat status;
1591.1Scgd	char *message;
1601.1Scgd};
1611.1Scgd
1621.1Scgdstatic struct rpc_errtab  rpc_errlist[] = {
1631.1Scgd	{ RPC_SUCCESS,
1641.1Scgd		"RPC: Success" },
1651.1Scgd	{ RPC_CANTENCODEARGS,
1661.1Scgd		"RPC: Can't encode arguments" },
1671.1Scgd	{ RPC_CANTDECODERES,
1681.1Scgd		"RPC: Can't decode result" },
1691.1Scgd	{ RPC_CANTSEND,
1701.1Scgd		"RPC: Unable to send" },
1711.1Scgd	{ RPC_CANTRECV,
1721.1Scgd		"RPC: Unable to receive" },
1731.1Scgd	{ RPC_TIMEDOUT,
1741.1Scgd		"RPC: Timed out" },
1751.1Scgd	{ RPC_VERSMISMATCH,
1761.1Scgd		"RPC: Incompatible versions of RPC" },
1771.1Scgd	{ RPC_AUTHERROR,
1781.1Scgd		"RPC: Authentication error" },
1791.1Scgd	{ RPC_PROGUNAVAIL,
1801.1Scgd		"RPC: Program unavailable" },
1811.1Scgd	{ RPC_PROGVERSMISMATCH,
1821.1Scgd		"RPC: Program/version mismatch" },
1831.1Scgd	{ RPC_PROCUNAVAIL,
1841.1Scgd		"RPC: Procedure unavailable" },
1851.1Scgd	{ RPC_CANTDECODEARGS,
1861.1Scgd		"RPC: Server can't decode arguments" },
1871.1Scgd	{ RPC_SYSTEMERROR,
1881.1Scgd		"RPC: Remote system error" },
1891.1Scgd	{ RPC_UNKNOWNHOST,
1901.1Scgd		"RPC: Unknown host" },
1911.1Scgd	{ RPC_UNKNOWNPROTO,
1921.1Scgd		"RPC: Unknown protocol" },
1931.1Scgd	{ RPC_PMAPFAILURE,
1941.1Scgd		"RPC: Port mapper failure" },
1951.1Scgd	{ RPC_PROGNOTREGISTERED,
1961.1Scgd		"RPC: Program not registered"},
1971.1Scgd	{ RPC_FAILED,
1981.1Scgd		"RPC: Failed (unspecified error)"}
1991.1Scgd};
2001.1Scgd
2011.1Scgd
2021.1Scgd/*
2031.1Scgd * This interface for use by clntrpc
2041.1Scgd */
2051.1Scgdchar *
2061.1Scgdclnt_sperrno(stat)
2071.1Scgd	enum clnt_stat stat;
2081.1Scgd{
2091.1Scgd	int i;
2101.1Scgd
2111.1Scgd	for (i = 0; i < sizeof(rpc_errlist)/sizeof(struct rpc_errtab); i++) {
2121.1Scgd		if (rpc_errlist[i].status == stat) {
2131.1Scgd			return (rpc_errlist[i].message);
2141.1Scgd		}
2151.1Scgd	}
2161.1Scgd	return ("RPC: (unknown error code)");
2171.1Scgd}
2181.1Scgd
2191.1Scgdvoid
2201.1Scgdclnt_perrno(num)
2211.1Scgd	enum clnt_stat num;
2221.1Scgd{
2231.1Scgd	(void) fprintf(stderr,"%s",clnt_sperrno(num));
2241.1Scgd}
2251.1Scgd
2261.1Scgd
2271.1Scgdchar *
2281.1Scgdclnt_spcreateerror(s)
2291.1Scgd	char *s;
2301.1Scgd{
2311.1Scgd	extern int sys_nerr;
2321.1Scgd	char *str = _buf();
2331.1Scgd
2341.1Scgd	if (str == 0)
2351.1Scgd		return(0);
2361.1Scgd	(void) sprintf(str, "%s: ", s);
2371.1Scgd	(void) strcat(str, clnt_sperrno(rpc_createerr.cf_stat));
2381.1Scgd	switch (rpc_createerr.cf_stat) {
2391.1Scgd	case RPC_PMAPFAILURE:
2401.1Scgd		(void) strcat(str, " - ");
2411.1Scgd		(void) strcat(str,
2421.1Scgd		    clnt_sperrno(rpc_createerr.cf_error.re_status));
2431.1Scgd		break;
2441.1Scgd
2451.1Scgd	case RPC_SYSTEMERROR:
2461.1Scgd		(void) strcat(str, " - ");
2471.1Scgd		if (rpc_createerr.cf_error.re_errno > 0
2481.1Scgd		    && rpc_createerr.cf_error.re_errno < sys_nerr)
2491.1Scgd			(void) strcat(str,
2501.1Scgd			    strerror(rpc_createerr.cf_error.re_errno));
2511.1Scgd		else
2521.1Scgd			(void) sprintf(&str[strlen(str)], "Error %d",
2531.1Scgd			    rpc_createerr.cf_error.re_errno);
2541.1Scgd		break;
2551.1Scgd	}
2561.1Scgd	(void) strcat(str, "\n");
2571.1Scgd	return (str);
2581.1Scgd}
2591.1Scgd
2601.1Scgdvoid
2611.1Scgdclnt_pcreateerror(s)
2621.1Scgd	char *s;
2631.1Scgd{
2641.1Scgd	(void) fprintf(stderr,"%s",clnt_spcreateerror(s));
2651.1Scgd}
2661.1Scgd
2671.1Scgdstruct auth_errtab {
2681.1Scgd	enum auth_stat status;
2691.1Scgd	char *message;
2701.1Scgd};
2711.1Scgd
2721.1Scgdstatic struct auth_errtab auth_errlist[] = {
2731.1Scgd	{ AUTH_OK,
2741.1Scgd		"Authentication OK" },
2751.1Scgd	{ AUTH_BADCRED,
2761.1Scgd		"Invalid client credential" },
2771.1Scgd	{ AUTH_REJECTEDCRED,
2781.1Scgd		"Server rejected credential" },
2791.1Scgd	{ AUTH_BADVERF,
2801.1Scgd		"Invalid client verifier" },
2811.1Scgd	{ AUTH_REJECTEDVERF,
2821.1Scgd		"Server rejected verifier" },
2831.1Scgd	{ AUTH_TOOWEAK,
2841.1Scgd		"Client credential too weak" },
2851.1Scgd	{ AUTH_INVALIDRESP,
2861.1Scgd		"Invalid server verifier" },
2871.1Scgd	{ AUTH_FAILED,
2881.1Scgd		"Failed (unspecified error)" },
2891.1Scgd};
2901.1Scgd
2911.1Scgdstatic char *
2921.1Scgdauth_errmsg(stat)
2931.1Scgd	enum auth_stat stat;
2941.1Scgd{
2951.1Scgd	int i;
2961.1Scgd
2971.1Scgd	for (i = 0; i < sizeof(auth_errlist)/sizeof(struct auth_errtab); i++) {
2981.1Scgd		if (auth_errlist[i].status == stat) {
2991.1Scgd			return(auth_errlist[i].message);
3001.1Scgd		}
3011.1Scgd	}
3021.1Scgd	return(NULL);
3031.1Scgd}
304