OSDN Git Service

Implement hidden poll, switch user to hidden *printf/*scanf/poll
[uclinux-h8/uClibc.git] / libc / inet / rpc / clnt_perror.c
1 /* @(#)clnt_perror.c    2.1 88/07/29 4.0 RPCSRC */
2 /*
3  * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
4  * unrestricted use provided that this legend is included on all tape
5  * media and as a part of the software program in whole or part.  Users
6  * may copy or modify Sun RPC without charge, but are not authorized
7  * to license or distribute it to anyone else except as part of a product or
8  * program developed by the user.
9  *
10  * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
11  * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
12  * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
13  *
14  * Sun RPC is provided with no support and without any obligation on the
15  * part of Sun Microsystems, Inc. to assist in its use, correction,
16  * modification or enhancement.
17  *
18  * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
19  * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
20  * OR ANY PART THEREOF.
21  *
22  * In no event will Sun Microsystems, Inc. be liable for any lost revenue
23  * or profits or other special, indirect and consequential damages, even if
24  * Sun has been advised of the possibility of such damages.
25  *
26  * Sun Microsystems, Inc.
27  * 2550 Garcia Avenue
28  * Mountain View, California  94043
29  */
30 #if 0
31 static char sccsid[] = "@(#)clnt_perror.c 1.15 87/10/07 Copyr 1984 Sun Micro";
32 #endif
33
34 /*
35  * clnt_perror.c
36  *
37  * Copyright (C) 1984, Sun Microsystems, Inc.
38  *
39  */
40 #define __FORCE_GLIBC
41 #include <features.h>
42
43 #include <stdio.h>
44 #include <string.h>
45 #include "rpc_private.h"
46
47 #ifdef USE_IN_LIBIO
48 # include <wchar.h>
49 # include <libio/iolibio.h>
50 # define fputs(s, f) _IO_fputs (s, f)
51 #endif
52
53 static char *auth_errmsg (enum auth_stat stat) internal_function;
54
55 #ifdef __UCLIBC_HAS_THREADS__
56 /*
57  * Making buf a preprocessor macro requires renaming the local
58  * buf variable in a few functions.  Overriding a global variable
59  * with a local variable of the same name is a bad idea, anyway.
60  */
61 #define buf (*(char **)&RPC_THREAD_VARIABLE(clnt_perr_buf_s))
62 #else
63 static char *buf;
64 #endif
65
66 static char *
67 _buf (void)
68 {
69   if (buf == NULL)
70     buf = (char *) malloc (256);
71   return buf;
72 }
73
74 struct rpc_errtab
75 {
76   enum clnt_stat status;
77   unsigned int message_off;
78 };
79
80 static const char rpc_errstr[] =
81 {
82 #define RPC_SUCCESS_IDX         0
83   _("RPC: Success")
84   "\0"
85 #define RPC_CANTENCODEARGS_IDX  (RPC_SUCCESS_IDX + sizeof "RPC: Success")
86   _("RPC: Can't encode arguments")
87   "\0"
88 #define RPC_CANTDECODERES_IDX   (RPC_CANTENCODEARGS_IDX \
89                                  + sizeof "RPC: Can't encode arguments")
90   _("RPC: Can't decode result")
91   "\0"
92 #define RPC_CANTSEND_IDX        (RPC_CANTDECODERES_IDX \
93                                  + sizeof "RPC: Can't decode result")
94   _("RPC: Unable to send")
95   "\0"
96 #define RPC_CANTRECV_IDX        (RPC_CANTSEND_IDX \
97                                  + sizeof "RPC: Unable to send")
98   _("RPC: Unable to receive")
99   "\0"
100 #define RPC_TIMEDOUT_IDX        (RPC_CANTRECV_IDX \
101                                  + sizeof "RPC: Unable to receive")
102   _("RPC: Timed out")
103   "\0"
104 #define RPC_VERSMISMATCH_IDX    (RPC_TIMEDOUT_IDX \
105                                  + sizeof "RPC: Timed out")
106   _("RPC: Incompatible versions of RPC")
107   "\0"
108 #define RPC_AUTHERROR_IDX       (RPC_VERSMISMATCH_IDX \
109                                  + sizeof "RPC: Incompatible versions of RPC")
110   _("RPC: Authentication error")
111   "\0"
112 #define RPC_PROGUNAVAIL_IDX             (RPC_AUTHERROR_IDX \
113                                  + sizeof "RPC: Authentication error")
114   _("RPC: Program unavailable")
115   "\0"
116 #define RPC_PROGVERSMISMATCH_IDX (RPC_PROGUNAVAIL_IDX \
117                                   + sizeof "RPC: Program unavailable")
118   _("RPC: Program/version mismatch")
119   "\0"
120 #define RPC_PROCUNAVAIL_IDX     (RPC_PROGVERSMISMATCH_IDX \
121                                  + sizeof "RPC: Program/version mismatch")
122   _("RPC: Procedure unavailable")
123   "\0"
124 #define RPC_CANTDECODEARGS_IDX  (RPC_PROCUNAVAIL_IDX \
125                                  + sizeof "RPC: Procedure unavailable")
126   _("RPC: Server can't decode arguments")
127   "\0"
128 #define RPC_SYSTEMERROR_IDX     (RPC_CANTDECODEARGS_IDX \
129                                  + sizeof "RPC: Server can't decode arguments")
130   _("RPC: Remote system error")
131   "\0"
132 #define RPC_UNKNOWNHOST_IDX     (RPC_SYSTEMERROR_IDX \
133                                  + sizeof "RPC: Remote system error")
134   _("RPC: Unknown host")
135   "\0"
136 #define RPC_UNKNOWNPROTO_IDX    (RPC_UNKNOWNHOST_IDX \
137                                  + sizeof "RPC: Unknown host")
138   _("RPC: Unknown protocol")
139   "\0"
140 #define RPC_PMAPFAILURE_IDX     (RPC_UNKNOWNPROTO_IDX \
141                                  + sizeof "RPC: Unknown protocol")
142   _("RPC: Port mapper failure")
143   "\0"
144 #define RPC_PROGNOTREGISTERED_IDX (RPC_PMAPFAILURE_IDX \
145                                    + sizeof "RPC: Port mapper failure")
146   _("RPC: Program not registered")
147   "\0"
148 #define RPC_FAILED_IDX          (RPC_PROGNOTREGISTERED_IDX \
149                                  + sizeof "RPC: Program not registered")
150   _("RPC: Failed (unspecified error)")
151 };
152
153 static const struct rpc_errtab rpc_errlist[] =
154 {
155   { RPC_SUCCESS, RPC_SUCCESS_IDX },
156   { RPC_CANTENCODEARGS, RPC_CANTENCODEARGS_IDX },
157   { RPC_CANTDECODERES, RPC_CANTDECODERES_IDX },
158   { RPC_CANTSEND, RPC_CANTSEND_IDX },
159   { RPC_CANTRECV, RPC_CANTRECV_IDX },
160   { RPC_TIMEDOUT, RPC_TIMEDOUT_IDX },
161   { RPC_VERSMISMATCH, RPC_VERSMISMATCH_IDX },
162   { RPC_AUTHERROR, RPC_AUTHERROR_IDX },
163   { RPC_PROGUNAVAIL, RPC_PROGUNAVAIL_IDX },
164   { RPC_PROGVERSMISMATCH, RPC_PROGVERSMISMATCH_IDX },
165   { RPC_PROCUNAVAIL, RPC_PROCUNAVAIL_IDX },
166   { RPC_CANTDECODEARGS, RPC_CANTDECODEARGS_IDX },
167   { RPC_SYSTEMERROR, RPC_SYSTEMERROR_IDX },
168   { RPC_UNKNOWNHOST, RPC_UNKNOWNHOST_IDX },
169   { RPC_UNKNOWNPROTO, RPC_UNKNOWNPROTO_IDX },
170   { RPC_PMAPFAILURE, RPC_PMAPFAILURE_IDX },
171   { RPC_PROGNOTREGISTERED, RPC_PROGNOTREGISTERED_IDX },
172   { RPC_FAILED, RPC_FAILED_IDX }
173 };
174
175
176 /*
177  * This interface for use by clntrpc
178  */
179 char attribute_hidden *
180 __clnt_sperrno (enum clnt_stat stat)
181 {
182   size_t i;
183
184   for (i = 0; i < sizeof (rpc_errlist) / sizeof (struct rpc_errtab); i++)
185     {
186       if (rpc_errlist[i].status == stat)
187         {
188           return (char*)_(rpc_errstr + rpc_errlist[i].message_off);
189         }
190     }
191   return _("RPC: (unknown error code)");
192 }
193 strong_alias(__clnt_sperrno,clnt_sperrno)
194
195 void
196 clnt_perrno (enum clnt_stat num)
197 {
198 #ifdef USE_IN_LIBIO
199   if (_IO_fwide (stderr, 0) > 0)
200     (void) __fwprintf (stderr, L"%s", __clnt_sperrno (num));
201   else
202 #endif
203     (void) fputs (__clnt_sperrno (num), stderr);
204 }
205
206 /*
207  * Print reply error info
208  */
209 char attribute_hidden *
210 __clnt_sperror (CLIENT * rpch, const char *msg)
211 {
212   char chrbuf[1024];
213   struct rpc_err e;
214   char *err;
215   char *str = _buf ();
216   char *strstart = str;
217   int len;
218
219   if (str == NULL)
220     return NULL;
221   CLNT_GETERR (rpch, &e);
222
223   len = __sprintf (str, "%s: ", msg);
224   str += len;
225
226   (void) __strcpy(str, __clnt_sperrno(e.re_status));
227   str += __strlen(str);
228
229   switch (e.re_status)
230     {
231     case RPC_SUCCESS:
232     case RPC_CANTENCODEARGS:
233     case RPC_CANTDECODERES:
234     case RPC_TIMEDOUT:
235     case RPC_PROGUNAVAIL:
236     case RPC_PROCUNAVAIL:
237     case RPC_CANTDECODEARGS:
238     case RPC_SYSTEMERROR:
239     case RPC_UNKNOWNHOST:
240     case RPC_UNKNOWNPROTO:
241     case RPC_PMAPFAILURE:
242     case RPC_PROGNOTREGISTERED:
243     case RPC_FAILED:
244       break;
245
246     case RPC_CANTSEND:
247     case RPC_CANTRECV:
248       strerror_r (e.re_errno, chrbuf, sizeof chrbuf);
249       len = __sprintf (str, "; errno = %s", chrbuf); 
250       str += len;
251       break;
252
253     case RPC_VERSMISMATCH:
254       len= __sprintf (str, _("; low version = %lu, high version = %lu"),
255                     e.re_vers.low, e.re_vers.high);
256       str += len;
257       break;
258
259     case RPC_AUTHERROR:
260       err = auth_errmsg (e.re_why);
261       (void) __strcpy(str, _("; why = "));
262       str += __strlen(str);
263
264       if (err != NULL)
265         {
266           (void) __strcpy(str, err);
267           str += __strlen(str);
268         }
269       else
270         {
271           len = __sprintf (str, _("(unknown authentication error - %d)"),
272                          (int) e.re_why);
273           str += len;
274         }
275       break;
276
277     case RPC_PROGVERSMISMATCH:
278       len = __sprintf (str, _("; low version = %lu, high version = %lu"),
279                      e.re_vers.low, e.re_vers.high);
280       str += len;
281       break;
282
283     default:                    /* unknown */
284       len = __sprintf (str, "; s1 = %lu, s2 = %lu", e.re_lb.s1, e.re_lb.s2);
285       str += len;
286       break;
287     }
288   *str = '\n';
289   *++str = '\0';
290   return (strstart);
291 }
292 strong_alias(__clnt_sperror,clnt_sperror)
293
294 void attribute_hidden
295 __clnt_perror (CLIENT * rpch, const char *msg)
296 {
297 #ifdef USE_IN_LIBIO
298   if (_IO_fwide (stderr, 0) > 0)
299     (void) __fwprintf (stderr, L"%s", __clnt_sperror (rpch, msg));
300   else
301 #endif
302     (void) fputs (__clnt_sperror (rpch, msg), stderr);
303 }
304 strong_alias(__clnt_perror,clnt_perror)
305
306 char attribute_hidden *
307 __clnt_spcreateerror (const char *msg)
308 {
309   char chrbuf[1024];
310   char *str = _buf ();
311   char *cp;
312   int len;
313   struct rpc_createerr *ce;
314
315   if (str == NULL)
316     return NULL;
317   ce = &get_rpc_createerr ();
318   len = __sprintf (str, "%s: ", msg);
319   cp = str + len;
320   (void) __strcpy(cp, __clnt_sperrno (ce->cf_stat));
321   cp += __strlen(cp);
322
323   switch (ce->cf_stat)
324     {
325     case RPC_PMAPFAILURE:
326       (void) __strcpy(cp, " - ");
327       cp += __strlen(cp);
328
329       (void) __strcpy(cp, __clnt_sperrno (ce->cf_error.re_status));
330       cp += __strlen(cp);
331
332       break;
333
334     case RPC_SYSTEMERROR:
335       (void) __strcpy(cp, " - ");
336       cp += __strlen(cp);
337
338       strerror_r (ce->cf_error.re_errno, chrbuf, sizeof chrbuf);
339       (void) __strcpy(cp, chrbuf);
340       cp += __strlen(cp);
341       break;
342     default:
343       break;
344     }
345   *cp = '\n';
346   *++cp = '\0';
347   return str;
348 }
349 strong_alias(__clnt_spcreateerror,clnt_spcreateerror)
350
351 void
352 clnt_pcreateerror (const char *msg)
353 {
354 #ifdef USE_IN_LIBIO
355   if (_IO_fwide (stderr, 0) > 0)
356     (void) __fwprintf (stderr, L"%s", __clnt_spcreateerror (msg));
357   else
358 #endif
359     (void) fputs (__clnt_spcreateerror (msg), stderr);
360 }
361
362 struct auth_errtab
363 {
364   enum auth_stat status;
365   unsigned int message_off;
366 };
367
368 static const char auth_errstr[] =
369 {
370 #define AUTH_OK_IDX             0
371    _("Authentication OK")
372    "\0"
373 #define AUTH_BADCRED_IDX        (AUTH_OK_IDX + sizeof "Authentication OK")
374    _("Invalid client credential")
375    "\0"
376 #define AUTH_REJECTEDCRED_IDX   (AUTH_BADCRED_IDX \
377                                  + sizeof "Invalid client credential")
378    _("Server rejected credential")
379    "\0"
380 #define AUTH_BADVERF_IDX        (AUTH_REJECTEDCRED_IDX \
381                                  + sizeof "Server rejected credential")
382    _("Invalid client verifier")
383    "\0"
384 #define AUTH_REJECTEDVERF_IDX   (AUTH_BADVERF_IDX \
385                                  + sizeof "Invalid client verifier")
386    _("Server rejected verifier")
387    "\0"
388 #define AUTH_TOOWEAK_IDX        (AUTH_REJECTEDVERF_IDX \
389                                  + sizeof "Server rejected verifier")
390    _("Client credential too weak")
391    "\0"
392 #define AUTH_INVALIDRESP_IDX    (AUTH_TOOWEAK_IDX \
393                                  + sizeof "Client credential too weak")
394    _("Invalid server verifier")
395    "\0"
396 #define AUTH_FAILED_IDX         (AUTH_INVALIDRESP_IDX \
397                                  + sizeof "Invalid server verifier")
398    _("Failed (unspecified error)")
399 };
400
401 static const struct auth_errtab auth_errlist[] =
402 {
403   { AUTH_OK, AUTH_OK_IDX },
404   { AUTH_BADCRED, AUTH_BADCRED_IDX },
405   { AUTH_REJECTEDCRED, AUTH_REJECTEDCRED_IDX },
406   { AUTH_BADVERF, AUTH_BADVERF_IDX },
407   { AUTH_REJECTEDVERF, AUTH_REJECTEDVERF_IDX },
408   { AUTH_TOOWEAK, AUTH_TOOWEAK_IDX },
409   { AUTH_INVALIDRESP, AUTH_INVALIDRESP_IDX },
410   { AUTH_FAILED, AUTH_FAILED_IDX }
411 };
412
413 static char *
414 internal_function
415 auth_errmsg (enum auth_stat stat)
416 {
417   size_t i;
418
419   for (i = 0; i < sizeof (auth_errlist) / sizeof (struct auth_errtab); i++)
420     {
421       if (auth_errlist[i].status == stat)
422         {
423           return (char*)_(auth_errstr + auth_errlist[i].message_off);
424         }
425     }
426   return NULL;
427 }
428
429
430 static void __attribute_used__
431 free_mem (void)
432 {
433   free (buf);
434 }