1*c9945492SAndroid Build Coastguard Worker #include <stdio.h>
2*c9945492SAndroid Build Coastguard Worker #include <string.h>
3*c9945492SAndroid Build Coastguard Worker #include <errno.h>
4*c9945492SAndroid Build Coastguard Worker #include "stdio_impl.h"
5*c9945492SAndroid Build Coastguard Worker
perror(const char * msg)6*c9945492SAndroid Build Coastguard Worker void perror(const char *msg)
7*c9945492SAndroid Build Coastguard Worker {
8*c9945492SAndroid Build Coastguard Worker FILE *f = stderr;
9*c9945492SAndroid Build Coastguard Worker char *errstr = strerror(errno);
10*c9945492SAndroid Build Coastguard Worker
11*c9945492SAndroid Build Coastguard Worker FLOCK(f);
12*c9945492SAndroid Build Coastguard Worker
13*c9945492SAndroid Build Coastguard Worker /* Save stderr's orientation and encoding rule, since perror is not
14*c9945492SAndroid Build Coastguard Worker * permitted to change them. */
15*c9945492SAndroid Build Coastguard Worker void *old_locale = f->locale;
16*c9945492SAndroid Build Coastguard Worker int old_mode = f->mode;
17*c9945492SAndroid Build Coastguard Worker
18*c9945492SAndroid Build Coastguard Worker if (msg && *msg) {
19*c9945492SAndroid Build Coastguard Worker fwrite(msg, strlen(msg), 1, f);
20*c9945492SAndroid Build Coastguard Worker fputc(':', f);
21*c9945492SAndroid Build Coastguard Worker fputc(' ', f);
22*c9945492SAndroid Build Coastguard Worker }
23*c9945492SAndroid Build Coastguard Worker fwrite(errstr, strlen(errstr), 1, f);
24*c9945492SAndroid Build Coastguard Worker fputc('\n', f);
25*c9945492SAndroid Build Coastguard Worker
26*c9945492SAndroid Build Coastguard Worker f->mode = old_mode;
27*c9945492SAndroid Build Coastguard Worker f->locale = old_locale;
28*c9945492SAndroid Build Coastguard Worker
29*c9945492SAndroid Build Coastguard Worker FUNLOCK(f);
30*c9945492SAndroid Build Coastguard Worker }
31