174462Salfred/* $NetBSD: clnt_perror.c,v 1.24 2000/06/02 23:11:07 fvdl Exp $ */ 274462Salfred 374462Salfred 4261046Smav/*- 5261046Smav * Copyright (c) 2009, Sun Microsystems, Inc. 6261046Smav * All rights reserved. 78870Srgrimes * 8261046Smav * Redistribution and use in source and binary forms, with or without 9261046Smav * modification, are permitted provided that the following conditions are met: 10261046Smav * - Redistributions of source code must retain the above copyright notice, 11261046Smav * this list of conditions and the following disclaimer. 12261046Smav * - Redistributions in binary form must reproduce the above copyright notice, 13261046Smav * this list of conditions and the following disclaimer in the documentation 14261046Smav * and/or other materials provided with the distribution. 15261046Smav * - Neither the name of Sun Microsystems, Inc. nor the names of its 16261046Smav * contributors may be used to endorse or promote products derived 17261046Smav * from this software without specific prior written permission. 18261046Smav * 19261046Smav * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 20261046Smav * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 21261046Smav * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 22261046Smav * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 23261046Smav * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24261046Smav * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25261046Smav * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26261046Smav * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27261046Smav * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28261046Smav * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29261046Smav * POSSIBILITY OF SUCH DAMAGE. 301901Swollman */ 311901Swollman 321901Swollman#if defined(LIBC_SCCS) && !defined(lint) 33136581Sobrienstatic char *sccsid2 = "@(#)clnt_perror.c 1.15 87/10/07 Copyr 1984 Sun Micro"; 3474462Salfredstatic char *sccsid = "@(#)clnt_perror.c 2.1 88/07/29 4.0 RPCSRC"; 351901Swollman#endif 3692990Sobrien#include <sys/cdefs.h> 3792990Sobrien__FBSDID("$FreeBSD$"); 381901Swollman 391901Swollman/* 401901Swollman * clnt_perror.c 411901Swollman * 421901Swollman * Copyright (C) 1984, Sun Microsystems, Inc. 431901Swollman * 441901Swollman */ 4574462Salfred#include "namespace.h" 4674462Salfred#include <assert.h> 471901Swollman#include <stdio.h> 4811666Sphk#include <stdlib.h> 491901Swollman#include <string.h> 5074462Salfred 511901Swollman#include <rpc/rpc.h> 521901Swollman#include <rpc/types.h> 531901Swollman#include <rpc/auth.h> 541901Swollman#include <rpc/clnt.h> 5574462Salfred#include "un-namespace.h" 561901Swollman 5774462Salfredstatic char *buf; 5874462Salfred 5992905Sobrienstatic char *_buf(void); 6092905Sobrienstatic char *auth_errmsg(enum auth_stat); 6121068Speter#define CLNT_PERROR_BUFLEN 256 621901Swollman 631901Swollmanstatic char * 641901Swollman_buf() 651901Swollman{ 661901Swollman 671901Swollman if (buf == 0) 6821068Speter buf = (char *)malloc(CLNT_PERROR_BUFLEN); 691901Swollman return (buf); 701901Swollman} 711901Swollman 721901Swollman/* 731901Swollman * Print reply error info 741901Swollman */ 751901Swollmanchar * 761901Swollmanclnt_sperror(rpch, s) 771901Swollman CLIENT *rpch; 7874462Salfred const char *s; 791901Swollman{ 801901Swollman struct rpc_err e; 811901Swollman char *err; 8274462Salfred char *str; 8374462Salfred char *strstart; 8474462Salfred size_t len, i; 851901Swollman 8674462Salfred assert(rpch != NULL); 8774462Salfred assert(s != NULL); 8874462Salfred 8974462Salfred str = _buf(); /* side effect: sets CLNT_PERROR_BUFLEN */ 901901Swollman if (str == 0) 911901Swollman return (0); 9274462Salfred len = CLNT_PERROR_BUFLEN; 9374462Salfred strstart = str; 941901Swollman CLNT_GETERR(rpch, &e); 951901Swollman 9681966Sbrian if ((i = snprintf(str, len, "%s: ", s)) > 0) { 9781966Sbrian str += i; 9881966Sbrian len -= i; 9981966Sbrian } 1001901Swollman 10174462Salfred (void)strncpy(str, clnt_sperrno(e.re_status), len - 1); 10274462Salfred i = strlen(str); 10374462Salfred str += i; 10474462Salfred len -= i; 10574462Salfred 1061901Swollman switch (e.re_status) { 1071901Swollman case RPC_SUCCESS: 1081901Swollman case RPC_CANTENCODEARGS: 1091901Swollman case RPC_CANTDECODERES: 1108870Srgrimes case RPC_TIMEDOUT: 1111901Swollman case RPC_PROGUNAVAIL: 1121901Swollman case RPC_PROCUNAVAIL: 1131901Swollman case RPC_CANTDECODEARGS: 1141901Swollman case RPC_SYSTEMERROR: 1151901Swollman case RPC_UNKNOWNHOST: 1161901Swollman case RPC_UNKNOWNPROTO: 1171901Swollman case RPC_PMAPFAILURE: 1181901Swollman case RPC_PROGNOTREGISTERED: 1191901Swollman case RPC_FAILED: 1201901Swollman break; 1211901Swollman 1221901Swollman case RPC_CANTSEND: 1231901Swollman case RPC_CANTRECV: 12474462Salfred i = snprintf(str, len, "; errno = %s", strerror(e.re_errno)); 12581966Sbrian if (i > 0) { 12681966Sbrian str += i; 12781966Sbrian len -= i; 12881966Sbrian } 1291901Swollman break; 1301901Swollman 1311901Swollman case RPC_VERSMISMATCH: 13274462Salfred i = snprintf(str, len, "; low version = %u, high version = %u", 13374462Salfred e.re_vers.low, e.re_vers.high); 13481966Sbrian if (i > 0) { 13581966Sbrian str += i; 13681966Sbrian len -= i; 13781966Sbrian } 1381901Swollman break; 1391901Swollman 1401901Swollman case RPC_AUTHERROR: 1411901Swollman err = auth_errmsg(e.re_why); 14274462Salfred i = snprintf(str, len, "; why = "); 14381966Sbrian if (i > 0) { 14481966Sbrian str += i; 14581966Sbrian len -= i; 14681966Sbrian } 1471901Swollman if (err != NULL) { 14874462Salfred i = snprintf(str, len, "%s",err); 1491901Swollman } else { 15074462Salfred i = snprintf(str, len, 15174462Salfred "(unknown authentication error - %d)", 1521901Swollman (int) e.re_why); 1531901Swollman } 15481966Sbrian if (i > 0) { 15581966Sbrian str += i; 15681966Sbrian len -= i; 15781966Sbrian } 1581901Swollman break; 1591901Swollman 1601901Swollman case RPC_PROGVERSMISMATCH: 16174462Salfred i = snprintf(str, len, "; low version = %u, high version = %u", 16274462Salfred e.re_vers.low, e.re_vers.high); 16381966Sbrian if (i > 0) { 16481966Sbrian str += i; 16581966Sbrian len -= i; 16681966Sbrian } 1671901Swollman break; 1681901Swollman 1691901Swollman default: /* unknown */ 17074462Salfred i = snprintf(str, len, "; s1 = %u, s2 = %u", 17174462Salfred e.re_lb.s1, e.re_lb.s2); 17281966Sbrian if (i > 0) { 17381966Sbrian str += i; 17481966Sbrian len -= i; 17581966Sbrian } 1761901Swollman break; 1771901Swollman } 17821068Speter strstart[CLNT_PERROR_BUFLEN-1] = '\0'; 1791901Swollman return(strstart) ; 1801901Swollman} 1811901Swollman 1821901Swollmanvoid 1831901Swollmanclnt_perror(rpch, s) 1841901Swollman CLIENT *rpch; 18574462Salfred const char *s; 1861901Swollman{ 18774462Salfred 18874462Salfred assert(rpch != NULL); 18974462Salfred assert(s != NULL); 19074462Salfred 19174462Salfred (void) fprintf(stderr, "%s\n", clnt_sperror(rpch,s)); 1921901Swollman} 1931901Swollman 19421068Speterstatic const char *const rpc_errlist[] = { 19521068Speter "RPC: Success", /* 0 - RPC_SUCCESS */ 19621068Speter "RPC: Can't encode arguments", /* 1 - RPC_CANTENCODEARGS */ 19721068Speter "RPC: Can't decode result", /* 2 - RPC_CANTDECODERES */ 19821068Speter "RPC: Unable to send", /* 3 - RPC_CANTSEND */ 19921068Speter "RPC: Unable to receive", /* 4 - RPC_CANTRECV */ 20021068Speter "RPC: Timed out", /* 5 - RPC_TIMEDOUT */ 20121068Speter "RPC: Incompatible versions of RPC", /* 6 - RPC_VERSMISMATCH */ 20221068Speter "RPC: Authentication error", /* 7 - RPC_AUTHERROR */ 20321068Speter "RPC: Program unavailable", /* 8 - RPC_PROGUNAVAIL */ 20421068Speter "RPC: Program/version mismatch", /* 9 - RPC_PROGVERSMISMATCH */ 20521068Speter "RPC: Procedure unavailable", /* 10 - RPC_PROCUNAVAIL */ 20621068Speter "RPC: Server can't decode arguments", /* 11 - RPC_CANTDECODEARGS */ 20721068Speter "RPC: Remote system error", /* 12 - RPC_SYSTEMERROR */ 20821068Speter "RPC: Unknown host", /* 13 - RPC_UNKNOWNHOST */ 20921068Speter "RPC: Port mapper failure", /* 14 - RPC_PMAPFAILURE */ 21021068Speter "RPC: Program not registered", /* 15 - RPC_PROGNOTREGISTERED */ 21121068Speter "RPC: Failed (unspecified error)", /* 16 - RPC_FAILED */ 21221068Speter "RPC: Unknown protocol" /* 17 - RPC_UNKNOWNPROTO */ 2131901Swollman}; 2141901Swollman 2151901Swollman 2161901Swollman/* 2171901Swollman * This interface for use by clntrpc 2181901Swollman */ 2191901Swollmanchar * 2201901Swollmanclnt_sperrno(stat) 2211901Swollman enum clnt_stat stat; 2221901Swollman{ 22321068Speter unsigned int errnum = stat; 2241901Swollman 22521068Speter if (errnum < (sizeof(rpc_errlist)/sizeof(rpc_errlist[0]))) 22674462Salfred /* LINTED interface problem */ 22721068Speter return (char *)rpc_errlist[errnum]; 22821068Speter 2291901Swollman return ("RPC: (unknown error code)"); 2301901Swollman} 2311901Swollman 2321901Swollmanvoid 2331901Swollmanclnt_perrno(num) 2341901Swollman enum clnt_stat num; 2351901Swollman{ 23674462Salfred (void) fprintf(stderr, "%s\n", clnt_sperrno(num)); 2371901Swollman} 2381901Swollman 2391901Swollman 2401901Swollmanchar * 2411901Swollmanclnt_spcreateerror(s) 24274462Salfred const char *s; 2431901Swollman{ 244241007Spfg char *str; 24574462Salfred size_t len, i; 2461901Swollman 24774462Salfred assert(s != NULL); 24874462Salfred 24974462Salfred str = _buf(); /* side effect: sets CLNT_PERROR_BUFLEN */ 2501901Swollman if (str == 0) 2511901Swollman return(0); 25274462Salfred len = CLNT_PERROR_BUFLEN; 25374462Salfred i = snprintf(str, len, "%s: ", s); 25481966Sbrian if (i > 0) 25581966Sbrian len -= i; 25674462Salfred (void)strncat(str, clnt_sperrno(rpc_createerr.cf_stat), len - 1); 2571901Swollman switch (rpc_createerr.cf_stat) { 2581901Swollman case RPC_PMAPFAILURE: 25974462Salfred (void) strncat(str, " - ", len - 1); 260241007Spfg (void) strncat(str, 261241007Spfg clnt_sperrno(rpc_createerr.cf_error.re_status), len - 4); 2621901Swollman break; 2631901Swollman 2641901Swollman case RPC_SYSTEMERROR: 26574462Salfred (void)strncat(str, " - ", len - 1); 26674462Salfred (void)strncat(str, strerror(rpc_createerr.cf_error.re_errno), 26774462Salfred len - 4); 2681901Swollman break; 26974462Salfred 27074462Salfred case RPC_CANTSEND: 27174462Salfred case RPC_CANTDECODERES: 27274462Salfred case RPC_CANTENCODEARGS: 27374462Salfred case RPC_SUCCESS: 27474462Salfred case RPC_UNKNOWNPROTO: 27574462Salfred case RPC_PROGNOTREGISTERED: 27674462Salfred case RPC_FAILED: 27774462Salfred case RPC_UNKNOWNHOST: 27874462Salfred case RPC_CANTDECODEARGS: 27974462Salfred case RPC_PROCUNAVAIL: 28074462Salfred case RPC_PROGVERSMISMATCH: 28174462Salfred case RPC_PROGUNAVAIL: 28274462Salfred case RPC_AUTHERROR: 28374462Salfred case RPC_VERSMISMATCH: 28474462Salfred case RPC_TIMEDOUT: 28574462Salfred case RPC_CANTRECV: 28616283Sjraynard default: 28716283Sjraynard break; 2881901Swollman } 28921068Speter str[CLNT_PERROR_BUFLEN-1] = '\0'; 2901901Swollman return (str); 2911901Swollman} 2921901Swollman 2931901Swollmanvoid 2941901Swollmanclnt_pcreateerror(s) 29574462Salfred const char *s; 2961901Swollman{ 29774462Salfred 29874462Salfred assert(s != NULL); 29974462Salfred 30074462Salfred (void) fprintf(stderr, "%s\n", clnt_spcreateerror(s)); 3011901Swollman} 3021901Swollman 30321068Speterstatic const char *const auth_errlist[] = { 30421068Speter "Authentication OK", /* 0 - AUTH_OK */ 30521068Speter "Invalid client credential", /* 1 - AUTH_BADCRED */ 30621068Speter "Server rejected credential", /* 2 - AUTH_REJECTEDCRED */ 30774462Salfred "Invalid client verifier", /* 3 - AUTH_BADVERF */ 30874462Salfred "Server rejected verifier", /* 4 - AUTH_REJECTEDVERF */ 30921068Speter "Client credential too weak", /* 5 - AUTH_TOOWEAK */ 31021068Speter "Invalid server verifier", /* 6 - AUTH_INVALIDRESP */ 311181344Sdfr "Failed (unspecified error)", /* 7 - AUTH_FAILED */ 312181344Sdfr "Kerberos generic error", /* 8 - AUTH_KERB_GENERIC*/ 313181344Sdfr "Kerberos credential expired", /* 9 - AUTH_TIMEEXPIRE */ 314181344Sdfr "Bad kerberos ticket file", /* 10 - AUTH_TKT_FILE */ 315181344Sdfr "Can't decode kerberos authenticator", /* 11 - AUTH_DECODE */ 316181344Sdfr "Address wrong in kerberos ticket", /* 12 - AUTH_NET_ADDR */ 317181344Sdfr "GSS-API crediential problem", /* 13 - RPCSEC_GSS_CREDPROBLEM */ 318181344Sdfr "GSS-API context problem" /* 14 - RPCSEC_GSS_CTXPROBLEM */ 3191901Swollman}; 3201901Swollman 3211901Swollmanstatic char * 3221901Swollmanauth_errmsg(stat) 3231901Swollman enum auth_stat stat; 3241901Swollman{ 32521068Speter unsigned int errnum = stat; 3261901Swollman 32721068Speter if (errnum < (sizeof(auth_errlist)/sizeof(auth_errlist[0]))) 32874462Salfred /* LINTED interface problem */ 32921068Speter return (char *)auth_errlist[errnum]; 33021068Speter 3311901Swollman return(NULL); 3321901Swollman} 333