xref: /inferno-os/lib9/errstr-posix.c (revision 35a6f3e10aa63aa1ac127c14186949900fe25993)
137da2899SCharles.Forsyth #include "lib9.h"
237da2899SCharles.Forsyth 
337da2899SCharles.Forsyth #include <errno.h>
437da2899SCharles.Forsyth 
537da2899SCharles.Forsyth static char errstring[ERRMAX];
637da2899SCharles.Forsyth 
737da2899SCharles.Forsyth enum
837da2899SCharles.Forsyth {
937da2899SCharles.Forsyth 	Magic = 0xffffff
1037da2899SCharles.Forsyth };
1137da2899SCharles.Forsyth 
1237da2899SCharles.Forsyth void
werrstr(char * fmt,...)1337da2899SCharles.Forsyth werrstr(char *fmt, ...)
1437da2899SCharles.Forsyth {
1537da2899SCharles.Forsyth 	va_list arg;
1637da2899SCharles.Forsyth 
1737da2899SCharles.Forsyth 	va_start(arg, fmt);
1837da2899SCharles.Forsyth 	vseprint(errstring, errstring+sizeof(errstring), fmt, arg);
1937da2899SCharles.Forsyth 	va_end(arg);
2037da2899SCharles.Forsyth 	errno = Magic;
2137da2899SCharles.Forsyth }
2237da2899SCharles.Forsyth 
2337da2899SCharles.Forsyth void
oserrstr(char * buf,uint nerr)2437da2899SCharles.Forsyth oserrstr(char *buf, uint nerr)
2537da2899SCharles.Forsyth {
26*35a6f3e1Sforsyth 	char *s;
27*35a6f3e1Sforsyth 
28*35a6f3e1Sforsyth 	if(errno != EINTR)
29*35a6f3e1Sforsyth 		s = strerror(errno);
30*35a6f3e1Sforsyth 	else
31*35a6f3e1Sforsyth 		s = "interrupted";
32*35a6f3e1Sforsyth 	utfecpy(buf, buf+nerr, s);
3337da2899SCharles.Forsyth }
3437da2899SCharles.Forsyth 
3537da2899SCharles.Forsyth int
errstr(char * buf,uint nerr)3637da2899SCharles.Forsyth errstr(char *buf, uint nerr)
3737da2899SCharles.Forsyth {
3837da2899SCharles.Forsyth 	if(errno == Magic)
3937da2899SCharles.Forsyth 		utfecpy(buf, buf+nerr, errstring);
4037da2899SCharles.Forsyth 	else
4137da2899SCharles.Forsyth 		oserrstr(buf, nerr);
4237da2899SCharles.Forsyth 	return 1;
4337da2899SCharles.Forsyth }
44