S/390: Add hwcap value for transactional execution.
[platform/upstream/glibc.git] / misc / error.c
1 /* Error handler for noninteractive utilities
2    Copyright (C) 1990-2012 Free Software Foundation, Inc.
3    This file is part of the GNU C Library.
4
5    The GNU C Library is free software; you can redistribute it and/or
6    modify it under the terms of the GNU Lesser General Public
7    License as published by the Free Software Foundation; either
8    version 2.1 of the License, or (at your option) any later version.
9
10    The GNU C Library is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13    Lesser General Public License for more details.
14
15    You should have received a copy of the GNU Lesser General Public
16    License along with the GNU C Library; if not, see
17    <http://www.gnu.org/licenses/>.  */
18
19 /* Written by David MacKenzie <djm@gnu.ai.mit.edu>.  */
20
21 #ifdef HAVE_CONFIG_H
22 # include <config.h>
23 #endif
24
25 #include <stdarg.h>
26 #include <stdio.h>
27 #include <stdlib.h>
28 #include <string.h>
29
30 #ifdef _LIBC
31 # include <libintl.h>
32 # include <stdbool.h>
33 # include <stdint.h>
34 # include <wchar.h>
35 # define mbsrtowcs __mbsrtowcs
36 #endif
37
38 #include "error.h"
39
40 #ifndef _
41 # define _(String) String
42 #endif
43
44 /* If NULL, error will flush stdout, then print on stderr the program
45    name, a colon and a space.  Otherwise, error will call this
46    function without parameters instead.  */
47 void (*error_print_progname) (void);
48
49 /* This variable is incremented each time `error' is called.  */
50 unsigned int error_message_count;
51
52 #ifdef _LIBC
53 /* In the GNU C library, there is a predefined variable for this.  */
54
55 # define program_name program_invocation_name
56 # include <errno.h>
57 # include <limits.h>
58 # include <libio/libioP.h>
59
60 /* In GNU libc we want do not want to use the common name `error' directly.
61    Instead make it a weak alias.  */
62 extern void __error (int status, int errnum, const char *message, ...)
63      __attribute__ ((__format__ (__printf__, 3, 4)));
64 extern void __error_at_line (int status, int errnum, const char *file_name,
65                              unsigned int line_number, const char *message,
66                              ...)
67      __attribute__ ((__format__ (__printf__, 5, 6)));;
68 # define error __error
69 # define error_at_line __error_at_line
70
71 # include <libio/iolibio.h>
72 # define fflush(s) _IO_fflush (s)
73 # undef putc
74 # define putc(c, fp) _IO_putc (c, fp)
75
76 # include <bits/libc-lock.h>
77
78 #else /* not _LIBC */
79
80 # if !HAVE_DECL_STRERROR_R && STRERROR_R_CHAR_P
81 #  ifndef HAVE_DECL_STRERROR_R
82 "this configure-time declaration test was not run"
83 #  endif
84 char *strerror_r ();
85 # endif
86
87 /* The calling program should define program_name and set it to the
88    name of the executing program.  */
89 extern char *program_name;
90
91 # if HAVE_STRERROR_R || defined strerror_r
92 #  define __strerror_r strerror_r
93 # endif /* HAVE_STRERROR_R || defined strerror_r */
94 #endif  /* not _LIBC */
95
96 static void
97 print_errno_message (int errnum)
98 {
99   char const *s;
100
101 #if defined HAVE_STRERROR_R || _LIBC
102   char errbuf[1024];
103 # if STRERROR_R_CHAR_P || _LIBC
104   s = __strerror_r (errnum, errbuf, sizeof errbuf);
105 # else
106   if (__strerror_r (errnum, errbuf, sizeof errbuf) == 0)
107     s = errbuf;
108   else
109     s = 0;
110 # endif
111 #else
112   s = strerror (errnum);
113 #endif
114
115 #if !_LIBC
116   if (! s)
117     s = _("Unknown system error");
118 #endif
119
120 #if _LIBC
121   __fxprintf (NULL, ": %s", s);
122 #else
123   fprintf (stderr, ": %s", s);
124 #endif
125 }
126
127 static void
128 error_tail (int status, int errnum, const char *message, va_list args)
129 {
130 #if _LIBC
131   if (_IO_fwide (stderr, 0) > 0)
132     {
133 # define ALLOCA_LIMIT 2000
134       size_t len = strlen (message) + 1;
135       wchar_t *wmessage = NULL;
136       mbstate_t st;
137       size_t res;
138       const char *tmp;
139       bool use_malloc = false;
140
141       while (1)
142         {
143           if (__libc_use_alloca (len * sizeof (wchar_t)))
144             wmessage = (wchar_t *) alloca (len * sizeof (wchar_t));
145           else
146             {
147               if (!use_malloc)
148                 wmessage = NULL;
149
150               wchar_t *p = (wchar_t *) realloc (wmessage,
151                                                 len * sizeof (wchar_t));
152               if (p == NULL)
153                 {
154                   free (wmessage);
155                   fputws_unlocked (L"out of memory\n", stderr);
156                   return;
157                 }
158               wmessage = p;
159               use_malloc = true;
160             }
161
162           memset (&st, '\0', sizeof (st));
163           tmp = message;
164
165           res = mbsrtowcs (wmessage, &tmp, len, &st);
166           if (res != len)
167             break;
168
169           if (__builtin_expect (len >= SIZE_MAX / 2, 0))
170             {
171               /* This really should not happen if everything is fine.  */
172               res = (size_t) -1;
173               break;
174             }
175
176           len *= 2;
177         }
178
179       if (res == (size_t) -1)
180         {
181           /* The string cannot be converted.  */
182           if (use_malloc)
183             {
184               free (wmessage);
185               use_malloc = false;
186             }
187           wmessage = (wchar_t *) L"???";
188         }
189
190       __vfwprintf (stderr, wmessage, args);
191
192       if (use_malloc)
193         free (wmessage);
194     }
195   else
196 #endif
197     vfprintf (stderr, message, args);
198   va_end (args);
199
200   ++error_message_count;
201   if (errnum)
202     print_errno_message (errnum);
203 #if _LIBC
204   __fxprintf (NULL, "\n");
205 #else
206   putc ('\n', stderr);
207 #endif
208   fflush (stderr);
209   if (status)
210     exit (status);
211 }
212
213
214 /* Print the program name and error message MESSAGE, which is a printf-style
215    format string with optional args.
216    If ERRNUM is nonzero, print its corresponding system error message.
217    Exit with status STATUS if it is nonzero.  */
218 void
219 error (int status, int errnum, const char *message, ...)
220 {
221   va_list args;
222
223 #if defined _LIBC && defined __libc_ptf_call
224   /* We do not want this call to be cut short by a thread
225      cancellation.  Therefore disable cancellation for now.  */
226   int state = PTHREAD_CANCEL_ENABLE;
227   __libc_ptf_call (pthread_setcancelstate, (PTHREAD_CANCEL_DISABLE, &state),
228                    0);
229 #endif
230
231   fflush (stdout);
232 #ifdef _LIBC
233   _IO_flockfile (stderr);
234 #endif
235   if (error_print_progname)
236     (*error_print_progname) ();
237   else
238     {
239 #if _LIBC
240       __fxprintf (NULL, "%s: ", program_name);
241 #else
242       fprintf (stderr, "%s: ", program_name);
243 #endif
244     }
245
246   va_start (args, message);
247   error_tail (status, errnum, message, args);
248
249 #ifdef _LIBC
250   _IO_funlockfile (stderr);
251 # ifdef __libc_ptf_call
252   __libc_ptf_call (pthread_setcancelstate, (state, NULL), 0);
253 # endif
254 #endif
255 }
256 \f
257 /* Sometimes we want to have at most one error per line.  This
258    variable controls whether this mode is selected or not.  */
259 int error_one_per_line;
260
261 void
262 error_at_line (int status, int errnum, const char *file_name,
263                unsigned int line_number, const char *message, ...)
264 {
265   va_list args;
266
267   if (error_one_per_line)
268     {
269       static const char *old_file_name;
270       static unsigned int old_line_number;
271
272       if (old_line_number == line_number
273           && (file_name == old_file_name
274               || (old_file_name != NULL
275                   && file_name != NULL
276                   && strcmp (old_file_name, file_name) == 0)))
277         /* Simply return and print nothing.  */
278         return;
279
280       old_file_name = file_name;
281       old_line_number = line_number;
282     }
283
284 #if defined _LIBC && defined __libc_ptf_call
285   /* We do not want this call to be cut short by a thread
286      cancellation.  Therefore disable cancellation for now.  */
287   int state = PTHREAD_CANCEL_ENABLE;
288   __libc_ptf_call (pthread_setcancelstate, (PTHREAD_CANCEL_DISABLE, &state),
289                    0);
290 #endif
291
292   fflush (stdout);
293 #ifdef _LIBC
294   _IO_flockfile (stderr);
295 #endif
296   if (error_print_progname)
297     (*error_print_progname) ();
298   else
299     {
300 #if _LIBC
301       __fxprintf (NULL, "%s:", program_name);
302 #else
303       fprintf (stderr, "%s:", program_name);
304 #endif
305     }
306
307 #if _LIBC
308   __fxprintf (NULL, file_name != NULL ? "%s:%d: " : " ",
309               file_name, line_number);
310 #else
311   fprintf (stderr, file_name != NULL ? "%s:%d: " : " ",
312            file_name, line_number);
313 #endif
314
315   va_start (args, message);
316   error_tail (status, errnum, message, args);
317
318 #ifdef _LIBC
319   _IO_funlockfile (stderr);
320 # ifdef __libc_ptf_call
321   __libc_ptf_call (pthread_setcancelstate, (state, NULL), 0);
322 # endif
323 #endif
324 }
325
326 #ifdef _LIBC
327 /* Make the weak alias.  */
328 # undef error
329 # undef error_at_line
330 weak_alias (__error, error)
331 weak_alias (__error_at_line, error_at_line)
332 #endif