Mercurial > hg > octave-nkf > gnulib-hg
annotate lib/error.c @ 4740:892879324c9c
(SIZE_MAX) [!defined SIZE_MAX]: Define.
(error_tail): Do not loop, reallocating temporary buffer, since
the original size is big enough. This avoids one potential size
overflow calculation. Check for size overflow when calculating
temporary buffer size. Free temporary buffer when done, if
it was allocated with malloc; this closes a memory leak.
author | Paul Eggert <eggert@cs.ucla.edu> |
---|---|
date | Fri, 26 Sep 2003 07:41:40 +0000 |
parents | 04758f7475fd |
children | 7717bd4078ea |
rev | line source |
---|---|
1268 | 1 /* Error handler for noninteractive utilities |
4739
04758f7475fd
Merge changes from glibc.
Paul Eggert <eggert@cs.ucla.edu>
parents:
4695
diff
changeset
|
2 Copyright (C) 1990-1998, 2000-2002, 2003 Free Software Foundation, Inc. |
04758f7475fd
Merge changes from glibc.
Paul Eggert <eggert@cs.ucla.edu>
parents:
4695
diff
changeset
|
3 This file is part of the GNU C Library. |
04758f7475fd
Merge changes from glibc.
Paul Eggert <eggert@cs.ucla.edu>
parents:
4695
diff
changeset
|
4 |
4020 | 5 This program is free software; you can redistribute it and/or modify |
6 it under the terms of the GNU General Public License as published by | |
7 the Free Software Foundation; either version 2, or (at your option) | |
8 any later version. | |
9 | 9 |
4020 | 10 This program is distributed in the hope that it will be useful, |
724
3f555c6de1b9
Use #if, not #ifdef in test for HAVE_CONFIG_H.
Jim Meyering <jim@meyering.net>
parents:
719
diff
changeset
|
11 but WITHOUT ANY WARRANTY; without even the implied warranty of |
4020 | 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
13 GNU General Public License for more details. | |
572 | 14 |
4020 | 15 You should have received a copy of the GNU General Public License along |
16 with this program; if not, write to the Free Software Foundation, | |
17 Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ | |
9 | 18 |
398 | 19 /* Written by David MacKenzie <djm@gnu.ai.mit.edu>. */ |
20 | |
1268 | 21 #ifdef HAVE_CONFIG_H |
1289 | 22 # include <config.h> |
398 | 23 #endif |
9 | 24 |
4636 | 25 #include "error.h" |
26 | |
27 #include <stdarg.h> | |
9 | 28 #include <stdio.h> |
4636 | 29 #include <stdlib.h> |
30 #include <string.h> | |
3966
22d3032f0239
Include gettext.h instead of <libintl.h> with #ifdefs.
Bruno Haible <bruno@clisp.org>
parents:
3618
diff
changeset
|
31 |
22d3032f0239
Include gettext.h instead of <libintl.h> with #ifdefs.
Bruno Haible <bruno@clisp.org>
parents:
3618
diff
changeset
|
32 #ifdef _LIBC |
2984
5b1fa2113060
Add a couple #includes, merging from GNU libc version.
Jim Meyering <jim@meyering.net>
parents:
2643
diff
changeset
|
33 # include <libintl.h> |
3966
22d3032f0239
Include gettext.h instead of <libintl.h> with #ifdefs.
Bruno Haible <bruno@clisp.org>
parents:
3618
diff
changeset
|
34 #else |
22d3032f0239
Include gettext.h instead of <libintl.h> with #ifdefs.
Bruno Haible <bruno@clisp.org>
parents:
3618
diff
changeset
|
35 # include "gettext.h" |
2984
5b1fa2113060
Add a couple #includes, merging from GNU libc version.
Jim Meyering <jim@meyering.net>
parents:
2643
diff
changeset
|
36 #endif |
3966
22d3032f0239
Include gettext.h instead of <libintl.h> with #ifdefs.
Bruno Haible <bruno@clisp.org>
parents:
3618
diff
changeset
|
37 |
3446 | 38 #ifdef _LIBC |
39 # include <wchar.h> | |
40 # define mbsrtowcs __mbsrtowcs | |
41 #endif | |
9 | 42 |
4072
86ee34b1ec28
Be consistent: change `#ifndef _LIBC' to `#if !_LIBC'.
Jim Meyering <jim@meyering.net>
parents:
4070
diff
changeset
|
43 #if !_LIBC |
4070
925594d77a99
Merge in changes from libc's misc/error.c, in preparation
Jim Meyering <jim@meyering.net>
parents:
4020
diff
changeset
|
44 # include "unlocked-io.h" |
925594d77a99
Merge in changes from libc's misc/error.c, in preparation
Jim Meyering <jim@meyering.net>
parents:
4020
diff
changeset
|
45 #endif |
925594d77a99
Merge in changes from libc's misc/error.c, in preparation
Jim Meyering <jim@meyering.net>
parents:
4020
diff
changeset
|
46 |
925594d77a99
Merge in changes from libc's misc/error.c, in preparation
Jim Meyering <jim@meyering.net>
parents:
4020
diff
changeset
|
47 #ifndef _ |
925594d77a99
Merge in changes from libc's misc/error.c, in preparation
Jim Meyering <jim@meyering.net>
parents:
4020
diff
changeset
|
48 # define _(String) String |
925594d77a99
Merge in changes from libc's misc/error.c, in preparation
Jim Meyering <jim@meyering.net>
parents:
4020
diff
changeset
|
49 #endif |
1268 | 50 |
398 | 51 /* If NULL, error will flush stdout, then print on stderr the program |
52 name, a colon and a space. Otherwise, error will call this | |
53 function without parameters instead. */ | |
4636 | 54 void (*error_print_progname) (void); |
572 | 55 |
56 /* This variable is incremented each time `error' is called. */ | |
57 unsigned int error_message_count; | |
9 | 58 |
527 | 59 #ifdef _LIBC |
572 | 60 /* In the GNU C library, there is a predefined variable for this. */ |
61 | |
1289 | 62 # define program_name program_invocation_name |
4739
04758f7475fd
Merge changes from glibc.
Paul Eggert <eggert@cs.ucla.edu>
parents:
4695
diff
changeset
|
63 # include <errno.h> |
4070
925594d77a99
Merge in changes from libc's misc/error.c, in preparation
Jim Meyering <jim@meyering.net>
parents:
4020
diff
changeset
|
64 # include <libio/libioP.h> |
572 | 65 |
1268 | 66 /* In GNU libc we want do not want to use the common name `error' directly. |
67 Instead make it a weak alias. */ | |
3446 | 68 extern void __error (int status, int errnum, const char *message, ...) |
69 __attribute__ ((__format__ (__printf__, 3, 4))); | |
70 extern void __error_at_line (int status, int errnum, const char *file_name, | |
71 unsigned int line_number, const char *message, | |
72 ...) | |
73 __attribute__ ((__format__ (__printf__, 5, 6)));; | |
1289 | 74 # define error __error |
75 # define error_at_line __error_at_line | |
1268 | 76 |
4500
cdb224406ea7
[!USE_IN_LIBIO]: Omit this case; assume USE_IN_LIBIO is 1.
Paul Eggert <eggert@cs.ucla.edu>
parents:
4072
diff
changeset
|
77 # include <libio/iolibio.h> |
cdb224406ea7
[!USE_IN_LIBIO]: Omit this case; assume USE_IN_LIBIO is 1.
Paul Eggert <eggert@cs.ucla.edu>
parents:
4072
diff
changeset
|
78 # define fflush(s) INTUSE(_IO_fflush) (s) |
cdb224406ea7
[!USE_IN_LIBIO]: Omit this case; assume USE_IN_LIBIO is 1.
Paul Eggert <eggert@cs.ucla.edu>
parents:
4072
diff
changeset
|
79 # undef putc |
cdb224406ea7
[!USE_IN_LIBIO]: Omit this case; assume USE_IN_LIBIO is 1.
Paul Eggert <eggert@cs.ucla.edu>
parents:
4072
diff
changeset
|
80 # define putc(c, fp) INTUSE(_IO_putc) (c, fp) |
2984
5b1fa2113060
Add a couple #includes, merging from GNU libc version.
Jim Meyering <jim@meyering.net>
parents:
2643
diff
changeset
|
81 |
4739
04758f7475fd
Merge changes from glibc.
Paul Eggert <eggert@cs.ucla.edu>
parents:
4695
diff
changeset
|
82 # include <bits/libc-lock.h> |
04758f7475fd
Merge changes from glibc.
Paul Eggert <eggert@cs.ucla.edu>
parents:
4695
diff
changeset
|
83 |
1289 | 84 #else /* not _LIBC */ |
527 | 85 |
3550
c18604dda2d7
(strerror_r): Do not declare unless !_LIBC.
Jim Meyering <jim@meyering.net>
parents:
3446
diff
changeset
|
86 # if !HAVE_DECL_STRERROR_R && STRERROR_R_CHAR_P |
c18604dda2d7
(strerror_r): Do not declare unless !_LIBC.
Jim Meyering <jim@meyering.net>
parents:
3446
diff
changeset
|
87 # ifndef HAVE_DECL_STRERROR_R |
c18604dda2d7
(strerror_r): Do not declare unless !_LIBC.
Jim Meyering <jim@meyering.net>
parents:
3446
diff
changeset
|
88 "this configure-time declaration test was not run" |
c18604dda2d7
(strerror_r): Do not declare unless !_LIBC.
Jim Meyering <jim@meyering.net>
parents:
3446
diff
changeset
|
89 # endif |
c18604dda2d7
(strerror_r): Do not declare unless !_LIBC.
Jim Meyering <jim@meyering.net>
parents:
3446
diff
changeset
|
90 char *strerror_r (); |
c18604dda2d7
(strerror_r): Do not declare unless !_LIBC.
Jim Meyering <jim@meyering.net>
parents:
3446
diff
changeset
|
91 # endif |
c18604dda2d7
(strerror_r): Do not declare unless !_LIBC.
Jim Meyering <jim@meyering.net>
parents:
3446
diff
changeset
|
92 |
4740
892879324c9c
(SIZE_MAX) [!defined SIZE_MAX]: Define.
Paul Eggert <eggert@cs.ucla.edu>
parents:
4739
diff
changeset
|
93 #ifndef SIZE_MAX |
892879324c9c
(SIZE_MAX) [!defined SIZE_MAX]: Define.
Paul Eggert <eggert@cs.ucla.edu>
parents:
4739
diff
changeset
|
94 # define SIZE_MAX ((size_t) -1) |
892879324c9c
(SIZE_MAX) [!defined SIZE_MAX]: Define.
Paul Eggert <eggert@cs.ucla.edu>
parents:
4739
diff
changeset
|
95 #endif |
892879324c9c
(SIZE_MAX) [!defined SIZE_MAX]: Define.
Paul Eggert <eggert@cs.ucla.edu>
parents:
4739
diff
changeset
|
96 |
398 | 97 /* The calling program should define program_name and set it to the |
98 name of the executing program. */ | |
99 extern char *program_name; | |
9 | 100 |
3550
c18604dda2d7
(strerror_r): Do not declare unless !_LIBC.
Jim Meyering <jim@meyering.net>
parents:
3446
diff
changeset
|
101 # if HAVE_STRERROR_R || defined strerror_r |
1289 | 102 # define __strerror_r strerror_r |
4636 | 103 # endif |
1289 | 104 #endif /* not _LIBC */ |
9 | 105 |
3550
c18604dda2d7
(strerror_r): Do not declare unless !_LIBC.
Jim Meyering <jim@meyering.net>
parents:
3446
diff
changeset
|
106 static void |
c18604dda2d7
(strerror_r): Do not declare unless !_LIBC.
Jim Meyering <jim@meyering.net>
parents:
3446
diff
changeset
|
107 print_errno_message (int errnum) |
c18604dda2d7
(strerror_r): Do not declare unless !_LIBC.
Jim Meyering <jim@meyering.net>
parents:
3446
diff
changeset
|
108 { |
c18604dda2d7
(strerror_r): Do not declare unless !_LIBC.
Jim Meyering <jim@meyering.net>
parents:
3446
diff
changeset
|
109 char const *s; |
c18604dda2d7
(strerror_r): Do not declare unless !_LIBC.
Jim Meyering <jim@meyering.net>
parents:
3446
diff
changeset
|
110 |
c18604dda2d7
(strerror_r): Do not declare unless !_LIBC.
Jim Meyering <jim@meyering.net>
parents:
3446
diff
changeset
|
111 #if defined HAVE_STRERROR_R || _LIBC |
c18604dda2d7
(strerror_r): Do not declare unless !_LIBC.
Jim Meyering <jim@meyering.net>
parents:
3446
diff
changeset
|
112 char errbuf[1024]; |
c18604dda2d7
(strerror_r): Do not declare unless !_LIBC.
Jim Meyering <jim@meyering.net>
parents:
3446
diff
changeset
|
113 # if STRERROR_R_CHAR_P || _LIBC |
c18604dda2d7
(strerror_r): Do not declare unless !_LIBC.
Jim Meyering <jim@meyering.net>
parents:
3446
diff
changeset
|
114 s = __strerror_r (errnum, errbuf, sizeof errbuf); |
c18604dda2d7
(strerror_r): Do not declare unless !_LIBC.
Jim Meyering <jim@meyering.net>
parents:
3446
diff
changeset
|
115 # else |
c18604dda2d7
(strerror_r): Do not declare unless !_LIBC.
Jim Meyering <jim@meyering.net>
parents:
3446
diff
changeset
|
116 if (__strerror_r (errnum, errbuf, sizeof errbuf) == 0) |
c18604dda2d7
(strerror_r): Do not declare unless !_LIBC.
Jim Meyering <jim@meyering.net>
parents:
3446
diff
changeset
|
117 s = errbuf; |
c18604dda2d7
(strerror_r): Do not declare unless !_LIBC.
Jim Meyering <jim@meyering.net>
parents:
3446
diff
changeset
|
118 else |
c18604dda2d7
(strerror_r): Do not declare unless !_LIBC.
Jim Meyering <jim@meyering.net>
parents:
3446
diff
changeset
|
119 s = 0; |
c18604dda2d7
(strerror_r): Do not declare unless !_LIBC.
Jim Meyering <jim@meyering.net>
parents:
3446
diff
changeset
|
120 # endif |
c18604dda2d7
(strerror_r): Do not declare unless !_LIBC.
Jim Meyering <jim@meyering.net>
parents:
3446
diff
changeset
|
121 #else |
c18604dda2d7
(strerror_r): Do not declare unless !_LIBC.
Jim Meyering <jim@meyering.net>
parents:
3446
diff
changeset
|
122 s = strerror (errnum); |
c18604dda2d7
(strerror_r): Do not declare unless !_LIBC.
Jim Meyering <jim@meyering.net>
parents:
3446
diff
changeset
|
123 #endif |
c18604dda2d7
(strerror_r): Do not declare unless !_LIBC.
Jim Meyering <jim@meyering.net>
parents:
3446
diff
changeset
|
124 |
c18604dda2d7
(strerror_r): Do not declare unless !_LIBC.
Jim Meyering <jim@meyering.net>
parents:
3446
diff
changeset
|
125 #if !_LIBC |
c18604dda2d7
(strerror_r): Do not declare unless !_LIBC.
Jim Meyering <jim@meyering.net>
parents:
3446
diff
changeset
|
126 if (! s) |
c18604dda2d7
(strerror_r): Do not declare unless !_LIBC.
Jim Meyering <jim@meyering.net>
parents:
3446
diff
changeset
|
127 s = _("Unknown system error"); |
c18604dda2d7
(strerror_r): Do not declare unless !_LIBC.
Jim Meyering <jim@meyering.net>
parents:
3446
diff
changeset
|
128 #endif |
c18604dda2d7
(strerror_r): Do not declare unless !_LIBC.
Jim Meyering <jim@meyering.net>
parents:
3446
diff
changeset
|
129 |
4500
cdb224406ea7
[!USE_IN_LIBIO]: Omit this case; assume USE_IN_LIBIO is 1.
Paul Eggert <eggert@cs.ucla.edu>
parents:
4072
diff
changeset
|
130 #if _LIBC |
3550
c18604dda2d7
(strerror_r): Do not declare unless !_LIBC.
Jim Meyering <jim@meyering.net>
parents:
3446
diff
changeset
|
131 if (_IO_fwide (stderr, 0) > 0) |
c18604dda2d7
(strerror_r): Do not declare unless !_LIBC.
Jim Meyering <jim@meyering.net>
parents:
3446
diff
changeset
|
132 { |
c18604dda2d7
(strerror_r): Do not declare unless !_LIBC.
Jim Meyering <jim@meyering.net>
parents:
3446
diff
changeset
|
133 __fwprintf (stderr, L": %s", s); |
c18604dda2d7
(strerror_r): Do not declare unless !_LIBC.
Jim Meyering <jim@meyering.net>
parents:
3446
diff
changeset
|
134 return; |
c18604dda2d7
(strerror_r): Do not declare unless !_LIBC.
Jim Meyering <jim@meyering.net>
parents:
3446
diff
changeset
|
135 } |
c18604dda2d7
(strerror_r): Do not declare unless !_LIBC.
Jim Meyering <jim@meyering.net>
parents:
3446
diff
changeset
|
136 #endif |
c18604dda2d7
(strerror_r): Do not declare unless !_LIBC.
Jim Meyering <jim@meyering.net>
parents:
3446
diff
changeset
|
137 |
c18604dda2d7
(strerror_r): Do not declare unless !_LIBC.
Jim Meyering <jim@meyering.net>
parents:
3446
diff
changeset
|
138 fprintf (stderr, ": %s", s); |
c18604dda2d7
(strerror_r): Do not declare unless !_LIBC.
Jim Meyering <jim@meyering.net>
parents:
3446
diff
changeset
|
139 } |
3446 | 140 |
141 static void | |
142 error_tail (int status, int errnum, const char *message, va_list args) | |
143 { | |
4695 | 144 #if _LIBC |
3446 | 145 if (_IO_fwide (stderr, 0) > 0) |
146 { | |
4695 | 147 # define ALLOCA_LIMIT 2000 |
3446 | 148 size_t len = strlen (message) + 1; |
4740
892879324c9c
(SIZE_MAX) [!defined SIZE_MAX]: Define.
Paul Eggert <eggert@cs.ucla.edu>
parents:
4739
diff
changeset
|
149 const wchar_t *wmessage = L"out of memory"; |
3446 | 150 mbstate_t st; |
151 size_t res; | |
152 const char *tmp; | |
4740
892879324c9c
(SIZE_MAX) [!defined SIZE_MAX]: Define.
Paul Eggert <eggert@cs.ucla.edu>
parents:
4739
diff
changeset
|
153 wchar_t *wbuf = (len < ALLOCA_LIMIT |
892879324c9c
(SIZE_MAX) [!defined SIZE_MAX]: Define.
Paul Eggert <eggert@cs.ucla.edu>
parents:
4739
diff
changeset
|
154 ? (void *) alloca (len * sizeof *wbuf) |
892879324c9c
(SIZE_MAX) [!defined SIZE_MAX]: Define.
Paul Eggert <eggert@cs.ucla.edu>
parents:
4739
diff
changeset
|
155 : len <= SIZE_MAX / sizeof *wbuf |
892879324c9c
(SIZE_MAX) [!defined SIZE_MAX]: Define.
Paul Eggert <eggert@cs.ucla.edu>
parents:
4739
diff
changeset
|
156 ? malloc (len * sizeof *wbuf) |
892879324c9c
(SIZE_MAX) [!defined SIZE_MAX]: Define.
Paul Eggert <eggert@cs.ucla.edu>
parents:
4739
diff
changeset
|
157 : NULL); |
3446 | 158 |
4740
892879324c9c
(SIZE_MAX) [!defined SIZE_MAX]: Define.
Paul Eggert <eggert@cs.ucla.edu>
parents:
4739
diff
changeset
|
159 if (wbuf) |
892879324c9c
(SIZE_MAX) [!defined SIZE_MAX]: Define.
Paul Eggert <eggert@cs.ucla.edu>
parents:
4739
diff
changeset
|
160 { |
3446 | 161 memset (&st, '\0', sizeof (st)); |
162 tmp =message; | |
4740
892879324c9c
(SIZE_MAX) [!defined SIZE_MAX]: Define.
Paul Eggert <eggert@cs.ucla.edu>
parents:
4739
diff
changeset
|
163 res = mbsrtowcs (wbuf, &tmp, len, &st); |
892879324c9c
(SIZE_MAX) [!defined SIZE_MAX]: Define.
Paul Eggert <eggert@cs.ucla.edu>
parents:
4739
diff
changeset
|
164 wmessage = res == (size_t) -1 ? L"???" : wbuf; |
3446 | 165 } |
166 | |
167 __vfwprintf (stderr, wmessage, args); | |
4740
892879324c9c
(SIZE_MAX) [!defined SIZE_MAX]: Define.
Paul Eggert <eggert@cs.ucla.edu>
parents:
4739
diff
changeset
|
168 if (! (len < ALLOCA_LIMIT)) |
892879324c9c
(SIZE_MAX) [!defined SIZE_MAX]: Define.
Paul Eggert <eggert@cs.ucla.edu>
parents:
4739
diff
changeset
|
169 free (wbuf); |
3446 | 170 } |
171 else | |
4695 | 172 #endif |
3446 | 173 vfprintf (stderr, message, args); |
174 va_end (args); | |
175 | |
176 ++error_message_count; | |
177 if (errnum) | |
3550
c18604dda2d7
(strerror_r): Do not declare unless !_LIBC.
Jim Meyering <jim@meyering.net>
parents:
3446
diff
changeset
|
178 print_errno_message (errnum); |
4680
0ec32cb1202f
Correct indentation of cpp directives.
Jim Meyering <jim@meyering.net>
parents:
4636
diff
changeset
|
179 #if _LIBC |
3446 | 180 if (_IO_fwide (stderr, 0) > 0) |
181 putwc (L'\n', stderr); | |
182 else | |
4680
0ec32cb1202f
Correct indentation of cpp directives.
Jim Meyering <jim@meyering.net>
parents:
4636
diff
changeset
|
183 #endif |
3446 | 184 putc ('\n', stderr); |
185 fflush (stderr); | |
186 if (status) | |
187 exit (status); | |
188 } | |
189 | |
190 | |
9 | 191 /* Print the program name and error message MESSAGE, which is a printf-style |
192 format string with optional args. | |
193 If ERRNUM is nonzero, print its corresponding system error message. | |
194 Exit with status STATUS if it is nonzero. */ | |
195 void | |
398 | 196 error (int status, int errnum, const char *message, ...) |
9 | 197 { |
198 va_list args; | |
199 | |
4739
04758f7475fd
Merge changes from glibc.
Paul Eggert <eggert@cs.ucla.edu>
parents:
4695
diff
changeset
|
200 #if defined _LIBC && defined __libc_ptf_call |
04758f7475fd
Merge changes from glibc.
Paul Eggert <eggert@cs.ucla.edu>
parents:
4695
diff
changeset
|
201 /* We do not want this call to be cut short by a thread |
04758f7475fd
Merge changes from glibc.
Paul Eggert <eggert@cs.ucla.edu>
parents:
4695
diff
changeset
|
202 cancellation. Therefore disable cancellation for now. */ |
04758f7475fd
Merge changes from glibc.
Paul Eggert <eggert@cs.ucla.edu>
parents:
4695
diff
changeset
|
203 int state = PTHREAD_CANCEL_ENABLE; |
04758f7475fd
Merge changes from glibc.
Paul Eggert <eggert@cs.ucla.edu>
parents:
4695
diff
changeset
|
204 __libc_ptf_call (pthread_setcancelstate, (PTHREAD_CANCEL_DISABLE, &state), |
04758f7475fd
Merge changes from glibc.
Paul Eggert <eggert@cs.ucla.edu>
parents:
4695
diff
changeset
|
205 0); |
04758f7475fd
Merge changes from glibc.
Paul Eggert <eggert@cs.ucla.edu>
parents:
4695
diff
changeset
|
206 #endif |
04758f7475fd
Merge changes from glibc.
Paul Eggert <eggert@cs.ucla.edu>
parents:
4695
diff
changeset
|
207 |
3446 | 208 fflush (stdout); |
209 #ifdef _LIBC | |
210 _IO_flockfile (stderr); | |
211 #endif | |
398 | 212 if (error_print_progname) |
213 (*error_print_progname) (); | |
214 else | |
215 { | |
4500
cdb224406ea7
[!USE_IN_LIBIO]: Omit this case; assume USE_IN_LIBIO is 1.
Paul Eggert <eggert@cs.ucla.edu>
parents:
4072
diff
changeset
|
216 #if _LIBC |
3446 | 217 if (_IO_fwide (stderr, 0) > 0) |
218 __fwprintf (stderr, L"%s: ", program_name); | |
219 else | |
220 #endif | |
221 fprintf (stderr, "%s: ", program_name); | |
398 | 222 } |
223 | |
4636 | 224 va_start (args, message); |
3446 | 225 error_tail (status, errnum, message, args); |
226 | |
227 #ifdef _LIBC | |
228 _IO_funlockfile (stderr); | |
4739
04758f7475fd
Merge changes from glibc.
Paul Eggert <eggert@cs.ucla.edu>
parents:
4695
diff
changeset
|
229 # ifdef __libc_ptf_call |
04758f7475fd
Merge changes from glibc.
Paul Eggert <eggert@cs.ucla.edu>
parents:
4695
diff
changeset
|
230 __libc_ptf_call (pthread_setcancelstate, (state, NULL), 0); |
04758f7475fd
Merge changes from glibc.
Paul Eggert <eggert@cs.ucla.edu>
parents:
4695
diff
changeset
|
231 # endif |
3446 | 232 #endif |
9 | 233 } |
572 | 234 |
573
8a90f3b04017
update from FSF:/home/gd/gnu/lib
Jim Meyering <jim@meyering.net>
parents:
572
diff
changeset
|
235 /* Sometimes we want to have at most one error per line. This |
8a90f3b04017
update from FSF:/home/gd/gnu/lib
Jim Meyering <jim@meyering.net>
parents:
572
diff
changeset
|
236 variable controls whether this mode is selected or not. */ |
8a90f3b04017
update from FSF:/home/gd/gnu/lib
Jim Meyering <jim@meyering.net>
parents:
572
diff
changeset
|
237 int error_one_per_line; |
8a90f3b04017
update from FSF:/home/gd/gnu/lib
Jim Meyering <jim@meyering.net>
parents:
572
diff
changeset
|
238 |
8a90f3b04017
update from FSF:/home/gd/gnu/lib
Jim Meyering <jim@meyering.net>
parents:
572
diff
changeset
|
239 void |
8a90f3b04017
update from FSF:/home/gd/gnu/lib
Jim Meyering <jim@meyering.net>
parents:
572
diff
changeset
|
240 error_at_line (int status, int errnum, const char *file_name, |
8a90f3b04017
update from FSF:/home/gd/gnu/lib
Jim Meyering <jim@meyering.net>
parents:
572
diff
changeset
|
241 unsigned int line_number, const char *message, ...) |
8a90f3b04017
update from FSF:/home/gd/gnu/lib
Jim Meyering <jim@meyering.net>
parents:
572
diff
changeset
|
242 { |
8a90f3b04017
update from FSF:/home/gd/gnu/lib
Jim Meyering <jim@meyering.net>
parents:
572
diff
changeset
|
243 va_list args; |
8a90f3b04017
update from FSF:/home/gd/gnu/lib
Jim Meyering <jim@meyering.net>
parents:
572
diff
changeset
|
244 |
8a90f3b04017
update from FSF:/home/gd/gnu/lib
Jim Meyering <jim@meyering.net>
parents:
572
diff
changeset
|
245 if (error_one_per_line) |
8a90f3b04017
update from FSF:/home/gd/gnu/lib
Jim Meyering <jim@meyering.net>
parents:
572
diff
changeset
|
246 { |
8a90f3b04017
update from FSF:/home/gd/gnu/lib
Jim Meyering <jim@meyering.net>
parents:
572
diff
changeset
|
247 static const char *old_file_name; |
8a90f3b04017
update from FSF:/home/gd/gnu/lib
Jim Meyering <jim@meyering.net>
parents:
572
diff
changeset
|
248 static unsigned int old_line_number; |
8a90f3b04017
update from FSF:/home/gd/gnu/lib
Jim Meyering <jim@meyering.net>
parents:
572
diff
changeset
|
249 |
3446 | 250 if (old_line_number == line_number |
251 && (file_name == old_file_name | |
252 || strcmp (old_file_name, file_name) == 0)) | |
573
8a90f3b04017
update from FSF:/home/gd/gnu/lib
Jim Meyering <jim@meyering.net>
parents:
572
diff
changeset
|
253 /* Simply return and print nothing. */ |
8a90f3b04017
update from FSF:/home/gd/gnu/lib
Jim Meyering <jim@meyering.net>
parents:
572
diff
changeset
|
254 return; |
8a90f3b04017
update from FSF:/home/gd/gnu/lib
Jim Meyering <jim@meyering.net>
parents:
572
diff
changeset
|
255 |
8a90f3b04017
update from FSF:/home/gd/gnu/lib
Jim Meyering <jim@meyering.net>
parents:
572
diff
changeset
|
256 old_file_name = file_name; |
8a90f3b04017
update from FSF:/home/gd/gnu/lib
Jim Meyering <jim@meyering.net>
parents:
572
diff
changeset
|
257 old_line_number = line_number; |
8a90f3b04017
update from FSF:/home/gd/gnu/lib
Jim Meyering <jim@meyering.net>
parents:
572
diff
changeset
|
258 } |
8a90f3b04017
update from FSF:/home/gd/gnu/lib
Jim Meyering <jim@meyering.net>
parents:
572
diff
changeset
|
259 |
4739
04758f7475fd
Merge changes from glibc.
Paul Eggert <eggert@cs.ucla.edu>
parents:
4695
diff
changeset
|
260 #if defined _LIBC && defined __libc_ptf_call |
04758f7475fd
Merge changes from glibc.
Paul Eggert <eggert@cs.ucla.edu>
parents:
4695
diff
changeset
|
261 /* We do not want this call to be cut short by a thread |
04758f7475fd
Merge changes from glibc.
Paul Eggert <eggert@cs.ucla.edu>
parents:
4695
diff
changeset
|
262 cancellation. Therefore disable cancellation for now. */ |
04758f7475fd
Merge changes from glibc.
Paul Eggert <eggert@cs.ucla.edu>
parents:
4695
diff
changeset
|
263 int state = PTHREAD_CANCEL_ENABLE; |
04758f7475fd
Merge changes from glibc.
Paul Eggert <eggert@cs.ucla.edu>
parents:
4695
diff
changeset
|
264 __libc_ptf_call (pthread_setcancelstate, (PTHREAD_CANCEL_DISABLE, &state), |
04758f7475fd
Merge changes from glibc.
Paul Eggert <eggert@cs.ucla.edu>
parents:
4695
diff
changeset
|
265 0); |
04758f7475fd
Merge changes from glibc.
Paul Eggert <eggert@cs.ucla.edu>
parents:
4695
diff
changeset
|
266 #endif |
04758f7475fd
Merge changes from glibc.
Paul Eggert <eggert@cs.ucla.edu>
parents:
4695
diff
changeset
|
267 |
3446 | 268 fflush (stdout); |
269 #ifdef _LIBC | |
270 _IO_flockfile (stderr); | |
271 #endif | |
573
8a90f3b04017
update from FSF:/home/gd/gnu/lib
Jim Meyering <jim@meyering.net>
parents:
572
diff
changeset
|
272 if (error_print_progname) |
8a90f3b04017
update from FSF:/home/gd/gnu/lib
Jim Meyering <jim@meyering.net>
parents:
572
diff
changeset
|
273 (*error_print_progname) (); |
8a90f3b04017
update from FSF:/home/gd/gnu/lib
Jim Meyering <jim@meyering.net>
parents:
572
diff
changeset
|
274 else |
8a90f3b04017
update from FSF:/home/gd/gnu/lib
Jim Meyering <jim@meyering.net>
parents:
572
diff
changeset
|
275 { |
4500
cdb224406ea7
[!USE_IN_LIBIO]: Omit this case; assume USE_IN_LIBIO is 1.
Paul Eggert <eggert@cs.ucla.edu>
parents:
4072
diff
changeset
|
276 #if _LIBC |
3446 | 277 if (_IO_fwide (stderr, 0) > 0) |
278 __fwprintf (stderr, L"%s: ", program_name); | |
279 else | |
280 #endif | |
281 fprintf (stderr, "%s:", program_name); | |
573
8a90f3b04017
update from FSF:/home/gd/gnu/lib
Jim Meyering <jim@meyering.net>
parents:
572
diff
changeset
|
282 } |
8a90f3b04017
update from FSF:/home/gd/gnu/lib
Jim Meyering <jim@meyering.net>
parents:
572
diff
changeset
|
283 |
8a90f3b04017
update from FSF:/home/gd/gnu/lib
Jim Meyering <jim@meyering.net>
parents:
572
diff
changeset
|
284 if (file_name != NULL) |
3446 | 285 { |
4500
cdb224406ea7
[!USE_IN_LIBIO]: Omit this case; assume USE_IN_LIBIO is 1.
Paul Eggert <eggert@cs.ucla.edu>
parents:
4072
diff
changeset
|
286 #if _LIBC |
3446 | 287 if (_IO_fwide (stderr, 0) > 0) |
288 __fwprintf (stderr, L"%s:%d: ", file_name, line_number); | |
289 else | |
290 #endif | |
291 fprintf (stderr, "%s:%d: ", file_name, line_number); | |
292 } | |
573
8a90f3b04017
update from FSF:/home/gd/gnu/lib
Jim Meyering <jim@meyering.net>
parents:
572
diff
changeset
|
293 |
4636 | 294 va_start (args, message); |
3446 | 295 error_tail (status, errnum, message, args); |
296 | |
297 #ifdef _LIBC | |
298 _IO_funlockfile (stderr); | |
4739
04758f7475fd
Merge changes from glibc.
Paul Eggert <eggert@cs.ucla.edu>
parents:
4695
diff
changeset
|
299 # ifdef __libc_ptf_call |
04758f7475fd
Merge changes from glibc.
Paul Eggert <eggert@cs.ucla.edu>
parents:
4695
diff
changeset
|
300 __libc_ptf_call (pthread_setcancelstate, (state, NULL), 0); |
04758f7475fd
Merge changes from glibc.
Paul Eggert <eggert@cs.ucla.edu>
parents:
4695
diff
changeset
|
301 # endif |
3446 | 302 #endif |
573
8a90f3b04017
update from FSF:/home/gd/gnu/lib
Jim Meyering <jim@meyering.net>
parents:
572
diff
changeset
|
303 } |
1268 | 304 |
305 #ifdef _LIBC | |
306 /* Make the weak alias. */ | |
1289 | 307 # undef error |
308 # undef error_at_line | |
1268 | 309 weak_alias (__error, error) |
310 weak_alias (__error_at_line, error_at_line) | |
311 #endif |