xref: /aosp_15_r20/external/musl/src/stdio/perror.c (revision c9945492fdd68bbe62686c5b452b4dc1be3f8453)
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