18360efbdSAlfred Perlstein /* $NetBSD: clnt_perror.c,v 1.24 2000/06/02 23:11:07 fvdl Exp $ */
28360efbdSAlfred Perlstein
38360efbdSAlfred Perlstein
42e322d37SHiroki Sato /*-
5*8a16b7a1SPedro F. Giffuni * SPDX-License-Identifier: BSD-3-Clause
6*8a16b7a1SPedro F. Giffuni *
72e322d37SHiroki Sato * Copyright (c) 2009, Sun Microsystems, Inc.
82e322d37SHiroki Sato * All rights reserved.
999064799SGarrett Wollman *
102e322d37SHiroki Sato * Redistribution and use in source and binary forms, with or without
112e322d37SHiroki Sato * modification, are permitted provided that the following conditions are met:
122e322d37SHiroki Sato * - Redistributions of source code must retain the above copyright notice,
132e322d37SHiroki Sato * this list of conditions and the following disclaimer.
142e322d37SHiroki Sato * - Redistributions in binary form must reproduce the above copyright notice,
152e322d37SHiroki Sato * this list of conditions and the following disclaimer in the documentation
162e322d37SHiroki Sato * and/or other materials provided with the distribution.
172e322d37SHiroki Sato * - Neither the name of Sun Microsystems, Inc. nor the names of its
182e322d37SHiroki Sato * contributors may be used to endorse or promote products derived
192e322d37SHiroki Sato * from this software without specific prior written permission.
2099064799SGarrett Wollman *
212e322d37SHiroki Sato * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
222e322d37SHiroki Sato * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
232e322d37SHiroki Sato * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
242e322d37SHiroki Sato * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
252e322d37SHiroki Sato * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
262e322d37SHiroki Sato * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
272e322d37SHiroki Sato * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
282e322d37SHiroki Sato * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
292e322d37SHiroki Sato * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
302e322d37SHiroki Sato * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
312e322d37SHiroki Sato * POSSIBILITY OF SUCH DAMAGE.
3299064799SGarrett Wollman */
3399064799SGarrett Wollman
3499064799SGarrett Wollman /*
3599064799SGarrett Wollman * clnt_perror.c
3699064799SGarrett Wollman *
3799064799SGarrett Wollman * Copyright (C) 1984, Sun Microsystems, Inc.
3899064799SGarrett Wollman *
3999064799SGarrett Wollman */
408360efbdSAlfred Perlstein #include "namespace.h"
418360efbdSAlfred Perlstein #include <assert.h>
4299064799SGarrett Wollman #include <stdio.h>
434c3af266SPoul-Henning Kamp #include <stdlib.h>
4499064799SGarrett Wollman #include <string.h>
458360efbdSAlfred Perlstein
4699064799SGarrett Wollman #include <rpc/rpc.h>
4799064799SGarrett Wollman #include <rpc/types.h>
4899064799SGarrett Wollman #include <rpc/auth.h>
4999064799SGarrett Wollman #include <rpc/clnt.h>
508360efbdSAlfred Perlstein #include "un-namespace.h"
5199064799SGarrett Wollman
5299064799SGarrett Wollman static char *buf;
5399064799SGarrett Wollman
54c05ac53bSDavid E. O'Brien static char *_buf(void);
55c05ac53bSDavid E. O'Brien static char *auth_errmsg(enum auth_stat);
568360efbdSAlfred Perlstein #define CLNT_PERROR_BUFLEN 256
578360efbdSAlfred Perlstein
5899064799SGarrett Wollman static char *
_buf(void)59587cf682SCraig Rodrigues _buf(void)
6099064799SGarrett Wollman {
6199064799SGarrett Wollman
62513004a2SPedro F. Giffuni if (buf == NULL)
63513004a2SPedro F. Giffuni buf = malloc(CLNT_PERROR_BUFLEN);
6499064799SGarrett Wollman return (buf);
6599064799SGarrett Wollman }
6699064799SGarrett Wollman
6799064799SGarrett Wollman /*
6899064799SGarrett Wollman * Print reply error info
6999064799SGarrett Wollman */
7099064799SGarrett Wollman char *
clnt_sperror(CLIENT * rpch,const char * s)71587cf682SCraig Rodrigues clnt_sperror(CLIENT *rpch, const char *s)
7299064799SGarrett Wollman {
7399064799SGarrett Wollman struct rpc_err e;
7499064799SGarrett Wollman char *err;
758360efbdSAlfred Perlstein char *str;
768360efbdSAlfred Perlstein char *strstart;
778360efbdSAlfred Perlstein size_t len, i;
7899064799SGarrett Wollman
798360efbdSAlfred Perlstein assert(rpch != NULL);
808360efbdSAlfred Perlstein assert(s != NULL);
818360efbdSAlfred Perlstein
828360efbdSAlfred Perlstein str = _buf(); /* side effect: sets CLNT_PERROR_BUFLEN */
83513004a2SPedro F. Giffuni if (str == NULL)
8499064799SGarrett Wollman return (0);
858360efbdSAlfred Perlstein len = CLNT_PERROR_BUFLEN;
868360efbdSAlfred Perlstein strstart = str;
8799064799SGarrett Wollman CLNT_GETERR(rpch, &e);
8899064799SGarrett Wollman
89a53a9f69SBrian Somers if ((i = snprintf(str, len, "%s: ", s)) > 0) {
908360efbdSAlfred Perlstein str += i;
918360efbdSAlfred Perlstein len -= i;
92a53a9f69SBrian Somers }
938360efbdSAlfred Perlstein
948360efbdSAlfred Perlstein (void)strncpy(str, clnt_sperrno(e.re_status), len - 1);
958360efbdSAlfred Perlstein i = strlen(str);
968360efbdSAlfred Perlstein str += i;
978360efbdSAlfred Perlstein len -= i;
9899064799SGarrett Wollman
9999064799SGarrett Wollman switch (e.re_status) {
10099064799SGarrett Wollman case RPC_SUCCESS:
10199064799SGarrett Wollman case RPC_CANTENCODEARGS:
10299064799SGarrett Wollman case RPC_CANTDECODERES:
10399064799SGarrett Wollman case RPC_TIMEDOUT:
10499064799SGarrett Wollman case RPC_PROGUNAVAIL:
10599064799SGarrett Wollman case RPC_PROCUNAVAIL:
10699064799SGarrett Wollman case RPC_CANTDECODEARGS:
10799064799SGarrett Wollman case RPC_SYSTEMERROR:
10899064799SGarrett Wollman case RPC_UNKNOWNHOST:
10999064799SGarrett Wollman case RPC_UNKNOWNPROTO:
11099064799SGarrett Wollman case RPC_PMAPFAILURE:
11199064799SGarrett Wollman case RPC_PROGNOTREGISTERED:
11299064799SGarrett Wollman case RPC_FAILED:
11399064799SGarrett Wollman break;
11499064799SGarrett Wollman
11599064799SGarrett Wollman case RPC_CANTSEND:
11699064799SGarrett Wollman case RPC_CANTRECV:
1178360efbdSAlfred Perlstein i = snprintf(str, len, "; errno = %s", strerror(e.re_errno));
118a53a9f69SBrian Somers if (i > 0) {
1198360efbdSAlfred Perlstein str += i;
1208360efbdSAlfred Perlstein len -= i;
121a53a9f69SBrian Somers }
12299064799SGarrett Wollman break;
12399064799SGarrett Wollman
12499064799SGarrett Wollman case RPC_VERSMISMATCH:
1258360efbdSAlfred Perlstein i = snprintf(str, len, "; low version = %u, high version = %u",
1268360efbdSAlfred Perlstein e.re_vers.low, e.re_vers.high);
127a53a9f69SBrian Somers if (i > 0) {
1288360efbdSAlfred Perlstein str += i;
1298360efbdSAlfred Perlstein len -= i;
130a53a9f69SBrian Somers }
13199064799SGarrett Wollman break;
13299064799SGarrett Wollman
13399064799SGarrett Wollman case RPC_AUTHERROR:
13499064799SGarrett Wollman err = auth_errmsg(e.re_why);
1358360efbdSAlfred Perlstein i = snprintf(str, len, "; why = ");
136a53a9f69SBrian Somers if (i > 0) {
1378360efbdSAlfred Perlstein str += i;
1388360efbdSAlfred Perlstein len -= i;
139a53a9f69SBrian Somers }
14099064799SGarrett Wollman if (err != NULL) {
1418360efbdSAlfred Perlstein i = snprintf(str, len, "%s",err);
14299064799SGarrett Wollman } else {
1438360efbdSAlfred Perlstein i = snprintf(str, len,
1448360efbdSAlfred Perlstein "(unknown authentication error - %d)",
14599064799SGarrett Wollman (int) e.re_why);
14699064799SGarrett Wollman }
147a53a9f69SBrian Somers if (i > 0) {
1488360efbdSAlfred Perlstein str += i;
1498360efbdSAlfred Perlstein len -= i;
150a53a9f69SBrian Somers }
15199064799SGarrett Wollman break;
15299064799SGarrett Wollman
15399064799SGarrett Wollman case RPC_PROGVERSMISMATCH:
1548360efbdSAlfred Perlstein i = snprintf(str, len, "; low version = %u, high version = %u",
1558360efbdSAlfred Perlstein e.re_vers.low, e.re_vers.high);
156a53a9f69SBrian Somers if (i > 0) {
1578360efbdSAlfred Perlstein str += i;
1588360efbdSAlfred Perlstein len -= i;
159a53a9f69SBrian Somers }
16099064799SGarrett Wollman break;
16199064799SGarrett Wollman
16299064799SGarrett Wollman default: /* unknown */
1638360efbdSAlfred Perlstein i = snprintf(str, len, "; s1 = %u, s2 = %u",
1648360efbdSAlfred Perlstein e.re_lb.s1, e.re_lb.s2);
165a53a9f69SBrian Somers if (i > 0) {
1668360efbdSAlfred Perlstein str += i;
1678360efbdSAlfred Perlstein len -= i;
168a53a9f69SBrian Somers }
16999064799SGarrett Wollman break;
17099064799SGarrett Wollman }
171370c138aSPeter Wemm strstart[CLNT_PERROR_BUFLEN-1] = '\0';
17299064799SGarrett Wollman return(strstart) ;
17399064799SGarrett Wollman }
17499064799SGarrett Wollman
17599064799SGarrett Wollman void
clnt_perror(CLIENT * rpch,const char * s)176587cf682SCraig Rodrigues clnt_perror(CLIENT *rpch, const char *s)
17799064799SGarrett Wollman {
1788360efbdSAlfred Perlstein
1798360efbdSAlfred Perlstein assert(rpch != NULL);
1808360efbdSAlfred Perlstein assert(s != NULL);
1818360efbdSAlfred Perlstein
182baadb8c9SBill Paul (void) fprintf(stderr, "%s\n", clnt_sperror(rpch,s));
18399064799SGarrett Wollman }
18499064799SGarrett Wollman
185370c138aSPeter Wemm static const char *const rpc_errlist[] = {
186370c138aSPeter Wemm "RPC: Success", /* 0 - RPC_SUCCESS */
187370c138aSPeter Wemm "RPC: Can't encode arguments", /* 1 - RPC_CANTENCODEARGS */
188370c138aSPeter Wemm "RPC: Can't decode result", /* 2 - RPC_CANTDECODERES */
189370c138aSPeter Wemm "RPC: Unable to send", /* 3 - RPC_CANTSEND */
190370c138aSPeter Wemm "RPC: Unable to receive", /* 4 - RPC_CANTRECV */
191370c138aSPeter Wemm "RPC: Timed out", /* 5 - RPC_TIMEDOUT */
192370c138aSPeter Wemm "RPC: Incompatible versions of RPC", /* 6 - RPC_VERSMISMATCH */
193370c138aSPeter Wemm "RPC: Authentication error", /* 7 - RPC_AUTHERROR */
194370c138aSPeter Wemm "RPC: Program unavailable", /* 8 - RPC_PROGUNAVAIL */
195370c138aSPeter Wemm "RPC: Program/version mismatch", /* 9 - RPC_PROGVERSMISMATCH */
196370c138aSPeter Wemm "RPC: Procedure unavailable", /* 10 - RPC_PROCUNAVAIL */
197370c138aSPeter Wemm "RPC: Server can't decode arguments", /* 11 - RPC_CANTDECODEARGS */
198370c138aSPeter Wemm "RPC: Remote system error", /* 12 - RPC_SYSTEMERROR */
199370c138aSPeter Wemm "RPC: Unknown host", /* 13 - RPC_UNKNOWNHOST */
200370c138aSPeter Wemm "RPC: Port mapper failure", /* 14 - RPC_PMAPFAILURE */
201370c138aSPeter Wemm "RPC: Program not registered", /* 15 - RPC_PROGNOTREGISTERED */
202370c138aSPeter Wemm "RPC: Failed (unspecified error)", /* 16 - RPC_FAILED */
203370c138aSPeter Wemm "RPC: Unknown protocol" /* 17 - RPC_UNKNOWNPROTO */
20499064799SGarrett Wollman };
20599064799SGarrett Wollman
20699064799SGarrett Wollman
20799064799SGarrett Wollman /*
20899064799SGarrett Wollman * This interface for use by clntrpc
20999064799SGarrett Wollman */
21099064799SGarrett Wollman char *
clnt_sperrno(enum clnt_stat stat)211587cf682SCraig Rodrigues clnt_sperrno(enum clnt_stat stat)
21299064799SGarrett Wollman {
213370c138aSPeter Wemm unsigned int errnum = stat;
21499064799SGarrett Wollman
215370c138aSPeter Wemm if (errnum < (sizeof(rpc_errlist)/sizeof(rpc_errlist[0])))
2168360efbdSAlfred Perlstein /* LINTED interface problem */
217370c138aSPeter Wemm return (char *)rpc_errlist[errnum];
218370c138aSPeter Wemm
21999064799SGarrett Wollman return ("RPC: (unknown error code)");
22099064799SGarrett Wollman }
22199064799SGarrett Wollman
22299064799SGarrett Wollman void
clnt_perrno(enum clnt_stat num)223587cf682SCraig Rodrigues clnt_perrno(enum clnt_stat num)
22499064799SGarrett Wollman {
225baadb8c9SBill Paul (void) fprintf(stderr, "%s\n", clnt_sperrno(num));
22699064799SGarrett Wollman }
22799064799SGarrett Wollman
22899064799SGarrett Wollman
22999064799SGarrett Wollman char *
clnt_spcreateerror(const char * s)230587cf682SCraig Rodrigues clnt_spcreateerror(const char *s)
23199064799SGarrett Wollman {
23206f13fb3SPedro F. Giffuni char *str;
2338360efbdSAlfred Perlstein size_t len, i;
23499064799SGarrett Wollman
2358360efbdSAlfred Perlstein assert(s != NULL);
2368360efbdSAlfred Perlstein
2378360efbdSAlfred Perlstein str = _buf(); /* side effect: sets CLNT_PERROR_BUFLEN */
238513004a2SPedro F. Giffuni if (str == NULL)
23999064799SGarrett Wollman return(0);
2408360efbdSAlfred Perlstein len = CLNT_PERROR_BUFLEN;
2418360efbdSAlfred Perlstein i = snprintf(str, len, "%s: ", s);
242a53a9f69SBrian Somers if (i > 0)
2438360efbdSAlfred Perlstein len -= i;
2448360efbdSAlfred Perlstein (void)strncat(str, clnt_sperrno(rpc_createerr.cf_stat), len - 1);
24599064799SGarrett Wollman switch (rpc_createerr.cf_stat) {
24699064799SGarrett Wollman case RPC_PMAPFAILURE:
2478360efbdSAlfred Perlstein (void) strncat(str, " - ", len - 1);
24806f13fb3SPedro F. Giffuni (void) strncat(str,
24906f13fb3SPedro F. Giffuni clnt_sperrno(rpc_createerr.cf_error.re_status), len - 4);
25099064799SGarrett Wollman break;
25199064799SGarrett Wollman
25299064799SGarrett Wollman case RPC_SYSTEMERROR:
2538360efbdSAlfred Perlstein (void)strncat(str, " - ", len - 1);
2548360efbdSAlfred Perlstein (void)strncat(str, strerror(rpc_createerr.cf_error.re_errno),
2558360efbdSAlfred Perlstein len - 4);
25699064799SGarrett Wollman break;
2578360efbdSAlfred Perlstein
2588360efbdSAlfred Perlstein case RPC_CANTSEND:
2598360efbdSAlfred Perlstein case RPC_CANTDECODERES:
2608360efbdSAlfred Perlstein case RPC_CANTENCODEARGS:
2618360efbdSAlfred Perlstein case RPC_SUCCESS:
2628360efbdSAlfred Perlstein case RPC_UNKNOWNPROTO:
2638360efbdSAlfred Perlstein case RPC_PROGNOTREGISTERED:
2648360efbdSAlfred Perlstein case RPC_FAILED:
2658360efbdSAlfred Perlstein case RPC_UNKNOWNHOST:
2668360efbdSAlfred Perlstein case RPC_CANTDECODEARGS:
2678360efbdSAlfred Perlstein case RPC_PROCUNAVAIL:
2688360efbdSAlfred Perlstein case RPC_PROGVERSMISMATCH:
2698360efbdSAlfred Perlstein case RPC_PROGUNAVAIL:
2708360efbdSAlfred Perlstein case RPC_AUTHERROR:
2718360efbdSAlfred Perlstein case RPC_VERSMISMATCH:
2728360efbdSAlfred Perlstein case RPC_TIMEDOUT:
2738360efbdSAlfred Perlstein case RPC_CANTRECV:
274f12d1a5dSJames Raynard default:
275f12d1a5dSJames Raynard break;
27699064799SGarrett Wollman }
277370c138aSPeter Wemm str[CLNT_PERROR_BUFLEN-1] = '\0';
27899064799SGarrett Wollman return (str);
27999064799SGarrett Wollman }
28099064799SGarrett Wollman
28199064799SGarrett Wollman void
clnt_pcreateerror(const char * s)282587cf682SCraig Rodrigues clnt_pcreateerror(const char *s)
28399064799SGarrett Wollman {
2848360efbdSAlfred Perlstein
2858360efbdSAlfred Perlstein assert(s != NULL);
2868360efbdSAlfred Perlstein
287baadb8c9SBill Paul (void) fprintf(stderr, "%s\n", clnt_spcreateerror(s));
28899064799SGarrett Wollman }
28999064799SGarrett Wollman
290370c138aSPeter Wemm static const char *const auth_errlist[] = {
291370c138aSPeter Wemm "Authentication OK", /* 0 - AUTH_OK */
292370c138aSPeter Wemm "Invalid client credential", /* 1 - AUTH_BADCRED */
293370c138aSPeter Wemm "Server rejected credential", /* 2 - AUTH_REJECTEDCRED */
294370c138aSPeter Wemm "Invalid client verifier", /* 3 - AUTH_BADVERF */
295370c138aSPeter Wemm "Server rejected verifier", /* 4 - AUTH_REJECTEDVERF */
296370c138aSPeter Wemm "Client credential too weak", /* 5 - AUTH_TOOWEAK */
297370c138aSPeter Wemm "Invalid server verifier", /* 6 - AUTH_INVALIDRESP */
2988f55a568SDoug Rabson "Failed (unspecified error)", /* 7 - AUTH_FAILED */
2998f55a568SDoug Rabson "Kerberos generic error", /* 8 - AUTH_KERB_GENERIC*/
3008f55a568SDoug Rabson "Kerberos credential expired", /* 9 - AUTH_TIMEEXPIRE */
3018f55a568SDoug Rabson "Bad kerberos ticket file", /* 10 - AUTH_TKT_FILE */
3028f55a568SDoug Rabson "Can't decode kerberos authenticator", /* 11 - AUTH_DECODE */
3038f55a568SDoug Rabson "Address wrong in kerberos ticket", /* 12 - AUTH_NET_ADDR */
3048f55a568SDoug Rabson "GSS-API crediential problem", /* 13 - RPCSEC_GSS_CREDPROBLEM */
3058f55a568SDoug Rabson "GSS-API context problem" /* 14 - RPCSEC_GSS_CTXPROBLEM */
30699064799SGarrett Wollman };
30799064799SGarrett Wollman
30899064799SGarrett Wollman static char *
auth_errmsg(enum auth_stat stat)309587cf682SCraig Rodrigues auth_errmsg(enum auth_stat stat)
31099064799SGarrett Wollman {
311370c138aSPeter Wemm unsigned int errnum = stat;
31299064799SGarrett Wollman
313370c138aSPeter Wemm if (errnum < (sizeof(auth_errlist)/sizeof(auth_errlist[0])))
3148360efbdSAlfred Perlstein /* LINTED interface problem */
315370c138aSPeter Wemm return (char *)auth_errlist[errnum];
316370c138aSPeter Wemm
31799064799SGarrett Wollman return(NULL);
31899064799SGarrett Wollman }
319