Libinfo-173.tar.gz
[apple/libinfo.git] / rpc.subproj / clnt_perror.c
1 /*
2 * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
3 *
4 * @APPLE_LICENSE_HEADER_START@
5 *
6 * Copyright (c) 1999-2003 Apple Computer, Inc. All Rights Reserved.
7 *
8 * This file contains Original Code and/or Modifications of Original Code
9 * as defined in and that are subject to the Apple Public Source License
10 * Version 2.0 (the 'License'). You may not use this file except in
11 * compliance with the License. Please obtain a copy of the License at
12 * http://www.opensource.apple.com/apsl/ and read it before using this
13 * file.
14 *
15 * The Original Code and all software distributed under the License are
16 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
17 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
18 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
19 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
20 * Please see the License for the specific language governing rights and
21 * limitations under the License.
22 *
23 * @APPLE_LICENSE_HEADER_END@
24 */
25 /*
26 * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
27 * unrestricted use provided that this legend is included on all tape
28 * media and as a part of the software program in whole or part. Users
29 * may copy or modify Sun RPC without charge, but are not authorized
30 * to license or distribute it to anyone else except as part of a product or
31 * program developed by the user.
32 *
33 * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
34 * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
35 * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
36 *
37 * Sun RPC is provided with no support and without any obligation on the
38 * part of Sun Microsystems, Inc. to assist in its use, correction,
39 * modification or enhancement.
40 *
41 * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
42 * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
43 * OR ANY PART THEREOF.
44 *
45 * In no event will Sun Microsystems, Inc. be liable for any lost revenue
46 * or profits or other special, indirect and consequential damages, even if
47 * Sun has been advised of the possibility of such damages.
48 *
49 * Sun Microsystems, Inc.
50 * 2550 Garcia Avenue
51 * Mountain View, California 94043
52 */
53
54 #if defined(LIBC_SCCS) && !defined(lint)
55 /*static char *sccsid = "from: @(#)clnt_perror.c 1.15 87/10/07 Copyr 1984 Sun Micro";*/
56 /*static char *sccsid = "from: @(#)clnt_perror.c 2.1 88/07/29 4.0 RPCSRC";*/
57 static char *rcsid = "$Id: clnt_perror.c,v 1.4 2003/06/23 17:24:59 majka Exp $";
58 #endif
59
60 /*
61 * clnt_perror.c
62 *
63 * Copyright (C) 1984, Sun Microsystems, Inc.
64 *
65 */
66 #include <stdio.h>
67 #include <stdlib.h>
68 #include <string.h>
69 #include <rpc/rpc.h>
70 #include <rpc/types.h>
71 #include <rpc/auth.h>
72 #include <rpc/clnt.h>
73
74 static char *auth_errmsg();
75
76 static char *buf;
77
78 static char *
79 _buf()
80 {
81
82 if (buf == 0)
83 buf = (char *)malloc(256);
84 return (buf);
85 }
86
87 /*
88 * Print reply error info
89 */
90 char *
91 clnt_sperror(rpch, s)
92 CLIENT *rpch;
93 char *s;
94 {
95 struct rpc_err e;
96 void clnt_perrno();
97 char *err;
98 char *str = _buf();
99 char *strstart = str;
100
101 if (str == 0)
102 return (0);
103 CLNT_GETERR(rpch, &e);
104
105 (void) sprintf(str, "%s: ", s);
106 str += strlen(str);
107
108 (void) strcpy(str, clnt_sperrno(e.re_status));
109 str += strlen(str);
110
111 switch (e.re_status) {
112 case RPC_SUCCESS:
113 case RPC_CANTENCODEARGS:
114 case RPC_CANTDECODERES:
115 case RPC_TIMEDOUT:
116 case RPC_PROGUNAVAIL:
117 case RPC_PROCUNAVAIL:
118 case RPC_CANTDECODEARGS:
119 case RPC_SYSTEMERROR:
120 case RPC_UNKNOWNHOST:
121 case RPC_UNKNOWNPROTO:
122 case RPC_PMAPFAILURE:
123 case RPC_PROGNOTREGISTERED:
124 case RPC_FAILED:
125 break;
126
127 case RPC_CANTSEND:
128 case RPC_CANTRECV:
129 (void) sprintf(str, "; errno = %s",
130 strerror(e.re_errno));
131 str += strlen(str);
132 break;
133
134 case RPC_VERSMISMATCH:
135 (void) sprintf(str,
136 "; low version = %lu, high version = %lu",
137 e.re_vers.low, e.re_vers.high);
138 str += strlen(str);
139 break;
140
141 case RPC_AUTHERROR:
142 err = auth_errmsg(e.re_why);
143 (void) sprintf(str,"; why = ");
144 str += strlen(str);
145 if (err != NULL) {
146 (void) sprintf(str, "%s",err);
147 } else {
148 (void) sprintf(str,
149 "(unknown authentication error - %d)",
150 (int) e.re_why);
151 }
152 str += strlen(str);
153 break;
154
155 case RPC_PROGVERSMISMATCH:
156 (void) sprintf(str,
157 "; low version = %lu, high version = %lu",
158 e.re_vers.low, e.re_vers.high);
159 str += strlen(str);
160 break;
161
162 default: /* unknown */
163 (void) sprintf(str,
164 "; s1 = %lu, s2 = %lu",
165 e.re_lb.s1, e.re_lb.s2);
166 str += strlen(str);
167 break;
168 }
169 (void) sprintf(str, "\n");
170 return(strstart) ;
171 }
172
173 void
174 clnt_perror(rpch, s)
175 CLIENT *rpch;
176 char *s;
177 {
178 (void) fprintf(stderr,"%s",clnt_sperror(rpch,s));
179 }
180
181
182 struct rpc_errtab {
183 enum clnt_stat status;
184 char *message;
185 };
186
187 static struct rpc_errtab rpc_errlist[] = {
188 { RPC_SUCCESS,
189 "RPC: Success" },
190 { RPC_CANTENCODEARGS,
191 "RPC: Can't encode arguments" },
192 { RPC_CANTDECODERES,
193 "RPC: Can't decode result" },
194 { RPC_CANTSEND,
195 "RPC: Unable to send" },
196 { RPC_CANTRECV,
197 "RPC: Unable to receive" },
198 { RPC_TIMEDOUT,
199 "RPC: Timed out" },
200 { RPC_VERSMISMATCH,
201 "RPC: Incompatible versions of RPC" },
202 { RPC_AUTHERROR,
203 "RPC: Authentication error" },
204 { RPC_PROGUNAVAIL,
205 "RPC: Program unavailable" },
206 { RPC_PROGVERSMISMATCH,
207 "RPC: Program/version mismatch" },
208 { RPC_PROCUNAVAIL,
209 "RPC: Procedure unavailable" },
210 { RPC_CANTDECODEARGS,
211 "RPC: Server can't decode arguments" },
212 { RPC_SYSTEMERROR,
213 "RPC: Remote system error" },
214 { RPC_UNKNOWNHOST,
215 "RPC: Unknown host" },
216 { RPC_UNKNOWNPROTO,
217 "RPC: Unknown protocol" },
218 { RPC_PMAPFAILURE,
219 "RPC: Port mapper failure" },
220 { RPC_PROGNOTREGISTERED,
221 "RPC: Program not registered"},
222 { RPC_FAILED,
223 "RPC: Failed (unspecified error)"}
224 };
225
226
227 /*
228 * This interface for use by clntrpc
229 */
230 char *
231 clnt_sperrno(stat)
232 enum clnt_stat stat;
233 {
234 int i;
235
236 for (i = 0; i < sizeof(rpc_errlist)/sizeof(struct rpc_errtab); i++) {
237 if (rpc_errlist[i].status == stat) {
238 return (rpc_errlist[i].message);
239 }
240 }
241 return ("RPC: (unknown error code)");
242 }
243
244 void
245 clnt_perrno(num)
246 enum clnt_stat num;
247 {
248 (void) fprintf(stderr,"%s",clnt_sperrno(num));
249 }
250
251
252 char *
253 clnt_spcreateerror(s)
254 char *s;
255 {
256 char *str = _buf();
257
258 if (str == 0)
259 return(0);
260 (void) sprintf(str, "%s: ", s);
261 (void) strcat(str, clnt_sperrno(rpc_createerr.cf_stat));
262 switch (rpc_createerr.cf_stat) {
263 case RPC_PMAPFAILURE:
264 (void) strcat(str, " - ");
265 (void) strcat(str,
266 clnt_sperrno(rpc_createerr.cf_error.re_status));
267 break;
268
269 case RPC_SYSTEMERROR:
270 (void) strcat(str, " - ");
271 if (rpc_createerr.cf_error.re_errno > 0
272 && rpc_createerr.cf_error.re_errno < sys_nerr)
273 (void) strcat(str,
274 strerror(rpc_createerr.cf_error.re_errno));
275 else
276 (void) sprintf(&str[strlen(str)], "Error %d",
277 rpc_createerr.cf_error.re_errno);
278 break;
279 default: break;
280 }
281 (void) strcat(str, "\n");
282 return (str);
283 }
284
285 void
286 clnt_pcreateerror(s)
287 char *s;
288 {
289 (void) fprintf(stderr,"%s",clnt_spcreateerror(s));
290 }
291
292 struct auth_errtab {
293 enum auth_stat status;
294 char *message;
295 };
296
297 static struct auth_errtab auth_errlist[] = {
298 { AUTH_OK,
299 "Authentication OK" },
300 { AUTH_BADCRED,
301 "Invalid client credential" },
302 { AUTH_REJECTEDCRED,
303 "Server rejected credential" },
304 { AUTH_BADVERF,
305 "Invalid client verifier" },
306 { AUTH_REJECTEDVERF,
307 "Server rejected verifier" },
308 { AUTH_TOOWEAK,
309 "Client credential too weak" },
310 { AUTH_INVALIDRESP,
311 "Invalid server verifier" },
312 { AUTH_FAILED,
313 "Failed (unspecified error)" },
314 };
315
316 static char *
317 auth_errmsg(stat)
318 enum auth_stat stat;
319 {
320 int i;
321
322 for (i = 0; i < sizeof(auth_errlist)/sizeof(struct auth_errtab); i++) {
323 if (auth_errlist[i].status == stat) {
324 return(auth_errlist[i].message);
325 }
326 }
327 return(NULL);
328 }